[libcamera-devel] [PATCH] android: camera_device: Calculate MAX_JPEG_SIZE

Kieran Bingham kieran.bingham at ideasonboard.com
Tue Feb 2 16:23:22 CET 2021


Hi Jacopo,

On 02/02/2021 12:36, Jacopo Mondi wrote:
> Calculate the JPEG maximum size using the maximum preview format size
> multiplied by a 1.5 factor.
> 
> The same multiplication factor is used in the existing HAL
> implementation in ChromeOS.

This is definitely better than the somewhat arbitrary fixed value I
picked from another HAL.

> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> ---
>  src/android/camera_device.cpp | 21 ++++++++++-----------
>  1 file changed, 10 insertions(+), 11 deletions(-)
> 
> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
> index a50b0ebfe60e..cb87d97888ed 100644
> --- a/src/android/camera_device.cpp
> +++ b/src/android/camera_device.cpp
> @@ -347,12 +347,6 @@ CameraDevice::CameraDevice(unsigned int id, const std::shared_ptr<Camera> &camer
>  {
>  	camera_->requestCompleted.connect(this, &CameraDevice::requestComplete);
>  
> -	/*
> -	 * \todo Determine a more accurate value for this during
> -	 *  streamConfiguration.
> -	 */
> -	maxJpegBufferSize_ = 13 << 20; /* 13631488 from USB HAL */
> -
>  	maker_ = "libcamera";
>  	model_ = "cameraModel";
>  
> @@ -629,6 +623,7 @@ int CameraDevice::initializeStreamConfigurations()
>  							mappedFormat,
>  							cameraResolutions);
>  
> +		Size maxJpegSize;
>  		for (const Size &res : resolutions) {
>  			streamConfigurations_.push_back({ res, androidFormat });
>  
> @@ -643,9 +638,17 @@ int CameraDevice::initializeStreamConfigurations()
>  			 * \todo Support JPEG streams produced by the Camera
>  			 * natively.
>  			 */
> -			if (androidFormat == HAL_PIXEL_FORMAT_YCbCr_420_888)
> +			if (androidFormat == HAL_PIXEL_FORMAT_YCbCr_420_888) {
>  				streamConfigurations_.push_back(
>  					{ res, HAL_PIXEL_FORMAT_BLOB });
> +
> +				if (res > maxJpegSize) {

Aha, so this runs over each of the supported stream configurations and
thus only the max gets through ? is that right?

(I think it is, so there's no issue)

> +					maxJpegSize = res;
> +					maxJpegBufferSize_ = maxJpegSize.width
> +							   * maxJpegSize.height
> +							   * 1.5;
> +				}
> +			}
>  		}
>  	}
>  
> @@ -878,10 +881,6 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()
>  				  availableThumbnailSizes.data(),
>  				  availableThumbnailSizes.size());
>  
> -	/*
> -	 * \todo Calculate the maximum JPEG buffer size by asking the encoder
> -	 * giving the maximum frame size required.
> -	 */

Is this no longer worth considering?
I sort of agree at the moment. And if we decide we want to ask the
encoders we can handle that later. I don't think we need to worry about
the todo.

Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>


>  	staticMetadata_->addEntry(ANDROID_JPEG_MAX_SIZE, &maxJpegBufferSize_, 1);
>  
>  	/* Sensor static metadata. */
> 

-- 
Regards
--
Kieran


More information about the libcamera-devel mailing list