[libcamera-devel] [PATCH 3/4] ipa: ipu3: Remove local cached limits for shutter speed and gain

Kieran Bingham kieran.bingham at ideasonboard.com
Thu Nov 25 13:04:52 CET 2021


Quoting Jean-Michel Hautbois (2021-11-25 10:21:42)
> The limits for shutter speed and analogue gain are stored locally while
> those are only used in computeExposure(). Remove those local variables,
> and use the IPASessionConfiguration values directly.
> 
> While at it, set default analogue gain and shutter speed.
> 

Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>

> Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois at ideasonboard.com>
> ---
>  src/ipa/ipu3/algorithms/agc.cpp | 42 ++++++++++++++++++---------------
>  src/ipa/ipu3/algorithms/agc.h   |  8 +------
>  2 files changed, 24 insertions(+), 26 deletions(-)
> 
> diff --git a/src/ipa/ipu3/algorithms/agc.cpp b/src/ipa/ipu3/algorithms/agc.cpp
> index 2945a138..b822c79b 100644
> --- a/src/ipa/ipu3/algorithms/agc.cpp
> +++ b/src/ipa/ipu3/algorithms/agc.cpp
> @@ -70,8 +70,7 @@ static constexpr uint32_t kNumStartupFrames = 10;
>  static constexpr double kRelativeLuminanceTarget = 0.16;
>  
>  Agc::Agc()
> -       : frameCount_(0), lineDuration_(0s), minShutterSpeed_(0s),
> -         maxShutterSpeed_(0s), filteredExposure_(0s)
> +       : frameCount_(0), lineDuration_(0s), filteredExposure_(0s)
>  {
>  }
>  
> @@ -90,16 +89,10 @@ int Agc::configure(IPAContext &context, const IPAConfigInfo &configInfo)
>         lineDuration_ = configInfo.sensorInfo.lineLength * 1.0s
>                       / configInfo.sensorInfo.pixelRate;
>  
> -       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 = minShutterSpeed_ / lineDuration_;
> +       context.frameContext.agc.gain =
> +               std::max(context.configuration.agc.minAnalogueGain, kMinAnalogueGain);
> +       context.frameContext.agc.exposure = 10ms / lineDuration_;
>  
>         return 0;
>  }
> @@ -174,17 +167,28 @@ utils::Duration Agc::filterExposure(utils::Duration currentExposure)
>  
>  /**
>   * \brief Estimate the new exposure and gain values
> - * \param[inout] frameContext The shared IPA frame Context
> + * \param[inout] context The shared IPA Context
>   * \param[in] yGain The gain calculated based on the relative luminance target
>   * \param[in] iqMeanGain The gain calculated based on the relative luminance target
>   */
> -void Agc::computeExposure(IPAFrameContext &frameContext, double yGain,
> -                         double iqMeanGain)
> +void Agc::computeExposure(IPAContext &context, double yGain, double iqMeanGain)
>  {
> +       IPASessionConfiguration &configuration = context.configuration;
> +       IPAFrameContext &frameContext = context.frameContext;
> +
>         /* Get the effective exposure and gain applied on the sensor. */
>         uint32_t exposure = frameContext.sensor.exposure;
>         double analogueGain = frameContext.sensor.gain;
>  
> +       utils::Duration minShutterSpeed = configuration.agc.minShutterSpeed;
> +       utils::Duration maxShutterSpeed = std::min(configuration.agc.maxShutterSpeed,
> +                                                  kMaxShutterSpeed);
> +
> +       double minAnalogueGain = std::max(configuration.agc.minAnalogueGain,
> +                                         kMinAnalogueGain);
> +       double maxAnalogueGain = std::min(configuration.agc.maxAnalogueGain,
> +                                         kMaxAnalogueGain);
> +
>         /* Use the highest of the two gain estimates. */
>         double evGain = std::max(yGain, iqMeanGain);
>  
> @@ -216,7 +220,7 @@ void Agc::computeExposure(IPAFrameContext &frameContext, double yGain,
>         utils::Duration currentExposure = effectiveExposureValue * evGain;
>  
>         /* 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;
> @@ -232,10 +236,10 @@ void Agc::computeExposure(IPAFrameContext &frameContext, double yGain,
>         * Push the shutter time up to the maximum first, and only then
>         * increase the gain.
>         */
> -       shutterTime = std::clamp<utils::Duration>(exposureValue / minAnalogueGain_,
> -                                                 minShutterSpeed_, maxShutterSpeed_);
> +       shutterTime = std::clamp<utils::Duration>(exposureValue / minAnalogueGain,
> +                                                 minShutterSpeed, maxShutterSpeed);
>         double stepGain = std::clamp(exposureValue / shutterTime,
> -                                    minAnalogueGain_, maxAnalogueGain_);
> +                                    minAnalogueGain, maxAnalogueGain);
>         LOG(IPU3Agc, Debug) << "Divided up shutter and gain are "
>                             << shutterTime << " and "
>                             << stepGain;
> @@ -348,7 +352,7 @@ void Agc::process(IPAContext &context, const ipu3_uapi_stats_3a *stats)
>                         break;
>         }
>  
> -       computeExposure(context.frameContext, yGain, iqMeanGain);
> +       computeExposure(context, yGain, iqMeanGain);
>         frameCount_++;
>  }
>  
> diff --git a/src/ipa/ipu3/algorithms/agc.h b/src/ipa/ipu3/algorithms/agc.h
> index 84bfe045..d9f17e6f 100644
> --- a/src/ipa/ipu3/algorithms/agc.h
> +++ b/src/ipa/ipu3/algorithms/agc.h
> @@ -34,8 +34,7 @@ private:
>         double measureBrightness(const ipu3_uapi_stats_3a *stats,
>                                  const ipu3_uapi_grid_config &grid) const;
>         utils::Duration filterExposure(utils::Duration currentExposure);
> -       void computeExposure(IPAFrameContext &frameContext, double yGain,
> -                            double iqMeanGain);
> +       void computeExposure(IPAContext &context, double yGain, double iqMeanGain);
>         double estimateLuminance(IPAFrameContext &frameContext,
>                                  const ipu3_uapi_grid_config &grid,
>                                  const ipu3_uapi_stats_3a *stats,
> @@ -44,11 +43,6 @@ private:
>         uint64_t frameCount_;
>  
>         utils::Duration lineDuration_;
> -       utils::Duration minShutterSpeed_;
> -       utils::Duration maxShutterSpeed_;
> -
> -       double minAnalogueGain_;
> -       double maxAnalogueGain_;
>  
>         utils::Duration filteredExposure_;
>  
> -- 
> 2.32.0
>


More information about the libcamera-devel mailing list