[libcamera-devel] [PATCH v3 12/14] ipa: ipu3: agc: Refactor condition on exposure correction

Laurent Pinchart laurent.pinchart at ideasonboard.com
Fri Oct 22 08:06:49 CEST 2021


Hi Jean-Michel,

On Fri, Oct 22, 2021 at 07:56:50AM +0200, Jean-Michel Hautbois wrote:
> On 22/10/2021 06:27, Laurent Pinchart wrote:
> > On Thu, Oct 21, 2021 at 06:43:59PM +0200, Jean-Michel Hautbois wrote:
> >> Until now, we can't know when the exposure and gains applied in the
> >> IPAIPU3::setControls() are really applied (it can be several frames). We
> >> don't want to use the values calculated as if they are already applied,
> >> and this is done by testing the frame number.
> >>
> >> When the exposure is estimated, we verify if it changed enough for
> >> exposure and gain to be updated.
> >>
> >> Keep the indentation level removal and simply return when the change is
> >> so small there is no need to apply the newly calculated value.
> > 
> > The first two paragraph seems unrelated to the version of this patch,
> > and the "keep" in the third paragraph refers to how this has changed
> > compared to v2. Please rewrite the commit message to correspond to the
> > code changes.
> 
> Let's try:
> '''
> Each time we test the brightness with the desired the target, we verify
> if the change is small enough to consider that we are correctly exposed
> or not. Simplify the reading by removing one level of indentation, and
> returning from the function when the change is too small.
> '''

How is the first sentence even relevant ? If you want to lower
indentation by returning early, just say so, there's no need to explain
what the code does.

> >> Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois at ideasonboard.com>
> >> Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> >> Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> >> ---
> >>   src/ipa/ipu3/algorithms/agc.cpp | 91 ++++++++++++++++-----------------
> >>   1 file changed, 45 insertions(+), 46 deletions(-)
> >>
> >> diff --git a/src/ipa/ipu3/algorithms/agc.cpp b/src/ipa/ipu3/algorithms/agc.cpp
> >> index 43ef89df..7ff3029b 100644
> >> --- a/src/ipa/ipu3/algorithms/agc.cpp
> >> +++ b/src/ipa/ipu3/algorithms/agc.cpp
> >> @@ -138,60 +138,59 @@ void Agc::lockExposureGain(uint32_t &exposure, double &analogueGain)
> >>   	if ((frameCount_ < kInitialFrameMinAECount) || (frameCount_ - lastFrame_ < kFrameSkipCount))
> >>   		return;
> >>   
> >> -	/* Are we correctly exposed ? */

I haven't noticed before, the comment could be kept.

> >> -	if (std::abs(iqMean_ - kEvGainTarget * knumHistogramBins) <= 1) {
> >> -		LOG(IPU3Agc, Debug) << "!!! Good exposure with iqMean = " << iqMean_;

And is there a particular reason to remove the log message ?

Please do *not* hide changes in a commit whose log message only mentions
indentation changes.

> >> -	} else {
> >> -		double evGain = kEvGainTarget * knumHistogramBins / iqMean_;
> >> +	if (std::abs(iqMean_ - kEvGainTarget * knumHistogramBins) <= 1)
> >> +		return;
> >>   
> >> -		/* extracted from Rpi::Agc::computeTargetExposure */
> >> -		utils::Duration currentShutter = exposure * lineDuration_;
> >> -		currentExposureNoDg_ = currentShutter * analogueGain;
> >> -		LOG(IPU3Agc, Debug) << "Actual total exposure " << currentExposureNoDg_
> >> -				    << " Shutter speed " << currentShutter
> >> -				    << " Gain " << analogueGain
> >> -				    << " Needed ev gain " << evGain;
> >> +	double evGain = kEvGainTarget * knumHistogramBins / iqMean_;
> >>   
> >> -		currentExposure_ = prevExposureValue_ * evGain;
> >> -		utils::Duration minShutterSpeed = minExposureLines_ * lineDuration_;
> >> -		utils::Duration maxShutterSpeed = maxExposureLines_ * lineDuration_;
> >> +	/* extracted from Rpi::Agc::computeTargetExposure */
> >> +	utils::Duration currentShutter = exposure * lineDuration_;
> >> +	currentExposureNoDg_ = currentShutter * analogueGain;
> >> +	LOG(IPU3Agc, Debug) << "Actual total exposure " << currentExposureNoDg_
> >> +			    << " Shutter speed " << currentShutter
> >> +			    << " Gain " << analogueGain
> >> +			    << " Needed ev gain " << evGain;
> >>   
> >> -		utils::Duration maxTotalExposure = maxShutterSpeed * kMaxGain;
> >> -		currentExposure_ = std::min(currentExposure_, maxTotalExposure);
> >> -		LOG(IPU3Agc, Debug) << "Target total exposure " << currentExposure_
> >> -				    << ", maximum is " << maxTotalExposure;
> >> +	currentExposure_ = prevExposureValue_ * evGain;
> >> +	utils::Duration minShutterSpeed = minExposureLines_ * lineDuration_;
> >> +	utils::Duration maxShutterSpeed = maxExposureLines_ * lineDuration_;
> >>   
> >> -		/* \todo: estimate if we need to desaturate */
> >> -		filterExposure();
> >> +	utils::Duration maxTotalExposure = maxShutterSpeed * kMaxGain;
> >> +	currentExposure_ = std::min(currentExposure_, maxTotalExposure);
> >> +	LOG(IPU3Agc, Debug) << "Target total exposure " << currentExposure_
> >> +			    << ", maximum is " << maxTotalExposure;
> >>   
> >> -		utils::Duration exposureValue = filteredExposure_;
> >> -		utils::Duration shutterTime = minShutterSpeed;
> >> +	/* \todo: estimate if we need to desaturate */
> >> +	filterExposure();
> >>   
> >> -		/*
> >> -		 * Push the shutter time up to the maximum first, and only then
> >> -		 * increase the gain.
> >> -		 */
> >> -		shutterTime = std::clamp<utils::Duration>(exposureValue / kMinGain,
> >> -							  minShutterSpeed, maxShutterSpeed);
> >> -		double stepGain = std::clamp(exposureValue / shutterTime,
> >> -					     kMinGain, kMaxGain);
> >> -		LOG(IPU3Agc, Debug) << "Divided up shutter and gain are "
> >> -				    << shutterTime << " and "
> >> -				    << stepGain;
> >> +	utils::Duration exposureValue = filteredExposure_;
> >> +	utils::Duration shutterTime = minShutterSpeed;
> >>   
> >> -		exposure = shutterTime / lineDuration_;
> >> -		analogueGain = stepGain;
> >> +	/*
> >> +	* Push the shutter time up to the maximum first, and only then
> >> +	* increase the gain.
> >> +	*/
> >> +	shutterTime = std::clamp<utils::Duration>(exposureValue / kMinGain,
> >> +						  minShutterSpeed, maxShutterSpeed);
> >> +	double stepGain = std::clamp(exposureValue / shutterTime,
> >> +				     kMinGain, kMaxGain);
> >> +	LOG(IPU3Agc, Debug) << "Divided up shutter and gain are "
> >> +			    << shutterTime << " and "
> >> +			    << stepGain;
> >> +
> >> +	exposure = shutterTime / lineDuration_;
> >> +	analogueGain = stepGain;
> >> +
> >> +	/*
> >> +	 * Update the exposure value for the next process call.
> >> +	 *
> >> +	 * \todo Obtain the values of the exposure time and analog gain
> >> +	 * that were actually used by the sensor, either from embedded
> >> +	 * data when available, or from the delayed controls
> >> +	 * infrastructure in case a slow down caused a mismatch.
> >> +	 */
> >> +	prevExposureValue_ = shutterTime * analogueGain;
> >>   
> >> -		/*
> >> -		 * Update the exposure value for the next process call.
> >> -		 *
> >> -		 * \todo Obtain the values of the exposure time and analog gain
> >> -		 * that were actually used by the sensor, either from embedded
> >> -		 * data when available, or from the delayed controls
> >> -		 * infrastructure in case a slow down caused a mismatch.
> >> -		 */
> >> -		prevExposureValue_ = shutterTime * analogueGain;
> >> -	}
> >>   	lastFrame_ = frameCount_;
> > 
> > This is a functional change, with no mention of it (and no explanation
> > of why it's correct) in the commit message.
> 
> Mmmh, if is "just" about removing one else and a LOG() message... I 'm 
> failing to see the functional change here...

Before this patch, lastFrame_ was set for both branches. With this
patch, as you return early, lastFrame_ doesn't get set when the change
is small.

> >>   }
> >>   

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list