[libcamera-devel] [PATCH 05/15] libcamera: ipu3: Report StreamFormats

Niklas Söderlund niklas.soderlund at ragnatech.se
Wed Jul 1 18:30:04 CEST 2020


Hi Jacopo,

Thanks for your work.

On 2020-07-01 14:30:26 +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.
> 
> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> ---
>  src/libcamera/pipeline/ipu3/ipu3.cpp | 47 +++++++++++++++++++++-------
>  1 file changed, 35 insertions(+), 12 deletions(-)
> 
> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
> index cd18c6f31023..ed2360347fb4 100644
> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp
> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
> @@ -33,6 +33,9 @@ LOG_DEFINE_CATEGORY(IPU3)
>  
>  static constexpr unsigned int IPU3_BUFFER_COUNT = 4;
>  static constexpr unsigned int IPU3_MAX_STREAMS = 3;
> +static constexpr unsigned int IPU3_OUTPUT_MAX_WIDTH = 4480;
> +static constexpr unsigned int IPU3_OUTPUT_MAX_HEIGHT = 34004;
> +static const Size minIPU3OutputSize = { 2, 2 };
>  
>  class IPU3CameraData : public CameraData
>  {
> @@ -295,15 +298,19 @@ CameraConfiguration *PipelineHandlerIPU3::generateConfiguration(Camera *camera,
>  {
>  	IPU3CameraData *data = cameraData(camera);
>  	IPU3CameraConfiguration *config = new IPU3CameraConfiguration(camera, data);
> +	CIO2Device *cio2 = &data->cio2_;

This chance touches none of the code that is added and only modifies 
code that is already here. I like it the way it is and that data is used 
in the code below. If it must change I would do so in a separate patch.

Whit this fixed,

Reviewed-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>

>  
>  	if (roles.empty())
>  		return config;
>  
> -	Size sensorResolution = data->cio2_.sensor()->resolution();
> +	Size sensorResolution = cio2->sensor()->resolution();
>  	unsigned int rawCount = 0;
>  	unsigned int outCount = 0;
>  	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:
> @@ -311,19 +318,29 @@ CameraConfiguration *PipelineHandlerIPU3::generateConfiguration(Camera *camera,
>  			 * Use the sensor resolution adjusted to respect the
>  			 * ImgU output alignement contraints.
>  			 */
> -			cfg.pixelFormat = formats::NV12;
> -			cfg.size = sensorResolution;
> -			cfg.size.width &= ~7;
> -			cfg.size.height &= ~3;
> -			cfg.bufferCount = IPU3_BUFFER_COUNT;
> +			pixelFormat = formats::NV12;
> +			size.width = std::min(sensorResolution.width,
> +					      IPU3_OUTPUT_MAX_WIDTH);
> +			size.height = std::min(sensorResolution.height,
> +					       IPU3_OUTPUT_MAX_HEIGHT);
> +			size.width &= ~7;
> +			size.height &= ~3;
> +			bufferCount = IPU3_BUFFER_COUNT;
> +			streamFormats[pixelFormat] = { { minIPU3OutputSize, size } };
>  
>  			outCount++;
>  
>  			break;
>  
>  		case StreamRole::StillCaptureRaw: {
> -			cfg = data->cio2_.generateConfiguration(sensorResolution);
> -			cfg.bufferCount = 1;
> +			StreamConfiguration cio2Config =
> +				cio2->generateConfiguration(sensorResolution);
> +			pixelFormat = cio2Config.pixelFormat;
> +			size = cio2Config.size;
> +			bufferCount = cio2Config.bufferCount;
> +
> +			for (const PixelFormat &format : cio2->formats())
> +				streamFormats[format] = cio2->sizes();
>  
>  			rawCount++;
>  
> @@ -339,9 +356,10 @@ CameraConfiguration *PipelineHandlerIPU3::generateConfiguration(Camera *camera,
>  			 */
>  			unsigned int width = std::min(1280U, sensorResolution.width);
>  			unsigned int height = std::min(720U, sensorResolution.height);
> -			cfg.size = { width & ~7, height & ~3 };
> -			cfg.pixelFormat = formats::NV12;
> -			cfg.bufferCount = IPU3_BUFFER_COUNT;
> +			size = { width & ~7, height & ~3 };
> +			pixelFormat = formats::NV12;
> +			bufferCount = IPU3_BUFFER_COUNT;
> +			streamFormats[pixelFormat] = { { minIPU3OutputSize, size } };
>  
>  			outCount++;
>  
> @@ -361,6 +379,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);
>  	}
>  
> -- 
> 2.27.0
> 
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel at lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel

-- 
Regards,
Niklas Söderlund


More information about the libcamera-devel mailing list