{"id":20551,"url":"https://patchwork.libcamera.org/api/patches/20551/?format=json","web_url":"https://patchwork.libcamera.org/patch/20551/","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":"<20240703175119.1872585-11-mzamazal@redhat.com>","date":"2024-07-03T17:51:10","name":"[v2,10/19] libcamera: software_isp: Call Algorithm::configure","commit_ref":null,"pull_url":null,"state":"superseded","archived":false,"hash":"a2d3bbceeb125a4f0b8c166cc42cf27c91056633","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/20551/mbox/","series":[{"id":4440,"url":"https://patchwork.libcamera.org/api/series/4440/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=4440","date":"2024-07-03T17:51:00","name":"Software ISP refactoring","version":2,"mbox":"https://patchwork.libcamera.org/series/4440/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/20551/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/20551/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 466BFC3240\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed,  3 Jul 2024 17:51:59 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 43FBC63368;\n\tWed,  3 Jul 2024 19:51:58 +0200 (CEST)","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 397E662E26\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  3 Jul 2024 19:51:52 +0200 (CEST)","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-684-VyTMsswuNNGzipqDDWJ4Fw-1;\n\tWed, 03 Jul 2024 13:51:47 -0400","from mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com\n\t(mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com\n\t[10.30.177.12])\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 id 2F21419560B0; Wed,  3 Jul 2024 17:51:46 +0000 (UTC)","from nuthatch.redhat.com (unknown [10.45.224.13])\n\tby mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix)\n\twith ESMTP id 8AA011954B0E; Wed,  3 Jul 2024 17:51:44 +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=\"RBcbWY0H\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1720029111;\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=bm7lFhcbwazjcjxChPZfLnE1kemQthOS5fvyqSVA+UU=;\n\tb=RBcbWY0HMTX1uFcXkm72adTiiG2NJjKLjELWfTZftbKUgF9Ry3r5JzxUIrbrerRwWEbSOW\n\tsPUNWD9blYK+/excF6QeS0o1ZvLUfqn2DmSSs69FgfkI4KrSBRK5cTvzB3MmmcsEmCrcHC\n\t4TOt+uDBb/Ehvg0naKzuQIad1kG5NiQ=","X-MC-Unique":"VyTMsswuNNGzipqDDWJ4Fw-1","From":"Milan Zamazal <mzamazal@redhat.com>","To":"libcamera-devel@lists.libcamera.org","Cc":"Milan Zamazal <mzamazal@redhat.com>,\n\tUmang Jain <umang.jain@ideasonboard.com>","Subject":"[PATCH v2 10/19] libcamera: software_isp: Call Algorithm::configure","Date":"Wed,  3 Jul 2024 19:51:10 +0200","Message-ID":"<20240703175119.1872585-11-mzamazal@redhat.com>","In-Reply-To":"<20240703175119.1872585-1-mzamazal@redhat.com>","References":"<20240703175119.1872585-1-mzamazal@redhat.com>","MIME-Version":"1.0","X-Scanned-By":"MIMEDefang 3.0 on 10.30.177.12","X-Mimecast-Spam-Score":"0","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":"This patch adds Algorithm::configure call for the defined algorithms.\nThis is preparation only since there are currently no Algorithm based\nalgorithms defined.\n\nA part of this change is passing IPAConfigInfo instead of ControlInfoMap\nto configure() calls as this is what Algorithm::configure expects.\n\nSigned-off-by: Milan Zamazal <mzamazal@redhat.com>\n---\n .../libcamera/internal/software_isp/software_isp.h   |  2 +-\n include/libcamera/ipa/soft.mojom                     |  6 +++++-\n src/ipa/simple/module.h                              |  4 +++-\n src/ipa/simple/soft_simple.cpp                       | 12 +++++++++---\n src/libcamera/pipeline/simple/simple.cpp             | 11 +++++++----\n src/libcamera/software_isp/software_isp.cpp          |  7 ++++---\n 6 files changed, 29 insertions(+), 13 deletions(-)","diff":"diff --git a/include/libcamera/internal/software_isp/software_isp.h b/include/libcamera/internal/software_isp/software_isp.h\nindex 7365b49a..ff26b1d4 100644\n--- a/include/libcamera/internal/software_isp/software_isp.h\n+++ b/include/libcamera/internal/software_isp/software_isp.h\n@@ -61,7 +61,7 @@ public:\n \n \tint configure(const StreamConfiguration &inputCfg,\n \t\t      const std::vector<std::reference_wrapper<StreamConfiguration>> &outputCfgs,\n-\t\t      const ControlInfoMap &sensorControls);\n+\t\t      const ipa::soft::IPAConfigInfo &configInfo);\n \n \tint exportBuffers(unsigned int output, unsigned int count,\n \t\t\t  std::vector<std::unique_ptr<FrameBuffer>> *buffers);\ndiff --git a/include/libcamera/ipa/soft.mojom b/include/libcamera/ipa/soft.mojom\nindex bd48ece9..5e124016 100644\n--- a/include/libcamera/ipa/soft.mojom\n+++ b/include/libcamera/ipa/soft.mojom\n@@ -8,6 +8,10 @@ module ipa.soft;\n \n import \"include/libcamera/ipa/core.mojom\";\n \n+struct IPAConfigInfo {\n+\tlibcamera.ControlInfoMap sensorControls;\n+};\n+\n interface IPASoftInterface {\n \tinit(libcamera.IPASettings settings,\n \t     libcamera.SharedFD fdStats,\n@@ -16,7 +20,7 @@ interface IPASoftInterface {\n \t\t=> (int32 ret);\n \tstart() => (int32 ret);\n \tstop();\n-\tconfigure(libcamera.ControlInfoMap sensorCtrlInfoMap)\n+\tconfigure(IPAConfigInfo configInfo)\n \t\t=> (int32 ret);\n \n \t[async] processStats(uint32 frame, uint32 bufferId, libcamera.ControlList sensorControls);\ndiff --git a/src/ipa/simple/module.h b/src/ipa/simple/module.h\nindex 33a7d1db..8d4d53fb 100644\n--- a/src/ipa/simple/module.h\n+++ b/src/ipa/simple/module.h\n@@ -9,6 +9,8 @@\n \n #include <libcamera/controls.h>\n \n+#include <libcamera/ipa/soft_ipa_interface.h>\n+\n #include \"libcamera/internal/software_isp/debayer_params.h\"\n #include \"libcamera/internal/software_isp/swisp_stats.h\"\n \n@@ -20,7 +22,7 @@ namespace libcamera {\n \n namespace ipa::soft {\n \n-using Module = ipa::Module<IPAContext, IPAFrameContext, ControlInfoMap,\n+using Module = ipa::Module<IPAContext, IPAFrameContext, IPAConfigInfo,\n \t\t\t   DebayerParams, SwIspStats>;\n \n } /* namespace ipa::soft */\ndiff --git a/src/ipa/simple/soft_simple.cpp b/src/ipa/simple/soft_simple.cpp\nindex dd300387..49fff312 100644\n--- a/src/ipa/simple/soft_simple.cpp\n+++ b/src/ipa/simple/soft_simple.cpp\n@@ -72,7 +72,7 @@ public:\n \t\t const SharedFD &fdStats,\n \t\t const SharedFD &fdParams,\n \t\t const ControlInfoMap &sensorInfoMap) override;\n-\tint configure(const ControlInfoMap &sensorInfoMap) override;\n+\tint configure(const IPAConfigInfo &configInfo) override;\n \n \tint start() override;\n \tvoid stop() override;\n@@ -206,9 +206,9 @@ int IPASoftSimple::init(const IPASettings &settings,\n \treturn 0;\n }\n \n-int IPASoftSimple::configure(const ControlInfoMap &sensorInfoMap)\n+int IPASoftSimple::configure(const IPAConfigInfo &configInfo)\n {\n-\tsensorInfoMap_ = sensorInfoMap;\n+\tsensorInfoMap_ = configInfo.sensorControls;\n \n \tconst ControlInfo &exposureInfo = sensorInfoMap_.find(V4L2_CID_EXPOSURE)->second;\n \tconst ControlInfo &gainInfo = sensorInfoMap_.find(V4L2_CID_ANALOGUE_GAIN)->second;\n@@ -247,6 +247,12 @@ int IPASoftSimple::configure(const ControlInfoMap &sensorInfoMap)\n \t\tagainMinStep_ = 1.0;\n \t}\n \n+\tfor (auto const &algo : algorithms()) {\n+\t\tint ret = algo->configure(context_, configInfo);\n+\t\tif (ret)\n+\t\t\treturn ret;\n+\t}\n+\n \tLOG(IPASoft, Info) << \"Exposure \" << exposureMin_ << \"-\" << exposureMax_\n \t\t\t   << \", gain \" << againMin_ << \"-\" << againMax_\n \t\t\t   << \" (\" << againMinStep_ << \")\";\ndiff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp\nindex e96674ae..e0c9fe5c 100644\n--- a/src/libcamera/pipeline/simple/simple.cpp\n+++ b/src/libcamera/pipeline/simple/simple.cpp\n@@ -1294,10 +1294,13 @@ int SimplePipelineHandler::configure(Camera *camera, CameraConfiguration *c)\n \tinputCfg.stride = captureFormat.planes[0].bpl;\n \tinputCfg.bufferCount = kNumInternalBuffers;\n \n-\treturn data->converter_\n-\t\t       ? data->converter_->configure(inputCfg, outputCfgs)\n-\t\t       : data->swIsp_->configure(inputCfg, outputCfgs,\n-\t\t\t\t\t\t data->sensor_->controls());\n+\tif (data->converter_)\n+\t\treturn data->converter_->configure(inputCfg, outputCfgs);\n+\telse {\n+\t\tipa::soft::IPAConfigInfo configInfo;\n+\t\tconfigInfo.sensorControls = data->sensor_->controls();\n+\t\treturn data->swIsp_->configure(inputCfg, outputCfgs, configInfo);\n+\t}\n }\n \n int SimplePipelineHandler::exportFrameBuffers(Camera *camera, Stream *stream,\ndiff --git a/src/libcamera/software_isp/software_isp.cpp b/src/libcamera/software_isp/software_isp.cpp\nindex 0f4b23d3..2bbb86da 100644\n--- a/src/libcamera/software_isp/software_isp.cpp\n+++ b/src/libcamera/software_isp/software_isp.cpp\n@@ -224,16 +224,17 @@ SoftwareIsp::strideAndFrameSize(const PixelFormat &outputFormat, const Size &siz\n  * \\brief Configure the SoftwareIsp object according to the passed in parameters\n  * \\param[in] inputCfg The input configuration\n  * \\param[in] outputCfgs The output configurations\n- * \\param[in] sensorControls ControlInfoMap of the controls supported by the sensor\n+ * \\param[in] configInfo The IPA configuration data, received from the pipeline\n+ * handler\n  * \\return 0 on success, a negative errno on failure\n  */\n int SoftwareIsp::configure(const StreamConfiguration &inputCfg,\n \t\t\t   const std::vector<std::reference_wrapper<StreamConfiguration>> &outputCfgs,\n-\t\t\t   const ControlInfoMap &sensorControls)\n+\t\t\t   const ipa::soft::IPAConfigInfo &configInfo)\n {\n \tASSERT(ipa_ && debayer_);\n \n-\tint ret = ipa_->configure(sensorControls);\n+\tint ret = ipa_->configure(configInfo);\n \tif (ret < 0)\n \t\treturn ret;\n \n","prefixes":["v2","10/19"]}