Patch Detail
Show a patch.
GET /api/1.1/patches/24923/?format=api
{ "id": 24923, "url": "https://patchwork.libcamera.org/api/1.1/patches/24923/?format=api", "web_url": "https://patchwork.libcamera.org/patch/24923/", "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": "<20251030165816.1095180-21-barnabas.pocze@ideasonboard.com>", "date": "2025-10-30T16:58:14", "name": "[RFC,v3,20/22] libcamera: pipeline: Fill `MetadataListPlan` of cameras", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": false, "hash": "e15e28718f69d320c09f7b16775057758630ef2e", "submitter": { "id": 216, "url": "https://patchwork.libcamera.org/api/1.1/people/216/?format=api", "name": "Barnabás Pőcze", "email": "barnabas.pocze@ideasonboard.com" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/24923/mbox/", "series": [ { "id": 5545, "url": "https://patchwork.libcamera.org/api/1.1/series/5545/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=5545", "date": "2025-10-30T16:57:54", "name": "libcamera: Add `MetadataList`", "version": 3, "mbox": "https://patchwork.libcamera.org/series/5545/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/24923/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/24923/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 D98D6C32CE\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 30 Oct 2025 16:58:51 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 72B9460967;\n\tThu, 30 Oct 2025 17:58:51 +0100 (CET)", "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 7E2E7608DD\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 30 Oct 2025 17:58:27 +0100 (CET)", "from pb-laptop.local (185.221.140.239.nat.pool.zt.hu\n\t[185.221.140.239])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 3A1DF6F3;\n\tThu, 30 Oct 2025 17:56:37 +0100 (CET)" ], "Authentication-Results": "lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"O9F4w+nX\"; dkim-atps=neutral", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1761843397;\n\tbh=sEbIS5dRHAfgUY53Ii32hXBCl6YO56ivpMm7rM1I9zQ=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=O9F4w+nXebw0HExtWjAs0gHKLWCq+biwyR3iaiq0o5XWxxZUeDtOKQpncaoCR4s/K\n\tt2Yr5w+cDnJphq6kkKJjXBUPFbDm+wbMjY7PB9EpwSFTYALW4OygUX/d3DrwUESD/5\n\tMgcLm9HG9ttu4ooPfyV7fBRls8uypUtaeDWBg3Nw=", "From": "=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>", "To": "libcamera-devel@lists.libcamera.org", "Cc": "Paul Elder <paul.elder@ideasonboard.com>", "Subject": "[RFC PATCH v3 20/22] libcamera: pipeline: Fill `MetadataListPlan` of\n\tcameras", "Date": "Thu, 30 Oct 2025 17:58:14 +0100", "Message-ID": "<20251030165816.1095180-21-barnabas.pocze@ideasonboard.com>", "X-Mailer": "git-send-email 2.51.1", "In-Reply-To": "<20251030165816.1095180-1-barnabas.pocze@ideasonboard.com>", "References": "<20251030165816.1095180-1-barnabas.pocze@ideasonboard.com>", "MIME-Version": "1.0", "Content-Type": "text/plain; charset=UTF-8", "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": "Fill the newly introduced `MetadataListPlan` member of the camera's private\ndata during initializations, similarly to the camera's `ControlInfoMap`.\n\nSigned-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\nReviewed-by: Paul Elder <paul.elder@ideasonboard.com>\n---\nchanges in v2:\n * add missing controls for `rkisp1`\n * sort alphabetically\n---\n .../internal/software_isp/software_isp.h | 3 +-\n include/libcamera/ipa/ipu3.mojom | 3 +-\n include/libcamera/ipa/mali-c55.mojom | 3 +-\n include/libcamera/ipa/raspberrypi.mojom | 1 +\n include/libcamera/ipa/rkisp1.mojom | 3 +-\n include/libcamera/ipa/soft.mojom | 3 +-\n src/ipa/ipu3/algorithms/agc.cpp | 4 +++\n src/ipa/ipu3/algorithms/awb.cpp | 12 +++++++\n src/ipa/ipu3/algorithms/awb.h | 1 +\n src/ipa/ipu3/ipa_context.cpp | 3 ++\n src/ipa/ipu3/ipa_context.h | 3 ++\n src/ipa/ipu3/ipu3.cpp | 8 +++--\n src/ipa/mali-c55/algorithms/agc.cpp | 5 +++\n src/ipa/mali-c55/algorithms/awb.cpp | 7 ++++\n src/ipa/mali-c55/algorithms/awb.h | 1 +\n src/ipa/mali-c55/algorithms/blc.cpp | 2 ++\n src/ipa/mali-c55/ipa_context.h | 3 ++\n src/ipa/mali-c55/mali-c55.cpp | 6 ++--\n src/ipa/rkisp1/algorithms/agc.cpp | 10 ++++++\n src/ipa/rkisp1/algorithms/awb.cpp | 4 +++\n src/ipa/rkisp1/algorithms/blc.cpp | 2 ++\n src/ipa/rkisp1/algorithms/ccm.cpp | 2 ++\n src/ipa/rkisp1/algorithms/goc.cpp | 2 ++\n src/ipa/rkisp1/algorithms/lux.cpp | 8 ++++-\n src/ipa/rkisp1/ipa_context.h | 1 +\n src/ipa/rkisp1/rkisp1.cpp | 8 +++--\n src/ipa/rpi/common/ipa_base.cpp | 34 +++++++++++++++++++\n src/ipa/rpi/pisp/pisp.cpp | 5 +--\n src/ipa/rpi/vc4/vc4.cpp | 4 ++-\n src/ipa/simple/algorithms/agc.cpp | 8 +++++\n src/ipa/simple/algorithms/agc.h | 1 +\n src/ipa/simple/algorithms/awb.cpp | 8 +++++\n src/ipa/simple/algorithms/awb.h | 1 +\n src/ipa/simple/algorithms/blc.cpp | 3 ++\n src/ipa/simple/algorithms/ccm.cpp | 3 ++\n src/ipa/simple/algorithms/lut.cpp | 3 ++\n src/ipa/simple/ipa_context.h | 2 ++\n src/ipa/simple/soft_simple.cpp | 8 +++--\n src/libcamera/pipeline/imx8-isi/imx8-isi.cpp | 2 ++\n src/libcamera/pipeline/ipu3/ipu3.cpp | 7 +++-\n src/libcamera/pipeline/mali-c55/mali-c55.cpp | 2 +-\n src/libcamera/pipeline/rkisp1/rkisp1.cpp | 4 ++-\n .../pipeline/rpi/common/pipeline_base.cpp | 8 +++++\n src/libcamera/pipeline/simple/simple.cpp | 2 +-\n src/libcamera/pipeline/uvcvideo/uvcvideo.cpp | 2 ++\n src/libcamera/pipeline/vimc/vimc.cpp | 2 ++\n .../pipeline/virtual/config_parser.cpp | 3 ++\n src/libcamera/software_isp/software_isp.cpp | 6 ++--\n 48 files changed, 203 insertions(+), 23 deletions(-)", "diff": "diff --git a/include/libcamera/internal/software_isp/software_isp.h b/include/libcamera/internal/software_isp/software_isp.h\nindex 7862465924..bd85f6b4bd 100644\n--- a/include/libcamera/internal/software_isp/software_isp.h\n+++ b/include/libcamera/internal/software_isp/software_isp.h\n@@ -41,6 +41,7 @@ class DebayerCpu;\n class FrameBuffer;\n class PixelFormat;\n class Stream;\n+class MetadataListPlan;\n struct StreamConfiguration;\n \n LOG_DECLARE_CATEGORY(SoftwareIsp)\n@@ -49,7 +50,7 @@ class SoftwareIsp : public Object\n {\n public:\n \tSoftwareIsp(PipelineHandler *pipe, const CameraSensor *sensor,\n-\t\t ControlInfoMap *ipaControls);\n+\t\t ControlInfoMap *ipaControls, MetadataListPlan *metadataPlan);\n \t~SoftwareIsp();\n \n \tint loadConfiguration([[maybe_unused]] const std::string &filename) { return 0; }\ndiff --git a/include/libcamera/ipa/ipu3.mojom b/include/libcamera/ipa/ipu3.mojom\nindex d9a50b01db..f49b777973 100644\n--- a/include/libcamera/ipa/ipu3.mojom\n+++ b/include/libcamera/ipa/ipu3.mojom\n@@ -20,7 +20,8 @@ interface IPAIPU3Interface {\n \tinit(libcamera.IPASettings settings,\n \t libcamera.IPACameraSensorInfo sensorInfo,\n \t libcamera.ControlInfoMap sensorControls)\n-\t\t=> (int32 ret, libcamera.ControlInfoMap ipaControls);\n+\t\t=> (int32 ret, libcamera.ControlInfoMap ipaControls,\n+\t\t libcamera.MetadataListPlan metadata);\n \tstart() => (int32 ret);\n \tstop();\n \ndiff --git a/include/libcamera/ipa/mali-c55.mojom b/include/libcamera/ipa/mali-c55.mojom\nindex 39b7f1f109..af1d083728 100644\n--- a/include/libcamera/ipa/mali-c55.mojom\n+++ b/include/libcamera/ipa/mali-c55.mojom\n@@ -11,7 +11,8 @@ struct IPAConfigInfo {\n \n interface IPAMaliC55Interface {\n \tinit(libcamera.IPASettings settings, IPAConfigInfo configInfo)\n-\t\t=> (int32 ret, libcamera.ControlInfoMap ipaControls);\n+\t\t=> (int32 ret, libcamera.ControlInfoMap ipaControls,\n+\t\t libcamera.MetadataListPlan metadataPlan);\n \tstart() => (int32 ret);\n \tstop();\n \ndiff --git a/include/libcamera/ipa/raspberrypi.mojom b/include/libcamera/ipa/raspberrypi.mojom\nindex 12b083e9d0..c32391911e 100644\n--- a/include/libcamera/ipa/raspberrypi.mojom\n+++ b/include/libcamera/ipa/raspberrypi.mojom\n@@ -26,6 +26,7 @@ struct InitParams {\n struct InitResult {\n \tSensorConfig sensorConfig;\n \tlibcamera.ControlInfoMap controlInfo;\n+\tlibcamera.MetadataListPlan metadataPlan;\n };\n \n struct BufferIds {\ndiff --git a/include/libcamera/ipa/rkisp1.mojom b/include/libcamera/ipa/rkisp1.mojom\nindex 068e898848..015ba46036 100644\n--- a/include/libcamera/ipa/rkisp1.mojom\n+++ b/include/libcamera/ipa/rkisp1.mojom\n@@ -19,7 +19,8 @@ interface IPARkISP1Interface {\n \t uint32 hwRevision, uint32 supportedBlocks,\n \t libcamera.IPACameraSensorInfo sensorInfo,\n \t libcamera.ControlInfoMap sensorControls)\n-\t\t=> (int32 ret, libcamera.ControlInfoMap ipaControls);\n+\t\t=> (int32 ret, libcamera.ControlInfoMap ipaControls,\n+\t\t libcamera.MetadataListPlan metadataPlan);\n \tstart() => (int32 ret);\n \tstop();\n \ndiff --git a/include/libcamera/ipa/soft.mojom b/include/libcamera/ipa/soft.mojom\nindex 77328c5fd5..360ed668b7 100644\n--- a/include/libcamera/ipa/soft.mojom\n+++ b/include/libcamera/ipa/soft.mojom\n@@ -18,7 +18,8 @@ interface IPASoftInterface {\n \t libcamera.SharedFD fdParams,\n \t libcamera.IPACameraSensorInfo sensorInfo,\n \t libcamera.ControlInfoMap sensorControls)\n-\t\t=> (int32 ret, libcamera.ControlInfoMap ipaControls, bool ccmEnabled);\n+\t\t=> (int32 ret, libcamera.ControlInfoMap ipaControls, bool ccmEnabled,\n+\t\t libcamera.MetadataListPlan metadataPlan);\n \tstart() => (int32 ret);\n \tstop();\n \tconfigure(IPAConfigInfo configInfo)\ndiff --git a/src/ipa/ipu3/algorithms/agc.cpp b/src/ipa/ipu3/algorithms/agc.cpp\nindex b0d89541da..2d7b0482fe 100644\n--- a/src/ipa/ipu3/algorithms/agc.cpp\n+++ b/src/ipa/ipu3/algorithms/agc.cpp\n@@ -82,6 +82,10 @@ int Agc::init(IPAContext &context, const YamlObject &tuningData)\n \n \tcontext.ctrlMap.merge(controls());\n \n+\tcontext.metadataPlan.set(controls::AnalogueGain);\n+\tcontext.metadataPlan.set(controls::ExposureTime);\n+\tcontext.metadataPlan.set(controls::FrameDuration);\n+\n \treturn 0;\n }\n \ndiff --git a/src/ipa/ipu3/algorithms/awb.cpp b/src/ipa/ipu3/algorithms/awb.cpp\nindex 55de05d9e3..499c7790f9 100644\n--- a/src/ipa/ipu3/algorithms/awb.cpp\n+++ b/src/ipa/ipu3/algorithms/awb.cpp\n@@ -197,6 +197,18 @@ Awb::Awb()\n \n Awb::~Awb() = default;\n \n+/**\n+ * \\copydoc libcamera::ipa::Algorithm::init\n+ */\n+int Awb::init(IPAContext &context, [[maybe_unused]] const YamlObject &tuningData)\n+{\n+\tcontext.metadataPlan.set(controls::AwbEnable);\n+\tcontext.metadataPlan.set(controls::ColourGains);\n+\tcontext.metadataPlan.set(controls::ColourTemperature);\n+\n+\treturn 0;\n+}\n+\n /**\n * \\copydoc libcamera::ipa::Algorithm::configure\n */\ndiff --git a/src/ipa/ipu3/algorithms/awb.h b/src/ipa/ipu3/algorithms/awb.h\nindex dbf69c9073..1d47bffa34 100644\n--- a/src/ipa/ipu3/algorithms/awb.h\n+++ b/src/ipa/ipu3/algorithms/awb.h\n@@ -40,6 +40,7 @@ public:\n \tAwb();\n \t~Awb();\n \n+\tint init(IPAContext &context, const YamlObject &tuningData) override;\n \tint configure(IPAContext &context, const IPAConfigInfo &configInfo) override;\n \tvoid prepare(IPAContext &context, const uint32_t frame,\n \t\t IPAFrameContext &frameContext,\ndiff --git a/src/ipa/ipu3/ipa_context.cpp b/src/ipa/ipu3/ipa_context.cpp\nindex 3b22f79176..f0b8b5dbea 100644\n--- a/src/ipa/ipu3/ipa_context.cpp\n+++ b/src/ipa/ipu3/ipa_context.cpp\n@@ -54,6 +54,9 @@ namespace libcamera::ipa::ipu3 {\n *\n * \\var IPAContext::ctrlMap\n * \\brief A ControlInfoMap::Map of controls populated by the algorithms\n+ *\n+ * \\var IPAContext::metadataPlan\n+ * \\brief A MetadataListPlan populated by the algorithms\n */\n \n /**\ndiff --git a/src/ipa/ipu3/ipa_context.h b/src/ipa/ipu3/ipa_context.h\nindex 97fcf06cd4..f4f45ef4d4 100644\n--- a/src/ipa/ipu3/ipa_context.h\n+++ b/src/ipa/ipu3/ipa_context.h\n@@ -14,6 +14,7 @@\n \n #include <libcamera/controls.h>\n #include <libcamera/geometry.h>\n+#include <libcamera/metadata_list_plan.h>\n \n #include <libipa/fc_queue.h>\n \n@@ -95,6 +96,8 @@ struct IPAContext {\n \tFCQueue<IPAFrameContext> frameContexts;\n \n \tControlInfoMap::Map ctrlMap;\n+\n+\tMetadataListPlan metadataPlan; // TODO: only needed during init(), how could be removed?\n };\n \n } /* namespace ipa::ipu3 */\ndiff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp\nindex 1cae08bf25..8d8811f717 100644\n--- a/src/ipa/ipu3/ipu3.cpp\n+++ b/src/ipa/ipu3/ipu3.cpp\n@@ -143,7 +143,8 @@ public:\n \tint init(const IPASettings &settings,\n \t\t const IPACameraSensorInfo &sensorInfo,\n \t\t const ControlInfoMap &sensorControls,\n-\t\t ControlInfoMap *ipaControls) override;\n+\t\t ControlInfoMap *ipaControls,\n+\t\t MetadataListPlan *metadataPlan) override;\n \n \tint start() override;\n \tvoid stop() override;\n@@ -299,7 +300,8 @@ void IPAIPU3::updateControls(const IPACameraSensorInfo &sensorInfo,\n int IPAIPU3::init(const IPASettings &settings,\n \t\t const IPACameraSensorInfo &sensorInfo,\n \t\t const ControlInfoMap &sensorControls,\n-\t\t ControlInfoMap *ipaControls)\n+\t\t ControlInfoMap *ipaControls,\n+\t\t MetadataListPlan *metadataPlan)\n {\n \tcamHelper_ = CameraSensorHelperFactoryBase::create(settings.sensorModel);\n \tif (camHelper_ == nullptr) {\n@@ -348,6 +350,8 @@ int IPAIPU3::init(const IPASettings &settings,\n \t/* Initialize controls. */\n \tupdateControls(sensorInfo, sensorControls, ipaControls);\n \n+\t*metadataPlan = std::move(context_.metadataPlan);\n+\n \treturn 0;\n }\n \ndiff --git a/src/ipa/mali-c55/algorithms/agc.cpp b/src/ipa/mali-c55/algorithms/agc.cpp\nindex f60fddac3f..97316ca35c 100644\n--- a/src/ipa/mali-c55/algorithms/agc.cpp\n+++ b/src/ipa/mali-c55/algorithms/agc.cpp\n@@ -145,6 +145,11 @@ int Agc::init(IPAContext &context, const YamlObject &tuningData)\n \t);\n \tcontext.ctrlMap.merge(controls());\n \n+\tcontext.metadataPlan.set(controls::AnalogueGain);\n+\tcontext.metadataPlan.set(controls::ColourTemperature);\n+\tcontext.metadataPlan.set(controls::DigitalGain);\n+\tcontext.metadataPlan.set(controls::ExposureTime);\n+\n \treturn 0;\n }\n \ndiff --git a/src/ipa/mali-c55/algorithms/awb.cpp b/src/ipa/mali-c55/algorithms/awb.cpp\nindex 3d546e5a85..1fd67a4f9f 100644\n--- a/src/ipa/mali-c55/algorithms/awb.cpp\n+++ b/src/ipa/mali-c55/algorithms/awb.cpp\n@@ -29,6 +29,13 @@ Awb::Awb()\n {\n }\n \n+int Awb::init(IPAContext &context, [[maybe_unused]] const YamlObject &tuningData)\n+{\n+\tcontext.metadataPlan.set(controls::ColourGains);\n+\n+\treturn 0;\n+}\n+\n int Awb::configure([[maybe_unused]] IPAContext &context,\n \t\t [[maybe_unused]] const IPACameraSensorInfo &configInfo)\n {\ndiff --git a/src/ipa/mali-c55/algorithms/awb.h b/src/ipa/mali-c55/algorithms/awb.h\nindex 2351d40555..6bdc88a193 100644\n--- a/src/ipa/mali-c55/algorithms/awb.h\n+++ b/src/ipa/mali-c55/algorithms/awb.h\n@@ -18,6 +18,7 @@ public:\n \tAwb();\n \t~Awb() = default;\n \n+\tint init(IPAContext &context, const YamlObject &tuningData) override;\n \tint configure(IPAContext &context,\n \t\t const IPACameraSensorInfo &configInfo) override;\n \tvoid prepare(IPAContext &context, const uint32_t frame,\ndiff --git a/src/ipa/mali-c55/algorithms/blc.cpp b/src/ipa/mali-c55/algorithms/blc.cpp\nindex 2a54c86a91..d36c7ac66e 100644\n--- a/src/ipa/mali-c55/algorithms/blc.cpp\n+++ b/src/ipa/mali-c55/algorithms/blc.cpp\n@@ -51,6 +51,8 @@ int BlackLevelCorrection::init([[maybe_unused]] IPAContext &context,\n \n \ttuningParameters_ = true;\n \n+\tcontext.metadataPlan.set(controls::SensorBlackLevels);\n+\n \tLOG(MaliC55Blc, Debug)\n \t\t<< \"Black levels: 00 \" << offset00 << \", 01 \" << offset01\n \t\t<< \", 10 \" << offset10 << \", 11 \" << offset11;\ndiff --git a/src/ipa/mali-c55/ipa_context.h b/src/ipa/mali-c55/ipa_context.h\nindex 13885eb83b..55aef1d100 100644\n--- a/src/ipa/mali-c55/ipa_context.h\n+++ b/src/ipa/mali-c55/ipa_context.h\n@@ -9,6 +9,7 @@\n \n #include <libcamera/base/utils.h>\n #include <libcamera/controls.h>\n+#include <libcamera/metadata_list_plan.h>\n \n #include \"libcamera/internal/bayer_format.h\"\n \n@@ -83,6 +84,8 @@ struct IPAContext {\n \tFCQueue<IPAFrameContext> frameContexts;\n \n \tControlInfoMap::Map ctrlMap;\n+\n+\tMetadataListPlan metadataPlan; // TODO: only needed during init(), how could be removed?\n };\n \n } /* namespace ipa::mali_c55 */\ndiff --git a/src/ipa/mali-c55/mali-c55.cpp b/src/ipa/mali-c55/mali-c55.cpp\nindex 7d45e7310a..10b61b4fb3 100644\n--- a/src/ipa/mali-c55/mali-c55.cpp\n+++ b/src/ipa/mali-c55/mali-c55.cpp\n@@ -46,7 +46,7 @@ public:\n \tIPAMaliC55();\n \n \tint init(const IPASettings &settings, const IPAConfigInfo &ipaConfig,\n-\t\t ControlInfoMap *ipaControls) override;\n+\t\t ControlInfoMap *ipaControls, MetadataListPlan *metadataPlan) override;\n \tint start() override;\n \tvoid stop() override;\n \tint configure(const IPAConfigInfo &ipaConfig, uint8_t bayerOrder,\n@@ -96,7 +96,7 @@ std::string IPAMaliC55::logPrefix() const\n }\n \n int IPAMaliC55::init(const IPASettings &settings, const IPAConfigInfo &ipaConfig,\n-\t\t ControlInfoMap *ipaControls)\n+\t\t ControlInfoMap *ipaControls, MetadataListPlan *metadataPlan)\n {\n \tcamHelper_ = CameraSensorHelperFactoryBase::create(settings.sensorModel);\n \tif (!camHelper_) {\n@@ -131,6 +131,8 @@ int IPAMaliC55::init(const IPASettings &settings, const IPAConfigInfo &ipaConfig\n \n \tupdateControls(ipaConfig.sensorInfo, ipaConfig.sensorControls, ipaControls);\n \n+\t*metadataPlan = std::move(context_.metadataPlan);\n+\n \treturn 0;\n }\n \ndiff --git a/src/ipa/rkisp1/algorithms/agc.cpp b/src/ipa/rkisp1/algorithms/agc.cpp\nindex f5a3c917cb..cbc7311cd5 100644\n--- a/src/ipa/rkisp1/algorithms/agc.cpp\n+++ b/src/ipa/rkisp1/algorithms/agc.cpp\n@@ -160,6 +160,16 @@ int Agc::init(IPAContext &context, const YamlObject &tuningData)\n \tcontext.ctrlMap[&controls::ExposureValue] = ControlInfo(-8.0f, 8.0f, 0.0f);\n \tcontext.ctrlMap.merge(controls());\n \n+\tcontext.metadataPlan.set(controls::AeConstraintMode);\n+\tcontext.metadataPlan.set(controls::AeExposureMode);\n+\tcontext.metadataPlan.set(controls::AeMeteringMode);\n+\tcontext.metadataPlan.set(controls::AnalogueGain);\n+\tcontext.metadataPlan.set(controls::AnalogueGainMode);\n+\tcontext.metadataPlan.set(controls::ExposureTime);\n+\tcontext.metadataPlan.set(controls::ExposureTimeMode);\n+\tcontext.metadataPlan.set(controls::ExposureValue);\n+\tcontext.metadataPlan.set(controls::FrameDuration);\n+\n \treturn 0;\n }\n \ndiff --git a/src/ipa/rkisp1/algorithms/awb.cpp b/src/ipa/rkisp1/algorithms/awb.cpp\nindex 399fb51be4..8de7ea3951 100644\n--- a/src/ipa/rkisp1/algorithms/awb.cpp\n+++ b/src/ipa/rkisp1/algorithms/awb.cpp\n@@ -117,6 +117,10 @@ int Awb::init(IPAContext &context, const YamlObject &tuningData)\n \tconst auto &src = awbAlgo_->controls();\n \tcmap.insert(src.begin(), src.end());\n \n+\tcontext.metadataPlan.set(controls::AwbEnable);\n+\tcontext.metadataPlan.set(controls::ColourGains);\n+\tcontext.metadataPlan.set(controls::ColourTemperature);\n+\n \treturn 0;\n }\n \ndiff --git a/src/ipa/rkisp1/algorithms/blc.cpp b/src/ipa/rkisp1/algorithms/blc.cpp\nindex 32fc44ffff..03071360b3 100644\n--- a/src/ipa/rkisp1/algorithms/blc.cpp\n+++ b/src/ipa/rkisp1/algorithms/blc.cpp\n@@ -103,6 +103,8 @@ int BlackLevelCorrection::init(IPAContext &context, const YamlObject &tuningData\n \t\t<< \", green (blue) \" << blackLevelGreenB_\n \t\t<< \", blue \" << blackLevelBlue_;\n \n+\tcontext.metadataPlan.set(controls::SensorBlackLevels);\n+\n \treturn 0;\n }\n \ndiff --git a/src/ipa/rkisp1/algorithms/ccm.cpp b/src/ipa/rkisp1/algorithms/ccm.cpp\nindex de2b6fe775..3115d3effa 100644\n--- a/src/ipa/rkisp1/algorithms/ccm.cpp\n+++ b/src/ipa/rkisp1/algorithms/ccm.cpp\n@@ -66,6 +66,8 @@ int Ccm::init([[maybe_unused]] IPAContext &context, const YamlObject &tuningData\n \t\toffsets_.setData({ { 0, Matrix<int16_t, 3, 1>({ 0, 0, 0 }) } });\n \t}\n \n+\tcontext.metadataPlan.set(controls::ColourCorrectionMatrix);\n+\n \treturn 0;\n }\n \ndiff --git a/src/ipa/rkisp1/algorithms/goc.cpp b/src/ipa/rkisp1/algorithms/goc.cpp\nindex a0e7030fe5..46a4c2c364 100644\n--- a/src/ipa/rkisp1/algorithms/goc.cpp\n+++ b/src/ipa/rkisp1/algorithms/goc.cpp\n@@ -60,6 +60,8 @@ int GammaOutCorrection::init(IPAContext &context, const YamlObject &tuningData)\n \tdefaultGamma_ = tuningData[\"gamma\"].get<double>(kDefaultGamma);\n \tcontext.ctrlMap[&controls::Gamma] = ControlInfo(0.1f, 10.0f, defaultGamma_);\n \n+\tcontext.metadataPlan.set(controls::Gamma);\n+\n \treturn 0;\n }\n \ndiff --git a/src/ipa/rkisp1/algorithms/lux.cpp b/src/ipa/rkisp1/algorithms/lux.cpp\nindex e8da698100..966c711375 100644\n--- a/src/ipa/rkisp1/algorithms/lux.cpp\n+++ b/src/ipa/rkisp1/algorithms/lux.cpp\n@@ -43,7 +43,13 @@ Lux::Lux()\n */\n int Lux::init([[maybe_unused]] IPAContext &context, const YamlObject &tuningData)\n {\n-\treturn lux_.parseTuningData(tuningData);\n+\tint ret = lux_.parseTuningData(tuningData);\n+\tif (ret)\n+\t\treturn ret;\n+\n+\tcontext.metadataPlan.set(controls::Lux);\n+\n+\treturn 0;\n }\n \n /**\ndiff --git a/src/ipa/rkisp1/ipa_context.h b/src/ipa/rkisp1/ipa_context.h\nindex f85a130d9c..caf7d9d448 100644\n--- a/src/ipa/rkisp1/ipa_context.h\n+++ b/src/ipa/rkisp1/ipa_context.h\n@@ -230,6 +230,7 @@ struct IPAContext {\n \tFCQueue<IPAFrameContext> frameContexts;\n \n \tControlInfoMap::Map ctrlMap;\n+\tMetadataListPlan metadataPlan; // TODO: only needed during init(), how could be removed?\n \n \tDebugMetadata debugMetadata;\n \ndiff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp\nindex fa22bfc349..9815b83a03 100644\n--- a/src/ipa/rkisp1/rkisp1.cpp\n+++ b/src/ipa/rkisp1/rkisp1.cpp\n@@ -55,7 +55,8 @@ public:\n \t\t uint32_t supportedBlocks,\n \t\t const IPACameraSensorInfo &sensorInfo,\n \t\t const ControlInfoMap &sensorControls,\n-\t\t ControlInfoMap *ipaControls) override;\n+\t\t ControlInfoMap *ipaControls,\n+\t\t MetadataListPlan *metadataPlan) override;\n \tint start() override;\n \tvoid stop() override;\n \n@@ -139,7 +140,8 @@ int IPARkISP1::init(const IPASettings &settings, unsigned int hwRevision,\n \t\t uint32_t supportedBlocks,\n \t\t const IPACameraSensorInfo &sensorInfo,\n \t\t const ControlInfoMap &sensorControls,\n-\t\t ControlInfoMap *ipaControls)\n+\t\t ControlInfoMap *ipaControls,\n+\t\t MetadataListPlan *metadataPlan)\n {\n \t/* \\todo Add support for other revisions */\n \tswitch (hwRevision) {\n@@ -209,6 +211,8 @@ int IPARkISP1::init(const IPASettings &settings, unsigned int hwRevision,\n \t/* Initialize controls. */\n \tupdateControls(sensorInfo, sensorControls, ipaControls);\n \n+\t*metadataPlan = std::move(context_.metadataPlan);\n+\n \treturn 0;\n }\n \ndiff --git a/src/ipa/rpi/common/ipa_base.cpp b/src/ipa/rpi/common/ipa_base.cpp\nindex 8dfe35cc32..15e65f9315 100644\n--- a/src/ipa/rpi/common/ipa_base.cpp\n+++ b/src/ipa/rpi/common/ipa_base.cpp\n@@ -182,6 +182,40 @@ int32_t IpaBase::init(const IPASettings &settings, const InitParams ¶ms, Ini\n \n \tresult->controlInfo = ControlInfoMap(std::move(ctrlMap), controls::controls);\n \n+\t// TODO: only set those that can be reported by configured algorithms?\n+\t// TODO: move this somewhere else?\n+\tresult->metadataPlan.set(controls::AeConstraintMode);\n+\tresult->metadataPlan.set(controls::AeExposureMode);\n+\tresult->metadataPlan.set(controls::AeMeteringMode);\n+\tresult->metadataPlan.set(controls::AeState);\n+\tresult->metadataPlan.set(controls::AfPauseState);\n+\tresult->metadataPlan.set(controls::AfState);\n+\tresult->metadataPlan.set(controls::AnalogueGain);\n+\tresult->metadataPlan.set(controls::AnalogueGainMode);\n+\tresult->metadataPlan.set(controls::AwbEnable);\n+\tresult->metadataPlan.set(controls::AwbMode);\n+\tresult->metadataPlan.set(controls::Brightness);\n+\tresult->metadataPlan.set(controls::ColourCorrectionMatrix);\n+\tresult->metadataPlan.set(controls::ColourGains);\n+\tresult->metadataPlan.set(controls::ColourTemperature);\n+\tresult->metadataPlan.set(controls::Contrast);\n+\tresult->metadataPlan.set(controls::DigitalGain);\n+\tresult->metadataPlan.set(controls::ExposureTime);\n+\tresult->metadataPlan.set(controls::ExposureTimeMode);\n+\tresult->metadataPlan.set(controls::ExposureValue);\n+\tresult->metadataPlan.set(controls::FocusFoM);\n+\tresult->metadataPlan.set(controls::FrameDuration);\n+\tresult->metadataPlan.set(controls::FrameDurationLimits);\n+\tresult->metadataPlan.set(controls::HdrChannel);\n+\tresult->metadataPlan.set(controls::HdrMode);\n+\tresult->metadataPlan.set(controls::LensPosition);\n+\tresult->metadataPlan.set(controls::Lux);\n+\tresult->metadataPlan.set(controls::Saturation);\n+\tresult->metadataPlan.set(controls::SensorBlackLevels);\n+\tresult->metadataPlan.set(controls::SensorTemperature);\n+\tresult->metadataPlan.set(controls::Sharpness);\n+\tresult->metadataPlan.set(controls::draft::NoiseReductionMode);\n+\n \treturn platformInit(params, result);\n }\n \ndiff --git a/src/ipa/rpi/pisp/pisp.cpp b/src/ipa/rpi/pisp/pisp.cpp\nindex ec7593ffc9..04e7731d22 100644\n--- a/src/ipa/rpi/pisp/pisp.cpp\n+++ b/src/ipa/rpi/pisp/pisp.cpp\n@@ -291,8 +291,7 @@ private:\n \tHdrStatus lastStitchHdrStatus_;\n };\n \n-int32_t IpaPiSP::platformInit(const InitParams ¶ms,\n-\t\t\t [[maybe_unused]] InitResult *result)\n+int32_t IpaPiSP::platformInit(const InitParams ¶ms, InitResult *result)\n {\n \tconst std::string &target = controller_.getTarget();\n \tif (target != \"pisp\") {\n@@ -325,6 +324,8 @@ int32_t IpaPiSP::platformInit(const InitParams ¶ms,\n \n \tsetDefaultConfig();\n \n+\tresult->metadataPlan.set(controls::rpi::PispStatsOutput, sizeof(pisp_statistics));\n+\n \treturn 0;\n }\n \ndiff --git a/src/ipa/rpi/vc4/vc4.cpp b/src/ipa/rpi/vc4/vc4.cpp\nindex 2b205b2861..3014925eaf 100644\n--- a/src/ipa/rpi/vc4/vc4.cpp\n+++ b/src/ipa/rpi/vc4/vc4.cpp\n@@ -91,7 +91,7 @@ private:\n \tAwbStatus lastAwbStatus_;\n };\n \n-int32_t IpaVc4::platformInit([[maybe_unused]] const InitParams ¶ms, [[maybe_unused]] InitResult *result)\n+int32_t IpaVc4::platformInit([[maybe_unused]] const InitParams ¶ms, InitResult *result)\n {\n \tconst std::string &target = controller_.getTarget();\n \n@@ -102,6 +102,8 @@ int32_t IpaVc4::platformInit([[maybe_unused]] const InitParams ¶ms, [[maybe_\n \t\treturn -EINVAL;\n \t}\n \n+\tresult->metadataPlan.set(controls::rpi::Bcm2835StatsOutput, sizeof(bcm2835_isp_stats));\n+\n \treturn 0;\n }\n \ndiff --git a/src/ipa/simple/algorithms/agc.cpp b/src/ipa/simple/algorithms/agc.cpp\nindex 189de770c6..c4e52328f0 100644\n--- a/src/ipa/simple/algorithms/agc.cpp\n+++ b/src/ipa/simple/algorithms/agc.cpp\n@@ -41,6 +41,14 @@ Agc::Agc()\n {\n }\n \n+int Agc::init(IPAContext &context, [[maybe_unused]] const YamlObject &tuningData)\n+{\n+\tcontext.metadataPlan.set(controls::AnalogueGain);\n+\tcontext.metadataPlan.set(controls::ExposureTime);\n+\n+\treturn 0;\n+}\n+\n void Agc::updateExposure(IPAContext &context, IPAFrameContext &frameContext, double exposureMSV)\n {\n \t/*\ndiff --git a/src/ipa/simple/algorithms/agc.h b/src/ipa/simple/algorithms/agc.h\nindex 112d9f5a19..00e70ea705 100644\n--- a/src/ipa/simple/algorithms/agc.h\n+++ b/src/ipa/simple/algorithms/agc.h\n@@ -19,6 +19,7 @@ public:\n \tAgc();\n \t~Agc() = default;\n \n+\tint init(IPAContext &context, const YamlObject &tuningData) override;\n \tvoid process(IPAContext &context, const uint32_t frame,\n \t\t IPAFrameContext &frameContext,\n \t\t const SwIspStats *stats,\ndiff --git a/src/ipa/simple/algorithms/awb.cpp b/src/ipa/simple/algorithms/awb.cpp\nindex cf78e98009..fe605117ab 100644\n--- a/src/ipa/simple/algorithms/awb.cpp\n+++ b/src/ipa/simple/algorithms/awb.cpp\n@@ -26,6 +26,14 @@ LOG_DEFINE_CATEGORY(IPASoftAwb)\n \n namespace ipa::soft::algorithms {\n \n+int Awb::init(IPAContext &context, [[maybe_unused]] const YamlObject &tuningData)\n+{\n+\tcontext.metadataPlan.set(controls::ColourGains);\n+\tcontext.metadataPlan.set(controls::ColourTemperature);\n+\n+\treturn 0;\n+}\n+\n int Awb::configure(IPAContext &context,\n \t\t [[maybe_unused]] const IPAConfigInfo &configInfo)\n {\ndiff --git a/src/ipa/simple/algorithms/awb.h b/src/ipa/simple/algorithms/awb.h\nindex ad993f39c1..b8ae63dcb1 100644\n--- a/src/ipa/simple/algorithms/awb.h\n+++ b/src/ipa/simple/algorithms/awb.h\n@@ -19,6 +19,7 @@ public:\n \tAwb() = default;\n \t~Awb() = default;\n \n+\tint init(IPAContext &context, const YamlObject &tuningData) override;\n \tint configure(IPAContext &context, const IPAConfigInfo &configInfo) override;\n \tvoid prepare(IPAContext &context,\n \t\t const uint32_t frame,\ndiff --git a/src/ipa/simple/algorithms/blc.cpp b/src/ipa/simple/algorithms/blc.cpp\nindex 370385afc6..bcb67b832a 100644\n--- a/src/ipa/simple/algorithms/blc.cpp\n+++ b/src/ipa/simple/algorithms/blc.cpp\n@@ -34,6 +34,9 @@ int BlackLevel::init([[maybe_unused]] IPAContext &context,\n \t\t */\n \t\tdefinedLevel_ = blackLevel.value() >> 8;\n \t}\n+\n+\tcontext.metadataPlan.set(controls::SensorBlackLevels);\n+\n \treturn 0;\n }\n \ndiff --git a/src/ipa/simple/algorithms/ccm.cpp b/src/ipa/simple/algorithms/ccm.cpp\nindex 0a98406c1a..b1758ff39b 100644\n--- a/src/ipa/simple/algorithms/ccm.cpp\n+++ b/src/ipa/simple/algorithms/ccm.cpp\n@@ -39,6 +39,9 @@ int Ccm::init([[maybe_unused]] IPAContext &context, const YamlObject &tuningData\n \tcontext.ccmEnabled = true;\n \tcontext.ctrlMap[&controls::Saturation] = ControlInfo(0.0f, 2.0f, 1.0f);\n \n+\tcontext.metadataPlan.set(controls::ColourCorrectionMatrix);\n+\tcontext.metadataPlan.set(controls::Saturation);\n+\n \treturn 0;\n }\n \ndiff --git a/src/ipa/simple/algorithms/lut.cpp b/src/ipa/simple/algorithms/lut.cpp\nindex d1d5f72712..5a7ffbd8fa 100644\n--- a/src/ipa/simple/algorithms/lut.cpp\n+++ b/src/ipa/simple/algorithms/lut.cpp\n@@ -28,6 +28,9 @@ int Lut::init(IPAContext &context,\n \t [[maybe_unused]] const YamlObject &tuningData)\n {\n \tcontext.ctrlMap[&controls::Contrast] = ControlInfo(0.0f, 2.0f, 1.0f);\n+\n+\tcontext.metadataPlan.set(controls::Contrast);\n+\n \treturn 0;\n }\n \ndiff --git a/src/ipa/simple/ipa_context.h b/src/ipa/simple/ipa_context.h\nindex c3081e3069..d76c0f79ee 100644\n--- a/src/ipa/simple/ipa_context.h\n+++ b/src/ipa/simple/ipa_context.h\n@@ -12,6 +12,7 @@\n #include <stdint.h>\n \n #include <libcamera/controls.h>\n+#include <libcamera/metadata_list_plan.h>\n \n #include \"libcamera/internal/matrix.h\"\n #include \"libcamera/internal/vector.h\"\n@@ -102,6 +103,7 @@ struct IPAContext {\n \tIPAActiveState activeState;\n \tFCQueue<IPAFrameContext> frameContexts;\n \tControlInfoMap::Map ctrlMap;\n+\tMetadataListPlan metadataPlan; // TODO: only needed during init(), how could be removed?\n \tbool ccmEnabled = false;\n };\n \ndiff --git a/src/ipa/simple/soft_simple.cpp b/src/ipa/simple/soft_simple.cpp\nindex b147aca2e3..9d698a27b3 100644\n--- a/src/ipa/simple/soft_simple.cpp\n+++ b/src/ipa/simple/soft_simple.cpp\n@@ -56,7 +56,8 @@ public:\n \t\t const IPACameraSensorInfo &sensorInfo,\n \t\t const ControlInfoMap &sensorControls,\n \t\t ControlInfoMap *ipaControls,\n-\t\t bool *ccmEnabled) override;\n+\t\t bool *ccmEnabled,\n+\t\t MetadataListPlan *metadataPlan) override;\n \tint configure(const IPAConfigInfo &configInfo) override;\n \n \tint start() override;\n@@ -96,7 +97,8 @@ int IPASoftSimple::init(const IPASettings &settings,\n \t\t\tconst IPACameraSensorInfo &sensorInfo,\n \t\t\tconst ControlInfoMap &sensorControls,\n \t\t\tControlInfoMap *ipaControls,\n-\t\t\tbool *ccmEnabled)\n+\t\t\tbool *ccmEnabled,\n+\t\t\tMetadataListPlan *metadataPlan)\n {\n \tcamHelper_ = CameraSensorHelperFactoryBase::create(settings.sensorModel);\n \tif (!camHelper_) {\n@@ -190,6 +192,8 @@ int IPASoftSimple::init(const IPASettings &settings,\n \t\treturn -EINVAL;\n \t}\n \n+\t*metadataPlan = std::move(context_.metadataPlan);\n+\n \treturn 0;\n }\n \ndiff --git a/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp b/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp\nindex de09431cb9..fbad880b23 100644\n--- a/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp\n+++ b/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp\n@@ -166,6 +166,8 @@ int ISICameraData::init()\n \n \tproperties_ = sensor_->properties();\n \n+\tmetadataPlan_.set(controls::SensorTimestamp);\n+\n \treturn 0;\n }\n \ndiff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\nindex d6b7edcb5a..13dbdb6268 100644\n--- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n@@ -1082,6 +1082,11 @@ int PipelineHandlerIPU3::registerCameras()\n \t\tif (ret)\n \t\t\tcontinue;\n \n+\t\tdata->metadataPlan_.set(controls::draft::PipelineDepth);\n+\t\tdata->metadataPlan_.set(controls::draft::TestPatternMode);\n+\t\tdata->metadataPlan_.set(controls::ScalerCrop);\n+\t\tdata->metadataPlan_.set(controls::SensorTimestamp);\n+\n \t\tconst CameraSensorProperties::SensorDelays &delays = cio2->sensor()->sensorDelays();\n \t\tstd::unordered_map<uint32_t, DelayedControls::ControlParams> params = {\n \t\t\t{ V4L2_CID_ANALOGUE_GAIN, { delays.gainDelay, false } },\n@@ -1191,7 +1196,7 @@ int IPU3CameraData::loadIPA()\n \t\tipa_->configurationFile(sensor->model() + \".yaml\", \"uncalibrated.yaml\");\n \n \tret = ipa_->init(IPASettings{ ipaTuningFile, sensor->model() },\n-\t\t\t sensorInfo, sensor->controls(), &ipaControls_);\n+\t\t\t sensorInfo, sensor->controls(), &ipaControls_, &metadataPlan_);\n \tif (ret) {\n \t\tLOG(IPU3, Error) << \"Failed to initialise the IPU3 IPA\";\n \t\treturn ret;\ndiff --git a/src/libcamera/pipeline/mali-c55/mali-c55.cpp b/src/libcamera/pipeline/mali-c55/mali-c55.cpp\nindex 38bdc6138e..938c5b2890 100644\n--- a/src/libcamera/pipeline/mali-c55/mali-c55.cpp\n+++ b/src/libcamera/pipeline/mali-c55/mali-c55.cpp\n@@ -402,7 +402,7 @@ int MaliC55CameraData::loadIPA()\n \n \tControlInfoMap ipaControls;\n \tret = ipa_->init({ ipaTuningFile, sensor_->model() }, ipaConfig,\n-\t\t\t &ipaControls);\n+\t\t\t &ipaControls, &metadataPlan_);\n \tif (ret) {\n \t\tLOG(MaliC55, Error) << \"Failed to initialise the Mali-C55 IPA\";\n \t\treturn ret;\ndiff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\nindex ecd1383153..002a44f304 100644\n--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n@@ -406,7 +406,7 @@ int RkISP1CameraData::loadIPA(unsigned int hwRevision, uint32_t supportedBlocks)\n \n \tret = ipa_->init({ ipaTuningFile, sensor_->model() }, hwRevision,\n \t\t\t supportedBlocks, sensorInfo, sensor_->controls(),\n-\t\t\t &ipaControls_);\n+\t\t\t &ipaControls_, &metadataPlan_);\n \tif (ret < 0) {\n \t\tLOG(RkISP1, Error) << \"IPA initialization failure\";\n \t\treturn ret;\n@@ -1377,6 +1377,8 @@ int PipelineHandlerRkISP1::createCamera(MediaEntity *sensor)\n \n \tupdateControls(data.get());\n \n+\tdata->metadataPlan_.set(controls::SensorTimestamp);\n+\n \tstd::set<Stream *> streams{\n \t\t&data->mainPathStream_,\n \t\t&data->selfPathStream_,\ndiff --git a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp\nindex c209aa5963..87ce290225 100644\n--- a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp\n+++ b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp\n@@ -589,6 +589,9 @@ int PipelineHandlerBase::configure(Camera *camera, CameraConfiguration *config)\n \n \tdata->controlInfo_ = ControlInfoMap(std::move(ctrlMap), result.controlInfo.idmap());\n \n+\t/* Update `rpi::ScalerCrops` size for the corrent configuration. */\n+\tdata->metadataPlan_.set(controls::rpi::ScalerCrops, config->size());\n+\n \t/* Setup the Video Mux/Bridge entities. */\n \tfor (auto &[device, link] : data->bridgeDevices_) {\n \t\t/*\n@@ -835,6 +838,11 @@ int PipelineHandlerBase::registerCamera(std::unique_ptr<RPi::CameraData> &camera\n \t/* Initialize the camera properties. */\n \tdata->properties_ = data->sensor_->properties();\n \n+\tdata->metadataPlan_ = std::move(result.metadataPlan);\n+\tdata->metadataPlan_.set(controls::SensorTimestamp);\n+\tdata->metadataPlan_.set(controls::FrameWallClock);\n+\tdata->metadataPlan_.set(controls::ScalerCrop);\n+\n \t/*\n \t * The V4L2_CID_NOTIFY_GAINS control, if present, is used to inform the\n \t * sensor of the colour gains. It is defined to be a linear gain where\ndiff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp\nindex 91715b7f8a..312f35ad15 100644\n--- a/src/libcamera/pipeline/simple/simple.cpp\n+++ b/src/libcamera/pipeline/simple/simple.cpp\n@@ -602,7 +602,7 @@ int SimpleCameraData::init()\n \t * Instantiate Soft ISP if this is enabled for the given driver and no converter is used.\n \t */\n \tif (!converter_ && pipe->swIspEnabled()) {\n-\t\tswIsp_ = std::make_unique<SoftwareIsp>(pipe, sensor_.get(), &controlInfo_);\n+\t\tswIsp_ = std::make_unique<SoftwareIsp>(pipe, sensor_.get(), &controlInfo_, &metadataPlan_);\n \t\tif (!swIsp_->isValid()) {\n \t\t\tLOG(SimplePipeline, Warning)\n \t\t\t\t<< \"Failed to create software ISP, disabling software debayering\";\ndiff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\nindex 4b5816dfdd..59fb4bd5c9 100644\n--- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n+++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n@@ -614,6 +614,8 @@ int UVCCameraData::init(MediaDevice *media)\n \n \tcontrolInfo_ = ControlInfoMap(std::move(ctrls), controls::controls);\n \n+\tmetadataPlan_.set(controls::SensorTimestamp);\n+\n \t/*\n \t * Close to allow camera to go into runtime-suspend, video_ will be\n \t * re-opened from acquireDevice() and validate().\ndiff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp\nindex 5022101505..1b6880a5dc 100644\n--- a/src/libcamera/pipeline/vimc/vimc.cpp\n+++ b/src/libcamera/pipeline/vimc/vimc.cpp\n@@ -593,6 +593,8 @@ int VimcCameraData::init()\n \n \tcontrolInfo_ = ControlInfoMap(std::move(ctrls), controls::controls);\n \n+\tmetadataPlan_.set(controls::SensorTimestamp);\n+\n \t/* Initialize the camera properties. */\n \tproperties_ = sensor_->properties();\n \ndiff --git a/src/libcamera/pipeline/virtual/config_parser.cpp b/src/libcamera/pipeline/virtual/config_parser.cpp\nindex 1d3d9ba87e..608bbd469f 100644\n--- a/src/libcamera/pipeline/virtual/config_parser.cpp\n+++ b/src/libcamera/pipeline/virtual/config_parser.cpp\n@@ -65,6 +65,9 @@ ConfigParser::parseConfigFile(File &file, PipelineHandler *pipe)\n \t\tcontrols[&controls::draft::FaceDetectMode] = ControlInfo(supportedFaceDetectModes);\n \n \t\tdata->controlInfo_ = ControlInfoMap(std::move(controls), controls::controls);\n+\n+\t\tdata->metadataPlan_.set(controls::SensorTimestamp);\n+\n \t\tconfigurations.push_back(std::move(data));\n \t}\n \ndiff --git a/src/libcamera/software_isp/software_isp.cpp b/src/libcamera/software_isp/software_isp.cpp\nindex fdadf79e19..30a4b89666 100644\n--- a/src/libcamera/software_isp/software_isp.cpp\n+++ b/src/libcamera/software_isp/software_isp.cpp\n@@ -71,10 +71,11 @@ LOG_DEFINE_CATEGORY(SoftwareIsp)\n * \\param[in] pipe The pipeline handler in use\n * \\param[in] sensor Pointer to the CameraSensor instance owned by the pipeline\n * \\param[out] ipaControls The IPA controls to update\n+ * \\param[out] metadataPlan The metadata plan to update\n * handler\n */\n SoftwareIsp::SoftwareIsp(PipelineHandler *pipe, const CameraSensor *sensor,\n-\t\t\t ControlInfoMap *ipaControls)\n+\t\t\t ControlInfoMap *ipaControls, MetadataListPlan *metadataPlan)\n \t: dmaHeap_(DmaBufAllocator::DmaBufAllocatorFlag::CmaHeap |\n \t\t DmaBufAllocator::DmaBufAllocatorFlag::SystemHeap |\n \t\t DmaBufAllocator::DmaBufAllocatorFlag::UDmaBuf)\n@@ -147,7 +148,8 @@ SoftwareIsp::SoftwareIsp(PipelineHandler *pipe, const CameraSensor *sensor,\n \t\t\t sensorInfo,\n \t\t\t sensor->controls(),\n \t\t\t ipaControls,\n-\t\t\t &ccmEnabled_);\n+\t\t\t &ccmEnabled_,\n+\t\t\t metadataPlan);\n \tif (ret) {\n \t\tLOG(SoftwareIsp, Error) << \"IPA init failed\";\n \t\tdebayer_.reset();\n", "prefixes": [ "RFC", "v3", "20/22" ] }