[libcamera-devel] [PATCH 1/4] ipa: libipa: algorithm: Add queueRequest() to the Algorithm class
Kieran Bingham
kieran.bingham at ideasonboard.com
Fri Jul 15 10:58:39 CEST 2022
Quoting Laurent Pinchart via libcamera-devel (2022-07-13 02:09:44)
> Hi Florian,
>
> Thank you for the patch.
>
> On Mon, Jul 04, 2022 at 05:23:15PM +0200, Florian Sylvestre via libcamera-devel wrote:
> > Add queueRequest() function to the Algorithm class. The queueRequest() function
> > provides controls values coming from the application to each algorithm.
> > Each algorithm is responsible for retrieving the controls associated to them.
Fantastic - just what I had in mind, and was envisaging!
> > Signed-off-by: Florian Sylvestre <fsylvestre at baylibre.com>
> > ---
> > src/ipa/ipu3/module.h | 2 +-
> > src/ipa/libipa/algorithm.cpp | 13 +++++++++++++
> > src/ipa/libipa/algorithm.h | 6 ++++++
> > src/ipa/libipa/module.cpp | 5 +++++
> > src/ipa/libipa/module.h | 3 ++-
> > src/ipa/rkisp1/module.h | 2 +-
> > 6 files changed, 28 insertions(+), 3 deletions(-)
> >
> > diff --git a/src/ipa/ipu3/module.h b/src/ipa/ipu3/module.h
> > index d94fc459..5c2179e0 100644
> > --- a/src/ipa/ipu3/module.h
> > +++ b/src/ipa/ipu3/module.h
> > @@ -20,7 +20,7 @@ namespace libcamera {
> > namespace ipa::ipu3 {
> >
> > using Module = ipa::Module<IPAContext, IPAFrameContext, IPAConfigInfo,
> > - ipu3_uapi_params, ipu3_uapi_stats_3a>;
> > + ipu3_uapi_params, ipu3_uapi_stats_3a, ControlList>;
I'm not sure that we need to define ControlList here ?
> >
> > } /* namespace ipa::ipu3 */
> >
> > diff --git a/src/ipa/libipa/algorithm.cpp b/src/ipa/libipa/algorithm.cpp
> > index 8549fe3f..1fb811ef 100644
> > --- a/src/ipa/libipa/algorithm.cpp
> > +++ b/src/ipa/libipa/algorithm.cpp
> > @@ -81,6 +81,19 @@ namespace ipa {
> > * includes setting fields and flags that enable those processing blocks.
> > */
> >
> > +/**
> > + * \fn Algorithm::queueRequest()
> > + * \brief Provide control values to the algorithm
> > + * \param[in] context The shared IPA context
> > + * \param[in] frame The frame number to aplly the control values
>
> s/aplly/apply/
>
> > + * \param[in] controls The list of user controls
> > + *
> > + * This function provides controls values coming from the application to the
> > + * algorithm. A frame number is provided to indicate the concerned frame.
> > + * Each algorithm is responsible for retrieving the controls associated to
> > + * them.
>
> Let's also mention when this is called:
>
> * This function is called for each request queued to the camera. It provides
> * the controls stored in the request to the algorithm. The \a frame number
> * identifies the corresponding frame.
Technically - it identifies the request sequence that the control list
was queued in.
We are working to infer that the request sequence represents the desired
corresponding frame number - but that is not fully settled throughout
yet, so I would probably prefer to see:
* This function is called for each request queued to the camera. It
* provides the controls stored in the request to the algorithm. The \a
* frame number is the Request sequence number and identifies the desired
* corresponding frame to target for the controls to take effect.
But perhaps that gets 'too' wordy...
> *
> * Algorithms shall read the applicable controls and store their value for later
> * use during frame processing.
>
> > + */
> > +
> > /**
> > * \fn Algorithm::process()
> > * \brief Process ISP statistics, and run algorithm operations
> > diff --git a/src/ipa/libipa/algorithm.h b/src/ipa/libipa/algorithm.h
> > index 2a8871d8..aa846625 100644
> > --- a/src/ipa/libipa/algorithm.h
> > +++ b/src/ipa/libipa/algorithm.h
> > @@ -40,6 +40,12 @@ public:
> > {
> > }
> >
> > + virtual void queueRequest([[maybe_unused]] typename Module::Context &context,
> > + [[maybe_unused]] const uint32_t frame,
To match the 'current' implementation of process, this should pass the
frameContext for the corresponding frame number.
[[maybe_unused]] typename Module::FrameContext *frameContext,
Any algorithm should store actionable state in that frameContext for
when it actually is processing that frame.
> > + [[maybe_unused]] const typename Module::ControlList &controls)
> > + {
> > + }
> > +
> > virtual void process([[maybe_unused]] typename Module::Context &context,
> > [[maybe_unused]] typename Module::FrameContext *frameContext,
> > [[maybe_unused]] const typename Module::Stats *stats)
> > diff --git a/src/ipa/libipa/module.cpp b/src/ipa/libipa/module.cpp
> > index 77352104..e87a52fc 100644
> > --- a/src/ipa/libipa/module.cpp
> > +++ b/src/ipa/libipa/module.cpp
> > @@ -77,6 +77,11 @@ namespace ipa {
> > * \brief The type of the IPA statistics and ISP results
> > */
> >
> > +/**
> > + * \typedef Module::ControlList
> > + * \brief The type of the ISP runtime controls list
> > + */
> > +
> > /**
> > * \fn Module::algorithms()
> > * \brief Retrieve the list of instantiated algorithms
> > diff --git a/src/ipa/libipa/module.h b/src/ipa/libipa/module.h
> > index 4149a353..81d3bf7f 100644
> > --- a/src/ipa/libipa/module.h
> > +++ b/src/ipa/libipa/module.h
> > @@ -26,7 +26,7 @@ LOG_DECLARE_CATEGORY(IPAModuleAlgo)
> > namespace ipa {
> >
> > template<typename _Context, typename _FrameContext, typename _Config,
> > - typename _Params, typename _Stats>
> > + typename _Params, typename _Stats, typename _ControlList>
>
> I don't expect usage of a different container than
> libcamera::ControlList for controls, so this can be hardcoded. No need
> to change the template parameters to the Module class, just use
> ControlList directly in queueRequest() instead of Module::ControlList.
Ah yes - agreed here. It should just be a ControlList.
Really keen to see this move forwards, with the above topics considered:
Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
>
> > class Module : public Loggable
> > {
> > public:
> > @@ -35,6 +35,7 @@ public:
> > using Config = _Config;
> > using Params = _Params;
> > using Stats = _Stats;
> > + using ControlList = _ControlList;
> >
> > virtual ~Module() {}
> >
> > diff --git a/src/ipa/rkisp1/module.h b/src/ipa/rkisp1/module.h
> > index 89f83208..08381a08 100644
> > --- a/src/ipa/rkisp1/module.h
> > +++ b/src/ipa/rkisp1/module.h
> > @@ -20,7 +20,7 @@ namespace libcamera {
> > namespace ipa::rkisp1 {
> >
> > using Module = ipa::Module<IPAContext, IPAFrameContext, IPACameraSensorInfo,
> > - rkisp1_params_cfg, rkisp1_stat_buffer>;
> > + rkisp1_params_cfg, rkisp1_stat_buffer, ControlList>;
> >
> > } /* namespace ipa::rkisp1 */
> >
>
> --
> Regards,
>
> Laurent Pinchart
More information about the libcamera-devel
mailing list