Message ID | 20250403154925.382973-15-stefan.klug@ideasonboard.com |
---|---|
State | Accepted |
Headers | show |
Series |
|
Related | show |
On Thu, Apr 03, 2025 at 05:49:19PM +0200, Stefan Klug wrote: > Damp the regulation of the color temperature with the same factor as the > gains. Not damping the color temperature leads to visible flicker, as > the CCM changes too much. > > 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> > > --- > > Changes in v2: > - Collected tags > > Changes in v3: > - Dropped incorrect call to estimateCCT() > --- > src/ipa/rkisp1/algorithms/awb.cpp | 5 +++-- > src/ipa/rkisp1/algorithms/ccm.cpp | 4 ---- > 2 files changed, 3 insertions(+), 6 deletions(-) > > diff --git a/src/ipa/rkisp1/algorithms/awb.cpp b/src/ipa/rkisp1/algorithms/awb.cpp > index f5415a0bb99d..47b29725af51 100644 > --- a/src/ipa/rkisp1/algorithms/awb.cpp > +++ b/src/ipa/rkisp1/algorithms/awb.cpp > @@ -317,8 +317,6 @@ void Awb::process(IPAContext &context, > RkISP1AwbStats awbStats{ rgbMeans }; > AwbResult awbResult = awbAlgo_->calculateAwb(awbStats, frameContext.lux.lux); > > - activeState.awb.automatic.temperatureK = awbResult.colourTemperature; > - > /* > * Clamp the gain values to the hardware, which expresses gains as Q2.8 > * unsigned integer values. Set the minimum just above zero to avoid > @@ -329,9 +327,12 @@ void Awb::process(IPAContext &context, > > /* Filter the values to avoid oscillations. */ > double speed = 0.2; > + double ct = awbResult.colourTemperature; > + ct = ct * speed + activeState.awb.automatic.temperatureK * (1 - speed); > awbResult.gains = awbResult.gains * speed + > activeState.awb.automatic.gains * (1 - speed); > > + activeState.awb.automatic.temperatureK = static_cast<unsigned int>(ct); > activeState.awb.automatic.gains = awbResult.gains; > > LOG(RkISP1Awb, Debug) > diff --git a/src/ipa/rkisp1/algorithms/ccm.cpp b/src/ipa/rkisp1/algorithms/ccm.cpp > index 3a96a5427bc6..de2b6fe775aa 100644 > --- a/src/ipa/rkisp1/algorithms/ccm.cpp > +++ b/src/ipa/rkisp1/algorithms/ccm.cpp > @@ -142,10 +142,6 @@ void Ccm::prepare(IPAContext &context, const uint32_t frame, > } > > uint32_t ct = frameContext.awb.temperatureK; > - /* > - * \todo The colour temperature will likely be noisy, add filtering to > - * avoid updating the CCM matrix all the time. > - */ > if (frame > 0 && ct == ct_) { > frameContext.ccm.ccm = context.activeState.ccm.automatic; > return; > -- > 2.43.0 >
diff --git a/src/ipa/rkisp1/algorithms/awb.cpp b/src/ipa/rkisp1/algorithms/awb.cpp index f5415a0bb99d..47b29725af51 100644 --- a/src/ipa/rkisp1/algorithms/awb.cpp +++ b/src/ipa/rkisp1/algorithms/awb.cpp @@ -317,8 +317,6 @@ void Awb::process(IPAContext &context, RkISP1AwbStats awbStats{ rgbMeans }; AwbResult awbResult = awbAlgo_->calculateAwb(awbStats, frameContext.lux.lux); - activeState.awb.automatic.temperatureK = awbResult.colourTemperature; - /* * Clamp the gain values to the hardware, which expresses gains as Q2.8 * unsigned integer values. Set the minimum just above zero to avoid @@ -329,9 +327,12 @@ void Awb::process(IPAContext &context, /* Filter the values to avoid oscillations. */ double speed = 0.2; + double ct = awbResult.colourTemperature; + ct = ct * speed + activeState.awb.automatic.temperatureK * (1 - speed); awbResult.gains = awbResult.gains * speed + activeState.awb.automatic.gains * (1 - speed); + activeState.awb.automatic.temperatureK = static_cast<unsigned int>(ct); activeState.awb.automatic.gains = awbResult.gains; LOG(RkISP1Awb, Debug) diff --git a/src/ipa/rkisp1/algorithms/ccm.cpp b/src/ipa/rkisp1/algorithms/ccm.cpp index 3a96a5427bc6..de2b6fe775aa 100644 --- a/src/ipa/rkisp1/algorithms/ccm.cpp +++ b/src/ipa/rkisp1/algorithms/ccm.cpp @@ -142,10 +142,6 @@ void Ccm::prepare(IPAContext &context, const uint32_t frame, } uint32_t ct = frameContext.awb.temperatureK; - /* - * \todo The colour temperature will likely be noisy, add filtering to - * avoid updating the CCM matrix all the time. - */ if (frame > 0 && ct == ct_) { frameContext.ccm.ccm = context.activeState.ccm.automatic; return;