[libcamera-devel] [PATCH 07/13] ipa: ipu3: agc: Change analogue gain limits

Laurent Pinchart laurent.pinchart at ideasonboard.com
Fri Oct 15 02:48:34 CEST 2021


On Thu, Oct 14, 2021 at 12:05:45PM +0100, Kieran Bingham wrote:
> Quoting Jean-Michel Hautbois (2021-10-13 16:41:19)
> > The gains is currently set as a uint32_t while the analogue gain is
> 
> 'gains are currently' ?
> 
> > passed as a double. We also have a default maximum analogue gain of 15
> > which is quite high for a number of sensors.
> > 
> > Use a maximum value of 8 which should really be configured by the IPA
> > and not fixed as it is now. While at it make it a double.
> > 
> > Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois at ideasonboard.com>
> > ---
> >  src/ipa/ipu3/algorithms/agc.cpp | 12 ++++--------
> >  1 file changed, 4 insertions(+), 8 deletions(-)
> > 
> > diff --git a/src/ipa/ipu3/algorithms/agc.cpp b/src/ipa/ipu3/algorithms/agc.cpp
> > index 2dd5c5c1..e58a8a8d 100644
> > --- a/src/ipa/ipu3/algorithms/agc.cpp
> > +++ b/src/ipa/ipu3/algorithms/agc.cpp
> > @@ -30,14 +30,10 @@ static constexpr uint32_t kInitialFrameMinAECount = 4;
> >  /* Number of frames to wait between new gain/exposure estimations */
> >  static constexpr uint32_t kFrameSkipCount = 6;
> >  
> > -/* Maximum ISO value for analogue gain */
> > -static constexpr uint32_t kMinISO = 100;
> > -static constexpr uint32_t kMaxISO = 1500;
> > -
> 
> Do the ISO values no longer make sense to be used here?

ISO values don't make much sense anywhere to be honest :-) It's mostly a
marketing argument. Considering gain = ISO / 100 is as good as anything,
because you can set a random conversion factor (within limits) and still
be compliant with the specification.

> As this needs to come from a camera helper anyway, I guess it doesn't
> hurt to reduce it as it should be changed later all the same.
> 
> Do you reduce it to prevent some overexposure issue? or because the
> sensors you've tested only have x8 as a maximum?
> 
> Anyway, I don't object to this patch otherwise.
> 
> 
> Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> 
> >  /* Maximum analogue gain value
> >   * \todo grab it from a camera helper */
> > -static constexpr uint32_t kMinGain = kMinISO / 100;
> > -static constexpr uint32_t kMaxGain = kMaxISO / 100;
> > +static constexpr double kMinGain = 1.0;
> > +static constexpr double kMaxGain = 8.0;
> >  
> >  /* \todo use calculated value based on sensor */
> >  static constexpr libcamera::utils::Duration kMinShutterSpeed = 100us;
> > @@ -161,9 +157,9 @@ void Agc::lockExposureGain(uint32_t &exposure, double &gain)
> >                 if (currentShutter < kMaxShutterSpeed) {
> >                         exposure = std::clamp(static_cast<uint32_t>(exposure * currentExposure_ / currentExposureNoDg_), minExposureLines_, maxExposureLines_);
> >                         newExposure = currentExposure_ / exposure;
> > -                       gain = std::clamp(static_cast<uint32_t>(gain * currentExposure_ / newExposure), kMinGain, kMaxGain);
> > +                       gain = std::clamp(static_cast<double>(gain * currentExposure_ / newExposure), kMinGain, kMaxGain);

This is also a good occasion to shorten lines, and you don't need the
cast:

			gain = std::clamp(gain * currentExposure_ / newExposure,
					  kMinGain, kMaxGain);

Same below.

By the way, in the previous patch, you could have used

			exposure = std::clamp<uint32_t>(exposure * currentExposure_ / currentExposureNoDg_,
							minExposureLines_,
							maxExposureLines_);

Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>

> >                 } else if (currentShutter >= kMaxShutterSpeed) {
> > -                       gain = std::clamp(static_cast<uint32_t>(gain * currentExposure_ / currentExposureNoDg_), kMinGain, kMaxGain);
> > +                       gain = std::clamp(static_cast<double>(gain * currentExposure_ / currentExposureNoDg_), kMinGain, kMaxGain);
> >                         newExposure = currentExposure_ / gain;
> >                         exposure = std::clamp(static_cast<uint32_t>(exposure * currentExposure_ / newExposure), minExposureLines_, maxExposureLines_);
> >                 }

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list