[libcamera-devel] [PATCH v3] android: camera_device: Add null check for ScalerCrop control

Laurent Pinchart laurent.pinchart at ideasonboard.com
Tue Mar 30 05:25:41 CEST 2021


Hi Phi-Bang,

On Mon, Mar 29, 2021 at 07:40:46PM +0200, Phi-Bang Nguyen wrote:
> The ScalerCrop control does not contain the null check which can
> cause the camera HAL crash at boot. Fix it.
> 
> Fixes: 31a1a628cd0e ("android: camera_device: Register MAX_DIGITAL_ZOOM")
> 
> Signed-off-by: Phi-Bang Nguyen <pnguyen at baylibre.com>

Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>

And pushed. Thank you :-)

> ---
>  src/android/camera_device.cpp | 40 ++++++++++++++++++-----------------
>  1 file changed, 21 insertions(+), 19 deletions(-)
> 
> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
> index ae693664..9ec261c3 100644
> --- a/src/android/camera_device.cpp
> +++ b/src/android/camera_device.cpp
> @@ -1095,26 +1095,28 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()
>  	}
>  
>  	/* Scaler static metadata. */
> -	{
> -		/*
> -		 * \todo The digital zoom factor is a property that depends
> -		 * on the desired output configuration and the sensor frame size
> -		 * input to the ISP. This information is not available to the
> -		 * Android HAL, not at initialization time at least.
> -		 *
> -		 * As a workaround rely on pipeline handlers initializing the
> -		 * ScalerCrop control with the camera default configuration and
> -		 * use the maximum and minimum crop rectangles to calculate the
> -		 * digital zoom factor.
> -		 */
> -		const auto info = controlsInfo.find(&controls::ScalerCrop);
> -		Rectangle min = info->second.min().get<Rectangle>();
> -		Rectangle max = info->second.max().get<Rectangle>();
> -		float maxZoom = std::min(1.0f * max.width / min.width,
> -					 1.0f * max.height / min.height);
> -		staticMetadata_->addEntry(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM,
> -					  &maxZoom, 1);
> +
> +	/*
> +	 * \todo The digital zoom factor is a property that depends
> +	 * on the desired output configuration and the sensor frame size
> +	 * input to the ISP. This information is not available to the
> +	 * Android HAL, not at initialization time at least.
> +	 *
> +	 * As a workaround rely on pipeline handlers initializing the
> +	 * ScalerCrop control with the camera default configuration and
> +	 * use the maximum and minimum crop rectangles to calculate the
> +	 * digital zoom factor.
> +	 */
> +	float maxZoom = 1.0f;
> +	const auto scalerCrop = controlsInfo.find(&controls::ScalerCrop);
> +	if (scalerCrop != controlsInfo.end()) {
> +		Rectangle min = scalerCrop->second.min().get<Rectangle>();
> +		Rectangle max = scalerCrop->second.max().get<Rectangle>();
> +		maxZoom = std::min(1.0f * max.width / min.width,
> +				   1.0f * max.height / min.height);
>  	}
> +	staticMetadata_->addEntry(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM,
> +				  &maxZoom, 1);
>  
>  	std::vector<uint32_t> availableStreamConfigurations;
>  	availableStreamConfigurations.reserve(streamConfigurations_.size() * 4);

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list