[libcamera-devel] [PATCH v2 2/6] src: ipa: raspberrypi: agc: Add GetConvergenceFrames method to AGC base class
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Tue Dec 8 12:55:13 CET 2020
Hi David,
On Tue, Dec 08, 2020 at 11:50:22AM +0000, David Plowman wrote:
> Hi Laurent, Naush,
>
> Thanks for the comments. I think there are some good points there. To
> bring the two together, I think Naush's suggest would be to avoid
> passing mistrust_frames into the GetConvergenceFrames method, and in
> the raspberrypi.cpp IPA file have something like:
>
> unsigned int convergenceFrames = agc->GetConvergenceFrames();
> if (convergenceFrames)
> convergenceFrames += mistrustFrames;
>
> I can see that leaves the Algorithms looking simpler, which is nice.
>
> Moving onto Laurent's point, this would mean that there's an in-built
> assumption that convergence is only to do with statistics (which,
> you're right, is what "mistrusted frames" are all about). But I don't
Do you mean sensor metadata, or statistics ?
> really see any other sort of convergence, at least certainly not in
> our pipeline.
>
> So I'm feeling like the Naush approach is probably the way to go...?
I'm fine with that. Given that the mistrusted frames cause
Controller::Process() to be skipped altogether, the algorithms can't see
those frames anyway, so there will always be an additional convergence
delay. If some algorithms could later work with mistrusted frames, we
would need a more intrusive rework anyway.
> On Tue, 8 Dec 2020 at 11:38, Laurent Pinchart wrote:
> > On Tue, Dec 08, 2020 at 10:07:19AM +0000, Naushir Patuck wrote:
> > > On Mon, 7 Dec 2020 at 18:02, David Plowman wrote:
> > > > We add a GetConvergenceFrames method to the AgcAlgorithm class which
> > > > can be called when the AGC is started from scratch. It suggests how
> > > > many frames should be dropped before displaying any (while the AGC
> > > > converges).
> > > >
> > > > The Raspberry Pi specific implementation makes this customisable from
> > > > the tuning file.
> > > >
> > > > Signed-off-by: David Plowman <david.plowman at raspberrypi.com>
> > > > ---
> > > > src/ipa/raspberrypi/controller/agc_algorithm.hpp | 1 +
> > > > src/ipa/raspberrypi/controller/rpi/agc.cpp | 13 +++++++++++++
> > > > src/ipa/raspberrypi/controller/rpi/agc.hpp | 2 ++
> > > > 3 files changed, 16 insertions(+)
> > > >
> > > > diff --git a/src/ipa/raspberrypi/controller/agc_algorithm.hpp
> > > > b/src/ipa/raspberrypi/controller/agc_algorithm.hpp
> > > > index b4ea54fb..85fc6084 100644
> > > > --- a/src/ipa/raspberrypi/controller/agc_algorithm.hpp
> > > > +++ b/src/ipa/raspberrypi/controller/agc_algorithm.hpp
> > > > @@ -15,6 +15,7 @@ class AgcAlgorithm : public Algorithm
> > > > public:
> > > > AgcAlgorithm(Controller *controller) : Algorithm(controller) {}
> > > > // An AGC algorithm must provide the following:
> > > > + virtual unsigned int GetConvergenceFrames(unsigned int mistrust_frames) const = 0;
> > > >
> > > > virtual void SetEv(double ev) = 0;
> > > > virtual void SetFlickerPeriod(double flicker_period) = 0;
> > > > virtual void SetFixedShutter(double fixed_shutter) = 0; // microseconds
> > > > diff --git a/src/ipa/raspberrypi/controller/rpi/agc.cpp b/src/ipa/raspberrypi/controller/rpi/agc.cpp
> > > > index 9da18c31..787918cc 100644
> > > > --- a/src/ipa/raspberrypi/controller/rpi/agc.cpp
> > > > +++ b/src/ipa/raspberrypi/controller/rpi/agc.cpp
> > > > @@ -142,6 +142,7 @@ void AgcConfig::Read(boost::property_tree::ptree const ¶ms)
> > > > Y_target.Read(params.get_child("y_target"));
> > > > speed = params.get<double>("speed", 0.2);
> > > > startup_frames = params.get<uint16_t>("startup_frames", 10);
> > > > + convergence_frames = params.get<unsigned int>("convergence_frames", 6);
> > > > fast_reduce_threshold =
> > > > params.get<double>("fast_reduce_threshold", 0.4);
> > > > base_ev = params.get<double>("base_ev", 1.0);
> > > > @@ -206,6 +207,18 @@ void Agc::Resume()
> > > > fixed_analogue_gain_ = 0;
> > > > }
> > > >
> > > > +unsigned int Agc::GetConvergenceFrames(unsigned int mistrust_frames) const
> > > > +{
> > > > + // If shutter and gain 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 (fixed_shutter_ && fixed_analogue_gain_)
> > > > + return 0;
> > > > + else
> > > > + return config_.convergence_frames + mistrust_frames;
> > > > +}
> > > > +
> > >
> > > Minor nitpick, but why do you pass mistrust_frames into
> > > GetConvergenceFrames? Could you not leave it out and do the addition of
> > > mistrust frames in the IPA? Either way,
> >
> > Could it be that the effect of the mistrusted frames could depend on the
> > algorithm's implementation ? I could imagine some algorithms not using
> > metadata, in which case the number of mistrusted frames could be
> > ignored (at least if mistrusted frames always means mistrusted
> > metadata).
> >
> > > Reviewed-by: Naushir Patuck <naush at raspberrypi.com>
> > >
> > > > void Agc::SetEv(double ev)
> > > > {
> > > > ev_ = ev;
> > > > diff --git a/src/ipa/raspberrypi/controller/rpi/agc.hpp
> > > > b/src/ipa/raspberrypi/controller/rpi/agc.hpp
> > > > index 95db1812..7d41608a 100644
> > > > --- a/src/ipa/raspberrypi/controller/rpi/agc.hpp
> > > > +++ b/src/ipa/raspberrypi/controller/rpi/agc.hpp
> > > > @@ -52,6 +52,7 @@ struct AgcConfig {
> > > > Pwl Y_target;
> > > > double speed;
> > > > uint16_t startup_frames;
> > > > + unsigned int convergence_frames;
> > > > double max_change;
> > > > double min_change;
> > > > double fast_reduce_threshold;
> > > > @@ -74,6 +75,7 @@ public:
> > > > bool IsPaused() const override;
> > > > void Pause() override;
> > > > void Resume() override;
> > > > + unsigned int GetConvergenceFrames(unsigned int mistrust_frames) const override;
> > > > void SetEv(double ev) override;
> > > > void SetFlickerPeriod(double flicker_period) override;
> > > > void SetFixedShutter(double fixed_shutter) override; // microseconds
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list