Show a patch.

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

{
    "id": 24224,
    "url": "https://patchwork.libcamera.org/api/1.1/patches/24224/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/24224/",
    "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": "<20250825114219.562831-4-paul.elder@ideasonboard.com>",
    "date": "2025-08-25T11:42:05",
    "name": "[v4,3/8] libcamera: camera: Add indirection to Camera signal emissions",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": false,
    "hash": "5c1b3d458f6b4409db14b9566ebfd949243542a8",
    "submitter": {
        "id": 17,
        "url": "https://patchwork.libcamera.org/api/1.1/people/17/?format=api",
        "name": "Paul Elder",
        "email": "paul.elder@ideasonboard.com"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/24224/mbox/",
    "series": [
        {
            "id": 5401,
            "url": "https://patchwork.libcamera.org/api/1.1/series/5401/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=5401",
            "date": "2025-08-25T11:42:02",
            "name": "Add Layers support",
            "version": 4,
            "mbox": "https://patchwork.libcamera.org/series/5401/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/24224/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/24224/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 73C6DBEFBE\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 25 Aug 2025 11:42:44 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id BB774692F5;\n\tMon, 25 Aug 2025 13:42:43 +0200 (CEST)",
            "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id CAF3C692E3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 25 Aug 2025 13:42:38 +0200 (CEST)",
            "from neptunite.infra.iob (unknown\n\t[IPv6:2404:7a81:160:2100:39d7:37aa:64a2:5533])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id E9B354B30;\n\tMon, 25 Aug 2025 13:41:34 +0200 (CEST)"
        ],
        "Authentication-Results": "lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"O4d2VW2F\"; dkim-atps=neutral",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1756122096;\n\tbh=PjYVh5PrJvYFdHvwINV+vlYyyMY+Qr9l0qLr3cw4oZw=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=O4d2VW2FmXnoiuwm43mN5moSs5MHZhBvczpt7zsqMQ58WEMM+TcaG9CQfYq++strR\n\tVJAOF/w896mn+yNazthcxT5RP8IidupzemmOjyzWef9y/YFMaOCMr8j7tnvIVvERg/\n\tsJ7UzCF5z++rzuBQOuvPfba4Xzqq3RjVgugvmeT8=",
        "From": "Paul Elder <paul.elder@ideasonboard.com>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Cc": "Paul Elder <paul.elder@ideasonboard.com>, kieran.bingham@ideasonboard.com,\n\tstefan.klug@ideasonboard.com, barnabas.pocze@ideasonboard.com",
        "Subject": "[PATCH v4 3/8] libcamera: camera: Add indirection to Camera signal\n\temissions",
        "Date": "Mon, 25 Aug 2025 20:42:05 +0900",
        "Message-ID": "<20250825114219.562831-4-paul.elder@ideasonboard.com>",
        "X-Mailer": "git-send-email 2.47.2",
        "In-Reply-To": "<20250825114219.562831-1-paul.elder@ideasonboard.com>",
        "References": "<20250825114219.562831-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 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 2e1e146a25b1..99aed4f0703a 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@@ -1480,7 +1523,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 e5f9e55c9783..a7d98fe2fa65 100644\n--- a/src/libcamera/pipeline_handler.cpp\n+++ b/src/libcamera/pipeline_handler.cpp\n@@ -552,7 +552,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 7f1e11e8f913..b4ae0f41a34c 100644\n--- a/src/libcamera/request.cpp\n+++ b/src/libcamera/request.cpp\n@@ -137,7 +137,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": [
        "v4",
        "3/8"
    ]
}