[libcamera-devel] [PATCH] pipeline: rkisp1: Move ControlInfoMap to IPA module
Umang Jain
umang.jain at ideasonboard.com
Tue Aug 2 06:46:09 CEST 2022
Hi Laurent,
Thank you for the patch
On 8/2/22 05:43, Laurent Pinchart via libcamera-devel 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: Umang Jain <umang.jain at ideasonboard.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)
More information about the libcamera-devel
mailing list