[v3,16/19] ipa: libipa: Remove maxExposureTime from sensor configuration
diff mbox series

Message ID 20251114-exposure-limits-v3-16-b7c07feba026@ideasonboard.com
State New
Headers show
Series
  • libipa: agc: Calculate exposure limits
Related show

Commit Message

Jacopo Mondi Nov. 14, 2025, 2:17 p.m. UTC
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 <jacopo.mondi@ideasonboard.com>
---
 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(-)

Patch
diff mbox series

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>();
-	int32_t maxExposure = v4l2Exposure.max().get<int32_t>();
 
 	const ControlInfo &v4l2Gain = sensorControls.find(V4L2_CID_ANALOGUE_GAIN)->second;
 	int32_t minGain = v4l2Gain.min().get<int32_t>();
@@ -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>();
-	int32_t maxExposure = v4l2Exposure.max().get<int32_t>();
 	int32_t defExposure = v4l2Exposure.def().get<int32_t>();
 
 	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);