[libcamera-devel] [PATCH v3 3/4] android: Override camera as "Internal" provided found in HAL config

paul.elder at ideasonboard.com paul.elder at ideasonboard.com
Mon Aug 2 10:46:40 CEST 2021


Hi Umang,

On Fri, Jul 30, 2021 at 04:31:53PM +0530, Umang Jain wrote:
> Currently, all UVC cameras are reported with CameraLocationExternal [1]
> by libcamera-core, since there is no universal information or standard,

s/,$//

> to know the location of these cameras. However, in the libcamera HAL
> layer, we can make an informed decision whether its external or

s/its/it's/

> internal, simply by checking the presence of it in the HAL

s/the presence of it/its presence/

> configuration file.
> 
> If the camera is found to be present in the HAL configuration file,

s/to be present//

> treat it as internal. CameraHalManager will now assign the numerical id
> of the camera accordingly, based on which the facing of the camera is set

I didn't think the facing of the camera affects the id?

> as well (as per the HAL config file) while initializing the CameraDevice
> wrapper.

I don't quite understand this last part.


Thanks,

Paul

> 
> [1] 76809320bb1a ("libcamera: pipeline: uvcvideo: Treat all UVC cameras
>                    as external")
> 
> Signed-off-by: Umang Jain <umang.jain at ideasonboard.com>
> ---
>  src/android/camera_device.cpp      | 13 ++++++++++++-
>  src/android/camera_hal_manager.cpp | 17 +++++++++++++++++
>  2 files changed, 29 insertions(+), 1 deletion(-)
> 
> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
> index 678cde23..394ebc84 100644
> --- a/src/android/camera_device.cpp
> +++ b/src/android/camera_device.cpp
> @@ -330,7 +330,18 @@ int CameraDevice::initialize(const CameraConfigData *cameraConfigData)
>  			facing_ = CAMERA_FACING_BACK;
>  			break;
>  		case properties::CameraLocationExternal:
> -			facing_ = CAMERA_FACING_EXTERNAL;
> +			/*
> +			 * If the camera is reported as external, but
> +			 * the CameraHalManager has overriden it, use
> +			 * what is reported in the configuration file.
> +			 * This typically happens for UVC cameras
> +			 * reported as 'External' by libcamera but
> +			 * installed in fixed position on the device.
> +			 */
> +			if (id_ < 1000 && cameraConfigData->facing != -1)
> +			       facing_ = cameraConfigData->facing;
> +			else
> +			       facing_ = CAMERA_FACING_EXTERNAL;
>  			break;
>  		}
>  
> diff --git a/src/android/camera_hal_manager.cpp b/src/android/camera_hal_manager.cpp
> index b364f62a..cce98fad 100644
> --- a/src/android/camera_hal_manager.cpp
> +++ b/src/android/camera_hal_manager.cpp
> @@ -145,6 +145,23 @@ void CameraHalManager::cameraAdded(std::shared_ptr<Camera> cam)
>  	}
>  
>  	const CameraConfigData *cameraConfigData = halConfig_.cameraConfigData(cam->id());
> +
> +	/*
> +	 * Some cameras whose location is reported by libcamera as external may
> +	 * actually be internal to the device. This is common with UVC cameras
> +	 * that are integrated in a laptop. In that case the real location
> +	 * should be specified in the configuration file.
> +	 *
> +	 * If the camera location is external and a configuration
> +	 * entry exists for it, override its location.
> +	 */
> +	if (isCameraNew && isCameraExternal) {
> +		if (cameraConfigData && cameraConfigData->facing != -1) {
> +			isCameraExternal = false;
> +			id = numInternalCameras_;
> +		}
> +	}
> +
>  	if (!isCameraExternal && !cameraConfigData) {
>  		LOG(HAL, Error)
>  			<< "HAL configuration entry for internal camera "
> -- 
> 2.31.0
> 


More information about the libcamera-devel mailing list