Patch Detail
Show a patch.
GET /api/patches/26181/?format=api
{ "id": 26181, "url": "https://patchwork.libcamera.org/api/patches/26181/?format=api", "web_url": "https://patchwork.libcamera.org/patch/26181/", "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": "<20260216203034.27558-13-mzamazal@redhat.com>", "date": "2026-02-16T20:30:31", "name": "[RFC,v2,12/14] libcamera: software_isp: Track statistics buffers", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "4f066e2721457d07a45e26ed2ff7a7a2214202b9", "submitter": { "id": 177, "url": "https://patchwork.libcamera.org/api/people/177/?format=api", "name": "Milan Zamazal", "email": "mzamazal@redhat.com" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/26181/mbox/", "series": [ { "id": 5795, "url": "https://patchwork.libcamera.org/api/series/5795/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=5795", "date": "2026-02-16T20:30:19", "name": "Software ISP: Share params and stats buffers", "version": 2, "mbox": "https://patchwork.libcamera.org/series/5795/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/26181/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/26181/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 5F3AFC0DA4\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 16 Feb 2026 20:31:08 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id F17596223C;\n\tMon, 16 Feb 2026 21:31:07 +0100 (CET)", "from us-smtp-delivery-124.mimecast.com\n\t(us-smtp-delivery-124.mimecast.com [170.10.133.124])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id D04596222B\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 16 Feb 2026 21:31:05 +0100 (CET)", "from mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com\n\t(ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63])\n\tby relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3,\n\tcipher=TLS_AES_256_GCM_SHA384) id us-mta-34-TNwyuSzvNSWAmEqAhBoWOw-1;\n\tMon, 16 Feb 2026 15:31:03 -0500", "from mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com\n\t(mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com\n\t[10.30.177.93])\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-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix)\n\twith ESMTPS\n\tid 7C2A219560B7 for <libcamera-devel@lists.libcamera.org>;\n\tMon, 16 Feb 2026 20:31:02 +0000 (UTC)", "from mzamazal-thinkpadp1gen7.tpbc.com (unknown [10.44.32.25])\n\tby mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix)\n\twith ESMTP id 57E6218004AD; Mon, 16 Feb 2026 20:31:01 +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=\"KHqiBGA4\"; dkim-atps=neutral", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1771273864;\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=668hMHR70XZOb9RF+lQOpoi1B8/acRs0FdbnirSL43I=;\n\tb=KHqiBGA40cv4dbZq7jzlkMS4hJm3U4Lpt/fD4/Z3T3R/jHi65GE9Uo3K5Wyr1VNKJXGCTD\n\tO0Ns0uCTt+5aDpb7tsMn23ST0WOR2ZQSfYi/FF0I75W89eyoF+C9YvTqkEloftqNHWL5Co\n\tZ0wq1dVBdYV+bm+ZW4BTszzVt69f5mg=", "X-MC-Unique": "TNwyuSzvNSWAmEqAhBoWOw-1", "X-Mimecast-MFC-AGG-ID": "TNwyuSzvNSWAmEqAhBoWOw_1771273862", "From": "Milan Zamazal <mzamazal@redhat.com>", "To": "libcamera-devel@lists.libcamera.org", "Cc": "Milan Zamazal <mzamazal@redhat.com>", "Subject": "[RFC PATCH v2 12/14] libcamera: software_isp: Track statistics\n\tbuffers", "Date": "Mon, 16 Feb 2026 21:30:31 +0100", "Message-ID": "<20260216203034.27558-13-mzamazal@redhat.com>", "In-Reply-To": "<20260216203034.27558-1-mzamazal@redhat.com>", "References": "<20260216203034.27558-1-mzamazal@redhat.com>", "MIME-Version": "1.0", "X-Scanned-By": "MIMEDefang 3.4.1 on 10.30.177.93", "X-Mimecast-Spam-Score": "0", "X-Mimecast-MFC-PROC-ID": "Z7FoDZ5LN0AO1WnbpyzODBKWhimcgBeyDHHU7AAOk00_1771273862", "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 passing the shared statistics buffers to IPA, this\npatch introduces tracking statistics buffer ids.\n\nSofwareIsp::availableStats_ is a queue of ids of the buffers available\nfor use. When a fresh statistics 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\nWe use buffers' file descriptors as buffer ids. The statistics buffers\nwill be shared with the IPA, SwIspStats and debayering and we need their\ncommon identification everywhere. The buffer file descriptors are\nshared unchanged so they can be used for the purpose, avoiding a need to\npass a special mapping to the IPA and debayering on initialization.\n\nNote that the statistics buffer id is still actually unused, this will\nbe changed once the buffers are shared with the IPA.\n\nSigned-off-by: Milan Zamazal <mzamazal@redhat.com>\n---\n .../libcamera/internal/software_isp/software_isp.h | 1 +\n src/libcamera/software_isp/debayer_egl.cpp | 4 ++--\n src/libcamera/software_isp/software_isp.cpp | 13 +++++++++++--\n 3 files changed, 14 insertions(+), 4 deletions(-)", "diff": "diff --git a/include/libcamera/internal/software_isp/software_isp.h b/include/libcamera/internal/software_isp/software_isp.h\nindex 1f3eb75f6..45128f25f 100644\n--- a/include/libcamera/internal/software_isp/software_isp.h\n+++ b/include/libcamera/internal/software_isp/software_isp.h\n@@ -104,6 +104,7 @@ private:\n \tDebayerParams debayerParams_;\n \tstd::queue<uint32_t> availableParams_;\n \tbool allocateParamsBuffers(const unsigned int bufferCount);\n+\tstd::queue<uint32_t> availableStats_;\n \tstd::unique_ptr<SwStatsCpu> allocateStatsBuffers(\n \t\tconst GlobalConfiguration &configuration,\n \t\tstd::vector<SharedFD> &fdStats,\ndiff --git a/src/libcamera/software_isp/debayer_egl.cpp b/src/libcamera/software_isp/debayer_egl.cpp\nindex 5715b80ae..66e1fcac2 100644\n--- a/src/libcamera/software_isp/debayer_egl.cpp\n+++ b/src/libcamera/software_isp/debayer_egl.cpp\n@@ -537,7 +537,7 @@ int DebayerEGL::debayerGPU(MappedFrameBuffer &in, int out_fd, const DebayerParam\n }\n \n void DebayerEGL::process(uint32_t frame,\n-\t\t\t [[maybe_unused]] const uint32_t statsBufferId,\n+\t\t\t const uint32_t statsBufferId,\n \t\t\t const uint32_t paramsBufferId,\n \t\t\t FrameBuffer *input,\n \t\t\t FrameBuffer *output)\n@@ -573,7 +573,7 @@ void DebayerEGL::process(uint32_t frame,\n \tmetadata.planes()[0].bytesused = output->planes()[0].length;\n \n \t/* Calculate stats for the whole frame */\n-\tstats_->processFrame(frame, 0, input);\n+\tstats_->processFrame(frame, statsBufferId, input);\n \tdmaSyncers.clear();\n \n \toutputBufferReady.emit(output);\ndiff --git a/src/libcamera/software_isp/software_isp.cpp b/src/libcamera/software_isp/software_isp.cpp\nindex a1a9ddbf4..f3ee5773b 100644\n--- a/src/libcamera/software_isp/software_isp.cpp\n+++ b/src/libcamera/software_isp/software_isp.cpp\n@@ -222,6 +222,7 @@ std::unique_ptr<SwStatsCpu> SoftwareIsp::allocateStatsBuffers(\n \t\tunsigned int bufferId = shared.fd().get();\n \t\tfdStats.emplace_back(shared.fd());\n \t\tsharedStats->emplace(bufferId, std::move(shared));\n+\t\tavailableStats_.push(bufferId);\n \t}\n \n \tauto stats = std::make_unique<SwStatsCpu>(configuration, std::move(sharedStats));\n@@ -457,11 +458,18 @@ void SoftwareIsp::process(uint32_t frame, FrameBuffer *input, FrameBuffer *outpu\n \t\twhile (availableParams_.empty())\n \t\t\t;\n \t}\n+\tif (availableStats_.empty()) {\n+\t\tLOG(SoftwareIsp, Error) << \"Statistics buffer underrun\";\n+\t\t/* Well, busy loop, but this situation shouldn't normally happen. */\n+\t\twhile (availableStats_.empty())\n+\t\t\t;\n+\t}\n \n \tconst uint32_t paramsBufferId = availableParams_.front();\n \tavailableParams_.pop();\n+\tconst uint32_t statsBufferId = availableStats_.front();\n+\tavailableStats_.pop();\n \tipa_->computeParams(frame, paramsBufferId);\n-\tconst uint32_t statsBufferId = 0;\n \tdebayer_->invokeMethod(&Debayer::process,\n \t\t\t ConnectionTypeQueued, frame,\n \t\t\t statsBufferId, paramsBufferId, input, output);\n@@ -487,8 +495,9 @@ void SoftwareIsp::statsReady(uint32_t frame, const uint32_t statsBufferId)\n \tispStatsReady.emit(frame, statsBufferId);\n }\n \n-void SoftwareIsp::statsProcessed([[maybe_unused]] const uint32_t statsBufferId)\n+void SoftwareIsp::statsProcessed(const uint32_t statsBufferId)\n {\n+\tavailableStats_.push(statsBufferId);\n }\n \n void SoftwareIsp::inputReady(FrameBuffer *input)\n", "prefixes": [ "RFC", "v2", "12/14" ] }