Show a patch.

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

{
    "id": 26856,
    "url": "https://patchwork.libcamera.org/api/1.1/patches/26856/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/26856/",
    "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": "<20260608150349.134371-8-mzamazal@redhat.com>",
    "date": "2026-06-08T15:03:36",
    "name": "[RFC,v4,07/17] libcamera: software_isp: Track unused parameters buffers",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "73c95f427a941b32464eb536485f758ea9ece9e3",
    "submitter": {
        "id": 177,
        "url": "https://patchwork.libcamera.org/api/1.1/people/177/?format=api",
        "name": "Milan Zamazal",
        "email": "mzamazal@redhat.com"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/26856/mbox/",
    "series": [
        {
            "id": 5982,
            "url": "https://patchwork.libcamera.org/api/1.1/series/5982/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=5982",
            "date": "2026-06-08T15:03:29",
            "name": "Software ISP: Share params and stats buffers",
            "version": 4,
            "mbox": "https://patchwork.libcamera.org/series/5982/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/26856/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/26856/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 36A8EC328C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon,  8 Jun 2026 15:04:38 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id C564461F1B;\n\tMon,  8 Jun 2026 17:04:37 +0200 (CEST)",
            "from us-smtp-delivery-124.mimecast.com\n\t(us-smtp-delivery-124.mimecast.com [170.10.129.124])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 03D7D61F00\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  8 Jun 2026 17:04:34 +0200 (CEST)",
            "from mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com\n\t(ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97])\n\tby relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3,\n\tcipher=TLS_AES_256_GCM_SHA384) id us-mta-103-Luh4S9tlNRaod2-3MdTlzQ-1;\n\tMon, 08 Jun 2026 11:04:15 -0400",
            "from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com\n\t(mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com\n\t[10.30.177.111])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\tkey-exchange X25519 server-signature RSA-PSS (2048 bits)\n\tserver-digest SHA256) (No client certificate requested)\n\tby mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix)\n\twith ESMTPS id DBEBF1800847; Mon,  8 Jun 2026 15:04:13 +0000 (UTC)",
            "from mzamazal-thinkpadp1gen7.tpbc.com (unknown [10.44.48.51])\n\tby mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix)\n\twith ESMTP id 3A5CD1800351; Mon,  8 Jun 2026 15:04:11 +0000 (UTC)"
        ],
        "Authentication-Results": "lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=redhat.com header.i=@redhat.com\n\theader.b=\"J1peoxoI\"; dkim-atps=neutral",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1780931073;\n\th=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n\tto:to:cc:cc:mime-version:mime-version:content-type:content-type:\n\tcontent-transfer-encoding:content-transfer-encoding:\n\tin-reply-to:in-reply-to:references:references;\n\tbh=4tddGy712352sjbLd3X1jE2tUkVJDxQazhu578EYriU=;\n\tb=J1peoxoIdVpb77axm5R78YtknLFSXARwYhHPS9nr2m6Bu5WP7i2kh0q59oX1W91HUykSIs\n\tVZ9UIKwasnJcb3a3BwZ5EH9e0NOGdMrtl74qDRo+lfnOg/TzzcfKNcUHNyw38Nr3aDYdOR\n\tKjfB98nOY+yYcuXmL4w8Y5X3vKpNZ/E=",
        "X-MC-Unique": "Luh4S9tlNRaod2-3MdTlzQ-1",
        "X-Mimecast-MFC-AGG-ID": "Luh4S9tlNRaod2-3MdTlzQ_1780931054",
        "From": "Milan Zamazal <mzamazal@redhat.com>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Cc": "Milan Zamazal <mzamazal@redhat.com>, Kieran Bingham\n\t<kieran.bingham@ideasonboard.com>, =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?=\n\t<barnabas.pocze@ideasonboard.com>,  johannes.goede@oss.qualcomm.com",
        "Subject": "[RFC PATCH v4 07/17] libcamera: software_isp: Track unused\n\tparameters buffers",
        "Date": "Mon,  8 Jun 2026 17:03:36 +0200",
        "Message-ID": "<20260608150349.134371-8-mzamazal@redhat.com>",
        "In-Reply-To": "<20260608150349.134371-1-mzamazal@redhat.com>",
        "References": "<20260608150349.134371-1-mzamazal@redhat.com>",
        "MIME-Version": "1.0",
        "X-Scanned-By": "MIMEDefang 3.4.1 on 10.30.177.111",
        "X-Mimecast-Spam-Score": "0",
        "X-Mimecast-MFC-PROC-ID": "JYyxR0JUegyBuU0SEZPdui3z3RItDRfLTN5VaBSjR5g_1780931054",
        "X-Mimecast-Originator": "redhat.com",
        "Content-Transfer-Encoding": "8bit",
        "content-type": "text/plain; charset=\"US-ASCII\"; x-default=true",
        "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": "As a preparation for introducing a ring of parameters buffers, this\npatch introduces tracking of parameters buffers available for use.\n\nSoftwareIsp::availableParams_ is a vector of ids of the buffers available\nfor use.  When a fresh parameter buffer is needed, its id is retrieved\nfrom there and once the buffer is no longer needed, it's put back there,\nin a method invoked by a signal.  This is similar to what the hardware\npipelines do.\n\nIf a parameters buffer is requested but there is no free available, it\nis an erroneous situation.  To recover from it, we have currently no\nbetter mechanism than to wait for an available buffer.  Simply returning\nfrom the processing would mean the finishing signals are not called,\nresulting in e.g. the input buffer not being returned.  This is\ndifferent from the hardware pipelines, which are structured somewhat\ndifferently.\n\nWe use 0 as the buffer id for now.  In followup patches, we will have to\nmake and pass a special id->buffer mapping to the IPA and debayering on\ninitialisation.\n\nNote that the parameters buffer id is still actually unused and the only\nbuffer currently used is still copied when passed to debayering.  This\npatch is just preparation for followup patches that will introduce\nmultiple buffers.\n\nSigned-off-by: Milan Zamazal <mzamazal@redhat.com>\n---\n .../internal/software_isp/software_isp.h      |  3 ++-\n src/libcamera/software_isp/software_isp.cpp   | 27 +++++++++++++++----\n 2 files changed, 24 insertions(+), 6 deletions(-)",
    "diff": "diff --git a/include/libcamera/internal/software_isp/software_isp.h b/include/libcamera/internal/software_isp/software_isp.h\nindex f97d25f0a..58fb9d752 100644\n--- a/include/libcamera/internal/software_isp/software_isp.h\n+++ b/include/libcamera/internal/software_isp/software_isp.h\n@@ -79,7 +79,7 @@ public:\n \tint queueBuffers(uint32_t frame, FrameBuffer *input,\n \t\t\t const std::map<const Stream *, FrameBuffer *> &outputs);\n \n-\tvoid process(uint32_t frame, FrameBuffer *input, FrameBuffer *output);\n+\tint process(uint32_t frame, FrameBuffer *input, FrameBuffer *output);\n \n \tSignal<FrameBuffer *> inputBufferReady;\n \tSignal<FrameBuffer *> outputBufferReady;\n@@ -99,6 +99,7 @@ private:\n \tThread ispWorkerThread_;\n \tSharedMemObject<DebayerParams> sharedParams_;\n \tDebayerParams debayerParams_;\n+\tstd::vector<uint32_t> availableParams_;\n \tDmaBufAllocator dmaHeap_;\n \tbool ccmEnabled_;\n \ndiff --git a/src/libcamera/software_isp/software_isp.cpp b/src/libcamera/software_isp/software_isp.cpp\nindex 774f2bf75..d48cd00ad 100644\n--- a/src/libcamera/software_isp/software_isp.cpp\n+++ b/src/libcamera/software_isp/software_isp.cpp\n@@ -185,6 +185,9 @@ bool SoftwareIsp::allocateParamsBuffers()\n \t\treturn false;\n \t}\n \n+\t/* Just a single buffer for now, let's use 0 as its id. */\n+\tavailableParams_.push_back(0);\n+\n \treturn true;\n }\n \n@@ -353,7 +356,12 @@ int SoftwareIsp::queueBuffers(uint32_t frame, FrameBuffer *input,\n \tfor (const auto &[stream, buffer] : outputs) {\n \t\tqueuedInputBuffers_.push_back(input);\n \t\tqueuedOutputBuffers_.push_back(buffer);\n-\t\tprocess(frame, input, buffer);\n+\t\tint ret = process(frame, input, buffer);\n+\t\tif (ret) {\n+\t\t\tqueuedInputBuffers_.pop_back();\n+\t\t\tqueuedOutputBuffers_.pop_back();\n+\t\t\treturn ret;\n+\t\t}\n \t}\n \n \treturn 0;\n@@ -413,15 +421,23 @@ void SoftwareIsp::stop()\n  * \\param[in] frame The frame number\n  * \\param[in] input The input framebuffer\n  * \\param[out] output The framebuffer to write the processed frame to\n+ * \\return 0 on success, -EAGAIN if a parameter buffer underrun occurs\n  */\n-void SoftwareIsp::process(uint32_t frame, FrameBuffer *input, FrameBuffer *output)\n+int SoftwareIsp::process(uint32_t frame, FrameBuffer *input, FrameBuffer *output)\n {\n-\t/* \\todo Provide a real value */\n-\tconstexpr uint32_t paramsBufferId = 0;\n+\tif (availableParams_.empty()) {\n+\t\tLOG(SoftwareIsp, Error) << \"Parameters buffer underrun\";\n+\t\treturn -EAGAIN;\n+\t}\n+\n+\tconst uint32_t paramsBufferId = availableParams_.back();\n+\tavailableParams_.pop_back();\n \tipa_->computeParams(frame, paramsBufferId);\n \tdebayer_->invokeMethod(&Debayer::process,\n \t\t\t       ConnectionTypeQueued, frame, paramsBufferId,\n \t\t\t       input, output, debayerParams_);\n+\n+\treturn 0;\n }\n \n void SoftwareIsp::saveIspParams([[maybe_unused]] const uint32_t paramsBufferId)\n@@ -429,8 +445,9 @@ void SoftwareIsp::saveIspParams([[maybe_unused]] const uint32_t paramsBufferId)\n \tdebayerParams_ = *sharedParams_;\n }\n \n-void SoftwareIsp::paramsBufferReady([[maybe_unused]] const uint32_t paramsBufferId)\n+void SoftwareIsp::paramsBufferReady(const uint32_t paramsBufferId)\n {\n+\tavailableParams_.push_back(paramsBufferId);\n }\n \n void SoftwareIsp::setSensorCtrls(const ControlList &sensorControls)\n",
    "prefixes": [
        "RFC",
        "v4",
        "07/17"
    ]
}