From patchwork Fri Nov 14 14:17:11 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 25068 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 01B3EC3241 for ; Fri, 14 Nov 2025 14:17:42 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 9BF6660AA7; Fri, 14 Nov 2025 15:17:42 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="GmVqZ7R0"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 0571860AAB for ; Fri, 14 Nov 2025 15:17:24 +0100 (CET) Received: from [192.168.1.101] (93-61-96-190.ip145.fastwebnet.it [93.61.96.190]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 067041E5A; Fri, 14 Nov 2025 15:15:22 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1763129723; bh=AIdwxNDRiTVtX5iE/ejoMpkXEM33NwchcLz9mIXnhXs=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=GmVqZ7R0gYvKzBBYZUS+YJIL53/bBCjU3SH+bzMfd8As3ICVfTxH+1TIEe/7th60Z TDUKYMP3cc86sZjoUvOnRuUT10f69r9fAcDmbxvNgWMN3KRnypxEFJ+++gdDTEf7z+ n8/qW19kUXb4xMLGttLxdS8OYS3xjtkVs1u76JiQ= From: Jacopo Mondi Date: Fri, 14 Nov 2025 15:17:11 +0100 Subject: [PATCH v3 16/19] ipa: libipa: Remove maxExposureTime from sensor configuration MIME-Version: 1.0 Message-Id: <20251114-exposure-limits-v3-16-b7c07feba026@ideasonboard.com> References: <20251114-exposure-limits-v3-0-b7c07feba026@ideasonboard.com> In-Reply-To: <20251114-exposure-limits-v3-0-b7c07feba026@ideasonboard.com> To: =?utf-8?q?Niklas_S=C3=B6derlund?= , Robert Mader , libcamera-devel@lists.libcamera.org Cc: Jacopo Mondi X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=13821; i=jacopo.mondi@ideasonboard.com; h=from:subject:message-id; bh=AIdwxNDRiTVtX5iE/ejoMpkXEM33NwchcLz9mIXnhXs=; b=owEBbQKS/ZANAwAKAXI0Bo8WoVY8AcsmYgBpFznsqlFgcBGcHZlihm+Ni4oglPlZjY0BtbH4o pPEQGW1Wn6JAjMEAAEKAB0WIQS1xD1IgJogio9YOMByNAaPFqFWPAUCaRc57AAKCRByNAaPFqFW PKZID/0Wy74iL7GKwpBdJAKqDuuDOpj9bFQz8g4meNo/eorIIz+qmynrrBsGz7IvX1YDzmS9qRo UnMtqbUkbPn8BrwgpoKtadKuEOrtjuUgKTyHTf88gV48lrRAWl3+tAIBdBI3VV4HGarPs5AW/Bq ylMNJrn6uK/pV/AKEuDPWRbL1JS711fyOBKM7wZ83lsSsf6LY7+yq/4q2UnYF2GCUJ3EQkmdwZG tJ28Y3pLCnE/do0fzCCcvOI2rKx1VFuUl2JXleYbL/GII7zztv0nB6qZ/HwGme/j4N0cJoC1neJ WzAlm4A5YIA5DCd08yNBPZkVRytFZeQqyls6a7mnFKqYNNFasbAur7ldbd2Iqw+MX8FBS/WVn0R AJO4j3EgCLTqScjK5ciCwf07WUOevvGGgfpwOQsqCifGZKlJ7fw3pcYklVvKDfljRzoxDvfw3ia TOJ2hzyb9fR4DDTrni6EcbjpflVhdH+RIAPygssS6d1SRC9tNQcYZxo9TRgi9g5d7CQ5pClORuh Q2swjVO/AYWoq029glmh2Aq14cTRsWvjr9opqm+Ruo85p+hDfQ+zqVEKkGxwZfsN4gOu7MJf3I+ DiwK60agEQUfJDibR8usV4kelsQQnVTFlzr5te+Pn5eqVgmQVNyZ/vdweUCKGiclJjxtcYWM5um qvGvA+ootCouvyw== X-Developer-Key: i=jacopo.mondi@ideasonboard.com; a=openpgp; fpr=72392EDC88144A65C701EA9BA5826A2587AD026B X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Now that we have moved the AgcMeanLuminance class and the associated helpers to calculate the maximum achievable shutter time using the frame duration, remove the maxExposureTime parameter from all the IPAs using AgcMeanLuminance. Remove maxExposureTime from all IPA sensor configuration data, as it is now unused and its value depends on the frame duration. Do not remove minExposureTime as this instead effectively represents a sensor parameters which remains stable during a streaming session. Signed-off-by: Jacopo Mondi --- src/ipa/ipu3/algorithms/agc.cpp | 15 +++------------ src/ipa/ipu3/algorithms/agc.h | 4 ---- src/ipa/ipu3/ipa_context.cpp | 3 --- src/ipa/ipu3/ipa_context.h | 1 - src/ipa/ipu3/ipu3.cpp | 2 -- src/ipa/libipa/agc_mean_luminance.cpp | 4 ---- src/ipa/libipa/agc_mean_luminance.h | 1 - src/ipa/mali-c55/algorithms/agc.cpp | 1 - src/ipa/mali-c55/ipa_context.h | 1 - src/ipa/mali-c55/mali-c55.cpp | 2 -- src/ipa/rkisp1/algorithms/agc.cpp | 2 -- src/ipa/rkisp1/ipa_context.cpp | 3 --- src/ipa/rkisp1/ipa_context.h | 1 - src/ipa/rkisp1/rkisp1.cpp | 1 - 14 files changed, 3 insertions(+), 38 deletions(-) diff --git a/src/ipa/ipu3/algorithms/agc.cpp b/src/ipa/ipu3/algorithms/agc.cpp index c9d41f93cff5b81710b76592303f1e0d10697326..8fc2d7310c5c6e08b3eff6cc575c221d21c1131f 100644 --- a/src/ipa/ipu3/algorithms/agc.cpp +++ b/src/ipa/ipu3/algorithms/agc.cpp @@ -57,11 +57,6 @@ static constexpr utils::Duration kMaxExposureTime = 60ms; /* Histogram constants */ static constexpr uint32_t knumHistogramBins = 256; -Agc::Agc() - : minExposureTime_(0s), maxExposureTime_(0s) -{ -} - /** * \brief Initialise the AGC algorithm from tuning files * \param[in] context The shared IPA context @@ -101,10 +96,6 @@ int Agc::configure(IPAContext &context, stride_ = configuration.grid.stride; bdsGrid_ = configuration.grid.bdsGrid; - minExposureTime_ = configuration.sensor.minExposureTime; - maxExposureTime_ = std::min(configuration.sensor.maxExposureTime, - kMaxExposureTime); - minAnalogueGain_ = std::max(configuration.sensor.minAnalogueGain, kMinAnalogueGain); maxAnalogueGain_ = configuration.sensor.maxAnalogueGain; @@ -117,10 +108,10 @@ int Agc::configure(IPAContext &context, AgcMeanLuminance::SensorConfiguration sensorConfig; sensorConfig.lineDuration = context.configuration.sensor.lineDuration; - sensorConfig.minExposureTime = minExposureTime_; + sensorConfig.minExposureTime = configuration.sensor.minExposureTime; sensorConfig.minFrameDuration = context.configuration.sensor.minFrameDuration; - sensorConfig.maxFrameDuration = context.configuration.sensor.maxFrameDuration; - sensorConfig.maxExposureTime = maxExposureTime_; + sensorConfig.maxFrameDuration = std::min(context.configuration.sensor.maxFrameDuration, + kMaxExposureTime); sensorConfig.minAnalogueGain = minAnalogueGain_; sensorConfig.maxAnalogueGain = maxAnalogueGain_; diff --git a/src/ipa/ipu3/algorithms/agc.h b/src/ipa/ipu3/algorithms/agc.h index 890c271b44627f337c0d8a85853e1ecc3bae1318..4c2e4e3e5913d87a5af420b17f6c487aeb6cc37a 100644 --- a/src/ipa/ipu3/algorithms/agc.h +++ b/src/ipa/ipu3/algorithms/agc.h @@ -27,7 +27,6 @@ namespace ipa::ipu3::algorithms { class Agc : public Algorithm, public AgcMeanLuminance { public: - Agc(); ~Agc() = default; int init(IPAContext &context, const YamlObject &tuningData) override; @@ -42,9 +41,6 @@ private: Histogram parseStatistics(const ipu3_uapi_stats_3a *stats, const ipu3_uapi_grid_config &grid); - utils::Duration minExposureTime_; - utils::Duration maxExposureTime_; - double minAnalogueGain_; double maxAnalogueGain_; diff --git a/src/ipa/ipu3/ipa_context.cpp b/src/ipa/ipu3/ipa_context.cpp index 47ae750f0ddb859e1a08e75e255b8decacd730a1..4281ffba5f7fc841e47132986631c0ee44c898ff 100644 --- a/src/ipa/ipu3/ipa_context.cpp +++ b/src/ipa/ipu3/ipa_context.cpp @@ -111,9 +111,6 @@ namespace libcamera::ipa::ipu3 { * \var IPASessionConfiguration::agc.minExposureTime * \brief Minimum exposure time supported with the configured sensor * - * \var IPASessionConfiguration::agc.maxExposureTime - * \brief Maximum exposure time supported with the configured sensor - * * \var IPASessionConfiguration::agc.minAnalogueGain * \brief Minimum analogue gain supported with the configured sensor * diff --git a/src/ipa/ipu3/ipa_context.h b/src/ipa/ipu3/ipa_context.h index 33f3fe3ae1b503d47887873046def0835cd53894..11b9c286d56ac6f30d446e3721f7e5db4364a6fb 100644 --- a/src/ipa/ipu3/ipa_context.h +++ b/src/ipa/ipu3/ipa_context.h @@ -38,7 +38,6 @@ struct IPASessionConfiguration { utils::Duration lineDuration; Size size; utils::Duration minExposureTime; - utils::Duration maxExposureTime; utils::Duration minFrameDuration; utils::Duration maxFrameDuration; double minAnalogueGain; diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp index 0c8651c5235f9e4e9944eb88595aeef41f016310..61e8030d722f430e702a8b8f7e2880caa961fa8e 100644 --- a/src/ipa/ipu3/ipu3.cpp +++ b/src/ipa/ipu3/ipu3.cpp @@ -206,7 +206,6 @@ void IPAIPU3::updateSessionConfiguration(const IPACameraSensorInfo &sensorInfo, const ControlInfo &v4l2Exposure = sensorControls.find(V4L2_CID_EXPOSURE)->second; int32_t minExposure = v4l2Exposure.min().get(); - int32_t maxExposure = v4l2Exposure.max().get(); const ControlInfo &v4l2Gain = sensorControls.find(V4L2_CID_ANALOGUE_GAIN)->second; int32_t minGain = v4l2Gain.min().get(); @@ -226,7 +225,6 @@ void IPAIPU3::updateSessionConfiguration(const IPACameraSensorInfo &sensorInfo, * \todo take VBLANK into account for maximum exposure time */ context_.configuration.sensor.minExposureTime = minExposure * context_.configuration.sensor.lineDuration; - context_.configuration.sensor.maxExposureTime = maxExposure * context_.configuration.sensor.lineDuration; context_.configuration.sensor.minFrameDuration = frameHeights[0] * context_.configuration.sensor.lineDuration; context_.configuration.sensor.maxFrameDuration = frameHeights[1] * diff --git a/src/ipa/libipa/agc_mean_luminance.cpp b/src/ipa/libipa/agc_mean_luminance.cpp index 725a23ef2f6f612c6d3408701246db7415fd8327..b930e1f7240d4936aa8dc850657bbbf9c2f3a11f 100644 --- a/src/ipa/libipa/agc_mean_luminance.cpp +++ b/src/ipa/libipa/agc_mean_luminance.cpp @@ -115,9 +115,6 @@ static constexpr double kMaxRelativeLuminanceTarget = 0.95; * \var AgcMeanLuminance::SensorConfiguration::minExposureTime * \brief The sensor minimum exposure time in microseconds * - * \var AgcMeanLuminance::SensorConfiguration::maxExposureTime - * \brief The sensor maximum exposure time in microseconds - * * \var AgcMeanLuminance::SensorConfiguration::minFrameDuration * \brief The sensor minimum frame duration in microseconds * @@ -372,7 +369,6 @@ void AgcMeanLuminance::configure(const SensorConfiguration &config, ExposureModeHelper::SensorConfiguration sensorConfig; sensorConfig.lineDuration_ = config.lineDuration; sensorConfig.minExposureTime_ = config.minExposureTime; - sensorConfig.maxExposureTime_ = config.maxExposureTime; sensorConfig.minFrameDuration_ = config.minFrameDuration; sensorConfig.maxFrameDuration_ = config.maxFrameDuration; sensorConfig.minGain_ = config.minAnalogueGain; diff --git a/src/ipa/libipa/agc_mean_luminance.h b/src/ipa/libipa/agc_mean_luminance.h index acbefc4e5765413bc803417eae1dbd0a943bc95e..93a0959bbd9e0d6ec42248f2d3b19253ad389ae6 100644 --- a/src/ipa/libipa/agc_mean_luminance.h +++ b/src/ipa/libipa/agc_mean_luminance.h @@ -45,7 +45,6 @@ public: struct SensorConfiguration { utils::Duration lineDuration; utils::Duration minExposureTime; - utils::Duration maxExposureTime; utils::Duration minFrameDuration; utils::Duration maxFrameDuration; double minAnalogueGain; diff --git a/src/ipa/mali-c55/algorithms/agc.cpp b/src/ipa/mali-c55/algorithms/agc.cpp index 91b1438f7e5ca0498373c86fd75b91f9c5a81c3f..a0b55694aad292f8a080d8266470797ac0cc2c25 100644 --- a/src/ipa/mali-c55/algorithms/agc.cpp +++ b/src/ipa/mali-c55/algorithms/agc.cpp @@ -176,7 +176,6 @@ int Agc::configure(IPAContext &context, AgcMeanLuminance::SensorConfiguration sensorConfig; sensorConfig.lineDuration = context.configuration.sensor.lineDuration; sensorConfig.minExposureTime = context.configuration.sensor.minShutterSpeed; - sensorConfig.maxExposureTime = context.configuration.sensor.maxShutterSpeed; sensorConfig.minFrameDuration = context.configuration.sensor.minFrameDuration; sensorConfig.maxFrameDuration = context.configuration.sensor.maxFrameDuration; sensorConfig.minAnalogueGain = context.configuration.sensor.minAnalogueGain; diff --git a/src/ipa/mali-c55/ipa_context.h b/src/ipa/mali-c55/ipa_context.h index 3b64cb7571729d4af162def5b2316331b3561af1..828103f21451d9f7f4998c3faedc8fb6a1e7a2ec 100644 --- a/src/ipa/mali-c55/ipa_context.h +++ b/src/ipa/mali-c55/ipa_context.h @@ -29,7 +29,6 @@ struct IPASessionConfiguration { utils::Duration lineDuration; uint32_t blackLevel; utils::Duration minShutterSpeed; - utils::Duration maxShutterSpeed; utils::Duration minFrameDuration; utils::Duration maxFrameDuration; double minAnalogueGain; diff --git a/src/ipa/mali-c55/mali-c55.cpp b/src/ipa/mali-c55/mali-c55.cpp index 491ae71a06dbede967bfbe1bcdcab25d177ad691..02f5dfb76eae073858ec688746b7e12ec072e567 100644 --- a/src/ipa/mali-c55/mali-c55.cpp +++ b/src/ipa/mali-c55/mali-c55.cpp @@ -170,7 +170,6 @@ void IPAMaliC55::updateSessionConfiguration(const IPACameraSensorInfo &info, const ControlInfo &v4l2Exposure = sensorControls.find(V4L2_CID_EXPOSURE)->second; int32_t minExposure = v4l2Exposure.min().get(); - int32_t maxExposure = v4l2Exposure.max().get(); int32_t defExposure = v4l2Exposure.def().get(); const ControlInfo &v4l2Gain = sensorControls.find(V4L2_CID_ANALOGUE_GAIN)->second; @@ -191,7 +190,6 @@ void IPAMaliC55::updateSessionConfiguration(const IPACameraSensorInfo &info, utils::Duration lineDuration = info.minLineLength * 1.0s / info.pixelRate; context_.configuration.sensor.lineDuration = lineDuration; context_.configuration.sensor.minShutterSpeed = minExposure * lineDuration; - context_.configuration.sensor.maxShutterSpeed = maxExposure * lineDuration; context_.configuration.sensor.minFrameDuration = frameHeights[0] * lineDuration; context_.configuration.sensor.maxFrameDuration = frameHeights[1] * lineDuration; context_.configuration.sensor.minAnalogueGain = context_.camHelper->gain(minGain); diff --git a/src/ipa/rkisp1/algorithms/agc.cpp b/src/ipa/rkisp1/algorithms/agc.cpp index b9a94ba03c910f73420579dd6737d8d46b26e576..a2ecd5c46a1fbcb728e23ed83b37b89fcdb80d84 100644 --- a/src/ipa/rkisp1/algorithms/agc.cpp +++ b/src/ipa/rkisp1/algorithms/agc.cpp @@ -203,8 +203,6 @@ int Agc::configure(IPAContext &context, const IPACameraSensorInfo &configInfo) AgcMeanLuminance::SensorConfiguration sensorConfig; sensorConfig.lineDuration = context.configuration.sensor.lineDuration; sensorConfig.minExposureTime = context.configuration.sensor.minExposureTime; - sensorConfig.maxExposureTime = context.configuration.sensor.maxExposureTime; - sensorConfig.minFrameDuration = context.configuration.sensor.minFrameDuration; sensorConfig.maxFrameDuration = context.configuration.sensor.maxFrameDuration; sensorConfig.minAnalogueGain = context.configuration.sensor.minAnalogueGain; sensorConfig.maxAnalogueGain = context.configuration.sensor.maxAnalogueGain; diff --git a/src/ipa/rkisp1/ipa_context.cpp b/src/ipa/rkisp1/ipa_context.cpp index 15cb0afe9fe8d266d645a27cc3a3e440a0dd2413..40c5d244cf524e9ca3455183ee02237892e70312 100644 --- a/src/ipa/rkisp1/ipa_context.cpp +++ b/src/ipa/rkisp1/ipa_context.cpp @@ -89,9 +89,6 @@ namespace libcamera::ipa::rkisp1 { * \var IPASessionConfiguration::sensor.minExposureTime * \brief Minimum exposure time supported with the sensor * - * \var IPASessionConfiguration::sensor.maxExposureTime - * \brief Maximum exposure time supported with the sensor - * * \var IPASessionConfiguration::sensor.minAnalogueGain * \brief Minimum analogue gain supported with the sensor * diff --git a/src/ipa/rkisp1/ipa_context.h b/src/ipa/rkisp1/ipa_context.h index 5fe727bd0b508617d993d226ae785056a3771ce0..52764dbc0a8f579332f0785baf86ba7a1f6db9e2 100644 --- a/src/ipa/rkisp1/ipa_context.h +++ b/src/ipa/rkisp1/ipa_context.h @@ -61,7 +61,6 @@ struct IPASessionConfiguration { struct { utils::Duration minExposureTime; - utils::Duration maxExposureTime; utils::Duration minFrameDuration; utils::Duration maxFrameDuration; double minAnalogueGain; diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp index f25e477f0fb77241bd1ccddb7778205e58bdc8a9..4da7cf36400df897ef4392fb264b1f6401391ad0 100644 --- a/src/ipa/rkisp1/rkisp1.cpp +++ b/src/ipa/rkisp1/rkisp1.cpp @@ -269,7 +269,6 @@ int IPARkISP1::configure(const IPAConfigInfo &ipaConfig, * on the sensor, update it with the controls. */ context_.configuration.sensor.minExposureTime = minExposure * lineDuration; - context_.configuration.sensor.maxExposureTime = maxExposure * lineDuration; context_.configuration.sensor.minFrameDuration = frameHeights[0] * lineDuration; context_.configuration.sensor.maxFrameDuration = frameHeights[1] * lineDuration; context_.configuration.sensor.minAnalogueGain = context_.camHelper->gain(minGain);