[libcamera-devel] [PATCH 09/20] libcamera: ipu3: Report StreamFormats

Laurent Pinchart laurent.pinchart at ideasonboard.com
Tue Jul 14 23:31:29 CEST 2020


Hi Jacopo,

Thank you for the patch.

On Tue, Jul 14, 2020 at 12:42:01PM +0200, Jacopo Mondi wrote:
> Report StreamFormats associated to each StreamConfiguration generated
> by the IPU3 pipeline handler.
> 
> The StreamFormats are generated differently for RAW and processed
> streams, with the former using the sensor enumerated resolutions and
> the latter using a continuous range of sizes constructed by matching the
> sensor capabilities with the platform constraints.
> 
> Reviewed-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>

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

> ---
>  src/libcamera/pipeline/ipu3/ipu3.cpp | 45 +++++++++++++++++++---------
>  1 file changed, 31 insertions(+), 14 deletions(-)
> 
> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
> index 517d9bd11fbf..b480d41f89ab 100644
> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp
> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
> @@ -313,7 +313,10 @@ CameraConfiguration *PipelineHandlerIPU3::generateConfiguration(Camera *camera,
>  
>  	Size sensorResolution = data->cio2_.sensor()->resolution();
>  	for (const StreamRole role : roles) {
> -		StreamConfiguration cfg = {};
> +		std::map<PixelFormat, std::vector<SizeRange>> streamFormats;
> +		unsigned int bufferCount;
> +		PixelFormat pixelFormat;
> +		Size size;
>  
>  		switch (role) {
>  		case StreamRole::StillCapture:
> @@ -322,18 +325,26 @@ CameraConfiguration *PipelineHandlerIPU3::generateConfiguration(Camera *camera,
>  			 * output constraints and required frame margin
>  			 * by rounding down to the closest alignment.
>  			 */
> -			cfg.size = sensorResolution.boundedTo(IMGU_OUTPUT_MAX_SIZE);
> -			cfg.size.width = utils::alignDown(cfg.size.width - 1,
> -							  IMGU_OUTPUT_WIDTH_MARGIN);
> -			cfg.size.height = utils::alignDown(cfg.size.height - 1,
> -							   IMGU_OUTPUT_HEIGHT_MARGIN);
> -			cfg.pixelFormat = formats::NV12;
> -			cfg.bufferCount = IPU3_BUFFER_COUNT;
> +			size = sensorResolution.boundedTo(IMGU_OUTPUT_MAX_SIZE);
> +			size.width = utils::alignDown(size.width - 1,
> +			    			      IMGU_OUTPUT_WIDTH_MARGIN);
> +			size.height = utils::alignDown(size.height - 1,
> +						       IMGU_OUTPUT_HEIGHT_MARGIN);
> +			pixelFormat = formats::NV12;
> +			bufferCount = IPU3_BUFFER_COUNT;
> +			streamFormats[pixelFormat] = { { IMGU_OUTPUT_MIN_SIZE, size } };
>  
>  			break;
>  
>  		case StreamRole::StillCaptureRaw: {
> -			cfg = data->cio2_.generateConfiguration(sensorResolution);
> +			StreamConfiguration cio2Config =
> +				data->cio2_.generateConfiguration(sensorResolution);
> +			pixelFormat = cio2Config.pixelFormat;
> +			size = cio2Config.size;
> +			bufferCount = cio2Config.bufferCount;
> +
> +			for (const PixelFormat &format : data->cio2_.formats())
> +				streamFormats[format] = data->cio2_.sizes();
>  
>  			break;
>  		}
> @@ -345,11 +356,12 @@ CameraConfiguration *PipelineHandlerIPU3::generateConfiguration(Camera *camera,
>  			 * capped to the maximum sensor resolution and aligned
>  			 * to the ImgU output constraints.
>  			 */
> -			cfg.size = sensorResolution.boundedTo({ 1280, 720 })
> -						   .alignedDownTo(IMGU_OUTPUT_WIDTH_ALIGN,
> -							          IMGU_OUTPUT_HEIGHT_ALIGN);
> -			cfg.pixelFormat = formats::NV12;
> -			cfg.bufferCount = IPU3_BUFFER_COUNT;
> +			size = sensorResolution.boundedTo({ 1280, 720 })
> +					       .alignedDownTo(IMGU_OUTPUT_WIDTH_ALIGN,
> +							      IMGU_OUTPUT_HEIGHT_ALIGN);
> +			pixelFormat = formats::NV12;
> +			bufferCount = IPU3_BUFFER_COUNT;
> +			streamFormats[pixelFormat] = { { IMGU_OUTPUT_MIN_SIZE, size } };
>  
>  			break;
>  		}
> @@ -361,6 +373,11 @@ CameraConfiguration *PipelineHandlerIPU3::generateConfiguration(Camera *camera,
>  			return nullptr;
>  		}
>  
> +		StreamFormats formats(streamFormats);
> +		StreamConfiguration cfg(formats);
> +		cfg.size = size;
> +		cfg.pixelFormat = pixelFormat;
> +		cfg.bufferCount = bufferCount;
>  		config->addConfiguration(cfg);
>  	}
>  

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list