[PATCH v2 14/17] ipa: rkisp1: Damp color temperature regulation

Laurent Pinchart laurent.pinchart at ideasonboard.com
Tue Apr 1 03:40:16 CEST 2025


On Mon, Mar 31, 2025 at 06:50:27PM +0100, Kieran Bingham wrote:
> Quoting Stefan Klug (2025-03-19 16:11:19)
> > 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 at ideasonboard.com>
> > Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> > 
> > ---
> > 
> > Changes in v2:
> > - Collected tags
> > ---
> >  src/ipa/rkisp1/algorithms/awb.cpp | 3 +++
> >  src/ipa/rkisp1/algorithms/ccm.cpp | 4 ----
> >  2 files changed, 3 insertions(+), 4 deletions(-)
> > 
> > diff --git a/src/ipa/rkisp1/algorithms/awb.cpp b/src/ipa/rkisp1/algorithms/awb.cpp
> > index 286d9e3e2018..149c6aa59c8d 100644
> > --- a/src/ipa/rkisp1/algorithms/awb.cpp
> > +++ b/src/ipa/rkisp1/algorithms/awb.cpp
> > @@ -342,9 +342,12 @@ void Awb::process(IPAContext &context,
> >  
> >         /* Filter the values to avoid oscillations. */
> >         double speed = 0.2;
> > +       double ct = estimateCCT(rgbMeans);
> > +       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);
> 
> I'm confused by this patch being late in the series and adding a
> calculation of temperature, without removing or modifying an existing
> calculation.

And furthermore, since we moved the AWB algorithms to libipa,
estimateCCT is not really meant to be called here. Something seems
weird.

> Is this duplicating where the automatic color temperature is estimated?
> Do we now call estimateCCT twice ?
> 
> >         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 303ac3dd2fe2..b7f32f0d5d8a 100644
> > --- a/src/ipa/rkisp1/algorithms/ccm.cpp
> > +++ b/src/ipa/rkisp1/algorithms/ccm.cpp
> > @@ -139,10 +139,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.
> > -        */

I don't think the comment should be removed. Even with damping, the
colour temperature is noisy. What we need here is a filter with a
threshold. Unless updating the CCM every frame is now fine.

> >         if (frame > 0 && ct == ct_) {
> >                 frameContext.ccm.ccm = context.activeState.ccm.automatic;
> >                 return;

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list