[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