[libcamera-devel] [PATCH v1 3/3] ipa: rpi: Set lens position to hyperfocal on startup
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Fri Jun 2 08:43:12 CEST 2023
Hello,
On Thu, Jun 01, 2023 at 11:33:15AM +0100, Nick Hollinghurst via libcamera-devel wrote:
> On Thu, 1 Jun 2023 at 10:56, Naushir Patuck <naush at raspberrypi.com> wrote:
> >
> > On the first ipa->configure() call, set the lens position (if a lens is
> > present) to the default position. Typically this would be the hyperfocal
> > position based on the tuning data.
> >
> > Signed-off-by: Naushir Patuck <naush at raspberrypi.com>
> > ---
> > src/ipa/rpi/common/ipa_base.cpp | 13 +++++++++++++
> > 1 file changed, 13 insertions(+)
> >
> > diff --git a/src/ipa/rpi/common/ipa_base.cpp b/src/ipa/rpi/common/ipa_base.cpp
> > index 599ad146a863..4413689b7bef 100644
> > --- a/src/ipa/rpi/common/ipa_base.cpp
> > +++ b/src/ipa/rpi/common/ipa_base.cpp
> > @@ -199,6 +199,19 @@ int32_t IpaBase::configure(const IPACameraSensorInfo &sensorInfo, const ConfigPa
> > agcStatus.shutterTime = defaultExposureTime;
> > agcStatus.analogueGain = defaultAnalogueGain;
> > applyAGC(&agcStatus, ctrls);
> > +
> > + /* Set the lens to the default (typically hyperfocal) position on first start. */
> > + RPiController::AfAlgorithm *af =
> > + dynamic_cast<RPiController::AfAlgorithm *>(controller_.getAlgorithm("af"));
> > + if (lensPresent_ && af) {
You could avoid looking up the AF algorithm is lensPresent_ is false.
That's a small optimization in a non-hot path, so it's not mandatory.
> > + float defaultPos = ipaAfControls.at(&controls::LensPosition).def().get<float>();
> > + ControlList lensCtrl(lensCtrls_);
> > + int32_t hwpos;
> > +
> > + af->setLensPosition(defaultPos, &hwpos);
> > + lensCtrl.set(V4L2_CID_FOCUS_ABSOLUTE, hwpos);
> > + result->lensControls = std::move(lensCtrl);
Will this work as expected if the user sets the AF mode to continuous at
start time ? Would it cause the lens to first be moved to the hyperfocal
distance, to be overridden right after ?
> > + }
> > }
> >
> > result->sensorControls = std::move(ctrls);
>
> I think this is good, but it suggests future cleanups:
>
> There's an opportunity to simplify the RPI AF algorithm, which
> deliberately supports an initial state in which it doesn't touch the
> lens and doesn't know where it is. If lens position is always
> initialized, a flag and some code paths can be removed there. But
> there's currently no way to retrieve "hwpos" without either setting a
> lens position or processing a frame; so it might entail a change to
> AfAlgorithm interface.
>
> Based on the existing interface, this patch is doing the best thing.
>
> There's a complication with the concept of "default" too: The tuning
> file can define defaults for each range ("normal", "macro", "full"),
> but none of those match the static default and limits in the
> ControlInfo. This might be part of a more general issue with control
> limits, so I don't think it needs addressing here.
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list