Show a patch.

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

{
    "id": 26031,
    "url": "https://patchwork.libcamera.org/api/patches/26031/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/26031/",
    "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": "<20260129082814.1777779-4-paul.elder@ideasonboard.com>",
    "date": "2026-01-29T08:28:09",
    "name": "[v6,3/8] libcamera: camera: Add indirection to Camera signal emissions",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "5c1b3d458f6b4409db14b9566ebfd949243542a8",
    "submitter": {
        "id": 17,
        "url": "https://patchwork.libcamera.org/api/people/17/?format=api",
        "name": "Paul Elder",
        "email": "paul.elder@ideasonboard.com"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/26031/mbox/",
    "series": [
        {
            "id": 5753,
            "url": "https://patchwork.libcamera.org/api/series/5753/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=5753",
            "date": "2026-01-29T08:28:06",
            "name": "Add Layers support",
            "version": 6,
            "mbox": "https://patchwork.libcamera.org/series/5753/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/26031/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/26031/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 91194C3226\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 29 Jan 2026 08:28:33 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 4A7BB61FCF;\n\tThu, 29 Jan 2026 09:28:33 +0100 (CET)",
            "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 31E5961FC6\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 29 Jan 2026 09:28:30 +0100 (CET)",
            "from neptunite.flets-east.jp (unknown\n\t[IPv6:2404:7a81:160:2100:2eea:f891:1bd7:2691])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 2E5AB1AED;\n\tThu, 29 Jan 2026 09:27:50 +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=\"lxmGy67K\"; dkim-atps=neutral",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1769675272;\n\tbh=0JLjnVcYcwPLW/uhk53vTIOSM+l2ha7LNK092Powohg=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=lxmGy67KLfxiua+OSzZDvtanyMS2yVfjDhBrWx3sUtz5e46I9d2eoWpcoTjUXWufz\n\t4UIo7lhVzTjAbn2Z2e+pI3PGeF1x6LcK8VdLAZFnD3AHNbG2u6oyOJ3uGJ88wrhe9G\n\tdeXgD2o8dXOffRR1T5mj10Bv2HQFcJOJipVpuh3w=",
        "From": "Paul Elder <paul.elder@ideasonboard.com>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Cc": "Paul Elder <paul.elder@ideasonboard.com>,\n\tStefan Klug <stefan.klug@ideasonboard.com>,\n\tKieran Bingham <kieran.bingham@ideasonboard.com>",
        "Subject": "[PATCH v6 3/8] libcamera: camera: Add indirection to Camera signal\n\temissions",
        "Date": "Thu, 29 Jan 2026 17:28:09 +0900",
        "Message-ID": "<20260129082814.1777779-4-paul.elder@ideasonboard.com>",
        "X-Mailer": "git-send-email 2.47.2",
        "In-Reply-To": "<20260129082814.1777779-1-paul.elder@ideasonboard.com>",
        "References": "<20260129082814.1777779-1-paul.elder@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 an extra level of indirection when emitting signals from the Camera.\nThis is to facilitate the implementation of the layer system in the near\nfuture, which will need to hook into Camera signal emissions.\n\nSigned-off-by: Paul Elder <paul.elder@ideasonboard.com>\nReviewed-by: Stefan Klug <stefan.klug@ideasonboard.com>\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\n---\nNo change in v6\n\nNo change in v5\n\nNo change in v4\n\nChanges in v3:\n- Add documentation\n\nNo change in v2\n---\n include/libcamera/internal/camera.h |  4 +++\n src/libcamera/camera.cpp            | 47 +++++++++++++++++++++++++++--\n src/libcamera/pipeline_handler.cpp  |  2 +-\n src/libcamera/request.cpp           |  2 +-\n 4 files changed, 51 insertions(+), 4 deletions(-)",
    "diff": "diff --git a/include/libcamera/internal/camera.h b/include/libcamera/internal/camera.h\nindex 8a2e9ed5894d..d28cd921a0f9 100644\n--- a/include/libcamera/internal/camera.h\n+++ b/include/libcamera/internal/camera.h\n@@ -36,6 +36,10 @@ public:\n \tPipelineHandler *pipe() { return pipe_.get(); }\n \tconst PipelineHandler *pipe() const { return pipe_.get(); }\n \n+\tvoid emitBufferCompleted(Request *request, FrameBuffer *buffer);\n+\tvoid emitRequestCompleted(Request *request);\n+\tvoid emitDisconnected();\n+\n \tstd::list<Request *> queuedRequests_;\n \tstd::queue<Request *> waitingRequests_;\n \tControlInfoMap controlInfo_;\ndiff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp\nindex 7c0e93ff483f..a2132e61a7bd 100644\n--- a/src/libcamera/camera.cpp\n+++ b/src/libcamera/camera.cpp\n@@ -611,6 +611,30 @@ Camera::Private::~Private()\n  * \\copydoc Camera::Private::pipe()\n  */\n \n+/**\n+ * \\fn Camera::Private::emitBufferCompleted\n+ * \\copydoc Camera::bufferCompleted\n+ *\n+ * This is one level of indirection so that we can call into the LayerManager\n+ * before actually emitting the Signal.\n+ */\n+\n+/**\n+ * \\fn Camera::Private::emitRequestCompleted\n+ * \\copydoc Camera::requestCompleted\n+ *\n+ * This is one level of indirection so that we can call into the LayerManager\n+ * before actually emitting the Signal.\n+ */\n+\n+/**\n+ * \\fn Camera::Private::emitDisconnected\n+ * \\copydoc Camera::disconnected\n+ *\n+ * This is one level of indirection so that we can call into the LayerManager\n+ * before actually emitting the Signal.\n+ */\n+\n /**\n  * \\fn Camera::Private::validator()\n  * \\brief Retrieve the control validator related to this camera\n@@ -746,6 +770,25 @@ void Camera::Private::setState(State state)\n {\n \tstate_.store(state, std::memory_order_release);\n }\n+\n+void Camera::Private::emitBufferCompleted(Request *request, FrameBuffer *buffer)\n+{\n+\tCamera *camera = _o<Camera>();\n+\tcamera->bufferCompleted.emit(request, buffer);\n+}\n+\n+void Camera::Private::emitRequestCompleted(Request *request)\n+{\n+\tCamera *camera = _o<Camera>();\n+\tcamera->requestCompleted.emit(request);\n+}\n+\n+void Camera::Private::emitDisconnected()\n+{\n+\tCamera *camera = _o<Camera>();\n+\tcamera->disconnected.emit();\n+}\n+\n #endif /* __DOXYGEN_PUBLIC__ */\n \n /**\n@@ -956,7 +999,7 @@ void Camera::disconnect()\n \tLOG(Camera, Debug) << \"Disconnecting camera \" << id();\n \n \t_d()->disconnect();\n-\tdisconnected.emit();\n+\t_d()->emitDisconnected();\n }\n \n int Camera::exportFrameBuffers(Stream *stream,\n@@ -1486,7 +1529,7 @@ void Camera::requestComplete(Request *request)\n \t\t\t\t  true))\n \t\tLOG(Camera, Fatal) << \"Trying to complete a request when stopped\";\n \n-\trequestCompleted.emit(request);\n+\t_d()->emitRequestCompleted(request);\n }\n \n } /* namespace libcamera */\ndiff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp\nindex 5c469e5bad24..c51ce4048558 100644\n--- a/src/libcamera/pipeline_handler.cpp\n+++ b/src/libcamera/pipeline_handler.cpp\n@@ -563,7 +563,7 @@ void PipelineHandler::doQueueRequests(Camera *camera)\n bool PipelineHandler::completeBuffer(Request *request, FrameBuffer *buffer)\n {\n \tCamera *camera = request->_d()->camera();\n-\tcamera->bufferCompleted.emit(request, buffer);\n+\tcamera->_d()->emitBufferCompleted(request, buffer);\n \treturn request->_d()->completeBuffer(buffer);\n }\n \ndiff --git a/src/libcamera/request.cpp b/src/libcamera/request.cpp\nindex 57f1f060d5b4..aa76188d3e42 100644\n--- a/src/libcamera/request.cpp\n+++ b/src/libcamera/request.cpp\n@@ -145,7 +145,7 @@ void Request::Private::doCancelRequest()\n \n \tfor (FrameBuffer *buffer : pending_) {\n \t\tbuffer->_d()->cancel();\n-\t\tcamera_->bufferCompleted.emit(request, buffer);\n+\t\tcamera_->_d()->emitBufferCompleted(request, buffer);\n \t}\n \n \tcancelled_ = true;\n",
    "prefixes": [
        "v6",
        "3/8"
    ]
}