[PATCH] pipeline: rkisp1: cproc: Fix default value handling
Jacopo Mondi
jacopo.mondi at ideasonboard.com
Wed Jun 5 10:33:05 CEST 2024
On Wed, Jun 05, 2024 at 08:48:25AM GMT, Stefan Klug wrote:
> Default control values where not applied to activeState. This had no negative
> side effects in first place, as the hardware defaults where used. The issue
> became visible, when only one of the controls was set at runtime. In that case
> the params for the other values where overwritten with 0 (reset value of
> activeState) resulting in a black image.
>
> While at it, only add the controls to the controls map if the algorithm is
> contained in the tuning file.
>
> Signed-off-by: Stefan Klug <stefan.klug at ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo.mondi at ideasonboard.com>
Thanks
j
>
> ---
>
> This patch depends on https://patchwork.libcamera.org/patch/20194/ which needs
> to be merged first.
>
>
> src/ipa/rkisp1/algorithms/cproc.cpp | 59 +++++++++++++++++++++++++++--
> src/ipa/rkisp1/algorithms/cproc.h | 3 ++
> src/ipa/rkisp1/rkisp1.cpp | 3 --
> 3 files changed, 59 insertions(+), 6 deletions(-)
>
> diff --git a/src/ipa/rkisp1/algorithms/cproc.cpp b/src/ipa/rkisp1/algorithms/cproc.cpp
> index 68bb8180..0f122504 100644
> --- a/src/ipa/rkisp1/algorithms/cproc.cpp
> +++ b/src/ipa/rkisp1/algorithms/cproc.cpp
> @@ -33,6 +33,56 @@ namespace ipa::rkisp1::algorithms {
>
> LOG_DEFINE_CATEGORY(RkISP1CProc)
>
> +static int convertBrightness(const float v)
> +{
> + return std::clamp<int>(std::lround(v * 128), -128, 127);
> +}
> +
> +static int convertContrast(const float v)
> +{
> + return std::clamp<int>(std::lround(v * 128), 0, 255);
> +}
> +
> +static int convertSaturation(const float v)
> +{
> + return std::clamp<int>(std::lround(v * 128), 0, 255);
> +}
> +
> +/**
> + * \copydoc libcamera::ipa::Algorithm::init
> + */
> +int ColorProcessing::init([[maybe_unused]] IPAContext &context,
> + [[maybe_unused]] const YamlObject &tuningData)
> +{
> + context.ctrlMap[&controls::Brightness] = ControlInfo(-1.0f, 0.993f, 0.0f);
> + context.ctrlMap[&controls::Contrast] = ControlInfo(0.0f, 1.993f, 1.0f);
> + context.ctrlMap[&controls::Saturation] = ControlInfo(0.0f, 1.993f, 1.0f);
> +
> + return 0;
> +}
> +
> +/**
> + * \brief Configure the Gamma given a configInfo
> + * \param[in] context The shared IPA context
> + * \param[in] configInfo The IPA configuration data
> + *
> + * \return 0
> + */
> +int ColorProcessing::configure([[maybe_unused]] IPAContext &context,
> + [[maybe_unused]] const IPACameraSensorInfo &configInfo)
> +{
> + auto &cproc = context.activeState.cproc;
> +
> + cproc.brightness = convertBrightness(
> + context.ctrlMap[&controls::Brightness].def().get<float>());
> + cproc.contrast = convertContrast(
> + context.ctrlMap[&controls::Contrast].def().get<float>());
> + cproc.saturation = convertSaturation(
> + context.ctrlMap[&controls::Saturation].def().get<float>());
> +
> + return 0;
> +}
> +
> /**
> * \copydoc libcamera::ipa::Algorithm::queueRequest
> */
> @@ -44,9 +94,12 @@ void ColorProcessing::queueRequest(IPAContext &context,
> auto &cproc = context.activeState.cproc;
> bool update = false;
>
> + if (frame == 0)
> + update = true;
> +
> const auto &brightness = controls.get(controls::Brightness);
> if (brightness) {
> - int value = std::clamp<int>(std::lround(*brightness * 128), -128, 127);
> + int value = convertBrightness(*brightness);
> if (cproc.brightness != value) {
> cproc.brightness = value;
> update = true;
> @@ -57,7 +110,7 @@ void ColorProcessing::queueRequest(IPAContext &context,
>
> const auto &contrast = controls.get(controls::Contrast);
> if (contrast) {
> - int value = std::clamp<int>(std::lround(*contrast * 128), 0, 255);
> + int value = convertContrast(*contrast);
> if (cproc.contrast != value) {
> cproc.contrast = value;
> update = true;
> @@ -68,7 +121,7 @@ void ColorProcessing::queueRequest(IPAContext &context,
>
> const auto saturation = controls.get(controls::Saturation);
> if (saturation) {
> - int value = std::clamp<int>(std::lround(*saturation * 128), 0, 255);
> + int value = convertSaturation(*saturation);
> if (cproc.saturation != value) {
> cproc.saturation = value;
> update = true;
> diff --git a/src/ipa/rkisp1/algorithms/cproc.h b/src/ipa/rkisp1/algorithms/cproc.h
> index bafba5cc..e50e7200 100644
> --- a/src/ipa/rkisp1/algorithms/cproc.h
> +++ b/src/ipa/rkisp1/algorithms/cproc.h
> @@ -21,6 +21,9 @@ public:
> ColorProcessing() = default;
> ~ColorProcessing() = default;
>
> + int init(IPAContext &context, const YamlObject &tuningData) override;
> + int configure(IPAContext &context,
> + const IPACameraSensorInfo &configInfo) override;
> void queueRequest(IPAContext &context, const uint32_t frame,
> IPAFrameContext &frameContext,
> const ControlList &controls) override;
> diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp
> index 17474408..62d56a3a 100644
> --- a/src/ipa/rkisp1/rkisp1.cpp
> +++ b/src/ipa/rkisp1/rkisp1.cpp
> @@ -109,9 +109,6 @@ const ControlInfoMap::Map rkisp1Controls{
> { &controls::AeEnable, ControlInfo(false, true) },
> { &controls::AwbEnable, ControlInfo(false, true) },
> { &controls::ColourGains, ControlInfo(0.0f, 3.996f, 1.0f) },
> - { &controls::Brightness, ControlInfo(-1.0f, 0.993f, 0.0f) },
> - { &controls::Contrast, ControlInfo(0.0f, 1.993f, 1.0f) },
> - { &controls::Saturation, ControlInfo(0.0f, 1.993f, 1.0f) },
> { &controls::Sharpness, ControlInfo(0.0f, 10.0f, 1.0f) },
> { &controls::draft::NoiseReductionMode, ControlInfo(controls::draft::NoiseReductionModeValues) },
> };
> --
> 2.43.0
>
More information about the libcamera-devel
mailing list