[{"id":38129,"web_url":"https://patchwork.libcamera.org/comment/38129/","msgid":"<177039192361.607498.15812082256025071207@neptunite.rasen.tech>","date":"2026-02-06T15:32:03","subject":"Re: [PATCH v3 16/19] ipa: libipa: Remove maxExposureTime from sensor\n\tconfiguration","submitter":{"id":17,"url":"https://patchwork.libcamera.org/api/people/17/","name":"Paul Elder","email":"paul.elder@ideasonboard.com"},"content":"Quoting Jacopo Mondi (2025-11-14 23:17:11)\n> Now that we have moved the AgcMeanLuminance class and the associated\n\n\"moved the AgcMeanLuminance class\"...? I don't think the class is moved (and\nthe move operation is missing a desination).\n\n\nThe code change looks good though.\n\nPaul\n\n> helpers to calculate the maximum achievable shutter time using the\n> frame duration, remove the maxExposureTime parameter from all the IPAs\n> using AgcMeanLuminance.\n> \n> Remove maxExposureTime from all IPA sensor configuration data, as it is\n> now unused and its value depends on the frame duration.\n> \n> Do not remove minExposureTime as this instead effectively represents\n> a sensor parameters which remains stable during a streaming session.\n> \n> Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\n> ---\n>  src/ipa/ipu3/algorithms/agc.cpp       | 15 +++------------\n>  src/ipa/ipu3/algorithms/agc.h         |  4 ----\n>  src/ipa/ipu3/ipa_context.cpp          |  3 ---\n>  src/ipa/ipu3/ipa_context.h            |  1 -\n>  src/ipa/ipu3/ipu3.cpp                 |  2 --\n>  src/ipa/libipa/agc_mean_luminance.cpp |  4 ----\n>  src/ipa/libipa/agc_mean_luminance.h   |  1 -\n>  src/ipa/mali-c55/algorithms/agc.cpp   |  1 -\n>  src/ipa/mali-c55/ipa_context.h        |  1 -\n>  src/ipa/mali-c55/mali-c55.cpp         |  2 --\n>  src/ipa/rkisp1/algorithms/agc.cpp     |  2 --\n>  src/ipa/rkisp1/ipa_context.cpp        |  3 ---\n>  src/ipa/rkisp1/ipa_context.h          |  1 -\n>  src/ipa/rkisp1/rkisp1.cpp             |  1 -\n>  14 files changed, 3 insertions(+), 38 deletions(-)\n> \n> diff --git a/src/ipa/ipu3/algorithms/agc.cpp b/src/ipa/ipu3/algorithms/agc.cpp\n> index c9d41f93cff5b81710b76592303f1e0d10697326..8fc2d7310c5c6e08b3eff6cc575c221d21c1131f 100644\n> --- a/src/ipa/ipu3/algorithms/agc.cpp\n> +++ b/src/ipa/ipu3/algorithms/agc.cpp\n> @@ -57,11 +57,6 @@ static constexpr utils::Duration kMaxExposureTime = 60ms;\n>  /* Histogram constants */\n>  static constexpr uint32_t knumHistogramBins = 256;\n>  \n> -Agc::Agc()\n> -       : minExposureTime_(0s), maxExposureTime_(0s)\n> -{\n> -}\n> -\n>  /**\n>   * \\brief Initialise the AGC algorithm from tuning files\n>   * \\param[in] context The shared IPA context\n> @@ -101,10 +96,6 @@ int Agc::configure(IPAContext &context,\n>         stride_ = configuration.grid.stride;\n>         bdsGrid_ = configuration.grid.bdsGrid;\n>  \n> -       minExposureTime_ = configuration.sensor.minExposureTime;\n> -       maxExposureTime_ = std::min(configuration.sensor.maxExposureTime,\n> -                                   kMaxExposureTime);\n> -\n>         minAnalogueGain_ = std::max(configuration.sensor.minAnalogueGain, kMinAnalogueGain);\n>         maxAnalogueGain_ = configuration.sensor.maxAnalogueGain;\n>  \n> @@ -117,10 +108,10 @@ int Agc::configure(IPAContext &context,\n>  \n>         AgcMeanLuminance::SensorConfiguration sensorConfig;\n>         sensorConfig.lineDuration = context.configuration.sensor.lineDuration;\n> -       sensorConfig.minExposureTime = minExposureTime_;\n> +       sensorConfig.minExposureTime = configuration.sensor.minExposureTime;\n>         sensorConfig.minFrameDuration = context.configuration.sensor.minFrameDuration;\n> -       sensorConfig.maxFrameDuration = context.configuration.sensor.maxFrameDuration;\n> -       sensorConfig.maxExposureTime = maxExposureTime_;\n> +       sensorConfig.maxFrameDuration = std::min(context.configuration.sensor.maxFrameDuration,\n> +                                                kMaxExposureTime);\n>         sensorConfig.minAnalogueGain = minAnalogueGain_;\n>         sensorConfig.maxAnalogueGain = maxAnalogueGain_;\n>  \n> diff --git a/src/ipa/ipu3/algorithms/agc.h b/src/ipa/ipu3/algorithms/agc.h\n> index 890c271b44627f337c0d8a85853e1ecc3bae1318..4c2e4e3e5913d87a5af420b17f6c487aeb6cc37a 100644\n> --- a/src/ipa/ipu3/algorithms/agc.h\n> +++ b/src/ipa/ipu3/algorithms/agc.h\n> @@ -27,7 +27,6 @@ namespace ipa::ipu3::algorithms {\n>  class Agc : public Algorithm, public AgcMeanLuminance\n>  {\n>  public:\n> -       Agc();\n>         ~Agc() = default;\n>  \n>         int init(IPAContext &context, const YamlObject &tuningData) override;\n> @@ -42,9 +41,6 @@ private:\n>         Histogram parseStatistics(const ipu3_uapi_stats_3a *stats,\n>                                   const ipu3_uapi_grid_config &grid);\n>  \n> -       utils::Duration minExposureTime_;\n> -       utils::Duration maxExposureTime_;\n> -\n>         double minAnalogueGain_;\n>         double maxAnalogueGain_;\n>  \n> diff --git a/src/ipa/ipu3/ipa_context.cpp b/src/ipa/ipu3/ipa_context.cpp\n> index 47ae750f0ddb859e1a08e75e255b8decacd730a1..4281ffba5f7fc841e47132986631c0ee44c898ff 100644\n> --- a/src/ipa/ipu3/ipa_context.cpp\n> +++ b/src/ipa/ipu3/ipa_context.cpp\n> @@ -111,9 +111,6 @@ namespace libcamera::ipa::ipu3 {\n>   * \\var IPASessionConfiguration::agc.minExposureTime\n>   * \\brief Minimum exposure time supported with the configured sensor\n>   *\n> - * \\var IPASessionConfiguration::agc.maxExposureTime\n> - * \\brief Maximum exposure time supported with the configured sensor\n> - *\n>   * \\var IPASessionConfiguration::agc.minAnalogueGain\n>   * \\brief Minimum analogue gain supported with the configured sensor\n>   *\n> diff --git a/src/ipa/ipu3/ipa_context.h b/src/ipa/ipu3/ipa_context.h\n> index 33f3fe3ae1b503d47887873046def0835cd53894..11b9c286d56ac6f30d446e3721f7e5db4364a6fb 100644\n> --- a/src/ipa/ipu3/ipa_context.h\n> +++ b/src/ipa/ipu3/ipa_context.h\n> @@ -38,7 +38,6 @@ struct IPASessionConfiguration {\n>                 utils::Duration lineDuration;\n>                 Size size;\n>                 utils::Duration minExposureTime;\n> -               utils::Duration maxExposureTime;\n>                 utils::Duration minFrameDuration;\n>                 utils::Duration maxFrameDuration;\n>                 double minAnalogueGain;\n> diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp\n> index 0c8651c5235f9e4e9944eb88595aeef41f016310..61e8030d722f430e702a8b8f7e2880caa961fa8e 100644\n> --- a/src/ipa/ipu3/ipu3.cpp\n> +++ b/src/ipa/ipu3/ipu3.cpp\n> @@ -206,7 +206,6 @@ void IPAIPU3::updateSessionConfiguration(const IPACameraSensorInfo &sensorInfo,\n>  \n>         const ControlInfo &v4l2Exposure = sensorControls.find(V4L2_CID_EXPOSURE)->second;\n>         int32_t minExposure = v4l2Exposure.min().get<int32_t>();\n> -       int32_t maxExposure = v4l2Exposure.max().get<int32_t>();\n>  \n>         const ControlInfo &v4l2Gain = sensorControls.find(V4L2_CID_ANALOGUE_GAIN)->second;\n>         int32_t minGain = v4l2Gain.min().get<int32_t>();\n> @@ -226,7 +225,6 @@ void IPAIPU3::updateSessionConfiguration(const IPACameraSensorInfo &sensorInfo,\n>          * \\todo take VBLANK into account for maximum exposure time\n>          */\n>         context_.configuration.sensor.minExposureTime = minExposure * context_.configuration.sensor.lineDuration;\n> -       context_.configuration.sensor.maxExposureTime = maxExposure * context_.configuration.sensor.lineDuration;\n>         context_.configuration.sensor.minFrameDuration = frameHeights[0] *\n>                                                          context_.configuration.sensor.lineDuration;\n>         context_.configuration.sensor.maxFrameDuration = frameHeights[1] *\n> diff --git a/src/ipa/libipa/agc_mean_luminance.cpp b/src/ipa/libipa/agc_mean_luminance.cpp\n> index 725a23ef2f6f612c6d3408701246db7415fd8327..b930e1f7240d4936aa8dc850657bbbf9c2f3a11f 100644\n> --- a/src/ipa/libipa/agc_mean_luminance.cpp\n> +++ b/src/ipa/libipa/agc_mean_luminance.cpp\n> @@ -115,9 +115,6 @@ static constexpr double kMaxRelativeLuminanceTarget = 0.95;\n>   * \\var AgcMeanLuminance::SensorConfiguration::minExposureTime\n>   * \\brief The sensor minimum exposure time in microseconds\n>   *\n> - * \\var AgcMeanLuminance::SensorConfiguration::maxExposureTime\n> - * \\brief The sensor maximum exposure time in microseconds\n> - *\n>   * \\var AgcMeanLuminance::SensorConfiguration::minFrameDuration\n>   * \\brief The sensor minimum frame duration in microseconds\n>   *\n> @@ -372,7 +369,6 @@ void AgcMeanLuminance::configure(const SensorConfiguration &config,\n>                 ExposureModeHelper::SensorConfiguration sensorConfig;\n>                 sensorConfig.lineDuration_ = config.lineDuration;\n>                 sensorConfig.minExposureTime_ = config.minExposureTime;\n> -               sensorConfig.maxExposureTime_ = config.maxExposureTime;\n>                 sensorConfig.minFrameDuration_ = config.minFrameDuration;\n>                 sensorConfig.maxFrameDuration_ = config.maxFrameDuration;\n>                 sensorConfig.minGain_ = config.minAnalogueGain;\n> diff --git a/src/ipa/libipa/agc_mean_luminance.h b/src/ipa/libipa/agc_mean_luminance.h\n> index acbefc4e5765413bc803417eae1dbd0a943bc95e..93a0959bbd9e0d6ec42248f2d3b19253ad389ae6 100644\n> --- a/src/ipa/libipa/agc_mean_luminance.h\n> +++ b/src/ipa/libipa/agc_mean_luminance.h\n> @@ -45,7 +45,6 @@ public:\n>         struct SensorConfiguration {\n>                 utils::Duration lineDuration;\n>                 utils::Duration minExposureTime;\n> -               utils::Duration maxExposureTime;\n>                 utils::Duration minFrameDuration;\n>                 utils::Duration maxFrameDuration;\n>                 double minAnalogueGain;\n> diff --git a/src/ipa/mali-c55/algorithms/agc.cpp b/src/ipa/mali-c55/algorithms/agc.cpp\n> index 91b1438f7e5ca0498373c86fd75b91f9c5a81c3f..a0b55694aad292f8a080d8266470797ac0cc2c25 100644\n> --- a/src/ipa/mali-c55/algorithms/agc.cpp\n> +++ b/src/ipa/mali-c55/algorithms/agc.cpp\n> @@ -176,7 +176,6 @@ int Agc::configure(IPAContext &context,\n>         AgcMeanLuminance::SensorConfiguration sensorConfig;\n>         sensorConfig.lineDuration = context.configuration.sensor.lineDuration;\n>         sensorConfig.minExposureTime = context.configuration.sensor.minShutterSpeed;\n> -       sensorConfig.maxExposureTime = context.configuration.sensor.maxShutterSpeed;\n>         sensorConfig.minFrameDuration = context.configuration.sensor.minFrameDuration;\n>         sensorConfig.maxFrameDuration = context.configuration.sensor.maxFrameDuration;\n>         sensorConfig.minAnalogueGain = context.configuration.sensor.minAnalogueGain;\n> diff --git a/src/ipa/mali-c55/ipa_context.h b/src/ipa/mali-c55/ipa_context.h\n> index 3b64cb7571729d4af162def5b2316331b3561af1..828103f21451d9f7f4998c3faedc8fb6a1e7a2ec 100644\n> --- a/src/ipa/mali-c55/ipa_context.h\n> +++ b/src/ipa/mali-c55/ipa_context.h\n> @@ -29,7 +29,6 @@ struct IPASessionConfiguration {\n>                 utils::Duration lineDuration;\n>                 uint32_t blackLevel;\n>                 utils::Duration minShutterSpeed;\n> -               utils::Duration maxShutterSpeed;\n>                 utils::Duration minFrameDuration;\n>                 utils::Duration maxFrameDuration;\n>                 double minAnalogueGain;\n> diff --git a/src/ipa/mali-c55/mali-c55.cpp b/src/ipa/mali-c55/mali-c55.cpp\n> index 491ae71a06dbede967bfbe1bcdcab25d177ad691..02f5dfb76eae073858ec688746b7e12ec072e567 100644\n> --- a/src/ipa/mali-c55/mali-c55.cpp\n> +++ b/src/ipa/mali-c55/mali-c55.cpp\n> @@ -170,7 +170,6 @@ void IPAMaliC55::updateSessionConfiguration(const IPACameraSensorInfo &info,\n>  \n>         const ControlInfo &v4l2Exposure = sensorControls.find(V4L2_CID_EXPOSURE)->second;\n>         int32_t minExposure = v4l2Exposure.min().get<int32_t>();\n> -       int32_t maxExposure = v4l2Exposure.max().get<int32_t>();\n>         int32_t defExposure = v4l2Exposure.def().get<int32_t>();\n>  \n>         const ControlInfo &v4l2Gain = sensorControls.find(V4L2_CID_ANALOGUE_GAIN)->second;\n> @@ -191,7 +190,6 @@ void IPAMaliC55::updateSessionConfiguration(const IPACameraSensorInfo &info,\n>         utils::Duration lineDuration = info.minLineLength * 1.0s / info.pixelRate;\n>         context_.configuration.sensor.lineDuration = lineDuration;\n>         context_.configuration.sensor.minShutterSpeed = minExposure * lineDuration;\n> -       context_.configuration.sensor.maxShutterSpeed = maxExposure * lineDuration;\n>         context_.configuration.sensor.minFrameDuration = frameHeights[0] * lineDuration;\n>         context_.configuration.sensor.maxFrameDuration = frameHeights[1] * lineDuration;\n>         context_.configuration.sensor.minAnalogueGain = context_.camHelper->gain(minGain);\n> diff --git a/src/ipa/rkisp1/algorithms/agc.cpp b/src/ipa/rkisp1/algorithms/agc.cpp\n> index b9a94ba03c910f73420579dd6737d8d46b26e576..a2ecd5c46a1fbcb728e23ed83b37b89fcdb80d84 100644\n> --- a/src/ipa/rkisp1/algorithms/agc.cpp\n> +++ b/src/ipa/rkisp1/algorithms/agc.cpp\n> @@ -203,8 +203,6 @@ int Agc::configure(IPAContext &context, const IPACameraSensorInfo &configInfo)\n>         AgcMeanLuminance::SensorConfiguration sensorConfig;\n>         sensorConfig.lineDuration = context.configuration.sensor.lineDuration;\n>         sensorConfig.minExposureTime = context.configuration.sensor.minExposureTime;\n> -       sensorConfig.maxExposureTime = context.configuration.sensor.maxExposureTime;\n> -       sensorConfig.minFrameDuration = context.configuration.sensor.minFrameDuration;\n>         sensorConfig.maxFrameDuration = context.configuration.sensor.maxFrameDuration;\n>         sensorConfig.minAnalogueGain = context.configuration.sensor.minAnalogueGain;\n>         sensorConfig.maxAnalogueGain = context.configuration.sensor.maxAnalogueGain;\n> diff --git a/src/ipa/rkisp1/ipa_context.cpp b/src/ipa/rkisp1/ipa_context.cpp\n> index 15cb0afe9fe8d266d645a27cc3a3e440a0dd2413..40c5d244cf524e9ca3455183ee02237892e70312 100644\n> --- a/src/ipa/rkisp1/ipa_context.cpp\n> +++ b/src/ipa/rkisp1/ipa_context.cpp\n> @@ -89,9 +89,6 @@ namespace libcamera::ipa::rkisp1 {\n>   * \\var IPASessionConfiguration::sensor.minExposureTime\n>   * \\brief Minimum exposure time supported with the sensor\n>   *\n> - * \\var IPASessionConfiguration::sensor.maxExposureTime\n> - * \\brief Maximum exposure time supported with the sensor\n> - *\n>   * \\var IPASessionConfiguration::sensor.minAnalogueGain\n>   * \\brief Minimum analogue gain supported with the sensor\n>   *\n> diff --git a/src/ipa/rkisp1/ipa_context.h b/src/ipa/rkisp1/ipa_context.h\n> index 5fe727bd0b508617d993d226ae785056a3771ce0..52764dbc0a8f579332f0785baf86ba7a1f6db9e2 100644\n> --- a/src/ipa/rkisp1/ipa_context.h\n> +++ b/src/ipa/rkisp1/ipa_context.h\n> @@ -61,7 +61,6 @@ struct IPASessionConfiguration {\n>  \n>         struct {\n>                 utils::Duration minExposureTime;\n> -               utils::Duration maxExposureTime;\n>                 utils::Duration minFrameDuration;\n>                 utils::Duration maxFrameDuration;\n>                 double minAnalogueGain;\n> diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp\n> index f25e477f0fb77241bd1ccddb7778205e58bdc8a9..4da7cf36400df897ef4392fb264b1f6401391ad0 100644\n> --- a/src/ipa/rkisp1/rkisp1.cpp\n> +++ b/src/ipa/rkisp1/rkisp1.cpp\n> @@ -269,7 +269,6 @@ int IPARkISP1::configure(const IPAConfigInfo &ipaConfig,\n>          * on the sensor, update it with the controls.\n>          */\n>         context_.configuration.sensor.minExposureTime = minExposure * lineDuration;\n> -       context_.configuration.sensor.maxExposureTime = maxExposure * lineDuration;\n>         context_.configuration.sensor.minFrameDuration = frameHeights[0] * lineDuration;\n>         context_.configuration.sensor.maxFrameDuration = frameHeights[1] * lineDuration;\n>         context_.configuration.sensor.minAnalogueGain = context_.camHelper->gain(minGain);\n> \n> -- \n> 2.51.1\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 6F22FC32F2\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri,  6 Feb 2026 15:32:12 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id DA891620D6;\n\tFri,  6 Feb 2026 16:32:11 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id C9275620C9\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri,  6 Feb 2026 16:32:09 +0100 (CET)","from neptunite.rasen.tech (unknown\n\t[IPv6:2404:7a81:160:2100:5247:7b72:2b7:10da])\n\tby perceval.ideasonboard.com (Postfix) with UTF8SMTPSA id BE7432E0;\n\tFri,  6 Feb 2026 16:31:25 +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=\"gQsLIof6\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1770391886;\n\tbh=vCnaoqsuEwQCSz8bGIRghs+8Wbi+eOpBWdWJL/FE+ME=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=gQsLIof6xPWbOtuUHEZem97HfaeO0C7S2SnpSSUUMdG/MtuWmctOjpCHnA49Wqvr+\n\tTR8U2Y72u5ftIhp9MMgFa1wEAXlS494461AgvjvNtEXkUbO5ZRQsleijrM8827xUq5\n\tfBDV4jt7h99vkdGZDFek1CgJDI3H6+Cd6I29cwJo=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20251114-exposure-limits-v3-16-b7c07feba026@ideasonboard.com>","References":"<20251114-exposure-limits-v3-0-b7c07feba026@ideasonboard.com>\n\t<20251114-exposure-limits-v3-16-b7c07feba026@ideasonboard.com>","Subject":"Re: [PATCH v3 16/19] ipa: libipa: Remove maxExposureTime from sensor\n\tconfiguration","From":"Paul Elder <paul.elder@ideasonboard.com>","Cc":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","To":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>, Niklas =?utf-8?b?U8O2?=\n\t=?utf-8?q?derlund?= <niklas.soderlund@ragnatech.se>, Robert Mader\n\t<robert.mader@collabora.com>, libcamera-devel@lists.libcamera.org","Date":"Sat, 07 Feb 2026 00:32:03 +0900","Message-ID":"<177039192361.607498.15812082256025071207@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>"}}]