[libcamera-devel] [PATCH v4 08/32] ipa: libipa: algorithm: queueRequest(): Pass frame context

Laurent Pinchart laurent.pinchart at ideasonboard.com
Tue Sep 20 21:14:49 CEST 2022


Hi Kieran,

On Tue, Sep 20, 2022 at 03:05:07PM +0100, Kieran Bingham wrote:
> Quoting Laurent Pinchart (2022-09-08 02:41:36)
> > From: Kieran Bingham <kieran.bingham at ideasonboard.com>
> > 
> > IPA modules have access to incoming Request's controls list and
> > need to store them in the frame context at queueRequest() time.
> > 
> > As each algorithm is expected to have ownership of a certain set of
> > controls it should have access to the frame context where they have been
> > stored, and where the algorithm computation results can be stored to
> > later populate metadata.
> > 
> > Now that both the IPU3 and RkISP1 IPA modules comply with the same
> > interface, propagate the queueRequest() call to algorithms in the IPU3
> 
> In the RKISP module? Or is this where something was dropped from the
> IPU3?
> 
> 
> It might be worth highlighting that this commit adds a dummy frame
> context for the RKISP for the time being ?

I'll update the commit message.

> But other than that, lets get this moving.
> 
> Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> 
> 
> > IPA module.
> > 
> > Signed-off-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> > Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> > Reviewed-by: Umang Jain <umang.jain at ideasonboard.com>
> > ---
> >  src/ipa/libipa/algorithm.cpp         | 1 +
> >  src/ipa/libipa/algorithm.h           | 1 +
> >  src/ipa/rkisp1/algorithms/awb.cpp    | 1 +
> >  src/ipa/rkisp1/algorithms/awb.h      | 1 +
> >  src/ipa/rkisp1/algorithms/cproc.cpp  | 1 +
> >  src/ipa/rkisp1/algorithms/cproc.h    | 1 +
> >  src/ipa/rkisp1/algorithms/dpf.cpp    | 1 +
> >  src/ipa/rkisp1/algorithms/dpf.h      | 1 +
> >  src/ipa/rkisp1/algorithms/filter.cpp | 1 +
> >  src/ipa/rkisp1/algorithms/filter.h   | 1 +
> >  src/ipa/rkisp1/rkisp1.cpp            | 5 ++++-
> >  11 files changed, 14 insertions(+), 1 deletion(-)
> > 
> > diff --git a/src/ipa/libipa/algorithm.cpp b/src/ipa/libipa/algorithm.cpp
> > index 30eab67f71fc..c152b885aee1 100644
> > --- a/src/ipa/libipa/algorithm.cpp
> > +++ b/src/ipa/libipa/algorithm.cpp
> > @@ -88,6 +88,7 @@ namespace ipa {
> >   * \brief Provide control values to the algorithm
> >   * \param[in] context The shared IPA context
> >   * \param[in] frame The frame number to apply the control values
> > + * \param[in] frameContext The current frame's context
> >   * \param[in] controls The list of user controls
> >   *
> >   * This function is called for each request queued to the camera. It provides
> > diff --git a/src/ipa/libipa/algorithm.h b/src/ipa/libipa/algorithm.h
> > index ee93d260ca3f..d8601f9ccaff 100644
> > --- a/src/ipa/libipa/algorithm.h
> > +++ b/src/ipa/libipa/algorithm.h
> > @@ -47,6 +47,7 @@ public:
> >  
> >         virtual void queueRequest([[maybe_unused]] typename Module::Context &context,
> >                                   [[maybe_unused]] const uint32_t frame,
> > +                                 [[maybe_unused]] typename Module::FrameContext &frameContext,
> >                                   [[maybe_unused]] const ControlList &controls)
> >         {
> >         }
> > diff --git a/src/ipa/rkisp1/algorithms/awb.cpp b/src/ipa/rkisp1/algorithms/awb.cpp
> > index aefba6382807..a23c32015454 100644
> > --- a/src/ipa/rkisp1/algorithms/awb.cpp
> > +++ b/src/ipa/rkisp1/algorithms/awb.cpp
> > @@ -128,6 +128,7 @@ void Awb::prepare(IPAContext &context,
> >   */
> >  void Awb::queueRequest(IPAContext &context,
> >                        [[maybe_unused]] const uint32_t frame,
> > +                      [[maybe_unused]] IPAFrameContext &frameContext,
> >                        const ControlList &controls)
> >  {
> >         auto &awb = context.frameContext.awb;
> > diff --git a/src/ipa/rkisp1/algorithms/awb.h b/src/ipa/rkisp1/algorithms/awb.h
> > index 806e11a2ec93..6d4a39467038 100644
> > --- a/src/ipa/rkisp1/algorithms/awb.h
> > +++ b/src/ipa/rkisp1/algorithms/awb.h
> > @@ -24,6 +24,7 @@ public:
> >                      IPAFrameContext &frameContext,
> >                      rkisp1_params_cfg *params) override;
> >         void queueRequest(IPAContext &context, const uint32_t frame,
> > +                         IPAFrameContext &frameContext,
> >                           const ControlList &controls) override;
> >         void process(IPAContext &context, const uint32_t frame,
> >                      IPAFrameContext &frameCtx,
> > diff --git a/src/ipa/rkisp1/algorithms/cproc.cpp b/src/ipa/rkisp1/algorithms/cproc.cpp
> > index c0505c68765b..bc4a07073706 100644
> > --- a/src/ipa/rkisp1/algorithms/cproc.cpp
> > +++ b/src/ipa/rkisp1/algorithms/cproc.cpp
> > @@ -38,6 +38,7 @@ LOG_DEFINE_CATEGORY(RkISP1CProc)
> >   */
> >  void ColorProcessing::queueRequest(IPAContext &context,
> >                                    [[maybe_unused]] const uint32_t frame,
> > +                                  [[maybe_unused]] IPAFrameContext &frameContext,
> >                                    const ControlList &controls)
> >  {
> >         auto &cproc = context.frameContext.cproc;
> > diff --git a/src/ipa/rkisp1/algorithms/cproc.h b/src/ipa/rkisp1/algorithms/cproc.h
> > index 02c3d9c95488..ba6e901ae110 100644
> > --- a/src/ipa/rkisp1/algorithms/cproc.h
> > +++ b/src/ipa/rkisp1/algorithms/cproc.h
> > @@ -22,6 +22,7 @@ public:
> >         ~ColorProcessing() = default;
> >  
> >         void queueRequest(IPAContext &context, const uint32_t frame,
> > +                         IPAFrameContext &frameContext,
> >                           const ControlList &controls) override;
> >         void prepare(IPAContext &context, const uint32_t frame,
> >                      IPAFrameContext &frameContext,
> > diff --git a/src/ipa/rkisp1/algorithms/dpf.cpp b/src/ipa/rkisp1/algorithms/dpf.cpp
> > index 8286f83facc1..be024fc5fe90 100644
> > --- a/src/ipa/rkisp1/algorithms/dpf.cpp
> > +++ b/src/ipa/rkisp1/algorithms/dpf.cpp
> > @@ -176,6 +176,7 @@ int Dpf::init([[maybe_unused]] IPAContext &context,
> >   */
> >  void Dpf::queueRequest(IPAContext &context,
> >                        [[maybe_unused]] const uint32_t frame,
> > +                      [[maybe_unused]] IPAFrameContext &frameContext,
> >                        const ControlList &controls)
> >  {
> >         auto &dpf = context.frameContext.dpf;
> > diff --git a/src/ipa/rkisp1/algorithms/dpf.h b/src/ipa/rkisp1/algorithms/dpf.h
> > index 656d78dee67c..e232cad4ee87 100644
> > --- a/src/ipa/rkisp1/algorithms/dpf.h
> > +++ b/src/ipa/rkisp1/algorithms/dpf.h
> > @@ -23,6 +23,7 @@ public:
> >  
> >         int init(IPAContext &context, const YamlObject &tuningData) override;
> >         void queueRequest(IPAContext &context, const uint32_t frame,
> > +                         IPAFrameContext &frameContext,
> >                           const ControlList &controls) override;
> >         void prepare(IPAContext &context, const uint32_t frame,
> >                      IPAFrameContext &frameContext,
> > diff --git a/src/ipa/rkisp1/algorithms/filter.cpp b/src/ipa/rkisp1/algorithms/filter.cpp
> > index 02562339d008..6aa5476aa25e 100644
> > --- a/src/ipa/rkisp1/algorithms/filter.cpp
> > +++ b/src/ipa/rkisp1/algorithms/filter.cpp
> > @@ -44,6 +44,7 @@ static constexpr uint32_t kFiltModeDefault = 0x000004f2;
> >   */
> >  void Filter::queueRequest(IPAContext &context,
> >                           [[maybe_unused]] const uint32_t frame,
> > +                         [[maybe_unused]] IPAFrameContext &frameContext,
> >                           const ControlList &controls)
> >  {
> >         auto &filter = context.frameContext.filter;
> > diff --git a/src/ipa/rkisp1/algorithms/filter.h b/src/ipa/rkisp1/algorithms/filter.h
> > index ac69657e2f0f..3fd882ea41dc 100644
> > --- a/src/ipa/rkisp1/algorithms/filter.h
> > +++ b/src/ipa/rkisp1/algorithms/filter.h
> > @@ -22,6 +22,7 @@ public:
> >         ~Filter() = default;
> >  
> >         void queueRequest(IPAContext &context, const uint32_t frame,
> > +                         IPAFrameContext &frameContext,
> >                           const ControlList &controls) override;
> >         void prepare(IPAContext &context, const uint32_t frame,
> >                      IPAFrameContext &frameContext,
> > diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp
> > index b2593a584a1a..07210d16b5b5 100644
> > --- a/src/ipa/rkisp1/rkisp1.cpp
> > +++ b/src/ipa/rkisp1/rkisp1.cpp
> > @@ -292,8 +292,11 @@ void IPARkISP1::unmapBuffers(const std::vector<unsigned int> &ids)
> >  
> >  void IPARkISP1::queueRequest(const uint32_t frame, const ControlList &controls)
> >  {
> > +       /* \todo Obtain the frame context to pass to process from the FCQueue */
> > +       IPAFrameContext frameContext;
> > +
> >         for (auto const &algo : algorithms())
> > -               algo->queueRequest(context_, frame, controls);
> > +               algo->queueRequest(context_, frame, frameContext, controls);
> >  }
> >  
> >  void IPARkISP1::fillParamsBuffer(const uint32_t frame, const uint32_t bufferId)

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list