[libcamera-devel] [PATCH v1 5/7] ipa: ipu3: rename AGC algorithm
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Mon Aug 23 18:52:49 CEST 2021
Hi Jean-Michel,
Thank you for the patch.
On Mon, Aug 23, 2021 at 02:49:35PM +0200, Jean-Michel Hautbois wrote:
> The initial AGC algorithm is a simple one, which calculates the exposure
> and gain values by trying to have a mean histogram value to 128.
Is this right ? I'm reading the code as targetting a value of 128 (maybe
we should say 0.5 instead, to avoid depending on the number of bits per
pixel in comments) for the mean of the top 2% of the histogram.
> Rename it as "AgcMean" to make it easy to distinguish.
>
> Now that we are modular, we can have multiple algorithms for one
> functionnality (here, AGC). Naming those algorithms makes it easier to
s/functionnality/functionality/
> chose between them.
>
> Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois at ideasonboard.com>
> ---
> .../ipu3/algorithms/{agc.cpp => agc_mean.cpp} | 31 +++++++++----------
> src/ipa/ipu3/algorithms/{agc.h => agc_mean.h} | 8 ++---
> src/ipa/ipu3/algorithms/meson.build | 2 +-
> src/ipa/ipu3/ipu3.cpp | 4 +--
> 4 files changed, 22 insertions(+), 23 deletions(-)
> rename src/ipa/ipu3/algorithms/{agc.cpp => agc_mean.cpp} (87%)
> rename src/ipa/ipu3/algorithms/{agc.h => agc_mean.h} (90%)
>
> diff --git a/src/ipa/ipu3/algorithms/agc.cpp b/src/ipa/ipu3/algorithms/agc_mean.cpp
> similarity index 87%
> rename from src/ipa/ipu3/algorithms/agc.cpp
> rename to src/ipa/ipu3/algorithms/agc_mean.cpp
> index 5ff50f4a..193f6e9a 100644
> --- a/src/ipa/ipu3/algorithms/agc.cpp
> +++ b/src/ipa/ipu3/algorithms/agc_mean.cpp
> @@ -2,10 +2,10 @@
> /*
> * Copyright (C) 2021, Ideas On Board
> *
> - * ipu3_agc.cpp - AGC/AEC control algorithm
> + * agc_mean.cpp - AGC/AEC control algorithm
"AGC/AEC mean-based control algorithm" ?
I'm not sure if mean vs. metering are the most descriptive names, but I
don't have better proposals at this point.
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> */
>
> -#include "agc.h"
> +#include "agc_mean.h"
>
> #include <algorithm>
> #include <chrono>
> @@ -23,7 +23,7 @@ using namespace std::literals::chrono_literals;
>
> namespace ipa::ipu3::algorithms {
>
> -LOG_DEFINE_CATEGORY(IPU3Agc)
> +LOG_DEFINE_CATEGORY(IPU3AgcMean)
>
> /* Number of frames to wait before calculating stats on minimum exposure */
> static constexpr uint32_t kInitialFrameMinAECount = 4;
> @@ -50,16 +50,15 @@ static constexpr double kEvGainTarget = 0.5;
> /* A cell is 8 bytes and contains averages for RGB values and saturation ratio */
> static constexpr uint8_t kCellSize = 8;
>
> -Agc::Agc()
> +AgcMean::AgcMean()
> : frameCount_(0), lastFrame_(0), iqMean_(0.0), lineDuration_(0s),
> maxExposureTime_(0s), prevExposure_(0s), prevExposureNoDg_(0s),
> currentExposure_(0s), currentExposureNoDg_(0s)
> {
> }
>
> -int Agc::configure([[maybe_unused]] IPAContext &context,
> - const IPAConfigInfo &configInfo)
> -{
> +int AgcMean::configure([[maybe_unused]] IPAContext &context,
> + const IPAConfigInfo &configInfo){
> lineDuration_ = configInfo.sensorInfo.lineLength * 1.0s
> / configInfo.sensorInfo.pixelRate;
> maxExposureTime_ = kMaxExposure * lineDuration_;
> @@ -67,7 +66,7 @@ int Agc::configure([[maybe_unused]] IPAContext &context,
> return 0;
> }
>
> -void Agc::processBrightness(const ipu3_uapi_stats_3a *stats,
> +void AgcMean::processBrightness(const ipu3_uapi_stats_3a *stats,
> const ipu3_uapi_grid_config &grid)
> {
> const struct ipu3_uapi_grid_config statsAeGrid = stats->stats_4a_config.awb_config.grid;
> @@ -109,7 +108,7 @@ void Agc::processBrightness(const ipu3_uapi_stats_3a *stats,
> iqMean_ = Histogram(Span<uint32_t>(hist)).interQuantileMean(0.98, 1.0);
> }
>
> -void Agc::filterExposure()
> +void AgcMean::filterExposure()
> {
> double speed = 0.2;
> if (prevExposure_ == 0s) {
> @@ -140,10 +139,10 @@ void Agc::filterExposure()
> if (prevExposureNoDg_ <
> prevExposure_ * fastReduceThreshold)
> prevExposureNoDg_ = prevExposure_ * fastReduceThreshold;
> - LOG(IPU3Agc, Debug) << "After filtering, total_exposure " << prevExposure_;
> + LOG(IPU3AgcMean, Debug) << "After filtering, total_exposure " << prevExposure_;
> }
>
> -void Agc::lockExposureGain(uint32_t &exposure, double &gain)
> +void AgcMean::lockExposureGain(uint32_t &exposure, double &gain)
> {
> /* Algorithm initialization should wait for first valid frames */
> /* \todo - have a number of frames given by DelayedControls ?
> @@ -153,20 +152,20 @@ void Agc::lockExposureGain(uint32_t &exposure, double &gain)
>
> /* Are we correctly exposed ? */
> if (std::abs(iqMean_ - kEvGainTarget * knumHistogramBins) <= 1) {
> - LOG(IPU3Agc, Debug) << "!!! Good exposure with iqMean = " << iqMean_;
> + LOG(IPU3AgcMean, Debug) << "!!! Good exposure with iqMean = " << iqMean_;
> } else {
> double newGain = kEvGainTarget * knumHistogramBins / iqMean_;
>
> /* extracted from Rpi::Agc::computeTargetExposure */
> libcamera::utils::Duration currentShutter = exposure * lineDuration_;
> currentExposureNoDg_ = currentShutter * gain;
> - LOG(IPU3Agc, Debug) << "Actual total exposure " << currentExposureNoDg_
> + LOG(IPU3AgcMean, Debug) << "Actual total exposure " << currentExposureNoDg_
> << " Shutter speed " << currentShutter
> << " Gain " << gain;
> currentExposure_ = currentExposureNoDg_ * newGain;
> libcamera::utils::Duration maxTotalExposure = maxExposureTime_ * kMaxGain;
> currentExposure_ = std::min(currentExposure_, maxTotalExposure);
> - LOG(IPU3Agc, Debug) << "Target total exposure " << currentExposure_;
> + LOG(IPU3AgcMean, Debug) << "Target total exposure " << currentExposure_;
>
> /* \todo: estimate if we need to desaturate */
> filterExposure();
> @@ -181,12 +180,12 @@ void Agc::lockExposureGain(uint32_t &exposure, double &gain)
> newExposure = currentExposure_ / gain;
> exposure = std::clamp(static_cast<uint32_t>(exposure * currentExposure_ / newExposure), kMinExposure, kMaxExposure);
> }
> - LOG(IPU3Agc, Debug) << "Adjust exposure " << exposure * lineDuration_ << " and gain " << gain;
> + LOG(IPU3AgcMean, Debug) << "Adjust exposure " << exposure * lineDuration_ << " and gain " << gain;
> }
> lastFrame_ = frameCount_;
> }
>
> -void Agc::process(IPAContext &context, const ipu3_uapi_stats_3a *stats)
> +void AgcMean::process(IPAContext &context, const ipu3_uapi_stats_3a *stats)
> {
> uint32_t &exposure = context.frameContext.agc.exposure;
> double &gain = context.frameContext.agc.gain;
> diff --git a/src/ipa/ipu3/algorithms/agc.h b/src/ipa/ipu3/algorithms/agc_mean.h
> similarity index 90%
> rename from src/ipa/ipu3/algorithms/agc.h
> rename to src/ipa/ipu3/algorithms/agc_mean.h
> index e36797d3..97114121 100644
> --- a/src/ipa/ipu3/algorithms/agc.h
> +++ b/src/ipa/ipu3/algorithms/agc_mean.h
> @@ -2,7 +2,7 @@
> /*
> * Copyright (C) 2021, Ideas On Board
> *
> - * agc.h - IPU3 AGC/AEC control algorithm
> + * agc_mean.h - IPU3 AGC/AEC control algorithm
> */
> #ifndef __LIBCAMERA_IPU3_ALGORITHMS_AGC_H__
> #define __LIBCAMERA_IPU3_ALGORITHMS_AGC_H__
> @@ -23,11 +23,11 @@ namespace ipa::ipu3::algorithms {
>
> using utils::Duration;
>
> -class Agc : public Algorithm
> +class AgcMean : public Algorithm
> {
> public:
> - Agc();
> - ~Agc() = default;
> + AgcMean();
> + ~AgcMean() = default;
>
> int configure(IPAContext &context, const IPAConfigInfo &configInfo) override;
> void process(IPAContext &context, const ipu3_uapi_stats_3a *stats) override;
> diff --git a/src/ipa/ipu3/algorithms/meson.build b/src/ipa/ipu3/algorithms/meson.build
> index deae225b..807b53ea 100644
> --- a/src/ipa/ipu3/algorithms/meson.build
> +++ b/src/ipa/ipu3/algorithms/meson.build
> @@ -1,7 +1,7 @@
> # SPDX-License-Identifier: CC0-1.0
>
> ipu3_ipa_algorithms = files([
> - 'agc.cpp',
> + 'agc_mean.cpp',
> 'algorithm.cpp',
> 'awb.cpp',
> 'tone_mapping.cpp',
> diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp
> index 0ed0a6f1..b73c4f7b 100644
> --- a/src/ipa/ipu3/ipu3.cpp
> +++ b/src/ipa/ipu3/ipu3.cpp
> @@ -29,7 +29,7 @@
>
> #include "libcamera/internal/mapped_framebuffer.h"
>
> -#include "algorithms/agc.h"
> +#include "algorithms/agc_mean.h"
> #include "algorithms/algorithm.h"
> #include "algorithms/awb.h"
> #include "algorithms/tone_mapping.h"
> @@ -266,7 +266,7 @@ int IPAIPU3::init(const IPASettings &settings,
> *ipaControls = ControlInfoMap(std::move(controls), controls::controls);
>
> /* Construct our Algorithms */
> - algorithms_.push_back(std::make_unique<algorithms::Agc>());
> + algorithms_.push_back(std::make_unique<algorithms::AgcMean>());
> algorithms_.push_back(std::make_unique<algorithms::Awb>());
> algorithms_.push_back(std::make_unique<algorithms::ToneMapping>());
>
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list