[libcamera-devel] [PATCH 16/16] ipa: ipu3: Cap frame duration to 30 FPS
Jacopo Mondi
jacopo at jmondi.org
Fri Sep 3 10:47:51 CEST 2021
Hi Paul,
On Wed, Sep 01, 2021 at 05:33:57PM +0900, paul.elder at ideasonboard.com wrote:
> Hi Jacopo,
>
> On Fri, Aug 27, 2021 at 02:07:57PM +0200, Jacopo Mondi wrote:
> > Limit the IPU3 frame rate to 30 FPS.
> >
> > The reason to do is to bring the IPU3 IPA in par with the Intel
> > HAL implementation on IPU3 platform, where 30FPS is the frame rate used
> > to perform quality tuning in the closed-source IPA module and has been
> > validated as the most efficient rate for the power/performace budget.
> >
> > Compute the vertical blanking to maintain such frame rate and configure
> > the sensor with that.
> >
> > Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> > ---
> > src/ipa/ipu3/ipu3.cpp | 37 ++++++++++++++++++++++++++++++++-----
> > 1 file changed, 32 insertions(+), 5 deletions(-)
> >
> > diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp
> > index fc5f69ed5ddc..0e5d5e479e20 100644
> > --- a/src/ipa/ipu3/ipu3.cpp
> > +++ b/src/ipa/ipu3/ipu3.cpp
> > @@ -183,7 +183,7 @@ private:
> > IPACameraSensorInfo sensorInfo_;
> >
> > /* Camera sensor controls. */
> > - uint32_t defVBlank_;
> > + uint32_t vBlank_;
> > uint32_t exposure_;
> > uint32_t minExposure_;
> > uint32_t maxExposure_;
> > @@ -257,10 +257,39 @@ void IPAIPU3::updateControls(const IPACameraSensorInfo &sensorInfo,
> > frameDurations[i] = frameSize / (sensorInfo.pixelRate / 1000000U);
> > }
> >
> > + /*
> > + * Cap minimum frame duration to 30FPS.
> > + *
> > + * 30 FPS has been validated in the closed source Intel 3A module as the
> > + * most opportune frame rate for quality tuning, and power
> > + * vs performances budget on Intel IPU3.
> > + *
> > + * Reduce the minimum achievable frame rate to 30 FPS and compute the
>
> Since it's a "frame rate" should this be the "maximum achievable frame
> rate"?
Indeed! Thanks for spotting, I'll fix!
>
> Reviewed-by: Paul Elder <paul.elder at ideasonboard.com>
>
> > + * vertical blanking to maintain that rate.
> > + */
> > + int64_t *minFrameDuration = &frameDurations[0];
> > + if (*minFrameDuration < 1e6 / 30.0)
> > + *minFrameDuration = 1e6 / 30.0;
> > +
> > controls[&controls::FrameDurationLimits] = ControlInfo(frameDurations[0],
> > frameDurations[1],
> > frameDurations[2]);
> >
> > + /*
> > + * Adjust the vertical blanking to obtain the desired frame duration.
> > + *
> > + * Assume a fixed line length as horizontal blanking is seldom
> > + * controllable.
> > + *
> > + * \todo Support making this overridable by the application through
> > + * controls::FrameDuration.
> > + *
> > + * \todo Clamp exposure to frame duration.
> > + */
> > + vBlank_ = *minFrameDuration * (sensorInfo.pixelRate / 1000000U);
> > + vBlank_ /= lineLength;
> > + vBlank_ -= sensorInfo.outputSize.height;
> > +
> > *ipaControls = ControlInfoMap(std::move(controls), controls::controls);
> > }
> >
> > @@ -399,8 +428,6 @@ int IPAIPU3::configure(const IPAConfigInfo &configInfo,
> > maxGain_ = itGain->second.max().get<int32_t>();
> > gain_ = minGain_;
> >
> > - defVBlank_ = itVBlank->second.def().get<int32_t>();
> > -
> > /* Clean context at configuration */
> > context_ = {};
> >
> > @@ -511,8 +538,7 @@ void IPAIPU3::parseStatistics(unsigned int frame,
> >
> > setControls(frame);
> >
> > - /* \todo Use VBlank value calculated from each frame exposure. */
> > - int64_t frameDuration = sensorInfo_.lineLength * (defVBlank_ + sensorInfo_.outputSize.height) /
> > + int64_t frameDuration = sensorInfo_.lineLength * (vBlank_ + sensorInfo_.outputSize.height) /
> > (sensorInfo_.pixelRate / 1e6);
> > ctrls.set(controls::FrameDuration, frameDuration);
> >
> > @@ -534,6 +560,7 @@ void IPAIPU3::setControls(unsigned int frame)
> > ControlList ctrls(ctrls_);
> > ctrls.set(V4L2_CID_EXPOSURE, static_cast<int32_t>(exposure_));
> > ctrls.set(V4L2_CID_ANALOGUE_GAIN, static_cast<int32_t>(gain_));
> > + ctrls.set(V4L2_CID_VBLANK, static_cast<int32_t>(vBlank_));
> > op.controls = ctrls;
> >
> > queueFrameAction.emit(frame, op);
> > --
> > 2.32.0
> >
More information about the libcamera-devel
mailing list