[libcamera-devel] [PATCH] ipa: ipu3: agc: Fix -nan exception

Kate Hsuan hpa at redhat.com
Fri Nov 12 08:17:58 CET 2021


Hi Jean-Michel,

On Thu, Nov 11, 2021 at 4:25 PM Jean-Michel Hautbois
<jeanmichel.hautbois at ideasonboard.com> wrote:
>
> Hi Kate,
>
> Thanks for the patch !
>
> On 11/11/2021 09:10, Kate Hsuan wrote:
> > The user may equip a cam cover to make sure security.If they want to
> > disable the cam, the cam cover could be physically closed to ensure
> > the image will not be delivered. In this situation, the image will be
> > all black and it triggers the -nan exception for some values.
> > Eventually, the exposure will be locked. As a result, we only can get
> > a black image.
> >
> > evGain is calculated by kEvGainTarget * knumHistogramBins / iqMean_.
> > For a black image, a -nan of iqMean_ will lead evGain miss calculated.
> > Consequently, the exposure value can not be correctly estimated and be
> > locked at -nan as well. In this situation, evGain is set to 1.0 and try
> > to estimate again through the next frame. Also, an additional check
> > makes sure the exposure value is between minTotalExposure and
> > maxTotalExposure.
> >
> > Signed-off-by: Kate Hsuan <hpa at redhat.com>
> > ---
> >   src/ipa/ipu3/algorithms/agc.cpp | 7 +++++--
> >   1 file changed, 5 insertions(+), 2 deletions(-)
> >
> > diff --git a/src/ipa/ipu3/algorithms/agc.cpp b/src/ipa/ipu3/algorithms/agc.cpp
> > index b5d736c1..d965febe 100644
> > --- a/src/ipa/ipu3/algorithms/agc.cpp
> > +++ b/src/ipa/ipu3/algorithms/agc.cpp
> > @@ -191,6 +191,8 @@ void Agc::computeExposure(uint32_t &exposure, double &analogueGain)
> >
> >       /* Estimate the gain needed to have the proportion wanted */
> >       double evGain = kEvGainTarget * knumHistogramBins / iqMean_;
> > +     if(std::isnan(evGain))
> > +             evGain = 1.0;
>
> This has been found on our side too :-) but we solved it in a different
> way, improving the AGC behaviour. Maybe would you like to have a look to
> the "[PATCH v2 00/14] IPA: IPU3: Introduce per-frame controls" series ?
>
> To be honest, I hesitated between testing nan, patching the Histogram
> class and the third option you can find in "ipa: ipu3: agc: Limit the
> number of saturated cells".

Thank you for noticing me this :)

We are working on the same issue.

>
> >
> >       /* extracted from Rpi::Agc::computeTargetExposure */
> >       /* Calculate the shutter time in seconds */
> > @@ -210,7 +212,9 @@ void Agc::computeExposure(uint32_t &exposure, double &analogueGain)
> >
> >       /* Clamp the exposure value to the min and max authorized */
> >       utils::Duration maxTotalExposure = maxShutterSpeed * maxAnalogueGain_;
> > -     currentExposure_ = std::min(currentExposure_, maxTotalExposure);
> > +     utils::Duration minTotalExposure = minShutterSpeed * minAnalogueGain_;
> > +
> > +     currentExposure_ = std::clamp<utils::Duration>(currentExposure_, minTotalExposure, maxTotalExposure);
> >       LOG(IPU3Agc, Debug) << "Target total exposure " << currentExposure_
> >                           << ", maximum is " << maxTotalExposure;
> >
> > @@ -232,7 +236,6 @@ void Agc::computeExposure(uint32_t &exposure, double &analogueGain)
> >       LOG(IPU3Agc, Debug) << "Divided up shutter and gain are "
> >                           << shutterTime << " and "
> >                           << stepGain;
> > -
> >       exposure = shutterTime / lineDuration_;
> >       analogueGain = stepGain;
> >
> >
>


-- 
BR,
Kate



More information about the libcamera-devel mailing list