diff options
Diffstat (limited to 'src/ipa')
-rw-r--r-- | src/ipa/rkisp1/algorithms/awb.cpp | 75 | ||||
-rw-r--r-- | src/ipa/rkisp1/ipa_context.cpp | 51 | ||||
-rw-r--r-- | src/ipa/rkisp1/ipa_context.h | 25 |
3 files changed, 110 insertions, 41 deletions
diff --git a/src/ipa/rkisp1/algorithms/awb.cpp b/src/ipa/rkisp1/algorithms/awb.cpp index 78398927..e491cf75 100644 --- a/src/ipa/rkisp1/algorithms/awb.cpp +++ b/src/ipa/rkisp1/algorithms/awb.cpp @@ -36,9 +36,12 @@ LOG_DEFINE_CATEGORY(RkISP1Awb) int Awb::configure(IPAContext &context, const IPACameraSensorInfo &configInfo) { - context.activeState.awb.gains.red = 1.0; - context.activeState.awb.gains.blue = 1.0; - context.activeState.awb.gains.green = 1.0; + context.activeState.awb.gains.manual.red = 1.0; + context.activeState.awb.gains.manual.blue = 1.0; + context.activeState.awb.gains.manual.green = 1.0; + context.activeState.awb.gains.automatic.red = 1.0; + context.activeState.awb.gains.automatic.blue = 1.0; + context.activeState.awb.gains.automatic.green = 1.0; context.activeState.awb.autoEnabled = true; /* @@ -75,13 +78,22 @@ uint32_t Awb::estimateCCT(double red, double green, double blue) * \copydoc libcamera::ipa::Algorithm::prepare */ void Awb::prepare(IPAContext &context, const uint32_t frame, - [[maybe_unused]] IPAFrameContext &frameContext, - rkisp1_params_cfg *params) + IPAFrameContext &frameContext, rkisp1_params_cfg *params) { - params->others.awb_gain_config.gain_green_b = 256 * context.activeState.awb.gains.green; - params->others.awb_gain_config.gain_blue = 256 * context.activeState.awb.gains.blue; - params->others.awb_gain_config.gain_red = 256 * context.activeState.awb.gains.red; - params->others.awb_gain_config.gain_green_r = 256 * context.activeState.awb.gains.green; + /* + * This is the latest time we can read the active state. This is the + * most up-to-date automatic values we can read. + */ + if (frameContext.awb.autoEnabled) { + frameContext.awb.gains.red = context.activeState.awb.gains.automatic.red; + frameContext.awb.gains.green = context.activeState.awb.gains.automatic.green; + frameContext.awb.gains.blue = context.activeState.awb.gains.automatic.blue; + } + + params->others.awb_gain_config.gain_green_b = 256 * frameContext.awb.gains.green; + params->others.awb_gain_config.gain_blue = 256 * frameContext.awb.gains.blue; + params->others.awb_gain_config.gain_red = 256 * frameContext.awb.gains.red; + params->others.awb_gain_config.gain_green_r = 256 * frameContext.awb.gains.green; /* Update the gains. */ params->module_cfg_update |= RKISP1_CIF_ISP_MODULE_AWB_GAIN; @@ -127,7 +139,7 @@ void Awb::prepare(IPAContext &context, const uint32_t frame, */ void Awb::queueRequest(IPAContext &context, [[maybe_unused]] const uint32_t frame, - [[maybe_unused]] IPAFrameContext &frameContext, + IPAFrameContext &frameContext, const ControlList &controls) { auto &awb = context.activeState.awb; @@ -142,21 +154,29 @@ void Awb::queueRequest(IPAContext &context, const auto &colourGains = controls.get(controls::ColourGains); if (colourGains && !awb.autoEnabled) { - awb.gains.red = (*colourGains)[0]; - awb.gains.blue = (*colourGains)[1]; + awb.gains.manual.red = (*colourGains)[0]; + awb.gains.manual.blue = (*colourGains)[1]; LOG(RkISP1Awb, Debug) - << "Set colour gains to red: " << awb.gains.red - << ", blue: " << awb.gains.blue; + << "Set colour gains to red: " << awb.gains.manual.red + << ", blue: " << awb.gains.manual.blue; + } + + frameContext.awb.autoEnabled = awb.autoEnabled; + + if (!awb.autoEnabled) { + frameContext.awb.gains.red = awb.gains.manual.red; + frameContext.awb.gains.green = 1.0; + frameContext.awb.gains.blue = awb.gains.manual.blue; } } /** * \copydoc libcamera::ipa::Algorithm::process */ -void Awb::process([[maybe_unused]] IPAContext &context, +void Awb::process(IPAContext &context, [[maybe_unused]] const uint32_t frame, - [[maybe_unused]] IPAFrameContext &frameCtx, + IPAFrameContext &frameContext, const rkisp1_stat_buffer *stats) { const rkisp1_cif_isp_stat *params = &stats->params; @@ -187,30 +207,27 @@ void Awb::process([[maybe_unused]] IPAContext &context, double greenMean = 1.1636 * yMean - 0.4045 * cbMean - 0.7949 * crMean; double blueMean = 1.1636 * yMean + 1.9912 * cbMean - 0.0250 * crMean; + frameContext.awb.temperatureK = estimateCCT(redMean, greenMean, blueMean); + /* Estimate the red and blue gains to apply in a grey world. */ double redGain = greenMean / (redMean + 1); double blueGain = greenMean / (blueMean + 1); /* Filter the values to avoid oscillations. */ double speed = 0.2; - redGain = speed * redGain + (1 - speed) * activeState.awb.gains.red; - blueGain = speed * blueGain + (1 - speed) * activeState.awb.gains.blue; + redGain = speed * redGain + (1 - speed) * activeState.awb.gains.automatic.red; + blueGain = speed * blueGain + (1 - speed) * activeState.awb.gains.automatic.blue; /* * Gain values are unsigned integer value, range 0 to 4 with 8 bit - * fractional part. + * fractional part. Hardcode the green gain to 1.0. */ - if (activeState.awb.autoEnabled) { - activeState.awb.gains.red = std::clamp(redGain, 0.0, 1023.0 / 256); - activeState.awb.gains.blue = std::clamp(blueGain, 0.0, 1023.0 / 256); - } - /* Hardcode the green gain to 1.0. */ - activeState.awb.gains.green = 1.0; - - activeState.awb.temperatureK = estimateCCT(redMean, greenMean, blueMean); + activeState.awb.gains.automatic.red = std::clamp(redGain, 0.0, 1023.0 / 256); + activeState.awb.gains.automatic.blue = std::clamp(blueGain, 0.0, 1023.0 / 256); + activeState.awb.gains.automatic.green = 1.0; - LOG(RkISP1Awb, Debug) << "Gain found for red: " << context.activeState.awb.gains.red - << " and for blue: " << context.activeState.awb.gains.blue; + LOG(RkISP1Awb, Debug) << "Gain found for red: " << activeState.awb.gains.automatic.red + << " and for blue: " << activeState.awb.gains.automatic.blue; } REGISTER_IPA_ALGORITHM(Awb, "Awb") diff --git a/src/ipa/rkisp1/ipa_context.cpp b/src/ipa/rkisp1/ipa_context.cpp index c7d5b1b6..ba80a070 100644 --- a/src/ipa/rkisp1/ipa_context.cpp +++ b/src/ipa/rkisp1/ipa_context.cpp @@ -120,17 +120,29 @@ namespace libcamera::ipa::rkisp1 { * \struct IPAActiveState::awb.gains * \brief White balance gains * - * \var IPAActiveState::awb.gains.red - * \brief White balance gain for R channel + * \struct IPAActiveState::awb.gains.manual + * \brief Manual white balance gains (set through requests) * - * \var IPAActiveState::awb.gains.green - * \brief White balance gain for G channel + * \var IPAActiveState::awb.gains.manual.red + * \brief Manual white balance gain for R channel * - * \var IPAActiveState::awb.gains.blue - * \brief White balance gain for B channel + * \var IPAActiveState::awb.gains.manual.green + * \brief Manual white balance gain for G channel * - * \var IPAActiveState::awb.temperatureK - * \brief Estimated color temperature + * \var IPAActiveState::awb.gains.manual.blue + * \brief Manual white balance gain for B channel + * + * \struct IPAActiveState::awb.gains.automatic + * \brief Automatic white balance gains (computed by the algorithm) + * + * \var IPAActiveState::awb.gains.automatic.red + * \brief Automatic white balance gain for R channel + * + * \var IPAActiveState::awb.gains.automatic.green + * \brief Automatic white balance gain for G channel + * + * \var IPAActiveState::awb.gains.automatic.blue + * \brief Automatic white balance gain for B channel * * \var IPAActiveState::awb.autoEnabled * \brief Whether the Auto White Balance algorithm is enabled @@ -202,6 +214,29 @@ namespace libcamera::ipa::rkisp1 { */ /** + * \var IPAFrameContext::awb + * \brief Automatic White Balance parameters for this frame + * + * \struct IPAFrameContext::awb.gains + * \brief White balance gains + * + * \var IPAFrameContext::awb.gains.red + * \brief White balance gain for R channel + * + * \var IPAFrameContext::awb.gains.green + * \brief White balance gain for G channel + * + * \var IPAFrameContext::awb.gains.blue + * \brief White balance gain for B channel + * + * \var IPAFrameContext::awb.temperatureK + * \brief Estimated color temperature + * + * \var IPAFrameContext::awb.autoEnabled + * \brief Whether the Auto White Balance algorithm is enabled + */ + +/** * \var IPAFrameContext::sensor * \brief Sensor configuration that used been used for this frame * diff --git a/src/ipa/rkisp1/ipa_context.h b/src/ipa/rkisp1/ipa_context.h index 3fbd6b18..5494a68f 100644 --- a/src/ipa/rkisp1/ipa_context.h +++ b/src/ipa/rkisp1/ipa_context.h @@ -56,12 +56,18 @@ struct IPAActiveState { struct { struct { - double red; - double green; - double blue; + struct { + double red; + double green; + double blue; + } manual; + struct { + double red; + double green; + double blue; + } automatic; } gains; - double temperatureK; bool autoEnabled; } awb; @@ -91,6 +97,17 @@ struct IPAFrameContext : public FrameContext { } agc; struct { + struct { + double red; + double green; + double blue; + } gains; + + double temperatureK; + bool autoEnabled; + } awb; + + struct { uint32_t exposure; double gain; } sensor; |