Message ID | 20240626072100.55497-14-mzamazal@redhat.com |
---|---|
State | Superseded |
Headers | show |
Series |
|
Related | show |
Hi Milan Thank you for the patch On 26/06/24 12:50 pm, Milan Zamazal wrote: > This patch adds Algorithm::configure call for the defined algorithms. > This is preparation only since there are currently no Algorithm based > algorithms defined. > > A part of this change is passing IPAConfigInfo instead of ControlInfoMap > to configure() calls as this is what Algorithm::configure expects. > > Signed-off-by: Milan Zamazal <mzamazal@redhat.com> > --- > .../libcamera/internal/software_isp/software_isp.h | 2 +- > include/libcamera/ipa/soft.mojom | 6 +++++- > src/ipa/simple/module.h | 3 ++- > src/ipa/simple/soft_simple.cpp | 12 +++++++++--- > src/libcamera/pipeline/simple/simple.cpp | 11 +++++++---- > src/libcamera/software_isp/software_isp.cpp | 7 ++++--- > 6 files changed, 28 insertions(+), 13 deletions(-) > > diff --git a/include/libcamera/internal/software_isp/software_isp.h b/include/libcamera/internal/software_isp/software_isp.h > index 8753c2fd..1ba9eb62 100644 > --- a/include/libcamera/internal/software_isp/software_isp.h > +++ b/include/libcamera/internal/software_isp/software_isp.h > @@ -61,7 +61,7 @@ public: > > int configure(const StreamConfiguration &inputCfg, > const std::vector<std::reference_wrapper<StreamConfiguration>> &outputCfgs, > - const ControlInfoMap &sensorControls); > + const ipa::soft::IPAConfigInfo &configInfo); > > int exportBuffers(unsigned int output, unsigned int count, > std::vector<std::unique_ptr<FrameBuffer>> *buffers); > diff --git a/include/libcamera/ipa/soft.mojom b/include/libcamera/ipa/soft.mojom > index dad352ba..65d90bfa 100644 > --- a/include/libcamera/ipa/soft.mojom > +++ b/include/libcamera/ipa/soft.mojom > @@ -8,6 +8,10 @@ module ipa.soft; > > import "include/libcamera/ipa/core.mojom"; > > +struct IPAConfigInfo { > + libcamera.ControlInfoMap sensorControls; > +}; > + > interface IPASoftInterface { > init(libcamera.IPASettings settings, > libcamera.SharedFD fdStats, > @@ -16,7 +20,7 @@ interface IPASoftInterface { > => (int32 ret); > start() => (int32 ret); > stop(); > - configure(libcamera.ControlInfoMap sensorCtrlInfoMap) > + configure(IPAConfigInfo configInfo) > => (int32 ret); > > prepare(uint32 frame); > diff --git a/src/ipa/simple/module.h b/src/ipa/simple/module.h > index 21328ecd..e518e742 100644 > --- a/src/ipa/simple/module.h > +++ b/src/ipa/simple/module.h > @@ -10,6 +10,7 @@ > #include <libcamera/controls.h> > > #include <libcamera/ipa/core_ipa_interface.h> > +#include <libcamera/ipa/soft_ipa_interface.h> I think the core_ipa_interface header can be (or should be dropped). It is already included as part of template for module_ipa_interface via: utils/ipc/generators/libcamera_templates/module_ipa_interface.h.tmpl Other IPAs (IPU3, RkISP1) also needs to be cleaned up, I'll try to propose a patch for them. Reviewed-by: Umang Jain <umang.jain@ideasonboard.com> > > #include "libcamera/internal/software_isp/debayer_params.h" > #include "libcamera/internal/software_isp/swisp_stats.h" > @@ -22,7 +23,7 @@ namespace libcamera { > > namespace ipa::soft { > > -using Module = ipa::Module<IPAContext, IPAFrameContext, ControlInfoMap, > +using Module = ipa::Module<IPAContext, IPAFrameContext, IPAConfigInfo, > DebayerParams, SwIspStats>; > > } /* namespace ipa::soft */ > diff --git a/src/ipa/simple/soft_simple.cpp b/src/ipa/simple/soft_simple.cpp > index 514a9db5..7200abaf 100644 > --- a/src/ipa/simple/soft_simple.cpp > +++ b/src/ipa/simple/soft_simple.cpp > @@ -73,7 +73,7 @@ public: > const SharedFD &fdStats, > const SharedFD &fdParams, > const ControlInfoMap &sensorInfoMap) override; > - int configure(const ControlInfoMap &sensorInfoMap) override; > + int configure(const IPAConfigInfo &configInfo) override; > > int start() override; > void stop() override; > @@ -209,9 +209,9 @@ int IPASoftSimple::init(const IPASettings &settings, > return 0; > } > > -int IPASoftSimple::configure(const ControlInfoMap &sensorInfoMap) > +int IPASoftSimple::configure(const IPAConfigInfo &configInfo) > { > - sensorInfoMap_ = sensorInfoMap; > + sensorInfoMap_ = configInfo.sensorControls; > > const ControlInfo &exposureInfo = sensorInfoMap_.find(V4L2_CID_EXPOSURE)->second; > const ControlInfo &gainInfo = sensorInfoMap_.find(V4L2_CID_ANALOGUE_GAIN)->second; > @@ -250,6 +250,12 @@ int IPASoftSimple::configure(const ControlInfoMap &sensorInfoMap) > againMinStep_ = 1.0; > } > > + for (auto const &algo : algorithms()) { > + int ret = algo->configure(context_, configInfo); > + if (ret) > + return ret; > + } > + > LOG(IPASoft, Info) << "Exposure " << exposureMin_ << "-" << exposureMax_ > << ", gain " << againMin_ << "-" << againMax_ > << " (" << againMinStep_ << ")"; > diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp > index 0fa9db38..a82d05f4 100644 > --- a/src/libcamera/pipeline/simple/simple.cpp > +++ b/src/libcamera/pipeline/simple/simple.cpp > @@ -1288,10 +1288,13 @@ int SimplePipelineHandler::configure(Camera *camera, CameraConfiguration *c) > inputCfg.stride = captureFormat.planes[0].bpl; > inputCfg.bufferCount = kNumInternalBuffers; > > - return data->converter_ > - ? data->converter_->configure(inputCfg, outputCfgs) > - : data->swIsp_->configure(inputCfg, outputCfgs, > - data->sensor_->controls()); > + if (data->converter_) > + return data->converter_->configure(inputCfg, outputCfgs); > + else { > + ipa::soft::IPAConfigInfo configInfo; > + configInfo.sensorControls = data->sensor_->controls(); > + return data->swIsp_->configure(inputCfg, outputCfgs, configInfo); > + } > } > > int SimplePipelineHandler::exportFrameBuffers(Camera *camera, Stream *stream, > diff --git a/src/libcamera/software_isp/software_isp.cpp b/src/libcamera/software_isp/software_isp.cpp > index ba3f1bae..1f176214 100644 > --- a/src/libcamera/software_isp/software_isp.cpp > +++ b/src/libcamera/software_isp/software_isp.cpp > @@ -223,16 +223,17 @@ SoftwareIsp::strideAndFrameSize(const PixelFormat &outputFormat, const Size &siz > * \brief Configure the SoftwareIsp object according to the passed in parameters > * \param[in] inputCfg The input configuration > * \param[in] outputCfgs The output configurations > - * \param[in] sensorControls ControlInfoMap of the controls supported by the sensor > + * \param[in] configInfo The IPA configuration data, received from the pipeline > + * handler > * \return 0 on success, a negative errno on failure > */ > int SoftwareIsp::configure(const StreamConfiguration &inputCfg, > const std::vector<std::reference_wrapper<StreamConfiguration>> &outputCfgs, > - const ControlInfoMap &sensorControls) > + const ipa::soft::IPAConfigInfo &configInfo) > { > ASSERT(ipa_ && debayer_); > > - int ret = ipa_->configure(sensorControls); > + int ret = ipa_->configure(configInfo); > if (ret < 0) > return ret; >
Hi Umang, thank you for review. Umang Jain <umang.jain@ideasonboard.com> writes: > Hi Milan > > Thank you for the patch > > On 26/06/24 12:50 pm, Milan Zamazal wrote: >> This patch adds Algorithm::configure call for the defined algorithms. >> This is preparation only since there are currently no Algorithm based >> algorithms defined. >> >> A part of this change is passing IPAConfigInfo instead of ControlInfoMap >> to configure() calls as this is what Algorithm::configure expects. >> >> Signed-off-by: Milan Zamazal <mzamazal@redhat.com> >> --- >> .../libcamera/internal/software_isp/software_isp.h | 2 +- >> include/libcamera/ipa/soft.mojom | 6 +++++- >> src/ipa/simple/module.h | 3 ++- >> src/ipa/simple/soft_simple.cpp | 12 +++++++++--- >> src/libcamera/pipeline/simple/simple.cpp | 11 +++++++---- >> src/libcamera/software_isp/software_isp.cpp | 7 ++++--- >> 6 files changed, 28 insertions(+), 13 deletions(-) >> >> diff --git a/include/libcamera/internal/software_isp/software_isp.h b/include/libcamera/internal/software_isp/software_isp.h >> index 8753c2fd..1ba9eb62 100644 >> --- a/include/libcamera/internal/software_isp/software_isp.h >> +++ b/include/libcamera/internal/software_isp/software_isp.h >> @@ -61,7 +61,7 @@ public: >> int configure(const StreamConfiguration &inputCfg, >> const std::vector<std::reference_wrapper<StreamConfiguration>> &outputCfgs, >> - const ControlInfoMap &sensorControls); >> + const ipa::soft::IPAConfigInfo &configInfo); >> int exportBuffers(unsigned int output, unsigned int count, >> std::vector<std::unique_ptr<FrameBuffer>> *buffers); >> diff --git a/include/libcamera/ipa/soft.mojom b/include/libcamera/ipa/soft.mojom >> index dad352ba..65d90bfa 100644 >> --- a/include/libcamera/ipa/soft.mojom >> +++ b/include/libcamera/ipa/soft.mojom >> @@ -8,6 +8,10 @@ module ipa.soft; >> import "include/libcamera/ipa/core.mojom"; >> +struct IPAConfigInfo { >> + libcamera.ControlInfoMap sensorControls; >> +}; >> + >> interface IPASoftInterface { >> init(libcamera.IPASettings settings, >> libcamera.SharedFD fdStats, >> @@ -16,7 +20,7 @@ interface IPASoftInterface { >> => (int32 ret); >> start() => (int32 ret); >> stop(); >> - configure(libcamera.ControlInfoMap sensorCtrlInfoMap) >> + configure(IPAConfigInfo configInfo) >> => (int32 ret); >> prepare(uint32 frame); >> diff --git a/src/ipa/simple/module.h b/src/ipa/simple/module.h >> index 21328ecd..e518e742 100644 >> --- a/src/ipa/simple/module.h >> +++ b/src/ipa/simple/module.h >> @@ -10,6 +10,7 @@ >> #include <libcamera/controls.h> >> #include <libcamera/ipa/core_ipa_interface.h> >> +#include <libcamera/ipa/soft_ipa_interface.h> > > I think the core_ipa_interface header can be (or should be dropped). It is already included as part of > template for module_ipa_interface via: > utils/ipc/generators/libcamera_templates/module_ipa_interface.h.tmpl And I don't see anything from core_ipa_interface.h used here directly so I'll drop the include. > Other IPAs (IPU3, RkISP1) also needs to be cleaned up, I'll try to propose a patch for them. > > Reviewed-by: Umang Jain <umang.jain@ideasonboard.com> >> #include "libcamera/internal/software_isp/debayer_params.h" >> #include "libcamera/internal/software_isp/swisp_stats.h" >> @@ -22,7 +23,7 @@ namespace libcamera { >> namespace ipa::soft { >> -using Module = ipa::Module<IPAContext, IPAFrameContext, ControlInfoMap, >> +using Module = ipa::Module<IPAContext, IPAFrameContext, IPAConfigInfo, >> DebayerParams, SwIspStats>; >> } /* namespace ipa::soft */ >> diff --git a/src/ipa/simple/soft_simple.cpp b/src/ipa/simple/soft_simple.cpp >> index 514a9db5..7200abaf 100644 >> --- a/src/ipa/simple/soft_simple.cpp >> +++ b/src/ipa/simple/soft_simple.cpp >> @@ -73,7 +73,7 @@ public: >> const SharedFD &fdStats, >> const SharedFD &fdParams, >> const ControlInfoMap &sensorInfoMap) override; >> - int configure(const ControlInfoMap &sensorInfoMap) override; >> + int configure(const IPAConfigInfo &configInfo) override; >> int start() override; >> void stop() override; >> @@ -209,9 +209,9 @@ int IPASoftSimple::init(const IPASettings &settings, >> return 0; >> } >> -int IPASoftSimple::configure(const ControlInfoMap &sensorInfoMap) >> +int IPASoftSimple::configure(const IPAConfigInfo &configInfo) >> { >> - sensorInfoMap_ = sensorInfoMap; >> + sensorInfoMap_ = configInfo.sensorControls; >> const ControlInfo &exposureInfo = sensorInfoMap_.find(V4L2_CID_EXPOSURE)->second; >> const ControlInfo &gainInfo = sensorInfoMap_.find(V4L2_CID_ANALOGUE_GAIN)->second; >> @@ -250,6 +250,12 @@ int IPASoftSimple::configure(const ControlInfoMap &sensorInfoMap) >> againMinStep_ = 1.0; >> } >> + for (auto const &algo : algorithms()) { >> + int ret = algo->configure(context_, configInfo); >> + if (ret) >> + return ret; >> + } >> + >> LOG(IPASoft, Info) << "Exposure " << exposureMin_ << "-" << exposureMax_ >> << ", gain " << againMin_ << "-" << againMax_ >> << " (" << againMinStep_ << ")"; >> diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp >> index 0fa9db38..a82d05f4 100644 >> --- a/src/libcamera/pipeline/simple/simple.cpp >> +++ b/src/libcamera/pipeline/simple/simple.cpp >> @@ -1288,10 +1288,13 @@ int SimplePipelineHandler::configure(Camera *camera, CameraConfiguration *c) >> inputCfg.stride = captureFormat.planes[0].bpl; >> inputCfg.bufferCount = kNumInternalBuffers; >> - return data->converter_ >> - ? data->converter_->configure(inputCfg, outputCfgs) >> - : data->swIsp_->configure(inputCfg, outputCfgs, >> - data->sensor_->controls()); >> + if (data->converter_) >> + return data->converter_->configure(inputCfg, outputCfgs); >> + else { >> + ipa::soft::IPAConfigInfo configInfo; >> + configInfo.sensorControls = data->sensor_->controls(); >> + return data->swIsp_->configure(inputCfg, outputCfgs, configInfo); >> + } >> } >> int SimplePipelineHandler::exportFrameBuffers(Camera *camera, Stream *stream, >> diff --git a/src/libcamera/software_isp/software_isp.cpp b/src/libcamera/software_isp/software_isp.cpp >> index ba3f1bae..1f176214 100644 >> --- a/src/libcamera/software_isp/software_isp.cpp >> +++ b/src/libcamera/software_isp/software_isp.cpp >> @@ -223,16 +223,17 @@ SoftwareIsp::strideAndFrameSize(const PixelFormat &outputFormat, const Size &siz >> * \brief Configure the SoftwareIsp object according to the passed in parameters >> * \param[in] inputCfg The input configuration >> * \param[in] outputCfgs The output configurations >> - * \param[in] sensorControls ControlInfoMap of the controls supported by the sensor >> + * \param[in] configInfo The IPA configuration data, received from the pipeline >> + * handler >> * \return 0 on success, a negative errno on failure >> */ >> int SoftwareIsp::configure(const StreamConfiguration &inputCfg, >> const std::vector<std::reference_wrapper<StreamConfiguration>> &outputCfgs, >> - const ControlInfoMap &sensorControls) >> + const ipa::soft::IPAConfigInfo &configInfo) >> { >> ASSERT(ipa_ && debayer_); >> - int ret = ipa_->configure(sensorControls); >> + int ret = ipa_->configure(configInfo); >> if (ret < 0) >> return ret; >>
diff --git a/include/libcamera/internal/software_isp/software_isp.h b/include/libcamera/internal/software_isp/software_isp.h index 8753c2fd..1ba9eb62 100644 --- a/include/libcamera/internal/software_isp/software_isp.h +++ b/include/libcamera/internal/software_isp/software_isp.h @@ -61,7 +61,7 @@ public: int configure(const StreamConfiguration &inputCfg, const std::vector<std::reference_wrapper<StreamConfiguration>> &outputCfgs, - const ControlInfoMap &sensorControls); + const ipa::soft::IPAConfigInfo &configInfo); int exportBuffers(unsigned int output, unsigned int count, std::vector<std::unique_ptr<FrameBuffer>> *buffers); diff --git a/include/libcamera/ipa/soft.mojom b/include/libcamera/ipa/soft.mojom index dad352ba..65d90bfa 100644 --- a/include/libcamera/ipa/soft.mojom +++ b/include/libcamera/ipa/soft.mojom @@ -8,6 +8,10 @@ module ipa.soft; import "include/libcamera/ipa/core.mojom"; +struct IPAConfigInfo { + libcamera.ControlInfoMap sensorControls; +}; + interface IPASoftInterface { init(libcamera.IPASettings settings, libcamera.SharedFD fdStats, @@ -16,7 +20,7 @@ interface IPASoftInterface { => (int32 ret); start() => (int32 ret); stop(); - configure(libcamera.ControlInfoMap sensorCtrlInfoMap) + configure(IPAConfigInfo configInfo) => (int32 ret); prepare(uint32 frame); diff --git a/src/ipa/simple/module.h b/src/ipa/simple/module.h index 21328ecd..e518e742 100644 --- a/src/ipa/simple/module.h +++ b/src/ipa/simple/module.h @@ -10,6 +10,7 @@ #include <libcamera/controls.h> #include <libcamera/ipa/core_ipa_interface.h> +#include <libcamera/ipa/soft_ipa_interface.h> #include "libcamera/internal/software_isp/debayer_params.h" #include "libcamera/internal/software_isp/swisp_stats.h" @@ -22,7 +23,7 @@ namespace libcamera { namespace ipa::soft { -using Module = ipa::Module<IPAContext, IPAFrameContext, ControlInfoMap, +using Module = ipa::Module<IPAContext, IPAFrameContext, IPAConfigInfo, DebayerParams, SwIspStats>; } /* namespace ipa::soft */ diff --git a/src/ipa/simple/soft_simple.cpp b/src/ipa/simple/soft_simple.cpp index 514a9db5..7200abaf 100644 --- a/src/ipa/simple/soft_simple.cpp +++ b/src/ipa/simple/soft_simple.cpp @@ -73,7 +73,7 @@ public: const SharedFD &fdStats, const SharedFD &fdParams, const ControlInfoMap &sensorInfoMap) override; - int configure(const ControlInfoMap &sensorInfoMap) override; + int configure(const IPAConfigInfo &configInfo) override; int start() override; void stop() override; @@ -209,9 +209,9 @@ int IPASoftSimple::init(const IPASettings &settings, return 0; } -int IPASoftSimple::configure(const ControlInfoMap &sensorInfoMap) +int IPASoftSimple::configure(const IPAConfigInfo &configInfo) { - sensorInfoMap_ = sensorInfoMap; + sensorInfoMap_ = configInfo.sensorControls; const ControlInfo &exposureInfo = sensorInfoMap_.find(V4L2_CID_EXPOSURE)->second; const ControlInfo &gainInfo = sensorInfoMap_.find(V4L2_CID_ANALOGUE_GAIN)->second; @@ -250,6 +250,12 @@ int IPASoftSimple::configure(const ControlInfoMap &sensorInfoMap) againMinStep_ = 1.0; } + for (auto const &algo : algorithms()) { + int ret = algo->configure(context_, configInfo); + if (ret) + return ret; + } + LOG(IPASoft, Info) << "Exposure " << exposureMin_ << "-" << exposureMax_ << ", gain " << againMin_ << "-" << againMax_ << " (" << againMinStep_ << ")"; diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp index 0fa9db38..a82d05f4 100644 --- a/src/libcamera/pipeline/simple/simple.cpp +++ b/src/libcamera/pipeline/simple/simple.cpp @@ -1288,10 +1288,13 @@ int SimplePipelineHandler::configure(Camera *camera, CameraConfiguration *c) inputCfg.stride = captureFormat.planes[0].bpl; inputCfg.bufferCount = kNumInternalBuffers; - return data->converter_ - ? data->converter_->configure(inputCfg, outputCfgs) - : data->swIsp_->configure(inputCfg, outputCfgs, - data->sensor_->controls()); + if (data->converter_) + return data->converter_->configure(inputCfg, outputCfgs); + else { + ipa::soft::IPAConfigInfo configInfo; + configInfo.sensorControls = data->sensor_->controls(); + return data->swIsp_->configure(inputCfg, outputCfgs, configInfo); + } } int SimplePipelineHandler::exportFrameBuffers(Camera *camera, Stream *stream, diff --git a/src/libcamera/software_isp/software_isp.cpp b/src/libcamera/software_isp/software_isp.cpp index ba3f1bae..1f176214 100644 --- a/src/libcamera/software_isp/software_isp.cpp +++ b/src/libcamera/software_isp/software_isp.cpp @@ -223,16 +223,17 @@ SoftwareIsp::strideAndFrameSize(const PixelFormat &outputFormat, const Size &siz * \brief Configure the SoftwareIsp object according to the passed in parameters * \param[in] inputCfg The input configuration * \param[in] outputCfgs The output configurations - * \param[in] sensorControls ControlInfoMap of the controls supported by the sensor + * \param[in] configInfo The IPA configuration data, received from the pipeline + * handler * \return 0 on success, a negative errno on failure */ int SoftwareIsp::configure(const StreamConfiguration &inputCfg, const std::vector<std::reference_wrapper<StreamConfiguration>> &outputCfgs, - const ControlInfoMap &sensorControls) + const ipa::soft::IPAConfigInfo &configInfo) { ASSERT(ipa_ && debayer_); - int ret = ipa_->configure(sensorControls); + int ret = ipa_->configure(configInfo); if (ret < 0) return ret;
This patch adds Algorithm::configure call for the defined algorithms. This is preparation only since there are currently no Algorithm based algorithms defined. A part of this change is passing IPAConfigInfo instead of ControlInfoMap to configure() calls as this is what Algorithm::configure expects. Signed-off-by: Milan Zamazal <mzamazal@redhat.com> --- .../libcamera/internal/software_isp/software_isp.h | 2 +- include/libcamera/ipa/soft.mojom | 6 +++++- src/ipa/simple/module.h | 3 ++- src/ipa/simple/soft_simple.cpp | 12 +++++++++--- src/libcamera/pipeline/simple/simple.cpp | 11 +++++++---- src/libcamera/software_isp/software_isp.cpp | 7 ++++--- 6 files changed, 28 insertions(+), 13 deletions(-)