[libcamera-devel] [PATCH v2 3/6] src: ipa: raspberrypi: agc: Add GetConvergenceFrames method to AWB base class
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Tue Dec 8 12:38:58 CET 2020
Hi David,
Thank you for the patch.
On Mon, Dec 07, 2020 at 06:01:18PM +0000, David Plowman wrote:
> We add a GetConvergenceFrames method to the AwbAlgorithm class which
> can be called when the AWB is started from scratch. It suggests how
> many frames should be dropped before displaying any (while the AWB
> converges).
>
> The Raspberry Pi specific implementation makes this customisable from
> the tuning file.
>
> Signed-off-by: David Plowman <david.plowman at raspberrypi.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> ---
> src/ipa/raspberrypi/controller/awb_algorithm.hpp | 1 +
> src/ipa/raspberrypi/controller/rpi/awb.cpp | 13 +++++++++++++
> src/ipa/raspberrypi/controller/rpi/awb.hpp | 2 ++
> 3 files changed, 16 insertions(+)
>
> diff --git a/src/ipa/raspberrypi/controller/awb_algorithm.hpp b/src/ipa/raspberrypi/controller/awb_algorithm.hpp
> index 5be0c9f4..84ae313b 100644
> --- a/src/ipa/raspberrypi/controller/awb_algorithm.hpp
> +++ b/src/ipa/raspberrypi/controller/awb_algorithm.hpp
> @@ -15,6 +15,7 @@ class AwbAlgorithm : public Algorithm
> public:
> AwbAlgorithm(Controller *controller) : Algorithm(controller) {}
> // An AWB algorithm must provide the following:
> + virtual unsigned int GetConvergenceFrames(unsigned int mistrust_frames) const = 0;
> virtual void SetMode(std::string const &mode_name) = 0;
> virtual void SetManualGains(double manual_r, double manual_b) = 0;
> };
> diff --git a/src/ipa/raspberrypi/controller/rpi/awb.cpp b/src/ipa/raspberrypi/controller/rpi/awb.cpp
> index 020825e3..6b359ac5 100644
> --- a/src/ipa/raspberrypi/controller/rpi/awb.cpp
> +++ b/src/ipa/raspberrypi/controller/rpi/awb.cpp
> @@ -59,6 +59,7 @@ void AwbConfig::Read(boost::property_tree::ptree const ¶ms)
> bayes = params.get<int>("bayes", 1);
> frame_period = params.get<uint16_t>("frame_period", 10);
> startup_frames = params.get<uint16_t>("startup_frames", 10);
> + convergence_frames = params.get<unsigned int>("convergence_frames", 3);
> speed = params.get<double>("speed", 0.05);
> if (params.get_child_optional("ct_curve"))
> read_ct_curve(ct_r, ct_b, params.get_child("ct_curve"));
> @@ -165,6 +166,18 @@ void Awb::Initialise()
> prev_sync_results_ = sync_results_;
> }
>
> +unsigned int Awb::GetConvergenceFrames(unsigned int mistrust_frames) const
> +{
> + // If colour gains have been explicitly set, there is no convergence
> + // to happen, so no need to drop any frames - return zero.
> + // Otherwise, any frames for which we have been told not to trust the
> + // statistics must be added to our own count.
> + if (manual_r_ && manual_b_)
> + return 0;
> + else
> + return config_.convergence_frames + mistrust_frames;
> +}
> +
> void Awb::SetMode(std::string const &mode_name)
> {
> std::unique_lock<std::mutex> lock(settings_mutex_);
> diff --git a/src/ipa/raspberrypi/controller/rpi/awb.hpp b/src/ipa/raspberrypi/controller/rpi/awb.hpp
> index 545d85a8..d86b9598 100644
> --- a/src/ipa/raspberrypi/controller/rpi/awb.hpp
> +++ b/src/ipa/raspberrypi/controller/rpi/awb.hpp
> @@ -37,6 +37,7 @@ struct AwbConfig {
> uint16_t frame_period;
> // number of initial frames for which speed taken as 1.0 (maximum)
> uint16_t startup_frames;
> + unsigned int convergence_frames; // approx number of frames to converge
> double speed; // IIR filter speed applied to algorithm results
> bool fast; // "fast" mode uses a 16x16 rather than 32x32 grid
> Pwl ct_r; // function maps CT to r (= R/G)
> @@ -82,6 +83,7 @@ public:
> char const *Name() const override;
> void Initialise() override;
> void Read(boost::property_tree::ptree const ¶ms) override;
> + unsigned int GetConvergenceFrames(unsigned int mistrust_frames) const override;
> void SetMode(std::string const &name) override;
> void SetManualGains(double manual_r, double manual_b) override;
> void SwitchMode(CameraMode const &camera_mode, Metadata *metadata) override;
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list