[libcamera-devel] [PATCH v2 1/3] ipa: ipu3: Calculate line duration from IPACameraSensorInfo
paul.elder at ideasonboard.com
paul.elder at ideasonboard.com
Tue Jun 8 09:48:28 CEST 2021
Hi Umang,
On Tue, Jun 08, 2021 at 01:12:23PM +0530, Umang Jain wrote:
> Squash \todo by calculating line duration from IPACameraSensorInfo,
> now passed in, to IPU3Agc::initialise().
>
> Since line duration is now calculated from real values, store it as a
> private member in IPU3Agc class. As a further step, replace the
> associated global constant, kMaxExposureTime, with a private IPU3Agc
> class member as well, and assign its value correspondingly in
> IPU3Agc::initialise(), similar to previous precedence.
>
> Signed-off-by: Umang Jain <umang.jain at ideasonboard.com>
> Tested-by: Paul Elder <paul.elder at ideasonboard.com>
> Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com
> Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder at ideasonboard.com>
> ---
> src/ipa/ipu3/ipu3.cpp | 2 +-
> src/ipa/ipu3/ipu3_agc.cpp | 24 +++++++++++++-----------
> src/ipa/ipu3/ipu3_agc.h | 7 ++++++-
> 3 files changed, 20 insertions(+), 13 deletions(-)
>
> diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp
> index 700a5660..2496b0a0 100644
> --- a/src/ipa/ipu3/ipu3.cpp
> +++ b/src/ipa/ipu3/ipu3.cpp
> @@ -174,7 +174,7 @@ void IPAIPU3::configure(const IPAConfigInfo &configInfo)
> awbAlgo_->initialise(params_, configInfo.bdsOutputSize, bdsGrid_);
>
> agcAlgo_ = std::make_unique<IPU3Agc>();
> - agcAlgo_->initialise(bdsGrid_);
> + agcAlgo_->initialise(bdsGrid_, configInfo.sensorInfo);
> }
>
> void IPAIPU3::mapBuffers(const std::vector<IPABuffer> &buffers)
> diff --git a/src/ipa/ipu3/ipu3_agc.cpp b/src/ipa/ipu3/ipu3_agc.cpp
> index 8bae423f..8ca95013 100644
> --- a/src/ipa/ipu3/ipu3_agc.cpp
> +++ b/src/ipa/ipu3/ipu3_agc.cpp
> @@ -11,6 +11,8 @@
> #include <cmath>
> #include <numeric>
>
> +#include <libcamera/ipa/core_ipa_interface.h>
> +
> #include "libcamera/internal/log.h"
>
> #include "libipa/histogram.h"
> @@ -39,11 +41,6 @@ static constexpr uint32_t kMaxGain = kMaxISO / 100;
> static constexpr uint32_t kMinExposure = 1;
> static constexpr uint32_t kMaxExposure = 1976;
>
> -/* \todo those should be got from IPACameraSensorInfo ! */
> -/* line duration in microseconds */
> -static constexpr double kLineDuration = 16.8;
> -static constexpr double kMaxExposureTime = kMaxExposure * kLineDuration;
> -
> /* Histogram constants */
> static constexpr uint32_t knumHistogramBins = 256;
> static constexpr double kEvGainTarget = 0.5;
> @@ -54,14 +51,19 @@ static constexpr uint8_t kCellSize = 8;
> IPU3Agc::IPU3Agc()
> : frameCount_(0), lastFrame_(0), converged_(false),
> updateControls_(false), iqMean_(0.0), gamma_(1.0),
> + lineDuration_(0.0), maxExposureTime_(0.0),
> prevExposure_(0.0), prevExposureNoDg_(0.0),
> currentExposure_(0.0), currentExposureNoDg_(0.0)
> {
> }
>
> -void IPU3Agc::initialise(struct ipu3_uapi_grid_config &bdsGrid)
> +void IPU3Agc::initialise(struct ipu3_uapi_grid_config &bdsGrid, const IPACameraSensorInfo &sensorInfo)
> {
> aeGrid_ = bdsGrid;
> +
> + /* line duration in microseconds */
> + lineDuration_ = sensorInfo.lineLength * 1000000ULL / static_cast<double>(sensorInfo.pixelRate);
> + maxExposureTime_ = kMaxExposure * lineDuration_;
> }
>
> void IPU3Agc::processBrightness(const ipu3_uapi_stats_3a *stats)
> @@ -160,13 +162,13 @@ void IPU3Agc::lockExposureGain(uint32_t &exposure, uint32_t &gain)
> double newGain = kEvGainTarget * knumHistogramBins / iqMean_;
>
> /* extracted from Rpi::Agc::computeTargetExposure */
> - double currentShutter = exposure * kLineDuration;
> + double currentShutter = exposure * lineDuration_;
> currentExposureNoDg_ = currentShutter * gain;
> LOG(IPU3Agc, Debug) << "Actual total exposure " << currentExposureNoDg_
> << " Shutter speed " << currentShutter
> << " Gain " << gain;
> currentExposure_ = currentExposureNoDg_ * newGain;
> - double maxTotalExposure = kMaxExposureTime * kMaxGain;
> + double maxTotalExposure = maxExposureTime_ * kMaxGain;
> currentExposure_ = std::min(currentExposure_, maxTotalExposure);
> LOG(IPU3Agc, Debug) << "Target total exposure " << currentExposure_;
>
> @@ -174,18 +176,18 @@ void IPU3Agc::lockExposureGain(uint32_t &exposure, uint32_t &gain)
> filterExposure();
>
> double newExposure = 0.0;
> - if (currentShutter < kMaxExposureTime) {
> + if (currentShutter < maxExposureTime_) {
> exposure = std::clamp(static_cast<uint32_t>(exposure * currentExposure_ / currentExposureNoDg_), kMinExposure, kMaxExposure);
> newExposure = currentExposure_ / exposure;
> gain = std::clamp(static_cast<uint32_t>(gain * currentExposure_ / newExposure), kMinGain, kMaxGain);
> updateControls_ = true;
> - } else if (currentShutter >= kMaxExposureTime) {
> + } else if (currentShutter >= maxExposureTime_) {
> gain = std::clamp(static_cast<uint32_t>(gain * currentExposure_ / currentExposureNoDg_), kMinGain, kMaxGain);
> newExposure = currentExposure_ / gain;
> exposure = std::clamp(static_cast<uint32_t>(exposure * currentExposure_ / newExposure), kMinExposure, kMaxExposure);
> updateControls_ = true;
> }
> - LOG(IPU3Agc, Debug) << "Adjust exposure " << exposure * kLineDuration << " and gain " << gain;
> + LOG(IPU3Agc, Debug) << "Adjust exposure " << exposure * lineDuration_ << " and gain " << gain;
> }
> lastFrame_ = frameCount_;
> }
> diff --git a/src/ipa/ipu3/ipu3_agc.h b/src/ipa/ipu3/ipu3_agc.h
> index bfdf45d1..99a582a9 100644
> --- a/src/ipa/ipu3/ipu3_agc.h
> +++ b/src/ipa/ipu3/ipu3_agc.h
> @@ -18,6 +18,8 @@
>
> namespace libcamera {
>
> +class IPACameraSensorInfo;
> +
> namespace ipa::ipu3 {
>
> class IPU3Agc : public Algorithm
> @@ -26,7 +28,7 @@ public:
> IPU3Agc();
> ~IPU3Agc() = default;
>
> - void initialise(struct ipu3_uapi_grid_config &bdsGrid);
> + void initialise(struct ipu3_uapi_grid_config &bdsGrid, const IPACameraSensorInfo &sensorInfo);
> void process(const ipu3_uapi_stats_3a *stats, uint32_t &exposure, uint32_t &gain);
> bool converged() { return converged_; }
> bool updateControls() { return updateControls_; }
> @@ -49,6 +51,9 @@ private:
> double iqMean_;
> double gamma_;
>
> + double lineDuration_;
> + double maxExposureTime_;
> +
> double prevExposure_;
> double prevExposureNoDg_;
> double currentExposure_;
> --
> 2.31.1
>
More information about the libcamera-devel
mailing list