Show a patch.

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

{
    "id": 733,
    "url": "https://patchwork.libcamera.org/api/1.1/patches/733/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/733/",
    "project": {
        "id": 1,
        "url": "https://patchwork.libcamera.org/api/1.1/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": "<20190313010532.28960-4-niklas.soderlund@ragnatech.se>",
    "date": "2019-03-13T01:05:31",
    "name": "[libcamera-devel,v3,3/4] test: camera: Add capture test",
    "commit_ref": "f873d801ddd1e040e27e9aed80c63e822a2321d7",
    "pull_url": null,
    "state": "accepted",
    "archived": false,
    "hash": "8b0253f11097a66323a677ad4ec01372c91ca1d7",
    "submitter": {
        "id": 5,
        "url": "https://patchwork.libcamera.org/api/1.1/people/5/?format=api",
        "name": "Niklas Söderlund",
        "email": "niklas.soderlund@ragnatech.se"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/733/mbox/",
    "series": [
        {
            "id": 206,
            "url": "https://patchwork.libcamera.org/api/1.1/series/206/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=206",
            "date": "2019-03-13T01:05:28",
            "name": "test: camera: Add basic tests for the camera",
            "version": 3,
            "mbox": "https://patchwork.libcamera.org/series/206/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/733/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/733/checks/",
    "tags": {},
    "headers": {
        "Return-Path": "<niklas.soderlund@ragnatech.se>",
        "Received": [
            "from vsp-unauthed02.binero.net (vsp-unauthed02.binero.net\n\t[195.74.38.227])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 1EDE2610BF\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 13 Mar 2019 02:06:23 +0100 (CET)",
            "from bismarck.berto.se (unknown [89.233.230.99])\n\tby bin-vsp-out-01.atm.binero.net (Halon) with ESMTPA\n\tid 3695721b-452c-11e9-846a-005056917a89;\n\tWed, 13 Mar 2019 02:06:21 +0100 (CET)"
        ],
        "X-Halon-ID": "3695721b-452c-11e9-846a-005056917a89",
        "Authorized-sender": "niklas@soderlund.pp.se",
        "From": "=?utf-8?q?Niklas_S=C3=B6derlund?= <niklas.soderlund@ragnatech.se>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Date": "Wed, 13 Mar 2019 02:05:31 +0100",
        "Message-Id": "<20190313010532.28960-4-niklas.soderlund@ragnatech.se>",
        "X-Mailer": "git-send-email 2.21.0",
        "In-Reply-To": "<20190313010532.28960-1-niklas.soderlund@ragnatech.se>",
        "References": "<20190313010532.28960-1-niklas.soderlund@ragnatech.se>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=UTF-8",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[libcamera-devel] [PATCH v3 3/4] test: camera: Add capture test",
        "X-BeenThere": "libcamera-devel@lists.libcamera.org",
        "X-Mailman-Version": "2.1.23",
        "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>",
        "X-List-Received-Date": "Wed, 13 Mar 2019 01:06:23 -0000"
    },
    "content": "Correctly configure the camera using the default configuration and run a\ncapture session for 100 milliseconds, which is plenty of time, in tests\nover 600 requests completed using the vimc pipeline.\n\nThe test passes if at least the number of buffers used in the capture\ntimes two number of requests completes to prove we cycle through all\nbuffers.\n\nSigned-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n---\n test/camera/capture.cpp | 142 ++++++++++++++++++++++++++++++++++++++++\n test/camera/meson.build |   1 +\n 2 files changed, 143 insertions(+)\n create mode 100644 test/camera/capture.cpp",
    "diff": "diff --git a/test/camera/capture.cpp b/test/camera/capture.cpp\nnew file mode 100644\nindex 0000000000000000..28eb61405d90a4c7\n--- /dev/null\n+++ b/test/camera/capture.cpp\n@@ -0,0 +1,142 @@\n+/* SPDX-License-Identifier: GPL-2.0-or-later */\n+/*\n+ * Copyright (C) 2019, Google Inc.\n+ *\n+ * libcamera Camera API tests\n+ */\n+\n+#include <iostream>\n+\n+#include \"camera_test.h\"\n+\n+using namespace std;\n+\n+namespace {\n+\n+class Capture : public CameraTest\n+{\n+protected:\n+\tunsigned int completeBuffersCount_;\n+\tunsigned int completeRequestsCount_;\n+\n+\tvoid bufferComplete(Request *request, Buffer *buffer)\n+\t{\n+\t\tif (buffer->status() != Buffer::BufferSuccess)\n+\t\t\treturn;\n+\n+\t\tcompleteBuffersCount_++;\n+\t}\n+\n+\tvoid requestComplete(Request *request, const std::map<Stream *, Buffer *> &buffers)\n+\t{\n+\t\tif (request->status() != Request::RequestComplete)\n+\t\t\treturn;\n+\n+\t\tcompleteRequestsCount_++;\n+\n+\t\t/* Reuse the buffers for a new request. */\n+\t\trequest = camera_->createRequest();\n+\t\trequest->setBuffers(buffers);\n+\t\tcamera_->queueRequest(request);\n+\t}\n+\n+\tint run()\n+\t{\n+\t\tStream *stream = *camera_->streams().begin();\n+\t\tstd::set<Stream *> streams = { stream };\n+\t\tstd::map<Stream *, StreamConfiguration> conf =\n+\t\t\tcamera_->streamConfiguration(streams);\n+\t\tStreamConfiguration *sconf = &conf.begin()->second;\n+\n+\t\tif (!configurationValid(streams, conf)) {\n+\t\t\tcout << \"Failed to read default configuration\" << endl;\n+\t\t\treturn TestFail;\n+\t\t}\n+\n+\t\tif (camera_->acquire()) {\n+\t\t\tcout << \"Failed to acquire the camera\" << endl;\n+\t\t\treturn TestFail;\n+\t\t}\n+\n+\t\tif (camera_->configureStreams(conf)) {\n+\t\t\tcout << \"Failed to set default configuration\" << endl;\n+\t\t\treturn TestFail;\n+\t\t}\n+\n+\t\tif (camera_->allocateBuffers()) {\n+\t\t\tcout << \"Failed to allocate buffers\" << endl;\n+\t\t\treturn TestFail;\n+\t\t}\n+\n+\t\tBufferPool &pool = stream->bufferPool();\n+\t\tstd::vector<Request *> requests;\n+\t\tfor (Buffer &buffer : pool.buffers()) {\n+\t\t\tRequest *request = camera_->createRequest();\n+\t\t\tif (!request) {\n+\t\t\t\tcout << \"Failed to create request\" << endl;\n+\t\t\t\treturn TestFail;\n+\t\t\t}\n+\n+\t\t\tstd::map<Stream *, Buffer *> map = { { stream, &buffer } };\n+\t\t\tif (request->setBuffers(map)) {\n+\t\t\t\tcout << \"Failed to associating buffer with request\" << endl;\n+\t\t\t\treturn TestFail;\n+\t\t\t}\n+\n+\t\t\trequests.push_back(request);\n+\t\t}\n+\n+\t\tcompleteRequestsCount_ = 0;\n+\t\tcompleteBuffersCount_ = 0;\n+\n+\t\tcamera_->bufferCompleted.connect(this, &Capture::bufferComplete);\n+\t\tcamera_->requestCompleted.connect(this, &Capture::requestComplete);\n+\n+\t\tif (camera_->start()) {\n+\t\t\tcout << \"Failed to start camera\" << endl;\n+\t\t\treturn TestFail;\n+\t\t}\n+\n+\t\tfor (Request *request : requests) {\n+\t\t\tif (camera_->queueRequest(request)) {\n+\t\t\t\tcout << \"Failed to queue request\" << endl;\n+\t\t\t\treturn TestFail;\n+\t\t\t}\n+\t\t}\n+\n+\t\tEventDispatcher *dispatcher = CameraManager::instance()->eventDispatcher();\n+\n+\t\tTimer timer;\n+\t\ttimer.start(100);\n+\t\twhile (timer.isRunning())\n+\t\t\tdispatcher->processEvents();\n+\n+\t\tif (completeRequestsCount_ <= sconf->bufferCount * 2) {\n+\t\t\tcout << \"Failed to capture enough frames (got \"\n+\t\t\t     << completeRequestsCount_ << \" expected at least \"\n+\t\t\t     << sconf->bufferCount * 2 << \")\" << endl;\n+\t\t\treturn TestFail;\n+\t\t}\n+\n+\t\tif (completeRequestsCount_ != completeBuffersCount_) {\n+\t\t\tcout << \"Number of completed buffers and requests differ\" << endl;\n+\t\t\treturn TestFail;\n+\t\t}\n+\n+\t\tif (camera_->stop()) {\n+\t\t\tcout << \"Failed to stop camera\" << endl;\n+\t\t\treturn TestFail;\n+\t\t}\n+\n+\t\tif (camera_->freeBuffers()) {\n+\t\t\tcout << \"Failed to free buffers\" << endl;\n+\t\t\treturn TestFail;\n+\t\t}\n+\n+\t\treturn TestPass;\n+\t}\n+};\n+\n+} /* namespace */\n+\n+TEST_REGISTER(Capture);\ndiff --git a/test/camera/meson.build b/test/camera/meson.build\nindex ed4837190ff6c52c..a1fd20326e97538b 100644\n--- a/test/camera/meson.build\n+++ b/test/camera/meson.build\n@@ -3,6 +3,7 @@\n camera_tests = [\n   [ 'configuration_default',  'configuration_default.cpp' ],\n   [ 'configuration_set',      'configuration_set.cpp' ],\n+  [ 'capture',                'capture.cpp' ],\n ]\n \n foreach t : camera_tests\n",
    "prefixes": [
        "libcamera-devel",
        "v3",
        "3/4"
    ]
}