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 <paul.elder@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
Paul Elder 2022-08-18 18:01:08 +09:00 committed by Laurent Pinchart
parent bf3dbaece9
commit 3200bb635c
5 changed files with 42 additions and 2 deletions

View file

@ -12,6 +12,7 @@
#include <libcamera/base/log.h>
#include <libcamera/control_ids.h>
#include <libcamera/ipa/core_ipa_interface.h>
/**
@ -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;