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

Jacopo Mondi jacopo at jmondi.org
Wed Sep 9 15:10:14 CEST 2020


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>
---
 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



More information about the libcamera-devel mailing list