Show a patch.

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

{
    "id": 23661,
    "url": "https://patchwork.libcamera.org/api/1.1/patches/23661/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/23661/",
    "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": "<20250626095944.1746345-4-paul.elder@ideasonboard.com>",
    "date": "2025-06-26T09:59:38",
    "name": "[RFC,3/7] libcamera: camera: Add indirection to Camera signal emissions",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": false,
    "hash": "457690684b8f0b89ab2430549c7edcc450ced291",
    "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/23661/mbox/",
    "series": [
        {
            "id": 5251,
            "url": "https://patchwork.libcamera.org/api/1.1/series/5251/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=5251",
            "date": "2025-06-26T09:59:35",
            "name": "Add Layers support",
            "version": 1,
            "mbox": "https://patchwork.libcamera.org/series/5251/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/23661/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/23661/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 B3315BDCBF\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 26 Jun 2025 10:00:25 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 038C668E01;\n\tThu, 26 Jun 2025 12:00:24 +0200 (CEST)",
            "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 8717568DF4\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 26 Jun 2025 12:00:19 +0200 (CEST)",
            "from neptunite.hamster-moth.ts.net (unknown\n\t[IPv6:2404:7a81:160:2100:258b:9e43:6dff:c39d])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id B264E743;\n\tThu, 26 Jun 2025 11:59:59 +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=\"HiiZoet1\"; dkim-atps=neutral",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1750932000;\n\tbh=jpm2IqAsPQETaFvOFA18lMB/Zly2mSavp3k6Usah3xI=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=HiiZoet1aGQ7ssoRHEI1RH3bMe0DvOycJrdi+B2ADzl91MzH0nXKxmIXpR3f+LuB/\n\tepExQLzTythSg0drH3fsFS3VMiko4GGH6JvOOqMh6OQiBuykpCFPE2OXkIqZIo/Wuw\n\twE2YAxVi5fU4Ol5MwxwObRdXKj31cjQOeSK0aVT8=",
        "From": "Paul Elder <paul.elder@ideasonboard.com>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Cc": "Paul Elder <paul.elder@ideasonboard.com>, kieran.bingham@ideasonboard.com",
        "Subject": "[RFC PATCH 3/7] libcamera: camera: Add indirection to Camera signal\n\temissions",
        "Date": "Thu, 26 Jun 2025 18:59:38 +0900",
        "Message-ID": "<20250626095944.1746345-4-paul.elder@ideasonboard.com>",
        "X-Mailer": "git-send-email 2.47.2",
        "In-Reply-To": "<20250626095944.1746345-1-paul.elder@ideasonboard.com>",
        "References": "<20250626095944.1746345-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>\n---\n include/libcamera/internal/camera.h |  4 ++++\n src/libcamera/camera.cpp            | 23 +++++++++++++++++++++--\n src/libcamera/pipeline_handler.cpp  |  2 +-\n src/libcamera/request.cpp           |  2 +-\n 4 files changed, 27 insertions(+), 4 deletions(-)",
    "diff": "diff --git a/include/libcamera/internal/camera.h b/include/libcamera/internal/camera.h\nindex 18f5c32a18e4..967d4e1693ec 100644\n--- a/include/libcamera/internal/camera.h\n+++ b/include/libcamera/internal/camera.h\n@@ -35,6 +35,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 \tControlInfoMap controlInfo_;\n \tControlList properties_;\ndiff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp\nindex c180a5fdde93..c3e656cab671 100644\n--- a/src/libcamera/camera.cpp\n+++ b/src/libcamera/camera.cpp\n@@ -737,6 +737,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@@ -947,7 +966,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@@ -1451,7 +1470,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 d84dff3c9f19..b5faaae08d4c 100644\n--- a/src/libcamera/pipeline_handler.cpp\n+++ b/src/libcamera/pipeline_handler.cpp\n@@ -527,7 +527,7 @@ void PipelineHandler::doQueueRequests()\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": [
        "RFC",
        "3/7"
    ]
}