[libcamera-devel] [PATCH v1 6/7] ipa: ipu3: Call exposure and gain controls from AGC
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Thu Jul 8 15:07:20 CEST 2021
Hi Jean-Michel,
Thank you for the patch.
On Mon, Jun 28, 2021 at 10:22:54PM +0200, Jean-Michel Hautbois wrote:
> IPAIPU3 does not need to directly know the exposure and gain limits.
> Move the control min and max values to IPU3Agc as for the moment it is the one which
> needs to use the values.
>
> Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois at ideasonboard.com>
> ---
> src/ipa/ipu3/ipu3.cpp | 14 +++-----------
> src/ipa/ipu3/ipu3_agc.cpp | 28 +++++++++++++++++++++++-----
> src/ipa/ipu3/ipu3_agc.h | 11 +++++++++--
> 3 files changed, 35 insertions(+), 18 deletions(-)
>
> diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp
> index 9a2def64..40b626ed 100644
> --- a/src/ipa/ipu3/ipu3.cpp
> +++ b/src/ipa/ipu3/ipu3.cpp
> @@ -67,11 +67,7 @@ private:
> /* Camera sensor controls. */
> uint32_t defVBlank_;
> uint32_t exposure_;
> - uint32_t minExposure_;
> - uint32_t maxExposure_;
> uint32_t gain_;
> - uint32_t minGain_;
> - uint32_t maxGain_;
>
> /* Interface to the AWB algorithm */
> std::unique_ptr<IPU3Awb> awbAlgo_;
> @@ -187,13 +183,9 @@ int IPAIPU3::configure(const IPAConfigInfo &configInfo)
> return -EINVAL;
> }
>
> - minExposure_ = std::max(itExp->second.min().get<int32_t>(), 1);
> - maxExposure_ = itExp->second.max().get<int32_t>();
> - exposure_ = minExposure_;
> + exposure_ = itExp->second.def().get<int32_t>();
This changes the exposure_ value, it used to be set to the minimum, it's
now the default. Is that intentiona ? If so, it should be explained in
the commit message.
>
> - minGain_ = std::max(itGain->second.min().get<int32_t>(), 1);
> - maxGain_ = itGain->second.max().get<int32_t>();
> - gain_ = minGain_;
> + gain_ = itGain->second.def().get<int32_t>();
Same here.
>
> defVBlank_ = itVBlank->second.def().get<int32_t>();
>
> @@ -205,7 +197,7 @@ int IPAIPU3::configure(const IPAConfigInfo &configInfo)
> awbAlgo_->initialise(params_, configInfo.bdsOutputSize, bdsGrid_);
>
> agcAlgo_ = std::make_unique<IPU3Agc>();
> - agcAlgo_->initialise(bdsGrid_, sensorInfo_);
> + agcAlgo_->initialise(bdsGrid_, configInfo);
>
> return 0;
> }
> diff --git a/src/ipa/ipu3/ipu3_agc.cpp b/src/ipa/ipu3/ipu3_agc.cpp
> index 6253ab94..042d67fa 100644
> --- a/src/ipa/ipu3/ipu3_agc.cpp
> +++ b/src/ipa/ipu3/ipu3_agc.cpp
> @@ -10,10 +10,12 @@
> #include <algorithm>
> #include <cmath>
> #include <numeric>
> +#include <stdint.h>
>
> -#include <libcamera/base/log.h>
> +#include <linux/v4l2-controls.h>
>
> -#include <libcamera/ipa/core_ipa_interface.h>
> +#include <libcamera/base/log.h>
> +#include <libcamera/base/utils.h>
>
> #include "libipa/histogram.h"
>
> @@ -59,12 +61,28 @@ IPU3Agc::IPU3Agc()
> {
> }
>
> -void IPU3Agc::initialise(struct ipu3_uapi_grid_config &bdsGrid, const IPACameraSensorInfo &sensorInfo)
> +void IPU3Agc::initialise(struct ipu3_uapi_grid_config &bdsGrid, const IPAConfigInfo &configInfo)
> {
> aeGrid_ = bdsGrid;
> + ctrls_ = configInfo.entityControls.at(0);
>
> - lineDuration_ = sensorInfo.lineLength * 1.0s / sensorInfo.pixelRate;
> - maxExposureTime_ = kMaxExposure * lineDuration_;
> + const auto itExp = ctrls_.find(V4L2_CID_EXPOSURE);
> + if (itExp == ctrls_.end()) {
> + LOG(IPU3Agc, Debug) << "Can't find exposure control";
> + return;
> + }
> + minExposure_ = itExp->second.min().get<int32_t>();
> + maxExposure_ = itExp->second.max().get<int32_t>();
> + lineDuration_ = configInfo.sensorInfo.lineLength * 1.0s / configInfo.sensorInfo.pixelRate;
> + maxExposureTime_ = maxExposure_ * lineDuration_;
> +
> + const auto itGain = ctrls_.find(V4L2_CID_ANALOGUE_GAIN);
> + if (itGain == ctrls_.end()) {
> + LOG(IPU3Agc, Debug) << "Can't find gain control";
> + return;
> + }
> + minGain_ = std::max(itGain->second.min().get<int32_t>(), 1);
> + maxGain_ = itGain->second.max().get<int32_t>();
> }
>
> void IPU3Agc::processBrightness(const ipu3_uapi_stats_3a *stats)
> diff --git a/src/ipa/ipu3/ipu3_agc.h b/src/ipa/ipu3/ipu3_agc.h
> index 774c8385..ce43c534 100644
> --- a/src/ipa/ipu3/ipu3_agc.h
> +++ b/src/ipa/ipu3/ipu3_agc.h
> @@ -15,7 +15,7 @@
> #include <linux/intel-ipu3.h>
>
> #include <libcamera/base/utils.h>
> -
> +#include <libcamera/ipa/ipu3_ipa_interface.h>
> #include <libcamera/geometry.h>
>
> #include "libipa/algorithm.h"
> @@ -35,8 +35,8 @@ public:
> IPU3Agc();
> ~IPU3Agc() = default;
>
> - void initialise(struct ipu3_uapi_grid_config &bdsGrid, const IPACameraSensorInfo &sensorInfo);
> void process(const ipu3_uapi_stats_3a *stats, uint32_t &exposure, double &gain);
> + void initialise(struct ipu3_uapi_grid_config &bdsGrid, const IPAConfigInfo &configInfo);
> bool converged() { return converged_; }
> bool updateControls() { return updateControls_; }
> /* \todo Use a metadata exchange between IPAs */
> @@ -48,6 +48,13 @@ private:
> void lockExposureGain(uint32_t &exposure, double &gain);
>
> struct ipu3_uapi_grid_config aeGrid_;
> + ControlInfoMap ctrls_;
I'm not too fond of storing another copy of this, especially given that
it's not used.
> +
> + uint32_t minExposure_;
> + uint32_t maxExposure_;
> +
> + uint32_t minGain_;
> + uint32_t maxGain_;
>
> uint64_t frameCount_;
> uint64_t lastFrame_;
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list