[libcamera-devel] [RFC] libcamera: ipu3: Always use sensor full frame size

Niklas Söderlund niklas.soderlund at ragnatech.se
Thu Sep 10 12:25:46 CEST 2020


Hi Jacopo,

Thanks for your work.

On 2020-09-09 15:10:14 +0200, Jacopo Mondi wrote:
> When calculating the pipeline configuration for the IPU3 platform,
> libcamera tries to be smart and select the smaller sensor frame
> resolution larger enough to accommodate the stream sizes
> requested by the application.
> 
> While this seems to make a lot of sense, in practice optimizing the
> selected sensor resolution makes the pipeline configuration calculation
> process fail in multiple occasions, or results in stalls in the capture
> process.
> 
> As a trivial example, capturing with cam with the following command
> line result in a stall:
> $ cam -swidth=1280,height=720 -swidth=640,height=480 -c1 -C
> 
> Likewise, the Android HAL supported format enumeration fails in
> reporting smaller resolutions as supported, when used with the OV5670
> sensor.
> 
> 320x240:
> DEBUG IPU3 ipu3.cpp:192 CIO2 configuration: 648x486-SGRBG10_IPU3
> ERROR IPU3 imgu.cpp:408 Failed to calculate pipe configuration
> ERROR IPU3 ipu3.cpp:299 Failed to calculate pipe configuration: unsupported resolutions.
> 
> 640x480:
> DEBUG IPU3 ipu3.cpp:192 CIO2 configuration: 648x486-SGRBG10_IPU3
> ERROR IPU3 imgu.cpp:408 Failed to calculate pipe configuration
> ERROR IPU3 ipu3.cpp:299 Failed to calculate pipe configuration: unsupported resolutions.
> 
> Furthermore the reference .xml files used for the IPU3 camera
> configuration on the ChromeOS platform restrict the number of sensor
> resolution to be used for the OV5670 sensor to 2 from the 6 supported by
> the driver [1].
> 
> The selection criteria of the correct CIO2 mode are not specified, and
> for the time being, always use the sensor maximum resolution at the
> expense of frame rate and bus bandwidth allows the pipeline to successfully
> support smaller modes for the OV5670 sensor and solves pipeline stalls
> when capturing with both sensors.
> 
> [1] See the <sensor_modes> enumeration in:
> https://chromium.googlesource.com/chromiumos/overlays/board-overlays/+/master/baseboard-poppy/media-libs/cros-camera-hal-configs-poppy/files/gcss/graph_settings_ov5670.xml
> 
> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>

I love how the IPU3 configuration depends on a xml file ;-) Given that 
our current configuration depends on this and assumes the larger 
resolution I think this is the right move.

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

> ---
>  src/libcamera/pipeline/ipu3/ipu3.cpp | 9 +--------
>  1 file changed, 1 insertion(+), 8 deletions(-)
> 
> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
> index 2d881fe28f98..488e9fff299e 100644
> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp
> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
> @@ -155,14 +155,12 @@ CameraConfiguration::Status IPU3CameraConfiguration::validate()
>  	unsigned int rawCount = 0;
>  	unsigned int yuvCount = 0;
>  	Size maxYuvSize;
> -	Size maxRawSize;
>  
>  	for (const StreamConfiguration &cfg : config_) {
>  		const PixelFormatInfo &info = PixelFormatInfo::info(cfg.pixelFormat);
>  
>  		if (info.colourEncoding == PixelFormatInfo::ColourEncodingRAW) {
>  			rawCount++;
> -			maxRawSize.expandTo(cfg.size);
>  		} else {
>  			yuvCount++;
>  			maxYuvSize.expandTo(cfg.size);
> @@ -174,18 +172,13 @@ CameraConfiguration::Status IPU3CameraConfiguration::validate()
>  		return Invalid;
>  	}
>  
> -	if (maxRawSize.isNull())
> -		maxRawSize = maxYuvSize.alignedUpTo(IMGU_OUTPUT_WIDTH_MARGIN,
> -						    IMGU_OUTPUT_HEIGHT_MARGIN)
> -				       .boundedTo(data_->cio2_.sensor()->resolution());
> -
>  	/*
>  	 * Generate raw configuration from CIO2.
>  	 *
>  	 * The output YUV streams will be limited in size to the maximum
>  	 * frame size requested for the RAW stream.
>  	 */
> -	cio2Configuration_ = data_->cio2_.generateConfiguration(maxRawSize);
> +	cio2Configuration_ = data_->cio2_.generateConfiguration({});
>  	if (!cio2Configuration_.pixelFormat.isValid())
>  		return Invalid;
>  
> -- 
> 2.28.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