Message ID | 20210608074225.59862-2-umang.jain@ideasonboard.com |
---|---|
State | Accepted |
Headers | show |
Series |
|
Related | show |
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@ideasonboard.com> > Tested-by: Paul Elder <paul.elder@ideasonboard.com> > Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Paul Elder <paul.elder@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 >
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_;