Patch Detail
Show a patch.
GET /api/1.1/patches/25650/?format=api
{ "id": 25650, "url": "https://patchwork.libcamera.org/api/1.1/patches/25650/?format=api", "web_url": "https://patchwork.libcamera.org/patch/25650/", "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": "<20260106165754.1759831-21-barnabas.pocze@ideasonboard.com>", "date": "2026-01-06T16:57:52", "name": "[v4,20/22] libcamera: pipeline: Fill `MetadataListPlan` of cameras", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "65894580c8a4d796b28632665eaef05e0bf8a990", "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/25650/mbox/", "series": [ { "id": 5688, "url": "https://patchwork.libcamera.org/api/1.1/series/5688/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=5688", "date": "2026-01-06T16:57:32", "name": "libcamera: Add `MetadataList`", "version": 4, "mbox": "https://patchwork.libcamera.org/series/5688/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/25650/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/25650/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 42ECCBDCBF\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 6 Jan 2026 16:58:21 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 2357D62000;\n\tTue, 6 Jan 2026 17:58:19 +0100 (CET)", "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 0F64061FD0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 6 Jan 2026 17:58:03 +0100 (CET)", "from pb-laptop.local (185.221.143.114.nat.pool.zt.hu\n\t[185.221.143.114])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id E191A27FE;\n\tTue, 6 Jan 2026 17:57:41 +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=\"SU1uBEoQ\"; dkim-atps=neutral", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1767718662;\n\tbh=jtwX65RzNmNJ+aJ8e8QrwQc31HZxu339fMbNIR2kbjs=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=SU1uBEoQzSBBPDCkMzqFCcUeSz5HMA8VUx1SlR7LNmt+iFNdGa39RiuZhNv1cGbl2\n\tzQfLtVfGxlkMuUtGNFXgL0D3VvwubWB1ZrZy6NysFavqdS1YgryYUXSiYDDWMnue/I\n\t9lBwl1ucK4uX6IPzmzx8IdYHP1UbQYzKr14cnKk0=", "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>,\n\tKieran Bingham <kieran.bingham@ideasonboard.com>", "Subject": "[PATCH v4 20/22] libcamera: pipeline: Fill `MetadataListPlan` of\n\tcameras", "Date": "Tue, 6 Jan 2026 17:57:52 +0100", "Message-ID": "<20260106165754.1759831-21-barnabas.pocze@ideasonboard.com>", "X-Mailer": "git-send-email 2.52.0", "In-Reply-To": "<20260106165754.1759831-1-barnabas.pocze@ideasonboard.com>", "References": "<20260106165754.1759831-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>\nReviewed-by: Kieran Bingham <kieran.bingham@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 ad89c9b3c..48a838a69 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 Debayer;\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 d9a50b01d..f49b77797 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 39b7f1f10..af1d08372 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 12b083e9d..c32391911 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 068e89884..015ba4603 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 77328c5fd..360ed668b 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 b0d89541d..2d7b0482f 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 55de05d9e..499c7790f 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 dbf69c907..1d47bffa3 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 3b22f7917..f0b8b5dbe 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 97fcf06cd..f4f45ef4d 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 b926f579a..a673d97bc 100644\n--- a/src/ipa/ipu3/ipu3.cpp\n+++ b/src/ipa/ipu3/ipu3.cpp\n@@ -144,7 +144,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 014fd1245..45738c0b1 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 964e81088..b6bbeca0f 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 683a62af2..1b6cf9b5f 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 d099219c3..9a1ad8260 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 13885eb83..55aef1d10 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 1d2a4f75c..7d1b1a7be 100644\n--- a/src/ipa/mali-c55/mali-c55.cpp\n+++ b/src/ipa/mali-c55/mali-c55.cpp\n@@ -49,7 +49,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@@ -99,7 +99,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@@ -134,6 +134,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 1ecaff680..8b6bca6be 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 e8da7974a..b83f022cd 100644\n--- a/src/ipa/rkisp1/algorithms/awb.cpp\n+++ b/src/ipa/rkisp1/algorithms/awb.cpp\n@@ -119,6 +119,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 32fc44fff..03071360b 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 de2b6fe77..3115d3eff 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 a0e7030fe..46a4c2c36 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 e9717bb3b..b005545ee 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 b257cee55..86d2166e3 100644\n--- a/src/ipa/rkisp1/ipa_context.h\n+++ b/src/ipa/rkisp1/ipa_context.h\n@@ -234,6 +234,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 fbcc39103..466d4cc7e 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 14aba4500..d5190d961 100644\n--- a/src/ipa/rpi/common/ipa_base.cpp\n+++ b/src/ipa/rpi/common/ipa_base.cpp\n@@ -184,6 +184,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 ec7593ffc..04e7731d2 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 2b205b286..3014925ea 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 2f7e040c2..73ae63fdf 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 112d9f5a1..00e70ea70 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 0080865aa..67886a24c 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 ad993f39c..b8ae63dcb 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 464e43c27..534011908 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 0a98406c1..b1758ff39 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 9aaab54f1..beed0aca8 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 26b60fb68..0dc8b38b2 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@@ -103,6 +104,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 dde116661..97b8332be 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 706681fce..b1111f19d 100644\n--- a/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp\n+++ b/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp\n@@ -171,6 +171,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 0190f677e..04549899c 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 77f251416..f66615265 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 320a4dc5a..d2cd1d4b8 100644\n--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n@@ -410,7 +410,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@@ -1493,6 +1493,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 fb8e466f6..c50697877 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@@ -839,6 +842,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 b30b0a122..f1925cdf7 100644\n--- a/src/libcamera/pipeline/simple/simple.cpp\n+++ b/src/libcamera/pipeline/simple/simple.cpp\n@@ -615,7 +615,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 3bd51733d..fcd25cf4e 100644\n--- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n+++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n@@ -617,6 +617,8 @@ int UVCCameraData::init(std::shared_ptr<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 4a03c149a..182aa56e8 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 1d3d9ba87..608bbd469 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 b31a374d8..407f1bca5 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: ispWorkerThread_(\"SWIspWorker\"),\n \t dmaHeap_(DmaBufAllocator::DmaBufAllocatorFlag::CmaHeap |\n \t\t DmaBufAllocator::DmaBufAllocatorFlag::SystemHeap |\n@@ -149,7 +150,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": [ "v4", "20/22" ] }