[libcamera-devel] [PATCH 2/4] ipa: ipu3: Calculate line duration from IPACameraSensorInfo
Kieran Bingham
kieran.bingham at ideasonboard.com
Fri Jun 4 11:39:54 CEST 2021
On 04/06/2021 10:27, Kieran Bingham wrote:
> Hi Umang,
>
> On 02/06/2021 11:23, 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>
>
> This looks reasonable to me. I guess we could have moved the sensorInfo
> [3/4] first but that doesn't make much difference, and this way moves
> it only where there is a user of it.
>
> Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com
>
>> ---
>> src/ipa/ipu3/ipu3.cpp | 2 +-
>> src/ipa/ipu3/ipu3_agc.cpp | 22 +++++++++++-----------
>> src/ipa/ipu3/ipu3_agc.h | 7 ++++++-
>> 3 files changed, 18 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..ccd01371 100644
>> --- a/src/ipa/ipu3/ipu3_agc.cpp
>> +++ b/src/ipa/ipu3/ipu3_agc.cpp
>> @@ -39,11 +39,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 +49,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 / static_cast<double>(sensorInfo.pixelRate / 1000000);
>> + maxExposureTime_ = kMaxExposure * lineDuration_;
>> }
>>
>> void IPU3Agc::processBrightness(const ipu3_uapi_stats_3a *stats)
>> @@ -160,13 +160,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 +174,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..ae557bdd 100644
>> --- a/src/ipa/ipu3/ipu3_agc.h
>> +++ b/src/ipa/ipu3/ipu3_agc.h
>> @@ -12,6 +12,8 @@
>>
>> #include <linux/intel-ipu3.h>
>>
>> +#include <libcamera/ipa/ipu3_ipa_interface.h>
In fact, the IPACameraSensorInfo comes from
libcamera/ipa/core_ipa_interface.h
Is there anything from ipu3_ipa_interface.h that will be needed in this
ipu3_agc component?
--
Kieran
>> +
>> #include <libcamera/geometry.h>
>>
>> #include "libipa/algorithm.h"
>> @@ -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_;
>>
>
--
Regards
--
Kieran
More information about the libcamera-devel
mailing list