[libcamera-devel] [PATCH] pipeline: rkisp1: Move ControlInfoMap to IPA module

Florian Sylvestre fsylvestre at baylibre.com
Wed Aug 3 18:02:00 CEST 2022


Hi Laurent,

On Wed, 3 Aug 2022 at 15:46, <paul.elder at ideasonboard.com> wrote:
>
> On Tue, Aug 02, 2022 at 03:13:30AM +0300, Laurent Pinchart wrote:
> > Currently the pipeline handler advertises controls handled by the IPA
> > from a ControlInfoMap it manually constructs. This is wrong, as the IPA
> > module is the component that knows what controls it supports. Fix this
> > by moving the ControlInfoMap construction to the IPA module, and pass it
> > to the pipeline handler as a return value from the IPA init() function.
> >
> > Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
>
> Reviewed-by: Paul Elder <paul.elder at ideasonboard.com>
Reviewed-by: Florian Sylvestre <fsylvestre at baylibre.com>
>
> > ---
> >  include/libcamera/ipa/rkisp1.mojom       |  2 +-
> >  src/ipa/rkisp1/rkisp1.cpp                | 30 ++++++++++++++++++++---
> >  src/libcamera/pipeline/rkisp1/rkisp1.cpp | 31 ++----------------------
> >  3 files changed, 30 insertions(+), 33 deletions(-)
> >
> > diff --git a/include/libcamera/ipa/rkisp1.mojom b/include/libcamera/ipa/rkisp1.mojom
> > index e35373852b7c..eaf3955e4096 100644
> > --- a/include/libcamera/ipa/rkisp1.mojom
> > +++ b/include/libcamera/ipa/rkisp1.mojom
> > @@ -11,7 +11,7 @@ import "include/libcamera/ipa/core.mojom";
> >  interface IPARkISP1Interface {
> >       init(libcamera.IPASettings settings,
> >            uint32 hwRevision)
> > -             => (int32 ret);
> > +             => (int32 ret, libcamera.ControlInfoMap ipaControls);
> >       start() => (int32 ret);
> >       stop();
> >
> > diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp
> > index e5010f6ab629..52f7143980fe 100644
> > --- a/src/ipa/rkisp1/rkisp1.cpp
> > +++ b/src/ipa/rkisp1/rkisp1.cpp
> > @@ -46,7 +46,8 @@ namespace ipa::rkisp1 {
> >  class IPARkISP1 : public IPARkISP1Interface, public Module
> >  {
> >  public:
> > -     int init(const IPASettings &settings, unsigned int hwRevision) override;
> > +     int init(const IPASettings &settings, unsigned int hwRevision,
> > +              ControlInfoMap *ipaControls) override;
> >       int start() override;
> >       void stop() override {}
> >
> > @@ -89,12 +90,27 @@ private:
> >       struct IPAContext context_;
> >  };
> >
> > +namespace {
> > +
> > +/* List of controls handled by the RkISP1 IPA */
> > +const ControlInfoMap::Map rkisp1Controls{
> > +     { &controls::AeEnable, ControlInfo(false, true) },
> > +     { &controls::Brightness, ControlInfo(-1.0f, 0.993f) },
> > +     { &controls::Contrast, ControlInfo(0.0f, 1.993f) },
> > +     { &controls::Saturation, ControlInfo(0.0f, 1.993f) },
> > +     { &controls::Sharpness, ControlInfo(0.0f, 10.0f, 1.0f) },
> > +     { &controls::draft::NoiseReductionMode, ControlInfo(controls::draft::NoiseReductionModeValues) },
> > +};
> > +
> > +} /* namespace */
> > +
> >  std::string IPARkISP1::logPrefix() const
> >  {
> >       return "rkisp1";
> >  }
> >
> > -int IPARkISP1::init(const IPASettings &settings, unsigned int hwRevision)
> > +int IPARkISP1::init(const IPASettings &settings, unsigned int hwRevision,
> > +                 ControlInfoMap *ipaControls)
> >  {
> >       /* \todo Add support for other revisions */
> >       switch (hwRevision) {
> > @@ -156,7 +172,15 @@ int IPARkISP1::init(const IPASettings &settings, unsigned int hwRevision)
> >               return -EINVAL;
> >       }
> >
> > -     return createAlgorithms(context_, (*data)["algorithms"]);
> > +     int ret = createAlgorithms(context_, (*data)["algorithms"]);
> > +     if (ret)
> > +             return ret;
> > +
> > +     /* Return the controls handled by the IPA. */
> > +     ControlInfoMap::Map ctrlMap = rkisp1Controls;
> > +     *ipaControls = ControlInfoMap(std::move(ctrlMap), controls::controls);
> > +
> > +     return 0;
> >  }
> >
> >  int IPARkISP1::start()
> > diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> > index de687f4dc6b0..932873329e89 100644
> > --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> > +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> > @@ -344,7 +344,8 @@ int RkISP1CameraData::loadIPA(unsigned int hwRevision)
> >               ipaTuningFile = std::string(configFromEnv);
> >       }
> >
> > -     int ret = ipa_->init({ ipaTuningFile, sensor_->model() }, hwRevision);
> > +     int ret = ipa_->init({ ipaTuningFile, sensor_->model() }, hwRevision,
> > +                          &controlInfo_);
> >       if (ret < 0) {
> >               LOG(RkISP1, Error) << "IPA initialization failure";
> >               return ret;
> > @@ -967,34 +968,6 @@ int PipelineHandlerRkISP1::createCamera(MediaEntity *sensor)
> >               std::make_unique<RkISP1CameraData>(this, &mainPath_,
> >                                                  hasSelfPath_ ? &selfPath_ : nullptr);
> >
> > -     ControlInfoMap::Map ctrls;
> > -     ctrls.emplace(std::piecewise_construct,
> > -                   std::forward_as_tuple(&controls::Sharpness),
> > -                   std::forward_as_tuple(0.0f, 10.0f, 1.0f));
> > -
> > -     ctrls.emplace(std::piecewise_construct,
> > -                   std::forward_as_tuple(&controls::Brightness),
> > -                   std::forward_as_tuple(-1.0f, 0.993f));
> > -
> > -     ctrls.emplace(std::piecewise_construct,
> > -                   std::forward_as_tuple(&controls::Contrast),
> > -                   std::forward_as_tuple(0.0f, 1.993f));
> > -
> > -     ctrls.emplace(std::piecewise_construct,
> > -                   std::forward_as_tuple(&controls::Saturation),
> > -                   std::forward_as_tuple(0.0f, 1.993f));
> > -
> > -     ctrls.emplace(std::piecewise_construct,
> > -                   std::forward_as_tuple(&controls::draft::NoiseReductionMode),
> > -                   std::forward_as_tuple(controls::draft::NoiseReductionModeValues));
> > -
> > -     ctrls.emplace(std::piecewise_construct,
> > -                   std::forward_as_tuple(&controls::AeEnable),
> > -                   std::forward_as_tuple(false, true));
> > -
> > -     data->controlInfo_ = ControlInfoMap(std::move(ctrls),
> > -                                         controls::controls);
> > -
> >       data->sensor_ = std::make_unique<CameraSensor>(sensor);
> >       ret = data->sensor_->init();
> >       if (ret)
> > --
> > Regards,
> >
> > Laurent Pinchart
> >



-- 
Florian Sylvestre


More information about the libcamera-devel mailing list