[libcamera-devel] [PATCH v2 2/2] pipeline: raspberrypi: Restrict the advertised maximum ISP output resolution

Naushir Patuck naush at raspberrypi.com
Wed Dec 8 13:36:37 CET 2021


Limit the advertised ISP output sizes available to the sensor resolution in
PipelineHandlerRPi::generateConfiguration(). The user is free to configure a
larger resolution than this, and this will work. However, this stops strange
behavior in applications that use the V4L2 compatability layer to run, and
request the largest possible advertised resolution, which is much larger than
the sensor resolution.

Signed-off-by: Naushir Patuck <naush at raspberrypi.com>
Reviewed-by: David Plowman <david.plowman at raspberrypi.com>
Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
---
 src/libcamera/pipeline/raspberrypi/raspberrypi.cpp | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
index 101aaea30743..86851ac467ad 100644
--- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
+++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
@@ -530,10 +530,11 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,
 
 	unsigned int rawCount = 0;
 	unsigned int outCount = 0;
+	Size sensorSize = data->sensor_->resolution();
 	for (const StreamRole role : roles) {
 		switch (role) {
 		case StreamRole::Raw:
-			size = data->sensor_->resolution();
+			size = sensorSize;
 			sensorFormat = findBestFormat(data->sensorFormats_, size, defaultRawBitDepth);
 			pixelFormat = mbusCodeToPixelFormat(sensorFormat.mbus_code,
 							    BayerFormat::Packing::CSI2);
@@ -546,7 +547,7 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,
 			fmts = data->isp_[Isp::Output0].dev()->formats();
 			pixelFormat = formats::NV12;
 			/* Return the largest sensor resolution. */
-			size = data->sensor_->resolution();
+			size = sensorSize;
 			bufferCount = 1;
 			outCount++;
 			break;
@@ -599,11 +600,15 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,
 						std::forward_as_tuple(format.second.begin(), format.second.end()));
 			}
 		} else {
-			/* Translate the V4L2PixelFormat to PixelFormat. */
+			/*
+			 * Translate the V4L2PixelFormat to PixelFormat. Note that we
+			 * limit the recommended largest ISP output size to match the
+			 * sensor resolution.
+			 */
 			for (const auto &format : fmts) {
 				PixelFormat pf = format.first.toPixelFormat();
 				if (pf.isValid())
-					deviceFormats[pf] = format.second;
+					deviceFormats[pf].emplace_back(sensorSize);
 			}
 		}
 
-- 
2.25.1



More information about the libcamera-devel mailing list