summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorStefan Klug <stefan.klug@ideasonboard.com>2025-04-03 17:49:16 +0200
committerStefan Klug <stefan.klug@ideasonboard.com>2025-05-20 11:16:36 +0200
commitf1ac420eb143db75174c91b3767359466fe59508 (patch)
tree9d9af2c8b67380288d4188e2d0520e005378dc0c /src
parent3fcc6b06c354c2a1a1db89d45979f94d30c8f112 (diff)
ipa: rkisp1: ccm/lsc: Fix CCM/LSC based on manual color temperature
In RkISP1Awb::process(), the color temperature in the active state is updated every time new statistics are available. The CCM/LSC algorithms use that value in prepare() to update the CCM/LSC. This is not correct if the color temperature was specified manually and leads to visible flicker even when AwbEnable is set to false. To fix that, track the auto and manual color temperature separately in active state. In Awb::prepare() the current frame context is updated with the corresponding value from active state. Change the algorithms to fetch the color temperature from the frame context instead of the active state in prepare(). Fixes: 02308809548d ("ipa: rkisp1: awb: Implement ColourTemperature control") Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Diffstat (limited to 'src')
-rw-r--r--src/ipa/rkisp1/algorithms/awb.cpp16
-rw-r--r--src/ipa/rkisp1/algorithms/ccm.cpp2
-rw-r--r--src/ipa/rkisp1/algorithms/lsc.cpp6
-rw-r--r--src/ipa/rkisp1/ipa_context.cpp11
-rw-r--r--src/ipa/rkisp1/ipa_context.h2
5 files changed, 21 insertions, 16 deletions
diff --git a/src/ipa/rkisp1/algorithms/awb.cpp b/src/ipa/rkisp1/algorithms/awb.cpp
index c7e65bd2..8a8fccd5 100644
--- a/src/ipa/rkisp1/algorithms/awb.cpp
+++ b/src/ipa/rkisp1/algorithms/awb.cpp
@@ -130,7 +130,8 @@ int Awb::configure(IPAContext &context,
context.activeState.awb.automatic.gains =
awbAlgo_->gainsFromColourTemperature(kDefaultColourTemperature);
context.activeState.awb.autoEnabled = true;
- context.activeState.awb.temperatureK = kDefaultColourTemperature;
+ context.activeState.awb.manual.temperatureK = kDefaultColourTemperature;
+ context.activeState.awb.automatic.temperatureK = kDefaultColourTemperature;
/*
* Define the measurement window for AWB as a centered rectangle
@@ -187,7 +188,7 @@ void Awb::queueRequest(IPAContext &context,
const auto &gains = awbAlgo_->gainsFromColourTemperature(*colourTemperature);
awb.manual.gains.r() = gains.r();
awb.manual.gains.b() = gains.b();
- awb.temperatureK = *colourTemperature;
+ awb.manual.temperatureK = *colourTemperature;
update = true;
}
@@ -196,7 +197,7 @@ void Awb::queueRequest(IPAContext &context,
<< "Set colour gains to " << awb.manual.gains;
frameContext.awb.gains = awb.manual.gains;
- frameContext.awb.temperatureK = awb.temperatureK;
+ frameContext.awb.temperatureK = awb.manual.temperatureK;
}
/**
@@ -210,8 +211,9 @@ void Awb::prepare(IPAContext &context, const uint32_t frame,
* most up-to-date automatic values we can read.
*/
if (frameContext.awb.autoEnabled) {
- frameContext.awb.gains = context.activeState.awb.automatic.gains;
- frameContext.awb.temperatureK = context.activeState.awb.temperatureK;
+ const auto &awb = context.activeState.awb;
+ frameContext.awb.gains = awb.automatic.gains;
+ frameContext.awb.temperatureK = awb.automatic.temperatureK;
}
auto gainConfig = params->block<BlockType::AwbGain>();
@@ -316,7 +318,7 @@ void Awb::process(IPAContext &context,
RkISP1AwbStats awbStats{ rgbMeans };
AwbResult awbResult = awbAlgo_->calculateAwb(awbStats, frameContext.lux.lux);
- activeState.awb.temperatureK = awbResult.colourTemperature;
+ activeState.awb.automatic.temperatureK = awbResult.colourTemperature;
/*
* Clamp the gain values to the hardware, which expresses gains as Q2.8
@@ -337,7 +339,7 @@ void Awb::process(IPAContext &context,
<< std::showpoint
<< "Means " << rgbMeans << ", gains "
<< activeState.awb.automatic.gains << ", temp "
- << activeState.awb.temperatureK << "K";
+ << activeState.awb.automatic.temperatureK << "K";
}
RGB<double> Awb::calculateRgbMeans(const IPAFrameContext &frameContext, const rkisp1_cif_isp_awb_stat *awb) const
diff --git a/src/ipa/rkisp1/algorithms/ccm.cpp b/src/ipa/rkisp1/algorithms/ccm.cpp
index eb8ca39e..2e5e9100 100644
--- a/src/ipa/rkisp1/algorithms/ccm.cpp
+++ b/src/ipa/rkisp1/algorithms/ccm.cpp
@@ -88,7 +88,7 @@ void Ccm::setParameters(struct rkisp1_cif_isp_ctk_config &config,
void Ccm::prepare(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext, RkISP1Params *params)
{
- uint32_t ct = context.activeState.awb.temperatureK;
+ uint32_t ct = frameContext.awb.temperatureK;
/*
* \todo The colour temperature will likely be noisy, add filtering to
diff --git a/src/ipa/rkisp1/algorithms/lsc.cpp b/src/ipa/rkisp1/algorithms/lsc.cpp
index e47aa2f0..e7301bfe 100644
--- a/src/ipa/rkisp1/algorithms/lsc.cpp
+++ b/src/ipa/rkisp1/algorithms/lsc.cpp
@@ -404,12 +404,12 @@ void LensShadingCorrection::copyTable(rkisp1_cif_isp_lsc_config &config,
/**
* \copydoc libcamera::ipa::Algorithm::prepare
*/
-void LensShadingCorrection::prepare(IPAContext &context,
+void LensShadingCorrection::prepare([[maybe_unused]] IPAContext &context,
[[maybe_unused]] const uint32_t frame,
- [[maybe_unused]] IPAFrameContext &frameContext,
+ IPAFrameContext &frameContext,
RkISP1Params *params)
{
- uint32_t ct = context.activeState.awb.temperatureK;
+ uint32_t ct = frameContext.awb.temperatureK;
if (std::abs(static_cast<int>(ct) - static_cast<int>(lastAppliedCt_)) <
kColourTemperatureChangeThreshhold)
return;
diff --git a/src/ipa/rkisp1/ipa_context.cpp b/src/ipa/rkisp1/ipa_context.cpp
index 25b5bf50..1ee6aeb1 100644
--- a/src/ipa/rkisp1/ipa_context.cpp
+++ b/src/ipa/rkisp1/ipa_context.cpp
@@ -197,15 +197,15 @@ namespace libcamera::ipa::rkisp1 {
* \var IPAActiveState::awb::AwbState.gains
* \brief White balance gains
*
+ * \var IPAActiveState::awb::AwbState.temperatureK
+ * \brief Color temperature
+ *
* \var IPAActiveState::awb.manual
* \brief Manual regulation state (set through requests)
*
* \var IPAActiveState::awb.automatic
* \brief Automatic regulation state (computed by the algorithm)
*
- * \var IPAActiveState::awb.temperatureK
- * \brief Estimated color temperature
- *
* \var IPAActiveState::awb.autoEnabled
* \brief Whether the Auto White Balance algorithm is enabled
*/
@@ -349,7 +349,10 @@ namespace libcamera::ipa::rkisp1 {
* \brief White balance gains
*
* \var IPAFrameContext::awb.temperatureK
- * \brief Estimated color temperature
+ * \brief Color temperature used for processing this frame
+ *
+ * This does not match the color temperature estimated for this frame as the
+ * measurements were taken on a previous frame.
*
* \var IPAFrameContext::awb.autoEnabled
* \brief Whether the Auto White Balance algorithm is enabled
diff --git a/src/ipa/rkisp1/ipa_context.h b/src/ipa/rkisp1/ipa_context.h
index 6bc922a8..769e9f11 100644
--- a/src/ipa/rkisp1/ipa_context.h
+++ b/src/ipa/rkisp1/ipa_context.h
@@ -91,12 +91,12 @@ struct IPAActiveState {
struct {
struct AwbState {
RGB<double> gains;
+ unsigned int temperatureK;
};
AwbState manual;
AwbState automatic;
- unsigned int temperatureK;
bool autoEnabled;
} awb;