ipa: rkisp1: lsc: Handle quantization locally

The quantization functionality in the Interpolator type hinders in
writing nice code. Don't use it and implement the functionality directly
in the algorithm.

While at it, reduce the threshold to half of the quantization step size,
otherwise it might happen that we skip a full quantization step. Rename
the kColourTemperatureChangeThreshhold to kColourTemperatureQuantization
to better express the usecase.

Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>
This commit is contained in:
Stefan Klug
2026-01-28 17:00:26 +01:00
parent 098fc4eeed
commit 3bfc71345f
+17 -7
View File
@@ -70,7 +70,7 @@ LOG_DEFINE_CATEGORY(RkISP1Lsc)
namespace {
constexpr int kColourTemperatureChangeThreshhold = 10;
constexpr int kColourTemperatureQuantization = 10;
class LscPolynomialLoader
{
@@ -308,12 +308,16 @@ std::vector<double> parseSizes(const YamlObject &tuningData,
return sizes;
}
unsigned int quantize(unsigned int value, unsigned int step)
{
return std::lround(value / static_cast<double>(step)) * step;
}
} /* namespace */
LensShadingCorrection::LensShadingCorrection()
: lastAppliedCt_(0), lastAppliedQuantizedCt_(0)
{
sets_.setQuantization(kColourTemperatureChangeThreshhold);
}
/**
@@ -426,17 +430,23 @@ void LensShadingCorrection::prepare([[maybe_unused]] IPAContext &context,
RkISP1Params *params)
{
uint32_t ct = frameContext.awb.temperatureK;
if (std::abs(static_cast<int>(ct) - static_cast<int>(lastAppliedCt_)) <
kColourTemperatureChangeThreshhold)
unsigned int quantizedCt = quantize(ct, kColourTemperatureQuantization);
/*
* Add a threshold so that oscillations around a quantization step don't
* lead to constant changes.
*/
if (utils::abs_diff(ct, lastAppliedCt_) < kColourTemperatureQuantization / 2)
return;
unsigned int quantizedCt;
const Components &set = sets_.getInterpolated(ct, &quantizedCt);
if (lastAppliedQuantizedCt_ == quantizedCt)
if (quantizedCt == lastAppliedQuantizedCt_)
return;
auto config = params->block<BlockType::Lsc>();
config.setEnabled(true);
setParameters(*config);
const Components &set = sets_.getInterpolated(quantizedCt);
copyTable(*config, set);
lastAppliedCt_ = ct;