[{"id":36333,"web_url":"https://patchwork.libcamera.org/comment/36333/","msgid":"<176069043605.2583768.6269804336654832230@neptunite.rasen.tech>","date":"2025-10-17T08:40:36","subject":"Re: [PATCH v5 2/2] ipa: ipu3, mali-c55, rkisp1,\n\trpi: Fix reporting non-scalar controls","submitter":{"id":17,"url":"https://patchwork.libcamera.org/api/people/17/","name":"Paul Elder","email":"paul.elder@ideasonboard.com"},"content":"(Adding Naush to CC)\n\nHi Naush,\n\nThis touches rpi code; are you ok with this change? It's part of a fix for bug 285 [0].\n\n\nThanks,\n\nPaul\n\n[0] https://bugs.libcamera.org/show_bug.cgi?id=285\n\nQuoting Paul Elder (2025-10-14 22:34:02)\n> The ControlInfos of non-scalar controls that are reported in controls()\n> must have non-scalar default values for controls that have a defined\n> size. This is because applications should be able to directly set the\n> default value from a ControlInfo to the control.\n> \n> Currently this is relevant to the following controls:\n> - ColourGains\n> - ColourCorrectionMatrix\n> - FrameDurationLimits\n> - AfWindows\n> \n> Fix the scalarness of these controls where relevant.\n> \n> Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>\n> Tested-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com> # rkisp1\n> \n> ---\n> Changes in v5:\n> - add AfWindows\n> - create Span arrays on-the-fly\n> \n> Changes in v4:\n> - improve commit message\n> \n> No change in v3\n> \n> No change in v2\n> ---\n>  src/ipa/ipu3/ipu3.cpp             | 4 ++--\n>  src/ipa/mali-c55/mali-c55.cpp     | 4 +++-\n>  src/ipa/rkisp1/algorithms/awb.cpp | 4 +++-\n>  src/ipa/rkisp1/rkisp1.cpp         | 3 ++-\n>  src/ipa/rpi/common/ipa_base.cpp   | 9 +++++++--\n>  5 files changed, 17 insertions(+), 7 deletions(-)\n> \n> diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp\n> index 1cae08bf255f..b926f579a9a3 100644\n> --- a/src/ipa/ipu3/ipu3.cpp\n> +++ b/src/ipa/ipu3/ipu3.cpp\n> @@ -20,6 +20,7 @@\n>  \n>  #include <libcamera/base/file.h>\n>  #include <libcamera/base/log.h>\n> +#include <libcamera/base/span.h>\n>  #include <libcamera/base/utils.h>\n>  \n>  #include <libcamera/control_ids.h>\n> @@ -280,10 +281,9 @@ void IPAIPU3::updateControls(const IPACameraSensorInfo &sensorInfo,\n>                 uint64_t frameSize = lineLength * frameHeights[i];\n>                 frameDurations[i] = frameSize / (sensorInfo.pixelRate / 1000000U);\n>         }\n> -\n>         controls[&controls::FrameDurationLimits] = ControlInfo(frameDurations[0],\n>                                                                frameDurations[1],\n> -                                                              frameDurations[2]);\n> +                                                              Span<const int64_t, 2>{ { frameDurations[2], frameDurations[2] } });\n>  \n>         controls.merge(context_.ctrlMap);\n>         *ipaControls = ControlInfoMap(std::move(controls), controls::controls);\n> diff --git a/src/ipa/mali-c55/mali-c55.cpp b/src/ipa/mali-c55/mali-c55.cpp\n> index 7d45e7310aec..4eaedabb47b8 100644\n> --- a/src/ipa/mali-c55/mali-c55.cpp\n> +++ b/src/ipa/mali-c55/mali-c55.cpp\n> @@ -5,6 +5,7 @@\n>   * Mali-C55 ISP image processing algorithms\n>   */\n>  \n> +#include <array>\n>  #include <map>\n>  #include <string.h>\n>  #include <vector>\n> @@ -14,6 +15,7 @@\n>  \n>  #include <libcamera/base/file.h>\n>  #include <libcamera/base/log.h>\n> +#include <libcamera/base/span.h>\n>  \n>  #include <libcamera/control_ids.h>\n>  #include <libcamera/ipa/ipa_interface.h>\n> @@ -236,7 +238,7 @@ void IPAMaliC55::updateControls(const IPACameraSensorInfo &sensorInfo,\n>  \n>         ctrlMap[&controls::FrameDurationLimits] = ControlInfo(frameDurations[0],\n>                                                               frameDurations[1],\n> -                                                             frameDurations[2]);\n> +                                                             Span<const int64_t, 2>{ { frameDurations[2], frameDurations[2] } });\n>  \n>         /*\n>          * Compute exposure time limits from the V4L2_CID_EXPOSURE control\n> diff --git a/src/ipa/rkisp1/algorithms/awb.cpp b/src/ipa/rkisp1/algorithms/awb.cpp\n> index 399fb51be414..e8da7974a1d6 100644\n> --- a/src/ipa/rkisp1/algorithms/awb.cpp\n> +++ b/src/ipa/rkisp1/algorithms/awb.cpp\n> @@ -91,7 +91,9 @@ int Awb::init(IPAContext &context, const YamlObject &tuningData)\n>                                                          kMaxColourTemperature,\n>                                                          kDefaultColourTemperature);\n>         cmap[&controls::AwbEnable] = ControlInfo(false, true);\n> -       cmap[&controls::ColourGains] = ControlInfo(0.0f, 3.996f, 1.0f);\n> +\n> +       cmap[&controls::ColourGains] = ControlInfo(0.0f, 3.996f,\n> +                                                  Span<const float, 2>{ { 1.0f, 1.0f } });\n>  \n>         if (!tuningData.contains(\"algorithm\"))\n>                 LOG(RkISP1Awb, Info) << \"No AWB algorithm specified.\"\n> diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp\n> index fa22bfc34904..61d3d1f6f96b 100644\n> --- a/src/ipa/rkisp1/rkisp1.cpp\n> +++ b/src/ipa/rkisp1/rkisp1.cpp\n> @@ -439,7 +439,8 @@ void IPARkISP1::updateControls(const IPACameraSensorInfo &sensorInfo,\n>  \n>         /* \\todo Move this (and other agc-related controls) to agc */\n>         context_.ctrlMap[&controls::FrameDurationLimits] =\n> -               ControlInfo(frameDurations[0], frameDurations[1], frameDurations[2]);\n> +               ControlInfo(frameDurations[0], frameDurations[1],\n> +                           ControlValue(Span<const int64_t, 2>{ { frameDurations[2], frameDurations[2] } }));\n>  \n>         ctrlMap.insert(context_.ctrlMap.begin(), context_.ctrlMap.end());\n>         *ipaControls = ControlInfoMap(std::move(ctrlMap), controls::controls);\n> diff --git a/src/ipa/rpi/common/ipa_base.cpp b/src/ipa/rpi/common/ipa_base.cpp\n> index 8dfe35cc3267..47d1b8cb7963 100644\n> --- a/src/ipa/rpi/common/ipa_base.cpp\n> +++ b/src/ipa/rpi/common/ipa_base.cpp\n> @@ -7,6 +7,7 @@\n>  \n>  #include \"ipa_base.h\"\n>  \n> +#include <array>\n>  #include <cmath>\n>  \n>  #include <libcamera/base/log.h>\n> @@ -99,13 +100,16 @@ const ControlInfoMap::Map ipaColourControls{\n>         { &controls::Saturation, ControlInfo(0.0f, 32.0f, 1.0f) },\n>  };\n>  \n> +std::array<Rectangle, 1> defaultAfWindows = { Rectangle{} };\n> +\n>  /* IPA controls handled conditionally, if the lens has a focus control */\n>  const ControlInfoMap::Map ipaAfControls{\n>         { &controls::AfMode, ControlInfo(controls::AfModeValues) },\n>         { &controls::AfRange, ControlInfo(controls::AfRangeValues) },\n>         { &controls::AfSpeed, ControlInfo(controls::AfSpeedValues) },\n>         { &controls::AfMetering, ControlInfo(controls::AfMeteringValues) },\n> -       { &controls::AfWindows, ControlInfo(Rectangle{}, Rectangle(65535, 65535, 65535, 65535), Rectangle{}) },\n> +       { &controls::AfWindows, ControlInfo(Rectangle{}, Rectangle(65535, 65535, 65535, 65535),\n> +                                           Span<const Rectangle, 1>{ defaultAfWindows }) },\n>         { &controls::AfTrigger, ControlInfo(controls::AfTriggerValues) },\n>         { &controls::AfPause, ControlInfo(controls::AfPauseValues) },\n>         { &controls::LensPosition, ControlInfo(0.0f, 32.0f, 1.0f) }\n> @@ -246,7 +250,8 @@ int32_t IpaBase::configure(const IPACameraSensorInfo &sensorInfo, const ConfigPa\n>         ctrlMap[&controls::FrameDurationLimits] =\n>                 ControlInfo(static_cast<int64_t>(mode_.minFrameDuration.get<std::micro>()),\n>                             static_cast<int64_t>(mode_.maxFrameDuration.get<std::micro>()),\n> -                           static_cast<int64_t>(defaultMinFrameDuration.get<std::micro>()));\n> +                           Span<const int64_t, 2>{ { static_cast<int64_t>(defaultMinFrameDuration.get<std::micro>()),\n> +                                                     static_cast<int64_t>(defaultMinFrameDuration.get<std::micro>()) } });\n>  \n>         ctrlMap[&controls::AnalogueGain] =\n>                 ControlInfo(static_cast<float>(mode_.minAnalogueGain),\n> -- \n> 2.47.2\n>","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 03BBEBE080\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 17 Oct 2025 08:40:47 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 283706069C;\n\tFri, 17 Oct 2025 10:40:46 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id B96C160453\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 17 Oct 2025 10:40:44 +0200 (CEST)","from neptunite.rasen.tech (unknown\n\t[IPv6:2404:7a81:160:2100:ce83:643f:d745:7d98])\n\tby perceval.ideasonboard.com (Postfix) with UTF8SMTPSA id 4FD521574; \n\tFri, 17 Oct 2025 10:39:03 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"KhbNa7T2\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1760690343;\n\tbh=pedAMJf5ho+owMvbdBCPf9ciAQJaCkFDXo9WYIOYdOY=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=KhbNa7T2zr62ueDl6b3NjGFBo0dUaNTQKWHS50oOa9qvFQi9ybxvFOR/FND72OWsh\n\tD/LeIRGhBgrQ+o3jZoQ1HvWSf0jLt3VRqrATHsKOH2uyINwE7lb9mMjpZDUMgnKltk\n\tRSCXyy8eIwRYifgHOvZzzfLkUJnFsPSddcZmkzh4=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20251014133404.3194952-3-paul.elder@ideasonboard.com>","References":"<20251014133404.3194952-1-paul.elder@ideasonboard.com>\n\t<20251014133404.3194952-3-paul.elder@ideasonboard.com>","Subject":"Re: [PATCH v5 2/2] ipa: ipu3, mali-c55, rkisp1,\n\trpi: Fix reporting non-scalar controls","From":"Paul Elder <paul.elder@ideasonboard.com>","Cc":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>,\n\tNaushir Patuck <naush@raspberrypi.com>","To":"libcamera-devel@lists.libcamera.org","Date":"Fri, 17 Oct 2025 17:40:36 +0900","Message-ID":"<176069043605.2583768.6269804336654832230@neptunite.rasen.tech>","User-Agent":"alot/0.0.0","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>"}},{"id":36334,"web_url":"https://patchwork.libcamera.org/comment/36334/","msgid":"<CAEmqJPpDeJnc_ViUjyV5=kiR55+9wdxsi2iHBmgRTDEVN1J0eg@mail.gmail.com>","date":"2025-10-17T08:57:38","subject":"Re: [PATCH v5 2/2] ipa: ipu3, mali-c55, rkisp1, rpi: Fix reporting\n\tnon-scalar controls","submitter":{"id":34,"url":"https://patchwork.libcamera.org/api/people/34/","name":"Naushir Patuck","email":"naush@raspberrypi.com"},"content":"Hi Paul,\n\nOn Tue, 14 Oct 2025 at 14:34, Paul Elder <paul.elder@ideasonboard.com>\nwrote:\n\n> The ControlInfos of non-scalar controls that are reported in controls()\n> must have non-scalar default values for controls that have a defined\n> size. This is because applications should be able to directly set the\n> default value from a ControlInfo to the control.\n>\n> Currently this is relevant to the following controls:\n> - ColourGains\n> - ColourCorrectionMatrix\n> - FrameDurationLimits\n> - AfWindows\n>\n> Fix the scalarness of these controls where relevant.\n>\n> Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>\n> Tested-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com> # rkisp1\n>\n> ---\n> Changes in v5:\n> - add AfWindows\n> - create Span arrays on-the-fly\n>\n> Changes in v4:\n> - improve commit message\n>\n> No change in v3\n>\n> No change in v2\n> ---\n>  src/ipa/ipu3/ipu3.cpp             | 4 ++--\n>  src/ipa/mali-c55/mali-c55.cpp     | 4 +++-\n>  src/ipa/rkisp1/algorithms/awb.cpp | 4 +++-\n>  src/ipa/rkisp1/rkisp1.cpp         | 3 ++-\n>  src/ipa/rpi/common/ipa_base.cpp   | 9 +++++++--\n>  5 files changed, 17 insertions(+), 7 deletions(-)\n>\n> diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp\n> index 1cae08bf255f..b926f579a9a3 100644\n> --- a/src/ipa/ipu3/ipu3.cpp\n> +++ b/src/ipa/ipu3/ipu3.cpp\n> @@ -20,6 +20,7 @@\n>\n>  #include <libcamera/base/file.h>\n>  #include <libcamera/base/log.h>\n> +#include <libcamera/base/span.h>\n>  #include <libcamera/base/utils.h>\n>\n>  #include <libcamera/control_ids.h>\n> @@ -280,10 +281,9 @@ void IPAIPU3::updateControls(const\n> IPACameraSensorInfo &sensorInfo,\n>                 uint64_t frameSize = lineLength * frameHeights[i];\n>                 frameDurations[i] = frameSize / (sensorInfo.pixelRate /\n> 1000000U);\n>         }\n> -\n>         controls[&controls::FrameDurationLimits] =\n> ControlInfo(frameDurations[0],\n>\n>  frameDurations[1],\n> -\n> frameDurations[2]);\n> +                                                              Span<const\n> int64_t, 2>{ { frameDurations[2], frameDurations[2] } });\n>\n>         controls.merge(context_.ctrlMap);\n>         *ipaControls = ControlInfoMap(std::move(controls),\n> controls::controls);\n> diff --git a/src/ipa/mali-c55/mali-c55.cpp b/src/ipa/mali-c55/mali-c55.cpp\n> index 7d45e7310aec..4eaedabb47b8 100644\n> --- a/src/ipa/mali-c55/mali-c55.cpp\n> +++ b/src/ipa/mali-c55/mali-c55.cpp\n> @@ -5,6 +5,7 @@\n>   * Mali-C55 ISP image processing algorithms\n>   */\n>\n> +#include <array>\n>  #include <map>\n>  #include <string.h>\n>  #include <vector>\n> @@ -14,6 +15,7 @@\n>\n>  #include <libcamera/base/file.h>\n>  #include <libcamera/base/log.h>\n> +#include <libcamera/base/span.h>\n>\n>  #include <libcamera/control_ids.h>\n>  #include <libcamera/ipa/ipa_interface.h>\n> @@ -236,7 +238,7 @@ void IPAMaliC55::updateControls(const\n> IPACameraSensorInfo &sensorInfo,\n>\n>         ctrlMap[&controls::FrameDurationLimits] =\n> ControlInfo(frameDurations[0],\n>\n> frameDurations[1],\n> -\n>  frameDurations[2]);\n> +                                                             Span<const\n> int64_t, 2>{ { frameDurations[2], frameDurations[2] } });\n>\n>         /*\n>          * Compute exposure time limits from the V4L2_CID_EXPOSURE control\n> diff --git a/src/ipa/rkisp1/algorithms/awb.cpp\n> b/src/ipa/rkisp1/algorithms/awb.cpp\n> index 399fb51be414..e8da7974a1d6 100644\n> --- a/src/ipa/rkisp1/algorithms/awb.cpp\n> +++ b/src/ipa/rkisp1/algorithms/awb.cpp\n> @@ -91,7 +91,9 @@ int Awb::init(IPAContext &context, const YamlObject\n> &tuningData)\n>\n>  kMaxColourTemperature,\n>\n>  kDefaultColourTemperature);\n>         cmap[&controls::AwbEnable] = ControlInfo(false, true);\n> -       cmap[&controls::ColourGains] = ControlInfo(0.0f, 3.996f, 1.0f);\n> +\n> +       cmap[&controls::ColourGains] = ControlInfo(0.0f, 3.996f,\n> +                                                  Span<const float, 2>{ {\n> 1.0f, 1.0f } });\n>\n>         if (!tuningData.contains(\"algorithm\"))\n>                 LOG(RkISP1Awb, Info) << \"No AWB algorithm specified.\"\n> diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp\n> index fa22bfc34904..61d3d1f6f96b 100644\n> --- a/src/ipa/rkisp1/rkisp1.cpp\n> +++ b/src/ipa/rkisp1/rkisp1.cpp\n> @@ -439,7 +439,8 @@ void IPARkISP1::updateControls(const\n> IPACameraSensorInfo &sensorInfo,\n>\n>         /* \\todo Move this (and other agc-related controls) to agc */\n>         context_.ctrlMap[&controls::FrameDurationLimits] =\n> -               ControlInfo(frameDurations[0], frameDurations[1],\n> frameDurations[2]);\n> +               ControlInfo(frameDurations[0], frameDurations[1],\n> +                           ControlValue(Span<const int64_t, 2>{ {\n> frameDurations[2], frameDurations[2] } }));\n>\n>         ctrlMap.insert(context_.ctrlMap.begin(), context_.ctrlMap.end());\n>         *ipaControls = ControlInfoMap(std::move(ctrlMap),\n> controls::controls);\n> diff --git a/src/ipa/rpi/common/ipa_base.cpp\n> b/src/ipa/rpi/common/ipa_base.cpp\n> index 8dfe35cc3267..47d1b8cb7963 100644\n> --- a/src/ipa/rpi/common/ipa_base.cpp\n> +++ b/src/ipa/rpi/common/ipa_base.cpp\n> @@ -7,6 +7,7 @@\n>\n>  #include \"ipa_base.h\"\n>\n> +#include <array>\n>  #include <cmath>\n>\n>  #include <libcamera/base/log.h>\n> @@ -99,13 +100,16 @@ const ControlInfoMap::Map ipaColourControls{\n>         { &controls::Saturation, ControlInfo(0.0f, 32.0f, 1.0f) },\n>  };\n>\n> +std::array<Rectangle, 1> defaultAfWindows = { Rectangle{} };\n> +\n>  /* IPA controls handled conditionally, if the lens has a focus control */\n>  const ControlInfoMap::Map ipaAfControls{\n>         { &controls::AfMode, ControlInfo(controls::AfModeValues) },\n>         { &controls::AfRange, ControlInfo(controls::AfRangeValues) },\n>         { &controls::AfSpeed, ControlInfo(controls::AfSpeedValues) },\n>         { &controls::AfMetering, ControlInfo(controls::AfMeteringValues) },\n> -       { &controls::AfWindows, ControlInfo(Rectangle{}, Rectangle(65535,\n> 65535, 65535, 65535), Rectangle{}) },\n> +       { &controls::AfWindows, ControlInfo(Rectangle{}, Rectangle(65535,\n> 65535, 65535, 65535),\n> +                                           Span<const Rectangle, 1>{\n> defaultAfWindows }) },\n>\n\nI can't decide if I prefer\n\n-                                           Span<const Rectangle, 1>{\ndefaultAfWindows }) },\n+                                           Span<const Rectangle, 1>{ {\nRectangle{} } }) },\n\nand removing defaultAfWindows.  It's not a big deal, either way:\n\nReviewed-by: Naushir Patuck <naush@raspberrypi.com>\n\n\n\n>         { &controls::AfTrigger, ControlInfo(controls::AfTriggerValues) },\n>         { &controls::AfPause, ControlInfo(controls::AfPauseValues) },\n>         { &controls::LensPosition, ControlInfo(0.0f, 32.0f, 1.0f) }\n> @@ -246,7 +250,8 @@ int32_t IpaBase::configure(const IPACameraSensorInfo\n> &sensorInfo, const ConfigPa\n>         ctrlMap[&controls::FrameDurationLimits] =\n>\n> ControlInfo(static_cast<int64_t>(mode_.minFrameDuration.get<std::micro>()),\n>\n> static_cast<int64_t>(mode_.maxFrameDuration.get<std::micro>()),\n> -\n>  static_cast<int64_t>(defaultMinFrameDuration.get<std::micro>()));\n> +                           Span<const int64_t, 2>{ {\n> static_cast<int64_t>(defaultMinFrameDuration.get<std::micro>()),\n> +\n>  static_cast<int64_t>(defaultMinFrameDuration.get<std::micro>()) } });\n>\n>         ctrlMap[&controls::AnalogueGain] =\n>                 ControlInfo(static_cast<float>(mode_.minAnalogueGain),\n> --\n> 2.47.2\n>\n>","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 8618FBE080\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 17 Oct 2025 08:58:13 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 5F9476069F;\n\tFri, 17 Oct 2025 10:58:12 +0200 (CEST)","from mail-vs1-xe2e.google.com (mail-vs1-xe2e.google.com\n\t[IPv6:2607:f8b0:4864:20::e2e])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 54BFD60697\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 17 Oct 2025 10:58:10 +0200 (CEST)","by mail-vs1-xe2e.google.com with SMTP id\n\tada2fe7eead31-5d61303bc30so98036137.0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 17 Oct 2025 01:58:10 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=raspberrypi.com header.i=@raspberrypi.com\n\theader.b=\"bqhzdKlg\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google; t=1760691489; x=1761296289;\n\tdarn=lists.libcamera.org; \n\th=cc:to:subject:message-id:date:from:in-reply-to:references\n\t:mime-version:from:to:cc:subject:date:message-id:reply-to;\n\tbh=5CWLv9bSvg7sANnuOW6gNERxFdjeRnjbRpUqAfvf90E=;\n\tb=bqhzdKlgJsHXspw/seUO3cO2YDLMyVnhU/7F3lWvwbjpuf184FbMvr1cKJdEthrHZN\n\tMHPagrkeQkxQj6MlY2jsuFWjD/kUqSRzheRPz5Vh+sZKhnzFafckfBPjxrtHrUlonRIN\n\t7wkHsKjzsHso/eii1V7jJ2t75VCtNw6gP9t5RBHlvU7e29/p71i81B4I8goZciHQExP8\n\tKdV/vZgVOJQ7qwUw6aID1T93vb2MODRByL7/kj52nL9xWG2fl9ZJdShv3YT+XZq0yOgM\n\tW1d4X/rFVFv32CCdiXYd5aGLdYGrt1FxnmDxDMx6BI5SdZO84n7V7UMof9NxqhVpR5cc\n\ttP9Q==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1760691489; x=1761296289;\n\th=cc:to:subject:message-id:date:from:in-reply-to:references\n\t:mime-version:x-gm-message-state:from:to:cc:subject:date:message-id\n\t:reply-to;\n\tbh=5CWLv9bSvg7sANnuOW6gNERxFdjeRnjbRpUqAfvf90E=;\n\tb=Ga5jDcEDjtPdn3Cuw2tHna1H1FrK9HGTzuExjMBqJi7nE7AKK4niJcGtvMRHkUcNKE\n\txiesQDO5p+zo2ej2YVJCPwTLSwmQlG4S1lDA45SJnz3Jgi3+H5285XGwYbP/FuyIZsqf\n\tWYaLfW+DnvZoFyW0ZeH2DTiXsZz8PNpX2XWOL7Lka79TUikPEscymXFzar9o5pPzW85P\n\tO+uDJjTusPtMDACUj9HnaSmVhDQ+mdYorB1SbcGi690FkvDTSA1Xsd6OcBYSYs9TWyhV\n\ty7QrZUPVkxBjdNLDZEmwrUCz1KiQ8eh3mcBF1i/93E8wzM+3xtrpb0MxPjFh4nOqiriw\n\t/ZUw==","X-Gm-Message-State":"AOJu0YxkmZ29iWLRYmKxeFj+qrptACkoIYQ/Y1QqUcDZrxxj5FlKWPdv\n\t/aYedRVxc3YCbPPP/BLVuoMgbnYlngeXfdzTExlud6Pb0+pu5e9qqQRalG/2xD9p7ErCV6npWqC\n\tMOdaSNlCUwvDgLYMW/vEU8pJdJ6eJBVafa1YYJx/7rQ==","X-Gm-Gg":"ASbGncsYw2vjWFQvRyA0GezBuZ+Vvp39fumD8i8fXL9aO6CnVMYa2LrJYOtakMsydPz\n\t6cgL+M+lAQtRbdj4h+dylhoWviZvbXhHvI5cymLOilhE9sN+YUkKfIsB/WUTppbREeJUawVgaCM\n\tm1OKLzTT/+izMblYGD0QNtX6R4HdCYnfplAp/dCBxikKTIlX5ScJhDvFcCfQi6RDaZDFUvmnzXx\n\tmhnLUURI9tkzA18sTIcEz8FCtI4L3F3oDE3+MBweW4Jn8xnn0Aflw49X7epvFMteVAO6nqd4zhQ\n\tOlWgvsxgFf5U+aOp","X-Google-Smtp-Source":"AGHT+IG+BNrg9aZHfLCRTK4s0WYGqmWhydfwXHUlqEGxJdyjO9YFzwSNGbJwCYTfRiVvZ9ytTif894lTyk0JwWFFZqo=","X-Received":"by 2002:a05:6102:949:b0:5c8:72ad:24a8 with SMTP id\n\tada2fe7eead31-5d7dd6aba03mr589171137.3.1760691488972; Fri, 17 Oct 2025\n\t01:58:08 -0700 (PDT)","MIME-Version":"1.0","References":"<20251014133404.3194952-1-paul.elder@ideasonboard.com>\n\t<20251014133404.3194952-3-paul.elder@ideasonboard.com>","In-Reply-To":"<20251014133404.3194952-3-paul.elder@ideasonboard.com>","From":"Naushir Patuck <naush@raspberrypi.com>","Date":"Fri, 17 Oct 2025 09:57:38 +0100","X-Gm-Features":"AS18NWBSo2PKHXeWUxAMfSH-zlrGocFJouLakOcyrUWu19L2TTCgMcMCNXUHyIg","Message-ID":"<CAEmqJPpDeJnc_ViUjyV5=kiR55+9wdxsi2iHBmgRTDEVN1J0eg@mail.gmail.com>","Subject":"Re: [PATCH v5 2/2] ipa: ipu3, mali-c55, rkisp1, rpi: Fix reporting\n\tnon-scalar controls","To":"Paul Elder <paul.elder@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org, =?utf-8?b?QmFybmFiw6FzIFDFkWN6?=\n\t=?utf-8?q?e?= <barnabas.pocze@ideasonboard.com>","Content-Type":"multipart/alternative; boundary=\"000000000000c27955064156eebf\"","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>"}},{"id":36580,"web_url":"https://patchwork.libcamera.org/comment/36580/","msgid":"<6a134414-e33a-49b3-a27e-6637dcdd5c7d@ideasonboard.com>","date":"2025-10-31T15:24:37","subject":"Re: [PATCH v5 2/2] ipa: ipu3, mali-c55, rkisp1, rpi: Fix reporting\n\tnon-scalar controls","submitter":{"id":156,"url":"https://patchwork.libcamera.org/api/people/156/","name":"Dan Scally","email":"dan.scally@ideasonboard.com"},"content":"Hi Paul\n\nOn 14/10/2025 14:34, Paul Elder wrote:\n> The ControlInfos of non-scalar controls that are reported in controls()\n> must have non-scalar default values for controls that have a defined\n> size. This is because applications should be able to directly set the\n> default value from a ControlInfo to the control.\n> \n> Currently this is relevant to the following controls:\n> - ColourGains\n> - ColourCorrectionMatrix\n> - FrameDurationLimits\n> - AfWindows\n> \n> Fix the scalarness of these controls where relevant.\n> \n> Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>\n> Tested-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com> # rkisp1\n> \nLooks good to me also:\n\nReviewed-by: Daniel Scally <dan.scally@ideasonboard.com>> ---\n> Changes in v5:\n> - add AfWindows\n> - create Span arrays on-the-fly\n> \n> Changes in v4:\n> - improve commit message\n> \n> No change in v3\n> \n> No change in v2\n> ---\n>   src/ipa/ipu3/ipu3.cpp             | 4 ++--\n>   src/ipa/mali-c55/mali-c55.cpp     | 4 +++-\n>   src/ipa/rkisp1/algorithms/awb.cpp | 4 +++-\n>   src/ipa/rkisp1/rkisp1.cpp         | 3 ++-\n>   src/ipa/rpi/common/ipa_base.cpp   | 9 +++++++--\n>   5 files changed, 17 insertions(+), 7 deletions(-)\n> \n> diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp\n> index 1cae08bf255f..b926f579a9a3 100644\n> --- a/src/ipa/ipu3/ipu3.cpp\n> +++ b/src/ipa/ipu3/ipu3.cpp\n> @@ -20,6 +20,7 @@\n>   \n>   #include <libcamera/base/file.h>\n>   #include <libcamera/base/log.h>\n> +#include <libcamera/base/span.h>\n>   #include <libcamera/base/utils.h>\n>   \n>   #include <libcamera/control_ids.h>\n> @@ -280,10 +281,9 @@ void IPAIPU3::updateControls(const IPACameraSensorInfo &sensorInfo,\n>   \t\tuint64_t frameSize = lineLength * frameHeights[i];\n>   \t\tframeDurations[i] = frameSize / (sensorInfo.pixelRate / 1000000U);\n>   \t}\n> -\n>   \tcontrols[&controls::FrameDurationLimits] = ControlInfo(frameDurations[0],\n>   \t\t\t\t\t\t\t       frameDurations[1],\n> -\t\t\t\t\t\t\t       frameDurations[2]);\n> +\t\t\t\t\t\t\t       Span<const int64_t, 2>{ { frameDurations[2], frameDurations[2] } });\n>   \n>   \tcontrols.merge(context_.ctrlMap);\n>   \t*ipaControls = ControlInfoMap(std::move(controls), controls::controls);\n> diff --git a/src/ipa/mali-c55/mali-c55.cpp b/src/ipa/mali-c55/mali-c55.cpp\n> index 7d45e7310aec..4eaedabb47b8 100644\n> --- a/src/ipa/mali-c55/mali-c55.cpp\n> +++ b/src/ipa/mali-c55/mali-c55.cpp\n> @@ -5,6 +5,7 @@\n>    * Mali-C55 ISP image processing algorithms\n>    */\n>   \n> +#include <array>\n>   #include <map>\n>   #include <string.h>\n>   #include <vector>\n> @@ -14,6 +15,7 @@\n>   \n>   #include <libcamera/base/file.h>\n>   #include <libcamera/base/log.h>\n> +#include <libcamera/base/span.h>\n>   \n>   #include <libcamera/control_ids.h>\n>   #include <libcamera/ipa/ipa_interface.h>\n> @@ -236,7 +238,7 @@ void IPAMaliC55::updateControls(const IPACameraSensorInfo &sensorInfo,\n>   \n>   \tctrlMap[&controls::FrameDurationLimits] = ControlInfo(frameDurations[0],\n>   \t\t\t\t\t\t\t      frameDurations[1],\n> -\t\t\t\t\t\t\t      frameDurations[2]);\n> +\t\t\t\t\t\t\t      Span<const int64_t, 2>{ { frameDurations[2], frameDurations[2] } });\n>   \n>   \t/*\n>   \t * Compute exposure time limits from the V4L2_CID_EXPOSURE control\n> diff --git a/src/ipa/rkisp1/algorithms/awb.cpp b/src/ipa/rkisp1/algorithms/awb.cpp\n> index 399fb51be414..e8da7974a1d6 100644\n> --- a/src/ipa/rkisp1/algorithms/awb.cpp\n> +++ b/src/ipa/rkisp1/algorithms/awb.cpp\n> @@ -91,7 +91,9 @@ int Awb::init(IPAContext &context, const YamlObject &tuningData)\n>   \t\t\t\t\t\t\t kMaxColourTemperature,\n>   \t\t\t\t\t\t\t kDefaultColourTemperature);\n>   \tcmap[&controls::AwbEnable] = ControlInfo(false, true);\n> -\tcmap[&controls::ColourGains] = ControlInfo(0.0f, 3.996f, 1.0f);\n> +\n> +\tcmap[&controls::ColourGains] = ControlInfo(0.0f, 3.996f,\n> +\t\t\t\t\t\t   Span<const float, 2>{ { 1.0f, 1.0f } });\n>   \n>   \tif (!tuningData.contains(\"algorithm\"))\n>   \t\tLOG(RkISP1Awb, Info) << \"No AWB algorithm specified.\"\n> diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp\n> index fa22bfc34904..61d3d1f6f96b 100644\n> --- a/src/ipa/rkisp1/rkisp1.cpp\n> +++ b/src/ipa/rkisp1/rkisp1.cpp\n> @@ -439,7 +439,8 @@ void IPARkISP1::updateControls(const IPACameraSensorInfo &sensorInfo,\n>   \n>   \t/* \\todo Move this (and other agc-related controls) to agc */\n>   \tcontext_.ctrlMap[&controls::FrameDurationLimits] =\n> -\t\tControlInfo(frameDurations[0], frameDurations[1], frameDurations[2]);\n> +\t\tControlInfo(frameDurations[0], frameDurations[1],\n> +\t\t\t    ControlValue(Span<const int64_t, 2>{ { frameDurations[2], frameDurations[2] } }));\n>   \n>   \tctrlMap.insert(context_.ctrlMap.begin(), context_.ctrlMap.end());\n>   \t*ipaControls = ControlInfoMap(std::move(ctrlMap), controls::controls);\n> diff --git a/src/ipa/rpi/common/ipa_base.cpp b/src/ipa/rpi/common/ipa_base.cpp\n> index 8dfe35cc3267..47d1b8cb7963 100644\n> --- a/src/ipa/rpi/common/ipa_base.cpp\n> +++ b/src/ipa/rpi/common/ipa_base.cpp\n> @@ -7,6 +7,7 @@\n>   \n>   #include \"ipa_base.h\"\n>   \n> +#include <array>\n>   #include <cmath>\n>   \n>   #include <libcamera/base/log.h>\n> @@ -99,13 +100,16 @@ const ControlInfoMap::Map ipaColourControls{\n>   \t{ &controls::Saturation, ControlInfo(0.0f, 32.0f, 1.0f) },\n>   };\n>   \n> +std::array<Rectangle, 1> defaultAfWindows = { Rectangle{} };\n> +\n>   /* IPA controls handled conditionally, if the lens has a focus control */\n>   const ControlInfoMap::Map ipaAfControls{\n>   \t{ &controls::AfMode, ControlInfo(controls::AfModeValues) },\n>   \t{ &controls::AfRange, ControlInfo(controls::AfRangeValues) },\n>   \t{ &controls::AfSpeed, ControlInfo(controls::AfSpeedValues) },\n>   \t{ &controls::AfMetering, ControlInfo(controls::AfMeteringValues) },\n> -\t{ &controls::AfWindows, ControlInfo(Rectangle{}, Rectangle(65535, 65535, 65535, 65535), Rectangle{}) },\n> +\t{ &controls::AfWindows, ControlInfo(Rectangle{}, Rectangle(65535, 65535, 65535, 65535),\n> +\t\t\t\t\t    Span<const Rectangle, 1>{ defaultAfWindows }) },\n>   \t{ &controls::AfTrigger, ControlInfo(controls::AfTriggerValues) },\n>   \t{ &controls::AfPause, ControlInfo(controls::AfPauseValues) },\n>   \t{ &controls::LensPosition, ControlInfo(0.0f, 32.0f, 1.0f) }\n> @@ -246,7 +250,8 @@ int32_t IpaBase::configure(const IPACameraSensorInfo &sensorInfo, const ConfigPa\n>   \tctrlMap[&controls::FrameDurationLimits] =\n>   \t\tControlInfo(static_cast<int64_t>(mode_.minFrameDuration.get<std::micro>()),\n>   \t\t\t    static_cast<int64_t>(mode_.maxFrameDuration.get<std::micro>()),\n> -\t\t\t    static_cast<int64_t>(defaultMinFrameDuration.get<std::micro>()));\n> +\t\t\t    Span<const int64_t, 2>{ { static_cast<int64_t>(defaultMinFrameDuration.get<std::micro>()),\n> +\t\t\t\t\t\t      static_cast<int64_t>(defaultMinFrameDuration.get<std::micro>()) } });\n>   \n>   \tctrlMap[&controls::AnalogueGain] =\n>   \t\tControlInfo(static_cast<float>(mode_.minAnalogueGain),","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 BC143C3259\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 31 Oct 2025 15:24:42 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id E111B609B7;\n\tFri, 31 Oct 2025 16:24:41 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id D990260947\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 31 Oct 2025 16:24:40 +0100 (CET)","from [192.168.0.43]\n\t(cpc141996-chfd3-2-0-cust928.12-3.cable.virginm.net [86.13.91.161])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id E29DAC73;\n\tFri, 31 Oct 2025 16:22:49 +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=\"UxeFQltW\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1761924170;\n\tbh=w5tI/evInKGVUJ73mB+BkbU8XjrGUroOz/OWOljIkC4=;\n\th=Date:Subject:To:Cc:References:From:In-Reply-To:From;\n\tb=UxeFQltWSHcpvoMoEvZ0sD4h5qTGVy5iaZsMfXcXV/NqXQo8H8hmEIaIXOD0TTpPH\n\tV8SOIRnCo2qP4OZervUOBXyIzouF1Q7MLJ/vrnM+1ZWDAtdW4jN9iLysAyeOecQFPc\n\t6HbwwNlmHS3FylZ3+dHosx9P6Uq+2s6h6Uce5cUY=","Message-ID":"<6a134414-e33a-49b3-a27e-6637dcdd5c7d@ideasonboard.com>","Date":"Fri, 31 Oct 2025 15:24:37 +0000","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH v5 2/2] ipa: ipu3, mali-c55, rkisp1, rpi: Fix reporting\n\tnon-scalar controls","To":"Paul Elder <paul.elder@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","Cc":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","References":"<20251014133404.3194952-1-paul.elder@ideasonboard.com>\n\t<20251014133404.3194952-3-paul.elder@ideasonboard.com>","Content-Language":"en-US","From":"Dan Scally <dan.scally@ideasonboard.com>","In-Reply-To":"<20251014133404.3194952-3-paul.elder@ideasonboard.com>","Content-Type":"text/plain; charset=UTF-8; format=flowed","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>"}}]