[libcamera-devel] [PATCH 1/2] ipa: ipu3: agc: Drop hard-codec analogue gain max

Laurent Pinchart laurent.pinchart at ideasonboard.com
Thu Jun 1 09:26:48 CEST 2023


Hi Jean-Michel,

On Thu, Jun 01, 2023 at 07:32:08AM +0200, Jean-Michel Hautbois wrote:
> On 29/05/2023 14:44, Laurent Pinchart via libcamera-devel wrote:
> > On Mon, May 29, 2023 at 02:39:25PM +0200, Jacopo Mondi via libcamera-devel wrote:
> >> As the sensor's analogue gain range is known, drop the arbitrary
> >> maximum limit for the sensor analogue gain.
> >>
> >> Signed-off-by: Jacopo Mondi <jacopo.mondi at ideasonboard.com>
> > 
> > I'm pretty sure that as soon as we'll merge this patch we'll get a
> > regression report and will need to implement proper AGC tuning. Oh well
> > :-)
> 
> This limit was, if I recall correctly, set to limit the gain as we could 
> for instance have a driver (or sensor) setting a maximum of 16 while 
> after 8 it is not behaving correctly (hello Omnivision). On the sgo2, 
> the ov sensor is going full white for a too high gain (again, if I 
> recall correctly). One could argue this is a driver issue, but the 
> datasheet says it can do it.

Regardless of whether this is a hardware issue or a driver issue, it's
an issue. I don't think a hardcoded gain in the IPA module is the right
solution though, if gains above a certain value don't work, we can
either disallow that on the driver side, or have a sensor-specific
maximum in the camera sensor helpers.

> The other reason was that multiplying by more than 8 is really a lot of 
> amplification for such sensors. Maybe having the possibility to add a 
> tuning value for this would make sense (ie, having a maximum default 
> which can be overridden) ?

Too high gains will cause lots of noise, but again that is
device-specific, and should thus be handled in the tuning data, no as a
hardcoded maximum gain in the IPA module. Tuning is performed based on
maximum acceptable noise levels (hello ISO-12232), so we could even have
different tuning files for the same platform for different use cases.

> Wait and see then, if there is a regression, this should be seen quite 
> easily (just put your device in a black room :-D).

That's a good idea. Jacopo, could you try this ?

> > Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> > 
> >> ---
> >>   src/ipa/ipu3/algorithms/agc.cpp | 7 +++----
> >>   1 file changed, 3 insertions(+), 4 deletions(-)
> >>
> >> diff --git a/src/ipa/ipu3/algorithms/agc.cpp b/src/ipa/ipu3/algorithms/agc.cpp
> >> index b5309bdbea25..606a237a4a59 100644
> >> --- a/src/ipa/ipu3/algorithms/agc.cpp
> >> +++ b/src/ipa/ipu3/algorithms/agc.cpp
> >> @@ -47,9 +47,8 @@ namespace ipa::ipu3::algorithms {
> >>   
> >>   LOG_DEFINE_CATEGORY(IPU3Agc)
> >>   
> >> -/* Limits for analogue gain values */
> >> +/* Minimum limit for analogue gain value */
> >>   static constexpr double kMinAnalogueGain = 1.0;
> >> -static constexpr double kMaxAnalogueGain = 8.0;
> >>   
> >>   /* \todo Honour the FrameDurationLimits control instead of hardcoding a limit */
> >>   static constexpr utils::Duration kMaxShutterSpeed = 60ms;
> >> @@ -97,10 +96,10 @@ int Agc::configure(IPAContext &context,
> >>   				    kMaxShutterSpeed);
> >>   
> >>   	minAnalogueGain_ = std::max(configuration.agc.minAnalogueGain, kMinAnalogueGain);
> >> -	maxAnalogueGain_ = std::min(configuration.agc.maxAnalogueGain, kMaxAnalogueGain);
> >> +	maxAnalogueGain_ = configuration.agc.maxAnalogueGain;
> >>   
> >>   	/* Configure the default exposure and gain. */
> >> -	activeState.agc.gain = std::max(minAnalogueGain_, kMinAnalogueGain);
> >> +	activeState.agc.gain = minAnalogueGain_;
> >>   	activeState.agc.exposure = 10ms / configuration.sensor.lineDuration;
> >>   
> >>   	frameCount_ = 0;

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list