[libcamera-devel] [PATCH v1 3/3] ipa: rpi: Set lens position to hyperfocal on startup

Nick Hollinghurst nick.hollinghurst at raspberrypi.com
Thu Jun 1 12:33:15 CEST 2023


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) {
> +                       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);
> +               }
>         }
>
>         result->sensorControls = std::move(ctrls);
> --
> 2.34.1
>

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.

 Nick


More information about the libcamera-devel mailing list