[v2,04/10] ipa: libipa: agc: Make Agc::configure() set limits
diff mbox series

Message ID 20251028-exposure-limits-v2-4-a8b5a318323e@ideasonboard.com
State New
Headers show
Series
  • libipa: agc: Calculate exposure limits
Related show

Commit Message

Jacopo Mondi Oct. 28, 2025, 9:31 a.m. UTC
The AgcMeanLuminance algorithm interface has a 'configure()' and
'setLimits()' API. configure() doesn't actually do much if not
initialzing a few variables, and the Mali and IPU3 IPAs do not
even call it. Configuring the AGC requires calling setLimits() at
configure() time and at run time.

In order to prepare to differentiate between configure-time settings
of the Agc and run-time handling of dynamic parameters such as the
frame duration limits, make the configure() operation initialize
the Agc limits.

Update all IPAs Agc implementation deriving from AgcMeanLuminance.

Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
---
 src/ipa/ipu3/algorithms/agc.cpp         | 14 +++++++---
 src/ipa/libipa/agc_mean_luminance.cpp   | 48 ++++++++++++++++++++++++++++++---
 src/ipa/libipa/agc_mean_luminance.h     | 11 +++++++-
 src/ipa/libipa/exposure_mode_helper.cpp | 20 ++++++++++----
 src/ipa/libipa/exposure_mode_helper.h   |  4 ++-
 src/ipa/mali-c55/algorithms/agc.cpp     | 16 ++++++-----
 src/ipa/rkisp1/algorithms/agc.cpp       | 15 ++++++-----
 7 files changed, 101 insertions(+), 27 deletions(-)

Patch
diff mbox series

diff --git a/src/ipa/ipu3/algorithms/agc.cpp b/src/ipa/ipu3/algorithms/agc.cpp
index b0d89541da8550bd50472779da7fa8e33b96e2f0..e303d724ab165bac03ac6bb9d3891a76049cff47 100644
--- a/src/ipa/ipu3/algorithms/agc.cpp
+++ b/src/ipa/ipu3/algorithms/agc.cpp
@@ -115,9 +115,17 @@  int Agc::configure(IPAContext &context,
 	context.activeState.agc.constraintMode = constraintModes().begin()->first;
 	context.activeState.agc.exposureMode = exposureModeHelpers().begin()->first;
 
-	/* \todo Run this again when FrameDurationLimits is passed in */
-	setLimits(minExposureTime_, maxExposureTime_, minAnalogueGain_,
-		  maxAnalogueGain_, {});
+	AgcMeanLuminance::AgcSensorConfiguration sensorConfig;
+	sensorConfig.lineDuration = context.configuration.sensor.lineDuration;
+	sensorConfig.minExposureTime = minExposureTime_;
+	sensorConfig.maxExposureTime = maxExposureTime_;
+	sensorConfig.minAnalogueGain = minAnalogueGain_;
+	sensorConfig.maxAnalogueGain = maxAnalogueGain_;
+
+	AgcMeanLuminance::configure(sensorConfig, context.camHelper.get());
+
+	/* \todo Update AGC limits when FrameDurationLimits is passed in */
+
 	resetFrameCount();
 
 	return 0;
diff --git a/src/ipa/libipa/agc_mean_luminance.cpp b/src/ipa/libipa/agc_mean_luminance.cpp
index 64f36bd75dd213671b5a2e6810245096ed001f21..9886864fc42514040eadb4c0b424796df1f1b6e1 100644
--- a/src/ipa/libipa/agc_mean_luminance.cpp
+++ b/src/ipa/libipa/agc_mean_luminance.cpp
@@ -95,6 +95,42 @@  static constexpr double kMaxRelativeLuminanceTarget = 0.95;
  * \brief The luminance target for the constraint
  */
 
+/**
+ * \struct AgcMeanLuminance::AgcSensorConfiguration
+ * \brief The sensor configuration parameters
+ *
+ * This structure collects the sensor configuration parameters which need
+ * to be provided to the AGC algorithm at configure() time.
+ *
+ * Each time configure() is called the sensor configuration need to be updated
+ * with new parameters.
+ */
+
+/**
+ * \var AgcMeanLuminance::AgcSensorConfiguration::lineDuration
+ * \brief The line duration in microseconds
+ */
+
+/**
+ * \var AgcMeanLuminance::AgcSensorConfiguration::minExposureTime
+ * \brief The sensor minimum exposure time in microseconds
+ */
+
+/**
+ * \var AgcMeanLuminance::AgcSensorConfiguration::maxExposureTime
+ * \brief The sensor maximum exposure time in microseconds
+ */
+
+/**
+ * \var AgcMeanLuminance::AgcSensorConfiguration::minAnalogueGain
+ * \brief The sensor minimum analogue gain absolute value
+ */
+
+/**
+ * \var AgcMeanLuminance::AgcSensorConfiguration::maxAnalogueGain
+ * \brief The sensor maximum analogue gain absolute value
+ */
+
 /**
  * \class AgcMeanLuminance
  * \brief A mean-based auto-exposure algorithm
@@ -314,17 +350,21 @@  int AgcMeanLuminance::parseExposureModes(const YamlObject &tuningData)
 
 /**
  * \brief Configure the exposure mode helpers
- * \param[in] lineDuration The sensor line length
+ * \param[in] config The sensor configuration
  * \param[in] sensorHelper The sensor helper
  *
- * This function configures the exposure mode helpers so they can correctly
+ * This function configures the exposure mode helpers by providing them the
+ * sensor configuration parameters and the sensor helper, so they can correctly
  * take quantization effects into account.
  */
-void AgcMeanLuminance::configure(utils::Duration lineDuration,
+void AgcMeanLuminance::configure(const AgcSensorConfiguration &config,
 				 const CameraSensorHelper *sensorHelper)
 {
 	for (auto &[id, helper] : exposureModeHelpers_)
-		helper->configure(lineDuration, sensorHelper);
+		helper->configure(config.lineDuration,
+				  config.minExposureTime, config.maxExposureTime,
+				  config.minAnalogueGain, config.maxAnalogueGain,
+				  sensorHelper);
 }
 
 /**
diff --git a/src/ipa/libipa/agc_mean_luminance.h b/src/ipa/libipa/agc_mean_luminance.h
index d7ec548e3e585e28fd03b956c8de7eaac5dc6e99..5ab75a3ac6c550a655f4bb7c8c30419ad8249183 100644
--- a/src/ipa/libipa/agc_mean_luminance.h
+++ b/src/ipa/libipa/agc_mean_luminance.h
@@ -42,7 +42,16 @@  public:
 		double yTarget;
 	};
 
-	void configure(utils::Duration lineDuration, const CameraSensorHelper *sensorHelper);
+	struct AgcSensorConfiguration {
+		utils::Duration lineDuration;
+		utils::Duration minExposureTime;
+		utils::Duration maxExposureTime;
+		double minAnalogueGain;
+		double maxAnalogueGain;
+	};
+
+	void configure(const AgcSensorConfiguration &config,
+		       const CameraSensorHelper *sensorHelper);
 	int parseTuningData(const YamlObject &tuningData);
 
 	void setExposureCompensation(double gain)
diff --git a/src/ipa/libipa/exposure_mode_helper.cpp b/src/ipa/libipa/exposure_mode_helper.cpp
index 29e316d9d09181cd65cb08f26babb1a680bee62a..557e14230ba4e0f120653bc09ea23a29a54cb4c8 100644
--- a/src/ipa/libipa/exposure_mode_helper.cpp
+++ b/src/ipa/libipa/exposure_mode_helper.cpp
@@ -82,22 +82,32 @@  ExposureModeHelper::ExposureModeHelper(const Span<std::pair<utils::Duration, dou
 /**
  * \brief Configure sensor details
  * \param[in] lineDuration The current line length of the sensor
+ * \param[in] minExposureTime The minimum exposure time supported
+ * \param[in] maxExposureTime The maximum exposure time supported
+ * \param[in] minGain The minimum analogue gain supported
+ * \param[in] maxGain The maximum analogue gain supported
  * \param[in] sensorHelper The sensor helper
  *
- * This function sets the line length and sensor helper. These are used in
- * splitExposure() to take the quantization of the exposure and gain into
- * account.
+ * This function initializes the exposure helper settings using the sensor
+ * configuration parameters.
  *
- * When this has not been called, it is assumed that exposure is in micro second
- * granularity and gain has no quantization at all.
+ * The sensor parameters' min and max limits are used in splitExposure() to take
+ * the quantization of the exposure and gain into account.
  *
  * ExposureModeHelper keeps a pointer to the CameraSensorHelper, so the caller
  * has to ensure that sensorHelper is valid until the next call to configure().
  */
 void ExposureModeHelper::configure(utils::Duration lineDuration,
+				   utils::Duration minExposureTime,
+				   utils::Duration maxExposureTime,
+				   double minGain, double maxGain,
 				   const CameraSensorHelper *sensorHelper)
 {
 	lineDuration_ = lineDuration;
+	minExposureTime_ = minExposureTime;
+	maxExposureTime_ = maxExposureTime;
+	minGain_ = minGain;
+	maxGain_ = maxGain;
 	sensorHelper_ = sensorHelper;
 }
 
diff --git a/src/ipa/libipa/exposure_mode_helper.h b/src/ipa/libipa/exposure_mode_helper.h
index 968192ddc5af768ae0de58aca6c7230c7b3bd507..bb0a692c99b3128a2ee3f15304f125e073721536 100644
--- a/src/ipa/libipa/exposure_mode_helper.h
+++ b/src/ipa/libipa/exposure_mode_helper.h
@@ -26,7 +26,9 @@  public:
 	ExposureModeHelper(const Span<std::pair<utils::Duration, double>> stages);
 	~ExposureModeHelper() = default;
 
-	void configure(utils::Duration lineLength, const CameraSensorHelper *sensorHelper);
+	void configure(utils::Duration lineLength, utils::Duration minExposureTime,
+		       utils::Duration maxExposureTime, double minGain, double maxGain,
+		       const CameraSensorHelper *sensorHelper);
 	void setLimits(utils::Duration minExposureTime, utils::Duration maxExposureTime,
 		       double minGain, double maxGain);
 
diff --git a/src/ipa/mali-c55/algorithms/agc.cpp b/src/ipa/mali-c55/algorithms/agc.cpp
index f60fddac3f04fd6f09dc782e929ff1593758c29b..ccf72cc9e8c33b1a516322c2445efa1684b7f751 100644
--- a/src/ipa/mali-c55/algorithms/agc.cpp
+++ b/src/ipa/mali-c55/algorithms/agc.cpp
@@ -169,12 +169,16 @@  int Agc::configure(IPAContext &context,
 	context.activeState.agc.constraintMode = constraintModes().begin()->first;
 	context.activeState.agc.exposureMode = exposureModeHelpers().begin()->first;
 
-	/* \todo Run this again when FrameDurationLimits is passed in */
-	setLimits(context.configuration.agc.minShutterSpeed,
-		  context.configuration.agc.maxShutterSpeed,
-		  context.configuration.agc.minAnalogueGain,
-		  context.configuration.agc.maxAnalogueGain,
-		  {});
+	AgcMeanLuminance::AgcSensorConfiguration sensorConfig;
+	sensorConfig.lineDuration = context.configuration.sensor.lineDuration;
+	sensorConfig.minExposureTime = context.configuration.agc.minShutterSpeed;
+	sensorConfig.maxExposureTime = context.configuration.agc.maxShutterSpeed;
+	sensorConfig.minAnalogueGain = context.configuration.agc.minAnalogueGain;
+	sensorConfig.maxAnalogueGain = context.configuration.agc.maxAnalogueGain;
+
+	AgcMeanLuminance::configure(sensorConfig, context.camHelper.get());
+
+	/* \todo Update AGC limits when FrameDurationLimits is passed in */
 
 	resetFrameCount();
 
diff --git a/src/ipa/rkisp1/algorithms/agc.cpp b/src/ipa/rkisp1/algorithms/agc.cpp
index f5a3c917cb6909f6ef918e5ee8e46cf97ba55010..8c07e6a6eac091d949ad71ee967c893897313cc8 100644
--- a/src/ipa/rkisp1/algorithms/agc.cpp
+++ b/src/ipa/rkisp1/algorithms/agc.cpp
@@ -200,13 +200,14 @@  int Agc::configure(IPAContext &context, const IPACameraSensorInfo &configInfo)
 	context.configuration.agc.measureWindow.h_size = configInfo.outputSize.width;
 	context.configuration.agc.measureWindow.v_size = configInfo.outputSize.height;
 
-	AgcMeanLuminance::configure(context.configuration.sensor.lineDuration,
-				    context.camHelper.get());
-
-	setLimits(context.configuration.sensor.minExposureTime,
-		  context.configuration.sensor.maxExposureTime,
-		  context.configuration.sensor.minAnalogueGain,
-		  context.configuration.sensor.maxAnalogueGain, {});
+	AgcMeanLuminance::AgcSensorConfiguration sensorConfig;
+	sensorConfig.lineDuration = context.configuration.sensor.lineDuration;
+	sensorConfig.minExposureTime = context.configuration.sensor.minExposureTime;
+	sensorConfig.maxExposureTime = context.configuration.sensor.maxExposureTime;
+	sensorConfig.minAnalogueGain = context.configuration.sensor.minAnalogueGain;
+	sensorConfig.maxAnalogueGain = context.configuration.sensor.maxAnalogueGain;
+
+	AgcMeanLuminance::configure(sensorConfig, context.camHelper.get());
 
 	context.activeState.agc.automatic.yTarget = effectiveYTarget();