[libcamera-devel] [libcamera-devel 2/5] ipa: libipa: Add init() function to the Algorithm class
paul.elder at ideasonboard.com
paul.elder at ideasonboard.com
Thu Jun 16 11:51:57 CEST 2022
Hi Laurent,
On Thu, Jun 09, 2022 at 01:08:08AM +0300, Laurent Pinchart wrote:
> Hi Paul,
>
> On Fri, May 27, 2022 at 03:46:45PM +0900, paul.elder at ideasonboard.com wrote:
> > On Thu, May 26, 2022 at 02:19:39AM +0300, Laurent Pinchart via libcamera-devel wrote:
> > > Hi Florian,
> > >
> > > Thank you for the patch.
> > >
> > > By the way, you don't need to add "libcamera-devel" manually to the
> > > subject line, the [libcamera-devel] tag is added by the mailing list.
> > >
> > > On Mon, May 23, 2022 at 11:24:32AM +0200, Florian Sylvestre via libcamera-devel wrote:
> > > > Add the init() function that will be called during algorithm initialization
> > > > to provide each algorithm the list of algorithms tuning data.
> > > > Each algorithm will be responsible to grab their corresponding parameters.
> > > >
> > > > Signed-off-by: Florian Sylvestre <fsylvestre at baylibre.com>
> > > > ---
> > > > src/ipa/libipa/algorithm.cpp | 15 +++++++++++++++
> > > > src/ipa/libipa/algorithm.h | 10 +++++++++-
> > > > 2 files changed, 24 insertions(+), 1 deletion(-)
> > > >
> > > > diff --git a/src/ipa/libipa/algorithm.cpp b/src/ipa/libipa/algorithm.cpp
> > > > index 398d5372..269a4beb 100644
> > > > --- a/src/ipa/libipa/algorithm.cpp
> > > > +++ b/src/ipa/libipa/algorithm.cpp
> > > > @@ -29,6 +29,21 @@ namespace ipa {
> > > > * to manage algorithms regardless of their specific type.
> > > > */
> > > >
> > > > +/**
> > > > + * \fn Algorithm::init()
> > > > + * \brief Configure the Algorithm with default parameters
> > > > + * \param[in] context The shared IPA context
> > > > + * \param[in] params The initial parameters used to tune algorithms
> > > > + *
> > > > + * This function is called once before the camera is running to get default
> > > > + * algorithm parameters.
> > >
> > > This may be understood as meaning it's called once every time the camera
> > > is started. I'd make this a bit clearer:
> > >
> > > * This function is called once, when the IPA module is initialized, to
> > > * initialize the algorithm. The \a params YamlObject contains IPA module
> > > * parameters, typically tuning data for all algorithms. The Algorithm is
> > > * responsible for reading the parameters relevant to its configuration.
> >
> > Yeah that's a good clarification.
> >
> > > > + *
> > > > + * Algorithms are responsible to read the parameters given and extract their
> > > > + * parameter configuration.
> > > > + *
> > > > + * \return 0 if successful, an error code otherwise
> > > > + */
> > > > +
> > > > /**
> > > > * \fn Algorithm::configure()
> > > > * \brief Configure the Algorithm given an IPAConfigInfo
> > > > diff --git a/src/ipa/libipa/algorithm.h b/src/ipa/libipa/algorithm.h
> > > > index 766aee5d..f5be1caf 100644
> > > > --- a/src/ipa/libipa/algorithm.h
> > > > +++ b/src/ipa/libipa/algorithm.h
> > > > @@ -10,12 +10,20 @@ namespace libcamera {
> > > >
> > > > namespace ipa {
> > > >
> > > > -template<typename Context, typename Config, typename Params, typename Stats>
> > > > +template<typename Context, typename TuningData,
> > >
> > > As we're trying to push for YAML usage everywhere through libcamera, I'm
> > > tempted to drop the additional template argument and use YamlObject
> > > unconditionally in init() instead of TuningData.
> > >
> > > Does anyone have an opinion on this ?
> >
> > On one hand, since all information will be representable in a yaml file,
> > it could be good to unify the tuning data into a YamlObject in
> > Algorithm.
> >
> > On the other hand, I think that it's not nice for algorithms to have to
> > deal with yaml directly. As in, the parser could convert the yaml values
> > into a "proper" data type that can be operated on.
>
> How would you envision this ? A set of structures that would be specific
> to particular algorithms (and to a particular IPA module) ? If so,
tbh, yeah, that's what I was envisioning.
> someone would need to convert the YAML data to that structure, and
> that's exactly what the Algorithm::init() function does :-) If we were
> to split that out of the algorithm implementation, wouldn't we end up
> with code that is algorithm-specific but would live elsewhere ?
Yeah, so probably the first hand is better.
>
> > Back to the first hand, the tuning file is only parsed and operated on
> > at init time, so the convenience of handling proper data types vs raw
> > yaml values isn't too vital.
> >
> > Back to the second hand, maybe for tuning parameters that are common
> > across platforms could have a unified parser and converter in libipa.
>
> That's possible, although I wouldn't expect it to be very common. In any
> case, the Algorithm::init() function could call helpers from libipa if
> needed.
Hm yeah I think you're right.
Alright, let's go for the first hand then.
Paul
>
> > After presenting the hands, I suppose I have to make a choice to be my
> > opinion... I'd say the second hand. tbh I forsee large tuning
> > parameters, and although they don't need to be operated on, I think
> > they'd be converted from yaml to parameters in the same way across
> > different platforms. So instead of extracting each value with get<>()
> > (like I see in 5/5), we could have a convenience extractor in libipa,
> > eventually.
> >
> > That's just my two cents.
> >
> > And so for that reason, with the wording fix, I think it's good to go:
> >
> > Reviewed-by: Paul Elder <paul.elder at ideasonboard.com>
> >
> > > > + typename Config, typename Params, typename Stats>
> > > > +
> > > > class Algorithm
> > > > {
> > > > public:
> > > > virtual ~Algorithm() {}
> > > >
> > > > + virtual int init([[maybe_unused]] Context &context,
> > > > + [[maybe_unused]] const TuningData *params)
> > > > + {
> > > > + return 0;
> > > > + }
> > > > +
> > > > virtual int configure([[maybe_unused]] Context &context,
> > > > [[maybe_unused]] const Config &configInfo)
> > > > {
More information about the libcamera-devel
mailing list