[libcamera-devel] [PATCH] ipa: rkisp1: agc: drop hard-coded analogue gain range

Jacopo Mondi jacopo.mondi at ideasonboard.com
Fri May 19 18:21:31 CEST 2023


Hello,

On Fri, May 19, 2023 at 04:51:09PM +0200, Benjamin Bara via libcamera-devel wrote:
> From: Benjamin Bara <benjamin.bara at skidata.com>
>
> As the sensor's analogue gain range is known (read-out in
> IPARkISP1::configure()), drop the limiting hard-coded range.
> This enables better performance in low-light conditions for sensors with
> a higher gain (e.g. the imx327).
>
> Signed-off-by: Benjamin Bara <benjamin.bara at skidata.com>

We had received a similar patch in the past but it probably got
dropped in between different versions of a series if I recall
correctly.

The limits are arbitraty, the IPU3 has them set to 1 and 8, who knows
why, so yeah, let's drop them, the cam helper should ensure this is
safe.

Reviewed-by: Jacopo Mondi <jacopo.mondi at ideasonboard.com>

And I'll send a similar patch to remove the limits from ipu3 too.

Thanks
  j

> ---
>  src/ipa/rkisp1/algorithms/agc.cpp | 19 +++----------------
>  1 file changed, 3 insertions(+), 16 deletions(-)
>
> diff --git a/src/ipa/rkisp1/algorithms/agc.cpp b/src/ipa/rkisp1/algorithms/agc.cpp
> index 22f70aba..a4e5500e 100644
> --- a/src/ipa/rkisp1/algorithms/agc.cpp
> +++ b/src/ipa/rkisp1/algorithms/agc.cpp
> @@ -36,15 +36,6 @@ namespace ipa::rkisp1::algorithms {
>
>  LOG_DEFINE_CATEGORY(RkISP1Agc)
>
> -/*
> - * Limits for analogue gain values
> - *
> - * \todo Remove the hard-coded limits and let the sensor helper specify
> - * the minimum and maximum allowed gain values.
> - */
> -static constexpr double kMinAnalogueGain = 1.0;
> -static constexpr double kMaxAnalogueGain = 16.0;
> -
>  /* \todo Honour the FrameDurationLimits control instead of hardcoding a limit */
>  static constexpr utils::Duration kMaxShutterSpeed = 60ms;
>
> @@ -80,9 +71,7 @@ Agc::Agc()
>  int Agc::configure(IPAContext &context, const IPACameraSensorInfo &configInfo)
>  {
>  	/* Configure the default exposure and gain. */
> -	context.activeState.agc.automatic.gain =
> -		std::max(context.configuration.sensor.minAnalogueGain,
> -			 kMinAnalogueGain);
> +	context.activeState.agc.automatic.gain = context.configuration.sensor.minAnalogueGain;
>  	context.activeState.agc.automatic.exposure =
>  		10ms / context.configuration.sensor.lineDuration;
>  	context.activeState.agc.manual.gain = context.activeState.agc.automatic.gain;
> @@ -265,10 +254,8 @@ void Agc::computeExposure(IPAContext &context, IPAFrameContext &frameContext,
>  	utils::Duration maxShutterSpeed = std::min(configuration.sensor.maxShutterSpeed,
>  						   kMaxShutterSpeed);
>
> -	double minAnalogueGain = std::max(configuration.sensor.minAnalogueGain,
> -					  kMinAnalogueGain);
> -	double maxAnalogueGain = std::min(configuration.sensor.maxAnalogueGain,
> -					  kMaxAnalogueGain);
> +	double minAnalogueGain = configuration.sensor.minAnalogueGain;
> +	double maxAnalogueGain = configuration.sensor.maxAnalogueGain;
>
>  	/* Consider within 1% of the target as correctly exposed. */
>  	if (utils::abs_diff(evGain, 1.0) < 0.01)
> --
> 2.34.1
>


More information about the libcamera-devel mailing list