Show a patch.

GET /api/patches/12052/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 12052,
    "url": "https://patchwork.libcamera.org/api/patches/12052/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/12052/",
    "project": {
        "id": 1,
        "url": "https://patchwork.libcamera.org/api/projects/1/?format=api",
        "name": "libcamera",
        "link_name": "libcamera",
        "list_id": "libcamera_core",
        "list_email": "libcamera-devel@lists.libcamera.org",
        "web_url": "",
        "scm_url": "",
        "webscm_url": ""
    },
    "msgid": "<20210421165139.318432-4-nfraprado@collabora.com>",
    "date": "2021-04-21T16:51:38",
    "name": "[libcamera-devel,v3,3/4] lc-compliance: Add test to queue more requests than hardware depth",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": false,
    "hash": "507221b3e55a44e61de6e816f6e8ab028df3272a",
    "submitter": {
        "id": 84,
        "url": "https://patchwork.libcamera.org/api/people/84/?format=api",
        "name": "Nícolas F. R. A. Prado",
        "email": "nfraprado@collabora.com"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/12052/mbox/",
    "series": [
        {
            "id": 1958,
            "url": "https://patchwork.libcamera.org/api/series/1958/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=1958",
            "date": "2021-04-21T16:51:35",
            "name": "lc-compliance: Add test to queue more requests than hardware depth",
            "version": 3,
            "mbox": "https://patchwork.libcamera.org/series/1958/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/12052/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/12052/checks/",
    "tags": {},
    "headers": {
        "Return-Path": "<libcamera-devel-bounces@lists.libcamera.org>",
        "X-Original-To": "parsemail@patchwork.libcamera.org",
        "Delivered-To": "parsemail@patchwork.libcamera.org",
        "Received": [
            "from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id ABD5EBDB15\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 21 Apr 2021 16:52:30 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 6A1DC68854;\n\tWed, 21 Apr 2021 18:52:30 +0200 (CEST)",
            "from bhuna.collabora.co.uk (bhuna.collabora.co.uk [46.235.227.227])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id CD98468851\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 21 Apr 2021 18:52:27 +0200 (CEST)",
            "from [127.0.0.1] (localhost [127.0.0.1])\n\t(Authenticated sender: nfraprado) with ESMTPSA id BD7BC1F423ED"
        ],
        "From": "=?utf-8?b?TsOtY29sYXMgRi4gUi4gQS4gUHJhZG8=?= <nfraprado@collabora.com>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Date": "Wed, 21 Apr 2021 13:51:38 -0300",
        "Message-Id": "<20210421165139.318432-4-nfraprado@collabora.com>",
        "X-Mailer": "git-send-email 2.31.1",
        "In-Reply-To": "<20210421165139.318432-1-nfraprado@collabora.com>",
        "References": "<20210421165139.318432-1-nfraprado@collabora.com>",
        "MIME-Version": "1.0",
        "Subject": "[libcamera-devel] [PATCH v3 3/4] lc-compliance: Add test to queue\n\tmore requests than hardware depth",
        "X-BeenThere": "libcamera-devel@lists.libcamera.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "<libcamera-devel.lists.libcamera.org>",
        "List-Unsubscribe": "<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>",
        "List-Archive": "<https://lists.libcamera.org/pipermail/libcamera-devel/>",
        "List-Post": "<mailto:libcamera-devel@lists.libcamera.org>",
        "List-Help": "<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>",
        "List-Subscribe": "<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>",
        "Cc": "=?utf-8?q?Andr=C3=A9_Almeida?= <andrealmeid@collabora.com>,\n\tkernel@collabora.com",
        "Content-Type": "text/plain; charset=\"utf-8\"",
        "Content-Transfer-Encoding": "base64",
        "Errors-To": "libcamera-devel-bounces@lists.libcamera.org",
        "Sender": "\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"
    },
    "content": "A pipeline handler should be able to handle an arbitrary amount of\nsimultaneous requests by submitting what it can to the video device and\nqueuing the rest internally until resources are available. This isn't\ncurrently done by some pipeline handlers however [1].\n\nAdd a new test to lc-compliance that submits a lot of requests at once\nto check if the pipeline handler is behaving well in this situation.\n\n[1] https://bugs.libcamera.org/show_bug.cgi?id=24\n\nSigned-off-by: Nícolas F. R. A. Prado <nfraprado@collabora.com>\n---\n src/lc-compliance/simple_capture.cpp | 70 ++++++++++++++++++++++++++++\n src/lc-compliance/simple_capture.h   | 15 ++++++\n src/lc-compliance/single_stream.cpp  | 31 +++++++++++-\n 3 files changed, 115 insertions(+), 1 deletion(-)",
    "diff": "diff --git a/src/lc-compliance/simple_capture.cpp b/src/lc-compliance/simple_capture.cpp\nindex 875772a80c27..01d76380e998 100644\n--- a/src/lc-compliance/simple_capture.cpp\n+++ b/src/lc-compliance/simple_capture.cpp\n@@ -223,3 +223,73 @@ void SimpleCaptureUnbalanced::requestComplete(Request *request)\n \tif (camera_->queueRequest(request))\n \t\tloop_->exit(-EINVAL);\n }\n+\n+SimpleCaptureOverflow::SimpleCaptureOverflow(std::shared_ptr<Camera> camera)\n+\t: SimpleCapture(camera)\n+{\n+}\n+\n+Results::Result SimpleCaptureOverflow::capture()\n+{\n+\tResults::Result ret = start();\n+\tif (ret.first != Results::Pass)\n+\t\treturn ret;\n+\n+\tStream *stream = config_->at(0).stream();\n+\tconst std::vector<std::unique_ptr<FrameBuffer>> &buffers = allocator_->buffers(stream);\n+\n+\tcaptureCount_ = 0;\n+\tcaptureLimit_ = buffers.size();\n+\n+\tstd::vector<std::unique_ptr<libcamera::Request>> requests;\n+\tfor (const std::unique_ptr<FrameBuffer> &buffer : buffers) {\n+\t\tstd::unique_ptr<Request> request = camera_->createRequest();\n+\t\tif (!request) {\n+\t\t\tstop();\n+\t\t\treturn { Results::Fail, \"Can't create request\" };\n+\t\t}\n+\n+\t\tif (request->addBuffer(stream, buffer.get())) {\n+\t\t\tstop();\n+\t\t\treturn { Results::Fail, \"Can't set buffer for request\" };\n+\t\t}\n+\n+\t\tif (camera_->queueRequest(request.get()) < 0) {\n+\t\t\tstop();\n+\t\t\treturn { Results::Fail, \"Failed to queue request\" };\n+\t\t}\n+\n+\t\trequests.push_back(std::move(request));\n+\t}\n+\n+\t/* Run capture session. */\n+\tloop_ = new EventLoop();\n+\tloop_->exec();\n+\tstop();\n+\tdelete loop_;\n+\n+\tif (captureCount_ != captureLimit_)\n+\t\treturn { Results::Fail, \"Got \" + std::to_string(captureCount_) +\n+\t\t\t\" request, wanted \" + std::to_string(captureLimit_) };\n+\n+\treturn { Results::Pass, \"Overflow capture of \" +\n+\t\tstd::to_string(captureLimit_) + \" requests\" };\n+}\n+\n+void SimpleCaptureOverflow::requestComplete([[maybe_unused]]Request *request)\n+{\n+\tcaptureCount_++;\n+\tif (captureCount_ >= captureLimit_) {\n+\t\tloop_->exit(0);\n+\t\treturn;\n+\t}\n+}\n+\n+Results::Result SimpleCaptureOverflow::allocateBuffers(unsigned int count)\n+{\n+\tStream *stream = config_->at(0).stream();\n+\tif (allocator_->allocate(stream, count) < 0)\n+\t\treturn { Results::Fail, \"Failed to allocate buffers\" };\n+\n+\treturn { Results::Pass, \"Allocated buffers\" };\n+}\ndiff --git a/src/lc-compliance/simple_capture.h b/src/lc-compliance/simple_capture.h\nindex 82e2c56a55f1..cafcdafe10c2 100644\n--- a/src/lc-compliance/simple_capture.h\n+++ b/src/lc-compliance/simple_capture.h\n@@ -66,4 +66,19 @@ private:\n \tunsigned int captureLimit_;\n };\n \n+class SimpleCaptureOverflow : public SimpleCapture\n+{\n+public:\n+\tSimpleCaptureOverflow(std::shared_ptr<libcamera::Camera> camera);\n+\n+\tResults::Result allocateBuffers(unsigned int count);\n+\tResults::Result capture();\n+\n+private:\n+\tvoid requestComplete(libcamera::Request *request) override;\n+\n+\tunsigned int captureCount_;\n+\tunsigned int captureLimit_;\n+};\n+\n #endif /* __LC_COMPLIANCE_SIMPLE_CAPTURE_H__ */\ndiff --git a/src/lc-compliance/single_stream.cpp b/src/lc-compliance/single_stream.cpp\nindex 649291c7bb73..61979f66d92d 100644\n--- a/src/lc-compliance/single_stream.cpp\n+++ b/src/lc-compliance/single_stream.cpp\n@@ -12,6 +12,23 @@\n \n using namespace libcamera;\n \n+static const unsigned int MAX_SIMULTANEOUS_REQUESTS = 8;\n+\n+Results::Result testRequestOverflow(std::shared_ptr<Camera> camera,\n+\t\t\t\t   StreamRole role, unsigned int numRequests)\n+{\n+\tSimpleCaptureOverflow capture(camera);\n+\n+\tResults::Result ret = capture.configure(role);\n+\tif (ret.first != Results::Pass)\n+\t\treturn ret;\n+\tcapture.allocateBuffers(numRequests);\n+\tif (ret.first != Results::Pass)\n+\t\treturn ret;\n+\n+\treturn capture.capture();\n+}\n+\n Results::Result testRequestBalance(std::shared_ptr<Camera> camera,\n \t\t\t\t   StreamRole role, unsigned int startCycles,\n \t\t\t\t   unsigned int numRequests)\n@@ -61,7 +78,7 @@ Results testSingleStream(std::shared_ptr<Camera> camera)\n \t};\n \tstatic const std::vector<unsigned int> numRequests = { 1, 2, 3, 5, 8, 13, 21, 34, 55, 89 };\n \n-\tResults results(numRequests.size() * roles.size() * 3);\n+\tResults results(numRequests.size() * roles.size() * 3 + roles.size() * 1);\n \n \tfor (const auto &role : roles) {\n \t\tstd::cout << \"= Test role \" << role.first << std::endl;\n@@ -97,6 +114,18 @@ Results testSingleStream(std::shared_ptr<Camera> camera)\n \t\tstd::cout << \"* Test unbalanced stop\" << std::endl;\n \t\tfor (unsigned int num : numRequests)\n \t\t\tresults.add(testRequestUnbalance(camera, role.second, num));\n+\n+\t\t/*\n+\t\t * Test overflowing pipeline with requests\n+\t\t *\n+\t\t * Makes sure that the camera supports receiving a large amount\n+\t\t * of requests at once. Example failure is a camera that doesn't\n+\t\t * check if there are available resources (free internal\n+\t\t * buffers, free buffers in the video devices) before handling a\n+\t\t * request.\n+\t\t */\n+\t\tstd::cout << \"* Test overflowing requests\" << std::endl;\n+\t\tresults.add(testRequestOverflow(camera, role.second, MAX_SIMULTANEOUS_REQUESTS));\n \t}\n \n \treturn results;\n",
    "prefixes": [
        "libcamera-devel",
        "v3",
        "3/4"
    ]
}