Message ID | 20201207180121.6374-3-david.plowman@raspberrypi.com |
---|---|
State | Superseded |
Headers | show |
Series |
|
Related | show |
Hi David, Thank you for your patch. On Mon, 7 Dec 2020 at 18:02, David Plowman <david.plowman@raspberrypi.com> 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@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, Reviewed-by: Naushir Patuck <naush@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 > -- > 2.20.1 > > _______________________________________________ > libcamera-devel mailing list > libcamera-devel@lists.libcamera.org > https://lists.libcamera.org/listinfo/libcamera-devel >
Hi David, Thank you for the patch. On Mon, Dec 07, 2020 at 06:01:17PM +0000, 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@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; As you need the same feature for AWB, would it make sense to add this virtual function to the Algorithm class instead ? > 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); Supplying the convergence value from the algorithm instead of the CamHelper is really nice. Possibly with GetConvergenceFrames() moved to Algorithm, Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > 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; > +} > + > 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
Hi Naush, 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@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@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
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 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...? Thanks David On Tue, 8 Dec 2020 at 11:38, Laurent Pinchart <laurent.pinchart@ideasonboard.com> wrote: > > Hi Naush, > > 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@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@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
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@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@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
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; +} + 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
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@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(+)