[libcamera-devel] [PATCH 1/3] libcamera: raspberrypi: Refuse invalid roles configuration

Laurent Pinchart laurent.pinchart at ideasonboard.com
Mon Jun 29 00:06:28 CEST 2020


Hi Jacopo,

Thank you for the patch.

On Sun, Jun 28, 2020 at 06:17:21PM +0200, Jacopo Mondi wrote:
> The generateConfiguration() implementation does not check if the
> requested list of roles can actually be satisfied. The camera API
> documentation prescribes the function shall fail in that case, instead
> of silently adjust the returned confiuguration.

s/confiuguration/configuration/

> Fix this by implementing the same logic as the validate() function
> implements, as the pipeline handler supports one raw stream and up to
> two output streams.
> 
> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> ---
>  src/libcamera/pipeline/raspberrypi/raspberrypi.cpp | 11 +++++++++++
>  1 file changed, 11 insertions(+)
> 
> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> index dcd737a1d1a0..d1338b640e3c 100644
> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> @@ -526,6 +526,8 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,
>  	if (roles.empty())
>  		return config;
>  
> +	unsigned int rawCount = 0;
> +	unsigned int outCount = 0;
>  	for (const StreamRole role : roles) {
>  		switch (role) {
>  		case StreamRole::StillCaptureRaw:
> @@ -535,6 +537,7 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,
>  			pixelFormat = sensorFormat.fourcc.toPixelFormat();
>  			ASSERT(pixelFormat.isValid());
>  			bufferCount = 1;
> +			rawCount++;
>  			break;
>  
>  		case StreamRole::StillCapture:
> @@ -543,6 +546,7 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,
>  			/* Return the largest sensor resolution. */
>  			size = data->sensor_->resolution();
>  			bufferCount = 1;
> +			outCount++;
>  			break;
>  
>  		case StreamRole::VideoRecording:
> @@ -550,6 +554,7 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,
>  			pixelFormat = formats::NV12;
>  			size = { 1920, 1080 };
>  			bufferCount = 4;
> +			outCount++;
>  			break;
>  
>  		case StreamRole::Viewfinder:
> @@ -557,6 +562,7 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,
>  			pixelFormat = formats::ARGB8888;
>  			size = { 800, 600 };
>  			bufferCount = 4;
> +			outCount++;
>  			break;
>  
>  		default:
> @@ -565,6 +571,11 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,
>  			break;
>  		}
>  
> +		if (rawCount > 1 || outCount > 2) {

Would an error message be a good idea ?

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

> +			delete config;
> +			return nullptr;
> +		}
> +
>  		/* Translate the V4L2PixelFormat to PixelFormat. */
>  		std::map<PixelFormat, std::vector<SizeRange>> deviceFormats;
>  		std::transform(fmts.begin(), fmts.end(), std::inserter(deviceFormats, deviceFormats.end()),

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list