[libcamera-devel] [PATCH v2] libcamera: pipeline: raspberrypi: Add StreamFormats to StreamConfiguration

Naushir Patuck naush at raspberrypi.com
Thu Jun 25 09:28:44 CEST 2020


In generateConfiguration(), add the device node specific formats to the
StreamConfiguration for each StreamRole requested.

Signed-off-by: Naushir Patuck <naush at raspberrypi.com>
Reviewed-by: Jacopo Mondi <jacopo at jmondi.org>
Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
---
 .../pipeline/raspberrypi/raspberrypi.cpp      | 52 +++++++++++++------
 1 file changed, 36 insertions(+), 16 deletions(-)

diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
index 60985b71..dcd737a1 100644
--- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
+++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
@@ -518,41 +518,45 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,
 	RPiCameraData *data = cameraData(camera);
 	CameraConfiguration *config = new RPiCameraConfiguration(data);
 	V4L2DeviceFormat sensorFormat;
+	unsigned int bufferCount;
+	PixelFormat pixelFormat;
 	V4L2PixFmtMap fmts;
+	Size size;
 
 	if (roles.empty())
 		return config;
 
 	for (const StreamRole role : roles) {
-		StreamConfiguration cfg{};
-
 		switch (role) {
 		case StreamRole::StillCaptureRaw:
-			cfg.size = data->sensor_->resolution();
+			size = data->sensor_->resolution();
 			fmts = data->unicam_[Unicam::Image].dev()->formats();
-			sensorFormat = findBestMode(fmts, cfg.size);
-			cfg.pixelFormat = sensorFormat.fourcc.toPixelFormat();
-			ASSERT(cfg.pixelFormat.isValid());
-			cfg.bufferCount = 1;
+			sensorFormat = findBestMode(fmts, size);
+			pixelFormat = sensorFormat.fourcc.toPixelFormat();
+			ASSERT(pixelFormat.isValid());
+			bufferCount = 1;
 			break;
 
 		case StreamRole::StillCapture:
-			cfg.pixelFormat = formats::NV12;
+			fmts = data->isp_[Isp::Output0].dev()->formats();
+			pixelFormat = formats::NV12;
 			/* Return the largest sensor resolution. */
-			cfg.size = data->sensor_->resolution();
-			cfg.bufferCount = 1;
+			size = data->sensor_->resolution();
+			bufferCount = 1;
 			break;
 
 		case StreamRole::VideoRecording:
-			cfg.pixelFormat = formats::NV12;
-			cfg.size = { 1920, 1080 };
-			cfg.bufferCount = 4;
+			fmts = data->isp_[Isp::Output0].dev()->formats();
+			pixelFormat = formats::NV12;
+			size = { 1920, 1080 };
+			bufferCount = 4;
 			break;
 
 		case StreamRole::Viewfinder:
-			cfg.pixelFormat = formats::ARGB8888;
-			cfg.size = { 800, 600 };
-			cfg.bufferCount = 4;
+			fmts = data->isp_[Isp::Output0].dev()->formats();
+			pixelFormat = formats::ARGB8888;
+			size = { 800, 600 };
+			bufferCount = 4;
 			break;
 
 		default:
@@ -561,6 +565,22 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,
 			break;
 		}
 
+		/* Translate the V4L2PixelFormat to PixelFormat. */
+		std::map<PixelFormat, std::vector<SizeRange>> deviceFormats;
+		std::transform(fmts.begin(), fmts.end(), std::inserter(deviceFormats, deviceFormats.end()),
+			       [&](const decltype(fmts)::value_type &format) {
+					return decltype(deviceFormats)::value_type{
+						format.first.toPixelFormat(),
+						format.second
+					};
+			       });
+
+		/* Add the stream format based on the device node used for the use case. */
+		StreamFormats formats(deviceFormats);
+		StreamConfiguration cfg(formats);
+		cfg.size = size;
+		cfg.pixelFormat = pixelFormat;
+		cfg.bufferCount = bufferCount;
 		config->addConfiguration(cfg);
 	}
 
-- 
2.25.1



More information about the libcamera-devel mailing list