{"id":26173,"url":"https://patchwork.libcamera.org/api/patches/26173/?format=json","web_url":"https://patchwork.libcamera.org/patch/26173/","project":{"id":1,"url":"https://patchwork.libcamera.org/api/projects/1/?format=json","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-5-mzamazal@redhat.com>","date":"2026-02-16T20:30:23","name":"[RFC,v2,04/14] libcamera: software_isp: Track unused parameters buffers","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"68a299e60329939c8c206c2977670b284a45f199","submitter":{"id":177,"url":"https://patchwork.libcamera.org/api/people/177/?format=json","name":"Milan Zamazal","email":"mzamazal@redhat.com"},"delegate":null,"mbox":"https://patchwork.libcamera.org/patch/26173/mbox/","series":[{"id":5795,"url":"https://patchwork.libcamera.org/api/series/5795/?format=json","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/26173/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/26173/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 6A551C0DA4\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 16 Feb 2026 20:30:54 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 33E6462217;\n\tMon, 16 Feb 2026 21:30:54 +0100 (CET)","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 016BB62217\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 16 Feb 2026 21:30:51 +0100 (CET)","from mx-prod-mc-05.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-523-K96L4ck-OPSqiy_AJxfJaQ-1;\n\tMon, 16 Feb 2026 15:30:49 -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-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix)\n\twith ESMTPS\n\tid 300EB195608A for <libcamera-devel@lists.libcamera.org>;\n\tMon, 16 Feb 2026 20:30:48 +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 1ED7F18004AD; Mon, 16 Feb 2026 20:30:46 +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=\"OvLrocve\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1771273850;\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=kIWpIUzUQXN9/tCaqd8lQIkAEIvvGtlhVkYtCxSXG4I=;\n\tb=OvLrocvekkyOrqXemH1ycQlD+soe7NLVf6ej5vmcONYqcrJKiol3ymqS+QKuRlGueptwwW\n\tW961Yje2fqQWcBtMxJ6FXHGHLH+AKqIj4orpgeSYXjH5TQr93xq+talzfnzN/Cl6QfBOHo\n\tG2SufLmV5G2W/+o04RM7+8Gp9puwV74=","X-MC-Unique":"K96L4ck-OPSqiy_AJxfJaQ-1","X-Mimecast-MFC-AGG-ID":"K96L4ck-OPSqiy_AJxfJaQ_1771273848","From":"Milan Zamazal <mzamazal@redhat.com>","To":"libcamera-devel@lists.libcamera.org","Cc":"Milan Zamazal <mzamazal@redhat.com>","Subject":"[RFC PATCH v2 04/14] libcamera: software_isp: Track unused\n\tparameters buffers","Date":"Mon, 16 Feb 2026 21:30:23 +0100","Message-ID":"<20260216203034.27558-5-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":"3YGvVjDv_XonIG37-O1du6YIbftcCgLdh-5gb9tuPrs_1771273848","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\nSofwareIsp::availableParams_ is a queue 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 buffers' file descriptors as buffer ids.  The parameters buffers\nwill be shared with the IPA and debayering and we need their common\nidentification everywhere.  The buffer file descriptors are shared\nunchanged so they can be used for the purpose, avoiding a need to pass a\nspecial id->buffer mapping to the IPA and debayering on initialization.\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       |  2 ++\n src/libcamera/software_isp/software_isp.cpp    | 18 +++++++++++++++---\n 2 files changed, 17 insertions(+), 3 deletions(-)","diff":"diff --git a/include/libcamera/internal/software_isp/software_isp.h b/include/libcamera/internal/software_isp/software_isp.h\nindex dc6b6f7c1..a8b7b1eb1 100644\n--- a/include/libcamera/internal/software_isp/software_isp.h\n+++ b/include/libcamera/internal/software_isp/software_isp.h\n@@ -11,6 +11,7 @@\n #include <functional>\n #include <map>\n #include <memory>\n+#include <queue>\n #include <stdint.h>\n #include <string>\n #include <tuple>\n@@ -98,6 +99,7 @@ private:\n \tThread ispWorkerThread_;\n \tSharedMemObject<DebayerParams> sharedParams_;\n \tDebayerParams debayerParams_;\n+\tstd::queue<uint32_t> availableParams_;\n \tbool allocateParamsBuffers();\n \tDmaBufAllocator dmaHeap_;\n \tbool ccmEnabled_;\ndiff --git a/src/libcamera/software_isp/software_isp.cpp b/src/libcamera/software_isp/software_isp.cpp\nindex dc0a8eb84..adf2a03ab 100644\n--- a/src/libcamera/software_isp/software_isp.cpp\n+++ b/src/libcamera/software_isp/software_isp.cpp\n@@ -180,6 +180,10 @@ bool SoftwareIsp::allocateParamsBuffers()\n \t\treturn false;\n \t}\n \n+\tASSERT(sharedParams_.fd().get() >= 0);\n+\tconst uint32_t bufferId = sharedParams_.fd().get();\n+\tavailableParams_.push(bufferId);\n+\n \treturn true;\n }\n \n@@ -404,8 +408,15 @@ void SoftwareIsp::stop()\n  */\n void 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\t/* Well, busy loop, but this situation shouldn't normally happen. */\n+\t\twhile (availableParams_.empty())\n+\t\t\t;\n+\t}\n+\n+\tconst uint32_t paramsBufferId = availableParams_.front();\n+\tavailableParams_.pop();\n \tipa_->computeParams(frame, paramsBufferId);\n \tdebayer_->invokeMethod(&Debayer::process,\n \t\t\t       ConnectionTypeQueued, frame, paramsBufferId, input, output, debayerParams_);\n@@ -416,8 +427,9 @@ void SoftwareIsp::saveIspParams([[maybe_unused]] uint32_t paramsBufferId)\n \tdebayerParams_ = *sharedParams_;\n }\n \n-void SoftwareIsp::releaseIspParams([[maybe_unused]] uint32_t paramsBufferId)\n+void SoftwareIsp::releaseIspParams(uint32_t paramsBufferId)\n {\n+\tavailableParams_.push(paramsBufferId);\n }\n \n void SoftwareIsp::setSensorCtrls(const ControlList &sensorControls)\n","prefixes":["RFC","v2","04/14"]}