[libcamera-devel,v5,09/14] ipa: ipu3: agc: Store exposure in units of time
diff mbox series

Message ID 20211113084947.21892-10-jeanmichel.hautbois@ideasonboard.com
State Accepted
Headers show
Series
  • IPA: IPU3: Introduce per-frame controls
Related show

Commit Message

Jean-Michel Hautbois Nov. 13, 2021, 8:49 a.m. UTC
The minimum and maximum exposure are stored in lines. Replace it by
values in time to simplify the calculations.

Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
---
 src/ipa/ipu3/algorithms/agc.cpp | 21 +++++++++------------
 src/ipa/ipu3/algorithms/agc.h   |  4 ++--
 2 files changed, 11 insertions(+), 14 deletions(-)

Patch
diff mbox series

diff --git a/src/ipa/ipu3/algorithms/agc.cpp b/src/ipa/ipu3/algorithms/agc.cpp
index 4d2450fc..1e6f2b64 100644
--- a/src/ipa/ipu3/algorithms/agc.cpp
+++ b/src/ipa/ipu3/algorithms/agc.cpp
@@ -79,8 +79,8 @@  static constexpr uint32_t kMaxLuminance = 255;
 static constexpr double kNormalizedLumaTarget = 0.16;
 
 Agc::Agc()
-	: frameCount_(0), iqMean_(0.0), lineDuration_(0s), minExposureLines_(0),
-	  maxExposureLines_(0), filteredExposure_(0s), currentExposure_(0s)
+	: frameCount_(0), iqMean_(0.0), lineDuration_(0s), minShutterSpeed_(0s),
+	  maxShutterSpeed_(0s), filteredExposure_(0s), currentExposure_(0s)
 {
 }
 
@@ -99,17 +99,16 @@  int Agc::configure(IPAContext &context, const IPAConfigInfo &configInfo)
 	lineDuration_ = configInfo.sensorInfo.lineLength * 1.0s
 		      / configInfo.sensorInfo.pixelRate;
 
-	/* \todo replace the exposure in lines storage with time based ones. */
-	minExposureLines_ = context.configuration.agc.minShutterSpeed / lineDuration_;
-	maxExposureLines_ = std::min(context.configuration.agc.maxShutterSpeed / lineDuration_,
-				     kMaxShutterSpeed / lineDuration_);
+	minShutterSpeed_ = context.configuration.agc.minShutterSpeed;
+	maxShutterSpeed_ = std::min(context.configuration.agc.maxShutterSpeed,
+				    kMaxShutterSpeed);
 
 	minAnalogueGain_ = std::max(context.configuration.agc.minAnalogueGain, kMinAnalogueGain);
 	maxAnalogueGain_ = std::min(context.configuration.agc.maxAnalogueGain, kMaxAnalogueGain);
 
 	/* Configure the default exposure and gain. */
 	context.frameContext.agc.gain = minAnalogueGain_;
-	context.frameContext.agc.exposure = minExposureLines_;
+	context.frameContext.agc.exposure = minShutterSpeed_ / lineDuration_;
 
 	return 0;
 }
@@ -236,11 +235,9 @@  void Agc::computeExposure(IPAFrameContext &frameContext, double currentYGain)
 	 * exposure value applied multiplied by the new estimated gain.
 	 */
 	currentExposure_ = effectiveExposureValue * evGain;
-	utils::Duration minShutterSpeed = minExposureLines_ * lineDuration_;
-	utils::Duration maxShutterSpeed = maxExposureLines_ * lineDuration_;
 
 	/* Clamp the exposure value to the min and max authorized */
-	utils::Duration maxTotalExposure = maxShutterSpeed * maxAnalogueGain_;
+	utils::Duration maxTotalExposure = maxShutterSpeed_ * maxAnalogueGain_;
 	currentExposure_ = std::min(currentExposure_, maxTotalExposure);
 	LOG(IPU3Agc, Debug) << "Target total exposure " << currentExposure_
 			    << ", maximum is " << maxTotalExposure;
@@ -250,14 +247,14 @@  void Agc::computeExposure(IPAFrameContext &frameContext, double currentYGain)
 
 	/* Divide the exposure value as new exposure and gain values */
 	utils::Duration exposureValue = filteredExposure_;
-	utils::Duration shutterTime = minShutterSpeed;
+	utils::Duration shutterTime;
 
 	/*
 	* Push the shutter time up to the maximum first, and only then
 	* increase the gain.
 	*/
 	shutterTime = std::clamp<utils::Duration>(exposureValue / minAnalogueGain_,
-						  minShutterSpeed, maxShutterSpeed);
+						  minShutterSpeed_, maxShutterSpeed_);
 	double stepGain = std::clamp(exposureValue / shutterTime,
 				     minAnalogueGain_, maxAnalogueGain_);
 	LOG(IPU3Agc, Debug) << "Divided up shutter and gain are "
diff --git a/src/ipa/ipu3/algorithms/agc.h b/src/ipa/ipu3/algorithms/agc.h
index 1d085b40..f14d56b7 100644
--- a/src/ipa/ipu3/algorithms/agc.h
+++ b/src/ipa/ipu3/algorithms/agc.h
@@ -46,8 +46,8 @@  private:
 	double iqMean_;
 
 	utils::Duration lineDuration_;
-	uint32_t minExposureLines_;
-	uint32_t maxExposureLines_;
+	utils::Duration minShutterSpeed_;
+	utils::Duration maxShutterSpeed_;
 
 	double minAnalogueGain_;
 	double maxAnalogueGain_;