[libcamera-devel] [PATCH v5 1/2] ipa: rkisp1: Take into account color temperature during LSC algorithm

Paul Elder paul.elder at ideasonboard.com
Wed Nov 9 12:32:40 CET 2022


On Wed, Nov 09, 2022 at 12:27:18PM +0200, Laurent Pinchart wrote:
> hi Paul,
> 
> On Wed, Nov 09, 2022 at 07:04:37PM +0900, Paul Elder wrote:
> > On Wed, Nov 09, 2022 at 11:30:55AM +0200, Laurent Pinchart wrote:
> > > On Tue, Nov 08, 2022 at 07:10:12PM +0100, Jacopo Mondi via libcamera-devel wrote:
> > > > On Tue, Nov 08, 2022 at 06:24:07PM +0900, Paul Elder via libcamera-devel wrote:
> > > > > From: Florian Sylvestre <fsylvestre at baylibre.com>
> > > > >
> > > > > Add coefficients sets in the YAML tuning file to allow using different set
> > > > > depending of the image color temperature (provided by AWB algorithm).
> > > > >
> > > > > During processing, LSC algorithm computes coefficients by doing a linear
> > > > > interpolation between the two closer set.
> > > > >
> > > > > Signed-off-by: Florian Sylvestre <fsylvestre at baylibre.com>
> > > > > Signed-off-by: Paul Elder <paul.elder at ideasonboard.com>
> > > > >
> > > > > ---
> > > > > Changes in v5:
> > > > > - fix cosmetic issues
> > > > > - fix set0 and set1 (they were swapped)
> > > > > - improve and simplify ct-rounding conditions
> > > > >
> > > > > Changes in v4:
> > > > > - save both the original and adjusted color temperature
> > > > >   - for more correct decisions on skipping interpolation
> > > > > - use map to store the LSC tables based on their color temperature
> > > > >   - for easier searching for available color temperatures LSC tables
> > > > > - redesign the LSC color temperature selection
> > > > >   - fix conditions for skipping interpolation
> > > > >   - fix choosing the nearest color temperature LSC table
> > > > >     - it used to be that, if ct was within 10% of both the upper and
> > > > >       lower ct, the lower ct would be chosen unconditionally
> > > > > ---
> > > > >  src/ipa/rkisp1/algorithms/lsc.cpp | 206 ++++++++++++++++++++++----
> > > > >  src/ipa/rkisp1/algorithms/lsc.h   |  26 +++-
> > > > >  src/ipa/rkisp1/data/ov5640.yaml   | 231 ++++++++++++++++++++----------
> > > > >  3 files changed, 358 insertions(+), 105 deletions(-)
> > > > >
> > > > > diff --git a/src/ipa/rkisp1/algorithms/lsc.cpp b/src/ipa/rkisp1/algorithms/lsc.cpp
> > > > > index e1c59033..9afa14ea 100644
> > > > > --- a/src/ipa/rkisp1/algorithms/lsc.cpp
> > > > > +++ b/src/ipa/rkisp1/algorithms/lsc.cpp
> > > > > @@ -7,6 +7,7 @@
> > > > >
> > > > >  #include "lsc.h"
> > > > >
> > > > > +#include <algorithm>
> > > > >  #include <cmath>
> > > > >  #include <numeric>
> > > > >
> > > > > @@ -89,6 +90,7 @@ static std::vector<uint16_t> parseTable(const YamlObject &tuningData,
> > > > >  }
> > > > >
> > > > >  LensShadingCorrection::LensShadingCorrection()
> > > > > +	: lastCt_({ 0, 0 })
> > > > >  {
> > > > >  }
> > > > >
> > > > > @@ -104,14 +106,46 @@ int LensShadingCorrection::init([[maybe_unused]] IPAContext &context,
> > > > >  	if (xSize_.empty() || ySize_.empty())
> > > > >  		return -EINVAL;
> > > > >
> > > > > -	rData_ = parseTable(tuningData, "r");
> > > > > -	grData_ = parseTable(tuningData, "gr");
> > > > > -	gbData_ = parseTable(tuningData, "gb");
> > > > > -	bData_ = parseTable(tuningData, "b");
> > > > > +	/* Get all defined sets to apply. */
> > > > > +	const YamlObject &yamlSets = tuningData["sets"];
> > > > > +	if (!yamlSets.isList()) {
> > > > > +		LOG(RkISP1Lsc, Error)
> > > > > +			<< "'sets' parameter not found in tuning file";
> > > > > +		return -EINVAL;
> > > > > +	}
> > > > > +
> > > > > +	const auto &sets = yamlSets.asList();
> > > > > +	for (const auto &yamlSet : sets) {
> > > > > +		uint32_t ct = yamlSet["ct"].get<uint32_t>(0);
> > > > > +
> > > > > +		if (sets_.count(ct)) {
> > > > > +			LOG(RkISP1Lsc, Error)
> > > > > +				<< "Multiple sets found for color temperature "
> > > > > +				<< ct;
> > > > > +			return -EINVAL;
> > > > > +		}
> > > > > +
> > > > > +		Components &set = sets_[ct];
> > > > > +
> > > > > +		set.ct = ct;
> > > > > +		set.r = parseTable(yamlSet, "r");
> > > > > +		set.gr = parseTable(yamlSet, "gr");
> > > > > +		set.gb = parseTable(yamlSet, "gb");
> > > > > +		set.b = parseTable(yamlSet, "b");
> > > > >
> > > > > -	if (rData_.empty() || grData_.empty() ||
> > > > > -	    gbData_.empty() || bData_.empty())
> > > > > +		if (set.r.empty() || set.gr.empty() ||
> > > > > +		    set.gb.empty() || set.b.empty()) {
> > > > > +			LOG(RkISP1Lsc, Error)
> > > > > +				<< "Set for color temperature " << ct
> > > > > +				<< " is missing tables";
> > > > > +			return -EINVAL;
> > > > > +		}
> > > > > +	}
> > > > > +
> > > > > +	if (sets_.empty()) {
> > > > > +		LOG(RkISP1Lsc, Error) << "Failed to load any sets";
> > > > >  		return -EINVAL;
> > > > > +	}
> > > > >
> > > > >  	return 0;
> > > > >  }
> > > > > @@ -151,36 +185,160 @@ int LensShadingCorrection::configure(IPAContext &context,
> > > > >  	return 0;
> > > > >  }
> > > > >
> > > > > +void LensShadingCorrection::writeTableRegs(rkisp1_params_cfg *params)
> > > > 
> > > > I think a rename has been suggested in the prevous version, not
> > > > because this function doesn't actually "Write Tables to Registers" but
> > > > because this name and "copyTable" doesn't convey what part of the
> > > > paramters structure they handle
> > > > 
> > > > I would not mind if this function and the one below could be merged
> > > > into one, as they effectively program parameters with a single table.
> > > > The interpolate function would return a Component, which we can then
> > > > pass to the unfied "fillParameters()" function.
> > > 
> > > That would be less efficient though. I'm fine with separate functions to
> > > write the LSC tables and the other LSC parameters, but I would indeed
> > > like this function to be renamed.
> > 
> > I'm having trouble coming up with a better name :/
> > 
> > writeTableSize? writeTableSizeAndEnableLSC?
> 
> setParameters() ?

Okay.

> 
> > > > It's a bit of redesign, and populating a Component to then write it to
> > > > memory is indeed less efficient, so I'll leave it to you to decide how
> > > > to better handle this.
> > > > 
> > > > (At least it should be possible to call "writeTableRegs()" from
> > > > "copyTable()" and "interpolateTable()")
> > > > 
> > > > > +{
> > > > > +	struct rkisp1_cif_isp_lsc_config &config = params->others.lsc_config;
> > > > > +
> > > > > +	memcpy(config.x_grad_tbl, xGrad_, sizeof(config.x_grad_tbl));
> > > > > +	memcpy(config.y_grad_tbl, yGrad_, sizeof(config.y_grad_tbl));
> > > > > +	memcpy(config.x_size_tbl, xSizes_, sizeof(config.x_size_tbl));
> > > > > +	memcpy(config.y_size_tbl, ySizes_, sizeof(config.y_size_tbl));
> > > > > +
> > > > > +	params->module_en_update |= RKISP1_CIF_ISP_MODULE_LSC;
> > > > > +	params->module_ens |= RKISP1_CIF_ISP_MODULE_LSC;
> > > > > +	params->module_cfg_update |= RKISP1_CIF_ISP_MODULE_LSC;
> > > > > +}
> > > > > +
> > > > > +void LensShadingCorrection::copyTable(rkisp1_cif_isp_lsc_config &config,
> > > > > +				      const Components &set)
> > > > > +{
> > > > > +	std::copy(set.r.begin(), set.r.end(), &config.r_data_tbl[0][0]);
> > > > > +	std::copy(set.gr.begin(), set.gr.end(), &config.gr_data_tbl[0][0]);
> > > > > +	std::copy(set.gb.begin(), set.gb.end(), &config.gb_data_tbl[0][0]);
> > > > > +	std::copy(set.b.begin(), set.b.end(), &config.b_data_tbl[0][0]);
> > > > > +}
> > > > > +
> > > > > +/*
> > > > > + * Interpolate LSC parameters based on color temperature value.
> > > > > + */
> > > > > +void LensShadingCorrection::interpolateTable(rkisp1_cif_isp_lsc_config &config,
> > > > > +					     const Components &set0,
> > > > > +					     const Components &set1,
> > > > > +					     const uint32_t ct)
> > > > > +{
> > > > > +	double coeff0 = (set1.ct - ct) / (set1.ct - set0.ct);
> > > > > +	double coeff1 = (ct - set0.ct) / (set1.ct - set0.ct);
> > > > > +
> > > > > +	for (unsigned int i = 0; i < RKISP1_CIF_ISP_LSC_SAMPLES_MAX; ++i) {
> > > > > +		for (unsigned int j = 0; j < RKISP1_CIF_ISP_LSC_SAMPLES_MAX; ++j) {
> > > > > +			unsigned int sample = i * RKISP1_CIF_ISP_LSC_SAMPLES_MAX + j;
> > > > > +
> > > > > +			config.r_data_tbl[i][j] =
> > > > > +				set0.r[sample] * coeff0 +
> > > > > +				set1.r[sample] * coeff1;
> > > > > +
> > > > > +			config.gr_data_tbl[i][j] =
> > > > > +				set0.gr[sample] * coeff0 +
> > > > > +				set1.gr[sample] * coeff1;
> > > > > +
> > > > > +			config.gb_data_tbl[i][j] =
> > > > > +				set0.gb[sample] * coeff0 +
> > > > > +				set1.gb[sample] * coeff1;
> > > > > +
> > > > > +			config.b_data_tbl[i][j] =
> > > > > +				set0.b[sample] * coeff0 +
> > > > > +				set1.b[sample] * coeff1;
> > > > > +		}
> > > > > +	}
> > > > > +}
> > > > > +
> > > > >  /**
> > > > >   * \copydoc libcamera::ipa::Algorithm::prepare
> > > > >   */
> > > > > -void LensShadingCorrection::prepare([[maybe_unused]] IPAContext &context,
> > > > > +void LensShadingCorrection::prepare(IPAContext &context,
> > > > >  				    const uint32_t frame,
> > > > >  				    [[maybe_unused]] IPAFrameContext &frameContext,
> > > > >  				    rkisp1_params_cfg *params)
> > > > >  {
> > > > > -	if (frame > 0)
> > > > > +	struct rkisp1_cif_isp_lsc_config &config = params->others.lsc_config;
> > > > > +
> > > > > +	/*
> > > > > +	 * If there is only one set, the configuration has already been done
> > > > > +	 * for first frame.
> > > > > +	 */
> > > > > +	if (sets_.size() == 1 && frame > 0)
> > > > >  		return;
> > > > >
> > > > > -	struct rkisp1_cif_isp_lsc_config &config = params->others.lsc_config;
> > > > > +	/*
> > > > > +	 * If there is only one set, pick it. We can ignore lastCt_, as it will
> > > > > +	 * never be relevant.
> > > > > +	 */
> > > > > +	if (sets_.size() == 1) {
> > > > > +		writeTableRegs(params);
> > > > > +		copyTable(config, sets_.cbegin()->second);
> > > > > +		return;
> > > > > +	}
> > > > >
> > > > > -	memcpy(config.x_grad_tbl, xGrad_, sizeof(config.x_grad_tbl));
> > > > > -	memcpy(config.y_grad_tbl, yGrad_, sizeof(config.y_grad_tbl));
> > > > > -	memcpy(config.x_size_tbl, xSizes_, sizeof(config.x_size_tbl));
> > > > > -	memcpy(config.y_size_tbl, ySizes_, sizeof(config.y_size_tbl));
> > > > > +	uint32_t ct = context.activeState.awb.temperatureK;
> > > > > +	ct = std::clamp(ct, sets_.cbegin()->first, sets_.crbegin()->first);
> > > > > +
> > > > > +	/*
> > > > > +	 * If the original is the same, then it means the same adjustment would
> > > > > +	 * be made. If the adjusted is the same, then it means that it's the
> > > > > +	 * same as what was actually applied. Thus in these cases we can skip
> > > > > +	 * reprogramming the LSC.
> > > > > +	 *
> > > > > +	 * ctOriginal == ctAdjusted can only happen if an interpolation
> > > > > +	 * happened, or if ctOriginal has an exact entry in sets_. This means
> > > > > +	 * that if ctOriginal != ctAdjusted, then ctOriginal was adjusted to
> > > > > +	 * the nearest available entry in sets_, resulting in ctAdjusted.
> > > > > +	 * Clearly, any ct value that is in between ctOriginal and ctAdjusted
> > > > > +	 * will be adjusted to the same ctAdjusted value, so we can skip
> > > > > +	 * reprogramming the LSC table.
> > > > > +	 *
> > > > > +	 * We also skip updating the ctOriginal value, as the last one has a
> > > > > +	 * larger bound and thus a larger range of ct values that will be
> > > > > +	 * adjusted to the same ctAdjusted.
> > > > > +	 */
> > > > > +	if ((lastCt_.ctOriginal <= ct && ct <= lastCt_.ctAdjusted) ||
> > > > > +	    (lastCt_.ctAdjusted <= ct && ct <= lastCt_.ctOriginal))
> > > > > +		return;
> > > > 
> > > > I think I got what is happening here and I think it's fine.
> > > > Actually the second paragraph in the comment drove me a bit off road,
> > > > I would shorten it to
> > > > 
> > > > 	/*
> > > >          * The color temperature used in the last run is stored in
> > > >          * lastCt_ as the original target temperature and the closest
> > > >          * one from sets_ it has been adjusted to.
> > > 
> > > That's not correct, ctAdjusted doesn't necessarily correspond to one of
> > > the tables from the tuning data, it can also be an intermediate value
> > > when interpolating.
> > > 
> > > >          *
> > > >          * If the current target color temperature is included in
> > > >          * between the original and the adjusted temperatures, the
> > > >          * same adjustment will be done again, thus we can skip
> > > >          * reprogramming the LSC.
> > > > 	 *
> > > > 	 * ctOriginal == ctAdjusted can only happen if an interpolation
> > > > 	 * happened or if ctOriginal has an exact entry in sets_. In
> > > >          * this case if the target temperature doesn't match exactly, we will
> > > >          * have to recompute.
> > > >          *
> > > > 	 * We also skip updating the ctOriginal value, as the last one has a
> > > > 	 * larger bound and thus a larger range of ct values that will be
> > > > 	 * adjusted to the same ctAdjusted.
> > > > 	 */
> > > > 	if ((lastCt_.ctOriginal <= ct && ct <= lastCt_.ctAdjusted) ||
> > > > 	    (lastCt_.ctAdjusted <= ct && ct <= lastCt_.ctOriginal))
> > > > 		return;
> > > > 
> > > > >
> > > > > -	std::copy(rData_.begin(), rData_.end(),
> > > > > -		  &config.r_data_tbl[0][0]);
> > > > > -	std::copy(grData_.begin(), grData_.end(),
> > > > > -		  &config.gr_data_tbl[0][0]);
> > > > > -	std::copy(gbData_.begin(), gbData_.end(),
> > > > > -		  &config.gb_data_tbl[0][0]);
> > > > > -	std::copy(bData_.begin(), bData_.end(),
> > > > > -		  &config.b_data_tbl[0][0]);
> > > > > +	writeTableRegs(params);
> > > > >
> > > > > -	params->module_en_update |= RKISP1_CIF_ISP_MODULE_LSC;
> > > > > -	params->module_ens |= RKISP1_CIF_ISP_MODULE_LSC;
> > > > > -	params->module_cfg_update |= RKISP1_CIF_ISP_MODULE_LSC;
> > > > > +	/*
> > > > > +	 * The color temperature matches exactly one of the available LSC tables.
> > > > > +	 */
> > > > > +	if (sets_.count(ct)) {
> > > > > +		copyTable(config, sets_[ct]);
> > > > > +		lastCt_ = { ct, ct };
> > > > > +		return;
> > > > > +	}
> > > > > +
> > > > > +	/* No shortcuts left; we need to round or interpolate */
> > > > > +	auto iter = sets_.upper_bound(ct);
> > > > > +	const Components &set1 = iter->second;
> > > > > +	const Components &set0 = (--iter)->second;
> > > > > +	uint32_t ct0 = set0.ct;
> > > > > +	uint32_t ct1 = set1.ct;
> > > > > +	uint32_t diff0 = ct - ct0;
> > > > > +	uint32_t diff1 = ct1 - ct;
> > > > > +	static constexpr double kThreshold = 0.1;
> > > > > +	float thresh = kThreshold * (ct1 - ct0);
> > > 
> > > s/thresh/threshold/
> > > 
> > > > The threshold will here depend on the distribution of the color
> > > > temperatures in the configuration file. If ct1 and ct0 are very far
> > > > apart, we will allow larger intervals. I guess it's fine, the
> > > > alternative would be to compute the threshold on the target color
> > > > temperature, but then the accepted interval would increase as the
> > > > color temperature increses, something that doesn't make sense..
> > > 
> > > v4 used kThreshold * ct, and I complained about it for the reason you
> > > describe here :-)
> > > 
> > > > > +
> > > > > +	if (diff0 < thresh) {
> > > > > +		LOG(RkISP1Lsc, Debug) << "using LSC table for " << ct0;
> > > > > +		copyTable(config, set0);
> > > > > +		lastCt_ = { ct, ct0 };
> > > > > +		return;
> > > > > +	}
> > > > > +
> > > > > +	if (diff1 < thresh) {
> > > > > +		LOG(RkISP1Lsc, Debug) << "using LSC table for " << ct1;
> > > > > +		copyTable(config, set1);
> > > > > +		lastCt_ = { ct, ct1 };
> > > > > +		return;
> > > > > +	}
> > > 
> > > Don't you need to pick the closest one, like in v4 ?
> > 
> > Not anymore. The way that thresh is defined means that it can never be
> > the case that diff0 *and* diff1 are less than thresh.
> > 
> > Do I need a proof...?
> > 
> > Proposition: Let
> >   - ct, ct0, and ct1 be integers such that ct0 < ct < ct1
> >   - diff0 = ct - ct0
> >   - diff1 = ct1 - ct
> >   - thresh = 0.1 * (ct1 - ct0)
> >   diff0 and diff1 cannot both be less than thresh. That is, if one of
> >   the two is less than thresh, then the other cannot also be less than
> >   thresh.
> > 
> > Proof:
> > 
> > Assume for the purpose of contradiction that diff0 and diff1 are both
> > less than thresh. This gives us the following equations:
> > 
> > 1: ct - ct0 < thresh
> > 2: ct1 - ct < thresh
> > 
> > Let us transform equations 1 and 2 into equations 3 and 4 respectively,
> > into terms of ct:
> > 
> >    ct - ct0 < thresh
> > 3: ct < thresh + ct0
> > 
> >    ct1 - ct < thresh
> >    -ct < thresh - ct1
> > 4: ct > ct1 - thresh
> > 
> > Combining equations 3 and 4 we get:
> > 
> > ct1 - thresh < ct < thresh + ct0
> > 
> > Let's expand thresh:
> > 
> > ct1 - 0.1 * (ct1 - ct0) < ct < 0.1 * (ct1 - ct0) + ct0
> > ct1 - 0.1*ct1 + 0.1*ct0 < ct < 0.1*ct1 - 0.1*ct0 + ct0
> > 0.9*ct1 + 0.1*ct0 < ct < 0.1*ct1 + 0.9*ct0
> > 
> > Clearly can get rid of ct and just compare the two boundaries, based on
> > transitivity. Since ct0 is less than ct1 based on the axioms of the
> > proposition, let's move ct0 to the left and ct1 to the right:
> > 
> > 0.9*ct1 + 0.1*ct0 < 0.1*ct1 + 0.9*ct0
> > 0.1*ct0 - 0.9*ct0 < 0.1*ct1 - 0.9*ct1
> > -0.8*ct0 < -0.8*ct1
> > ct0 > ct1
> > 
> > And we have a contradiction with the assumption based on the
> > proposition, thereby proving the proposition to be true.
> > 
> > QED
> 
> :-)
> 
> > Corollary: The proposition holds for any kThreshold that is between 0
> > and 1 exclusive.

s/1/0.5/

> > 
> > > 
> > > 	if (diff0 < thresh || diff1 < thresh) {
> > > 		const Components &set = diff0 < diff1 ? set0 : set1;
> > > 		LOG(RkISP1Lsc, Debug) << "using LSC table for " << set.ct;
> > > 		copyTable(config, set);
> > > 		lastCt_ = { ct, set.ct };
> > > 		return;
> > > 	}
> 
> This construct produces less code though. Up to you.

That's true. I like it more too.


Paul

> 
> > > > > +
> > > > > +	/*
> > > > > +	 * ct is not within 10% of the difference between the neighbouring
> > > > > +	 * color temperatures, so we need to interpolate.
> > > > > +	 */
> > > > > +	LOG(RkISP1Lsc, Debug)
> > > > > +		<< "ct is " << ct << ", interpolating between "
> > > > > +		<< ct0 << " and " << ct1;
> > > > > +	interpolateTable(config, set0, set1, ct);
> > > > > +	lastCt_ = { ct, ct };
> > > > >  }
> > > > >
> > > > >  REGISTER_IPA_ALGORITHM(LensShadingCorrection, "LensShadingCorrection")
> > > > > diff --git a/src/ipa/rkisp1/algorithms/lsc.h b/src/ipa/rkisp1/algorithms/lsc.h
> > > > > index da81ea53..7c0b634c 100644
> > > > > --- a/src/ipa/rkisp1/algorithms/lsc.h
> > > > > +++ b/src/ipa/rkisp1/algorithms/lsc.h
> > > > > @@ -7,6 +7,8 @@
> > > > >
> > > > >  #pragma once
> > > > >
> > > > > +#include <map>
> > > > > +
> > > > >  #include "algorithm.h"
> > > > >
> > > > >  namespace libcamera {
> > > > > @@ -26,17 +28,31 @@ public:
> > > > >  		     rkisp1_params_cfg *params) override;
> > > > >
> > > > >  private:
> > > > > -	std::vector<uint16_t> rData_;
> > > > > -	std::vector<uint16_t> grData_;
> > > > > -	std::vector<uint16_t> gbData_;
> > > > > -	std::vector<uint16_t> bData_;
> > > > > -
> > > > > +	struct Components {
> > > > > +		uint32_t ct;
> > > > > +		std::vector<uint16_t> r;
> > > > 
> > > > Missing #include <vector>
> > > 
> > > Not a new issue, but nice to fix indeed.
> > > 
> > > > > +		std::vector<uint16_t> gr;
> > > > > +		std::vector<uint16_t> gb;
> > > > > +		std::vector<uint16_t> b;
> > > > > +	};
> > > > > +
> > > > > +	void writeTableRegs(rkisp1_params_cfg *params);
> > > > > +	void copyTable(rkisp1_cif_isp_lsc_config &config, const Components &set0);
> > > > > +	void interpolateTable(rkisp1_cif_isp_lsc_config &config,
> > > > > +			      const Components &set0, const Components &set1,
> > > > > +			      const uint32_t ct);
> > > > > +
> > > > > +	std::map<uint32_t, Components> sets_;
> > > > >  	std::vector<double> xSize_;
> > > > >  	std::vector<double> ySize_;
> > > > >  	uint16_t xGrad_[RKISP1_CIF_ISP_LSC_SECTORS_TBL_SIZE];
> > > > >  	uint16_t yGrad_[RKISP1_CIF_ISP_LSC_SECTORS_TBL_SIZE];
> > > > >  	uint16_t xSizes_[RKISP1_CIF_ISP_LSC_SECTORS_TBL_SIZE];
> > > > >  	uint16_t ySizes_[RKISP1_CIF_ISP_LSC_SECTORS_TBL_SIZE];
> > > > > +	struct {
> > > > > +		uint32_t ctOriginal;
> > > > > +		uint32_t ctAdjusted;
> > > > 
> > > > nit: the structure is named "Ct" already. I would name the members
> > > > "original" (or target) and "adjusted".
> > > 
> > > I forgot to mention that in the review of the preview version :-)
> > > 
> > > Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> > > 
> > > > Anyway, all minors and details, the logic is there and works
> > > > Reviewed-by: Jacopo Mondi <jacopo at jmondi.org>
> > > > 
> > > > > +	} lastCt_;
> > > > >  };
> > > > >
> > > > >  } /* namespace ipa::rkisp1::algorithms */
> > > > > diff --git a/src/ipa/rkisp1/data/ov5640.yaml b/src/ipa/rkisp1/data/ov5640.yaml
> > > > > index 3dc369ac..897b83cb 100644
> > > > > --- a/src/ipa/rkisp1/data/ov5640.yaml
> > > > > +++ b/src/ipa/rkisp1/data/ov5640.yaml
> > > > > @@ -20,82 +20,161 @@ algorithms:
> > > > >    - LensShadingCorrection:
> > > > >        x-size: [ 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625 ]
> > > > >        y-size: [ 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625 ]
> > > > > -      r:  [
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -          ]
> > > > > -      gr: [
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -          ]
> > > > > -      gb: [
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -          ]
> > > > > -      b:  [
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -            1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > -          ]
> > > > > +      sets:
> > > > > +        - ct: 3000
> > > > > +          r:  [
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +              ]
> > > > > +          gr: [
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +              ]
> > > > > +          gb: [
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +              ]
> > > > > +          b:  [
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +                1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
> > > > > +              ]
> > > > > +        - ct: 7000
> > > > > +          r:  [
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +              ]
> > > > > +          gr: [
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +              ]
> > > > > +          gb: [
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +              ]
> > > > > +          b:  [
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +                1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
> > > > > +              ]
> > > > >    - DefectPixelClusterCorrection:
> > > > >        fixed-set: false
> > > > >        sets:
> 
> -- 
> Regards,
> 
> Laurent Pinchart


More information about the libcamera-devel mailing list