[libcamera-devel] [RFC PATCH] android: Plumb lens focus distance
Kieran Bingham
kieran.bingham at ideasonboard.com
Mon Nov 15 15:11:19 CET 2021
Quoting Laurent Pinchart (2021-09-15 00:26:35)
> Hi Paul,
>
> Thank you for the patch.
>
> On Mon, Sep 13, 2021 at 04:31:25PM +0900, Paul Elder wrote:
> > Plumb the controls related to lens focus distance:
> > - LENS_INFO_FOCUS_DISTANCE_CALIBRATION (static)
> > - LENS_INFO_MINIMUM_FOCUS_DISTANCE (static)
> > - LENS_FOCUS_DISTANCE (request, result)
> >
> > Conceptually, the first two controls determine the range of possible
> > values of the third. None of our lenses are calibrated, so hardcode the
> > first to uncalibrated. The valid focus distances are then [0, min].
> > Since we don't yet support variable-focus lenses, hardcode the second to
> > 0.0f, making the range of valid focus distances [0, 0]. Hence, hardcode
> > the focus distance in the result metadata to 0, and ignore the control
> > in the request. Add todos for adding proper controls later, once we have
> > focus support.
> >
> > Signed-off-by: Paul Elder <paul.elder at ideasonboard.com>
> > ---
> > This is also on top of my ctsw branch, so it won't apply on master, but
> > I would like comments to confirm the direction and design.
> > ---
> > src/android/camera_capabilities.cpp | 13 +++++++++++++
> > src/android/camera_device.cpp | 4 ++++
> > 2 files changed, 17 insertions(+)
> >
> > diff --git a/src/android/camera_capabilities.cpp b/src/android/camera_capabilities.cpp
> > index 461c208b..a807712d 100644
> > --- a/src/android/camera_capabilities.cpp
> > +++ b/src/android/camera_capabilities.cpp
> > @@ -717,6 +717,7 @@ int CameraCapabilities::initializeStaticMetadata()
> > ANDROID_LENS_INFO_AVAILABLE_APERTURES,
> > ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS,
> > ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION,
> > + ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION,
> > ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE,
> > ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE,
> > ANDROID_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES,
> > @@ -805,6 +806,7 @@ int CameraCapabilities::initializeStaticMetadata()
> > ANDROID_JPEG_THUMBNAIL_SIZE,
> > ANDROID_LENS_APERTURE,
> > ANDROID_LENS_FOCAL_LENGTH,
> > + ANDROID_LENS_FOCUS_DISTANCE,
> > ANDROID_LENS_OPTICAL_STABILIZATION_MODE,
> > ANDROID_LENS_STATE,
> > ANDROID_NOISE_REDUCTION_MODE,
> > @@ -1247,10 +1249,21 @@ int CameraCapabilities::initializeStaticMetadata()
> > staticMetadata_->addEntry(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION,
> > opticalStabilizations);
> >
> > + /*
> > + * Must be populated for FULL, optional for LIMITED. The value doesn't
> > + * matter, so just hardcode to uncalibrated. Uncalibrated means that
> > + * the max focus distance is zero (= infinite focus) and the min focus
> > + * distance is specified in LENS_INFO_MINIMUM_FOCUS_DISTANCE.
> > + */
> > + int distanceCalibration = ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION_UNCALIBRATED;
> > + staticMetadata_->addEntry(ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION,
> > + distanceCalibration);
> > +
> > float hypeFocalDistance = 0;
> > staticMetadata_->addEntry(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE,
> > hypeFocalDistance);
> >
> > + /* \todo Get this from the HAL config. */
>
> Once we'll have focus support in the libcamera core, I think this will
> come from libcamera, not the HAL config. The minimum focus distance is
> useful in general.
>
> With this todo updated,
>
> Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
>
> > float minFocusDistance = 0;
> > staticMetadata_->addEntry(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE,
> > minFocusDistance);
> > diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
> > index 373e0f98..cfbb84aa 100644
> > --- a/src/android/camera_device.cpp
> > +++ b/src/android/camera_device.cpp
> > @@ -1396,6 +1396,10 @@ CameraDevice::getResultMetadata(const Camera3RequestDescriptor &descriptor) cons
> > float focal_length = 1.0;
> > resultMetadata->addEntry(ANDROID_LENS_FOCAL_LENGTH, focal_length);
> >
> > + /* \todo Add a libcamera control for this, and plumb it. */
Given the discussions at : [0], Perhaps we should start by adding a
draft control directly?
[0] https://lists.libcamera.org/pipermail/libcamera-devel/2021-November/026991.html
> > + float focalDistance = 0.0;
> > + resultMetadata->addEntry(ANDROID_LENS_FOCUS_DISTANCE, focalDistance);
Will we mandate that metadata is provided in completed requests? (like
this one) or will we 'fill in a default' if it's not available.
If the completed request doesn't report a lens focus distance do we
simply not return a value to Android? or return the previous value
maybe?
> > +
> > value = ANDROID_LENS_STATE_STATIONARY;
> > resultMetadata->addEntry(ANDROID_LENS_STATE, value);
> >
>
> --
> Regards,
>
> Laurent Pinchart
More information about the libcamera-devel
mailing list