From 3200bb635ccd64d5997bc372d9fa6bc894b2f9d0 Mon Sep 17 00:00:00 2001 From: Paul Elder Date: Thu, 18 Aug 2022 18:01:08 +0900 Subject: ipa: rkisp1: Add manual color gains Add support for manually controlling the color gains on the rkisp1 IPA. To that end, add and plumb the AwbEnable and ColourGains controls. As per-frame controls aren't supported yet in the rkisp1 IPA, simply apply and perform checks on the controls immediately. Signed-off-by: Paul Elder Reviewed-by: Laurent Pinchart Reviewed-by: Jacopo Mondi Signed-off-by: Laurent Pinchart --- src/ipa/rkisp1/algorithms/awb.cpp | 36 ++++++++++++++++++++++++++++++++++-- src/ipa/rkisp1/algorithms/awb.h | 2 ++ 2 files changed, 36 insertions(+), 2 deletions(-) (limited to 'src/ipa/rkisp1/algorithms') diff --git a/src/ipa/rkisp1/algorithms/awb.cpp b/src/ipa/rkisp1/algorithms/awb.cpp index 9f00364d..a3c14a9a 100644 --- a/src/ipa/rkisp1/algorithms/awb.cpp +++ b/src/ipa/rkisp1/algorithms/awb.cpp @@ -12,6 +12,7 @@ #include +#include #include /** @@ -38,6 +39,7 @@ int Awb::configure(IPAContext &context, context.frameContext.awb.gains.red = 1.0; context.frameContext.awb.gains.blue = 1.0; context.frameContext.awb.gains.green = 1.0; + context.frameContext.awb.autoEnabled = true; /* * Define the measurement window for AWB as a centered rectangle @@ -116,6 +118,34 @@ void Awb::prepare(IPAContext &context, rkisp1_params_cfg *params) params->module_ens |= RKISP1_CIF_ISP_MODULE_AWB; } +/** + * \copydoc libcamera::ipa::Algorithm::queueRequest + */ +void Awb::queueRequest(IPAContext &context, + [[maybe_unused]] const uint32_t frame, + const ControlList &controls) +{ + auto &awb = context.frameContext.awb; + + const auto &awbEnable = controls.get(controls::AwbEnable); + if (awbEnable && *awbEnable != awb.autoEnabled) { + awb.autoEnabled = *awbEnable; + + LOG(RkISP1Awb, Debug) + << (*awbEnable ? "Enabling" : "Disabling") << " AWB"; + } + + const auto &colourGains = controls.get(controls::ColourGains); + if (colourGains && !awb.autoEnabled) { + awb.gains.red = (*colourGains)[0]; + awb.gains.blue = (*colourGains)[1]; + + LOG(RkISP1Awb, Debug) + << "Set colour gains to red: " << awb.gains.red + << ", blue: " << awb.gains.blue; + } +} + /** * \copydoc libcamera::ipa::Algorithm::process */ @@ -164,8 +194,10 @@ void Awb::process([[maybe_unused]] IPAContext &context, * Gain values are unsigned integer value, range 0 to 4 with 8 bit * fractional part. */ - frameContext.awb.gains.red = std::clamp(redGain, 0.0, 1023.0 / 256); - frameContext.awb.gains.blue = std::clamp(blueGain, 0.0, 1023.0 / 256); + if (frameContext.awb.autoEnabled) { + frameContext.awb.gains.red = std::clamp(redGain, 0.0, 1023.0 / 256); + frameContext.awb.gains.blue = std::clamp(blueGain, 0.0, 1023.0 / 256); + } /* Hardcode the green gain to 1.0. */ frameContext.awb.gains.green = 1.0; diff --git a/src/ipa/rkisp1/algorithms/awb.h b/src/ipa/rkisp1/algorithms/awb.h index 667a8beb..4917267b 100644 --- a/src/ipa/rkisp1/algorithms/awb.h +++ b/src/ipa/rkisp1/algorithms/awb.h @@ -21,6 +21,8 @@ public: int configure(IPAContext &context, const IPACameraSensorInfo &configInfo) override; void prepare(IPAContext &context, rkisp1_params_cfg *params) override; + void queueRequest(IPAContext &context, const uint32_t frame, + const ControlList &controls) override; void process(IPAContext &context, IPAFrameContext *frameCtx, const rkisp1_stat_buffer *stats) override; -- cgit v1.2.1