[PATCH] ipa: rpi: Fix for incorrectly reported max shutter speed

Laurent Pinchart laurent.pinchart at ideasonboard.com
Thu May 9 13:01:11 CEST 2024


Hi Naush,

On Thu, May 09, 2024 at 11:51:05AM +0100, Naushir Patuck wrote:
> On Thu, 9 May 2024 at 11:23, Laurent Pinchart wrote:
> > On Tue, May 07, 2024 at 11:32:54AM +0100, Naushir Patuck wrote:
> > > On Sat, 4 May 2024 at 16:04, Laurent Pinchart wrote:
> > > > On Wed, May 01, 2024 at 05:04:03PM +0100, Naushir Patuck wrote:
> > > > > On Wed, 1 May 2024 at 16:53, Laurent Pinchart wrote:
> > > > > > On Fri, Apr 26, 2024 at 12:18:15PM +0100, Naushir Patuck wrote:
> > > > > > > The maximum shutter speed calculation in the cam-helper relied on
> > > > > > > the frame duration limits being correctly set in the cam-helper's mode
> > > > > > > structure. This was not the case on first startup, so the maximum
> > > > > > > shutter speed reported back via the ControlInfo was incorrect.
> > > > > > >
> > > > > > > Fix this by setting up the camera mode in the cam-helper before querying
> > > > > > > for the max shutter value.
> > > > > > >
> > > > > > > Signed-off-by: Naushir Patuck <naush at raspberrypi.com>
> > > > > > > ---
> > > > > > >  src/ipa/rpi/common/ipa_base.cpp | 6 ++++++
> > > > > > >  1 file changed, 6 insertions(+)
> > > > > > >
> > > > > > > diff --git a/src/ipa/rpi/common/ipa_base.cpp b/src/ipa/rpi/common/ipa_base.cpp
> > > > > > > index 149a133ab662..1d12262bda01 100644
> > > > > > > --- a/src/ipa/rpi/common/ipa_base.cpp
> > > > > > > +++ b/src/ipa/rpi/common/ipa_base.cpp
> > > > > > > @@ -592,6 +592,12 @@ void IpaBase::setMode(const IPACameraSensorInfo &sensorInfo)
> > > > > > >       mode_.minAnalogueGain = helper_->gain(gainCtrl.min().get<int32_t>());
> > > > > > >       mode_.maxAnalogueGain = helper_->gain(gainCtrl.max().get<int32_t>());
> > > > > > >
> > > > > > > +     /*
> > > > > > > +      * We need to give the helper the min/max frame durations so it can calculate
> > > > > > > +      * the correct exposure limits below.
> > > > > > > +      */
> > > > > > > +     helper_->setCameraMode(mode_);
> > > > > > > +
> > > > > >
> > > > > > Don't you end up doing this twice, once here, and once in
> > > > > > IpaBase::configure(), which calls IpaBase::setMode() ?
> > > > >
> > > > > Yes, it does happen twice.  The other option would be to pass a const
> > > > > reference to mode_ into the helper through setMode(), allowing us only do
> > > > > it once.
> > > >
> > > > I don't think I follow you.
> > >
> > > What I mean is that we don't give the cam helper its own copy of the
> > > mode structure, but pass it a const reference to the IPA's mode
> > > structure.   This would solve the problem with the calculation here.
> >
> > It's probably me, but I still don't get it :-) We have
> >
> > void CamHelper::setCameraMode(const CameraMode &mode)
> > {
> >         mode_ = mode;
> >         if (parser_) {
> >                 parser_->reset();
> >                 parser_->setBitsPerPixel(mode.bitdepth);
> >                 parser_->setLineLengthBytes(0); /* We use SetBufferSize. */
> >         }
> > }
> >
> > called in IpaBase::configure(). This patch adds another call in
> > IpaBase::setMode(). You wrote
> >
> > > The other option would be to pass a const reference to mode_ into the
> > > helper through setMode()
> >
> > Doesn't this patch does exactly that ? How is it another option ?
> >
> > /me is confused
> 
> In CamHelper::setCameraMode(const CameraMode &mode), I would have to store
> the const reference rather than make a copy of CameraMode mode:
> 
> diff --git a/src/ipa/rpi/cam_helper/cam_helper.h
> b/src/ipa/rpi/cam_helper/cam_helper.h
> index 58a4b202d5a8..eb2a56484606 100644
> --- a/src/ipa/rpi/cam_helper/cam_helper.h
> +++ b/src/ipa/rpi/cam_helper/cam_helper.h
> @@ -107,7 +107,7 @@ protected:
>                                       Metadata &metadata) const;
> 
>         std::unique_ptr<MdParser> parser_;
> -       CameraMode mode_;
> +       const CameraMode &mode_;
> 
> Then in the IPA if I call CamHelper::setCameraMode()
> before IpaBase::setMode() + a bit of other refactoring, I think I can
> achieve what I want without a double call..  The "other bit of refactoring"
> is the bit I'm a bit hesitant to work on for such a simple fix :)

Aahhh OK, I get it now. The above won't compile though, you can't
reassign a reference, it can only be initialized at object construction
time. You could use a pointer, but I think that will make the code more
difficult to understand, with changes being implicitly shared between
components. Let's stick with this patch for the time being. There's
probably a chance to refactor the code to make the interface between the
components a bit cleaner, but that's a gut feeling at this point. Or
maybe a wishful thinking that there is always a way to make pieces fall
neatly into place :-)

> > > > > But that was a bit more involved over this more trivial fix.  I
> > > > > can change to do that if folks prefer.
> > > > >
> > > > > > >       /* Shutter speed is calculated based on the limits of the frame durations. */
> > > > > > >       mode_.minShutter = helper_->exposure(shutterCtrl.min().get<int32_t>(), mode_.minLineLength);
> > > > > > >       mode_.maxShutter = Duration::max();

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list