Show a patch.

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

{
    "id": 22227,
    "url": "https://patchwork.libcamera.org/api/1.1/patches/22227/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/22227/",
    "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": "<20241206160747.97176-2-jacopo.mondi@ideasonboard.com>",
    "date": "2024-12-06T16:07:39",
    "name": "[1/8] libcamera: camera: Introduce metadataAvailable signal",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "7517506c9f556fbfe15bffe9e517445960f713a7",
    "submitter": {
        "id": 143,
        "url": "https://patchwork.libcamera.org/api/1.1/people/143/?format=api",
        "name": "Jacopo Mondi",
        "email": "jacopo.mondi@ideasonboard.com"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/22227/mbox/",
    "series": [
        {
            "id": 4858,
            "url": "https://patchwork.libcamera.org/api/1.1/series/4858/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=4858",
            "date": "2024-12-06T16:07:38",
            "name": "libcamera: Support partial metadata completion",
            "version": 1,
            "mbox": "https://patchwork.libcamera.org/series/4858/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/22227/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/22227/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 23B9FBE173\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri,  6 Dec 2024 16:08:01 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 665F467E27;\n\tFri,  6 Dec 2024 17:07:57 +0100 (CET)",
            "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 38FA566176\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri,  6 Dec 2024 17:07:55 +0100 (CET)",
            "from ideasonboard.com (93-61-96-190.ip145.fastwebnet.it\n\t[93.61.96.190])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 6D3AA9FC;\n\tFri,  6 Dec 2024 17:07:25 +0100 (CET)"
        ],
        "Authentication-Results": "lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"Ts324LDQ\"; dkim-atps=neutral",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1733501245;\n\tbh=Scbv05dXlHumWo/CTfJGqq5LN8ueXb/PBHOBlNjYnw8=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=Ts324LDQbr52G/xMJ1LnBkPPyIsxyk3pz00jixFTaaFtwNE6dtQA308+bFN3xM4EP\n\tptc+g5p6Ixw61pdgs5rSrBjoP7BhwUKymH4EPTGwAqpfz9STCnPCmMZSXciAOoqg8p\n\tZgRL4gM3/vV3jnbpj8728phNum0UyJakmI3+9dQE=",
        "From": "Jacopo Mondi <jacopo.mondi@ideasonboard.com>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Cc": "Jacopo Mondi <jacopo.mondi@ideasonboard.com>,\n\tHarvey Yang <chenghaoyang@chromium.org>,\n\tHan-Lin Chen <hanlinchen@chromium.org>",
        "Subject": "[PATCH 1/8] libcamera: camera: Introduce metadataAvailable signal",
        "Date": "Fri,  6 Dec 2024 17:07:39 +0100",
        "Message-ID": "<20241206160747.97176-2-jacopo.mondi@ideasonboard.com>",
        "X-Mailer": "git-send-email 2.47.1",
        "In-Reply-To": "<20241206160747.97176-1-jacopo.mondi@ideasonboard.com>",
        "References": "<20241206160747.97176-1-jacopo.mondi@ideasonboard.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "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>",
        "Errors-To": "libcamera-devel-bounces@lists.libcamera.org",
        "Sender": "\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"
    },
    "content": "Add a new signal to the Camera class that allows applications to\nreceive notifications for early completion of metadata results.\n\nTo avoid expensive copies of the metadata results the signal\ntransports the ids of the metadata keys that are ready. Applications\ncan use these ids to access the metadata results from\nRequest::metadata().\n\nThe signal is an opt-in feature for applications and the sum of\nall metadata results notified through this signal is available\nin Request::metadata() at request completion time.\n\nSigned-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\n---\n include/libcamera/camera.h |  2 ++\n src/libcamera/camera.cpp   | 42 ++++++++++++++++++++++++++++++++++++++\n 2 files changed, 44 insertions(+)",
    "diff": "diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h\nindex 94cee7bd86bb..20d51c191ecd 100644\n--- a/include/libcamera/camera.h\n+++ b/include/libcamera/camera.h\n@@ -13,6 +13,7 @@\n #include <set>\n #include <stdint.h>\n #include <string>\n+#include <unordered_set>\n \n #include <libcamera/base/class.h>\n #include <libcamera/base/flags.h>\n@@ -122,6 +123,7 @@ public:\n \n \tconst std::string &id() const;\n \n+\tSignal<Request *, std::unordered_set<const ControlId *>> metadataAvailable;\n \tSignal<Request *, FrameBuffer *> bufferCompleted;\n \tSignal<Request *> requestCompleted;\n \tSignal<> disconnected;\ndiff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp\nindex 4c865a46af53..63e78b24e271 100644\n--- a/src/libcamera/camera.cpp\n+++ b/src/libcamera/camera.cpp\n@@ -886,6 +886,48 @@ const std::string &Camera::id() const\n \treturn _d()->id_;\n }\n \n+/**\n+ * \\var Camera::metadataAvailable\n+ * \\brief Signal emitted when metadata for a request are available\n+ *\n+ * The metadataAvailable signal notifies applications about the availability\n+ * of metadata for a request before the request completes.\n+ *\n+ * As metadata results could be large in size, the signal transports the ids\n+ * of the metadata that have just been made available, but the actual control\n+ * values are stored in the Camera::metadata() list.\n+ *\n+ * Applications can access the value of the newly available metadata results\n+ * with:\n+ *\n+ * \\code\n+\n+\tvoid metadataAvailableHandler(Request *request,\n+\t\t\t\t      std::unordered_set<const ControlId *> ids)\n+\t{\n+\t\tconst ControlList &metadata = request->metadata();\n+\n+\t\tfor (const auto id : ids) {\n+\t\t\tControlValue &value = metadata.get(id->id());\n+\n+\t\t\t....\n+\t\t}\n+\t}\n+   \\endcode\n+ *\n+ * This signal is emitted multiple times for the same request, it is in facts\n+ * emitted by the framework every time a new metadata list is made available\n+ * by the Camera to the application.\n+ *\n+ * The sum of all metadata lists reported through this signal is equal to\n+ * Request::metadata() list when the Request completes.\n+ *\n+ * Application can opt-in to handle this signal to receive fast notifications\n+ * of metadata availability or can equally access the full metadata list\n+ * at Request complete time through Request::metadata() if they have no interest\n+ * in early metadata notification.\n+ */\n+\n /**\n  * \\var Camera::bufferCompleted\n  * \\brief Signal emitted when a buffer for a request queued to the camera has\n",
    "prefixes": [
        "1/8"
    ]
}