[libcamera-devel] [PATCH v6 1/6] pipeline: raspberrypi: Refactor stream configuration routine

Naushir Patuck naush at raspberrypi.com
Mon Feb 8 16:07:33 CET 2021


Refactor the high/low resolution stream format and output selection
routine. This change is in preparation of adding 1/4 resolution output
for fast colour denoise.

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>
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
---
 .../pipeline/raspberrypi/raspberrypi.cpp      | 57 ++++++-------------
 1 file changed, 16 insertions(+), 41 deletions(-)

diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
index 0804a4393c19..183a690dbca1 100644
--- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
+++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
@@ -623,52 +623,27 @@ int PipelineHandlerRPi::configure(Camera *camera, CameraConfiguration *config)
 			continue;
 		}
 
-		if (i == maxIndex) {
-			/* ISP main output format. */
-			V4L2VideoDevice *dev = data->isp_[Isp::Output0].dev();
-			V4L2PixelFormat fourcc = dev->toV4L2PixelFormat(cfg.pixelFormat);
-			format.size = cfg.size;
-			format.fourcc = fourcc;
-
-			ret = dev->setFormat(&format);
-			if (ret)
-				return -EINVAL;
-
-			if (format.size != cfg.size || format.fourcc != fourcc) {
-				LOG(RPI, Error)
-					<< "Failed to set format on ISP capture0 device: "
-					<< format.toString();
-				return -EINVAL;
-			}
-
-			cfg.setStream(&data->isp_[Isp::Output0]);
-			data->isp_[Isp::Output0].setExternal(true);
-		}
+		/* The largest resolution gets routed to the ISP Output 0 node. */
+		RPi::Stream *stream = i == maxIndex ? &data->isp_[Isp::Output0]
+						      : &data->isp_[Isp::Output1];
 
-		/*
-		 * ISP second output format. This fallthrough means that if a
-		 * second output stream has not been configured, we simply use
-		 * the Output0 configuration.
-		 */
-		V4L2VideoDevice *dev = data->isp_[Isp::Output1].dev();
-		format.fourcc = dev->toV4L2PixelFormat(cfg.pixelFormat);
+		V4L2PixelFormat fourcc = stream->dev()->toV4L2PixelFormat(cfg.pixelFormat);
 		format.size = cfg.size;
+		format.fourcc = fourcc;
 
-		ret = dev->setFormat(&format);
-		if (ret) {
+		ret = stream->dev()->setFormat(&format);
+		if (ret)
+			return -EINVAL;
+
+		if (format.size != cfg.size || format.fourcc != fourcc) {
 			LOG(RPI, Error)
-				<< "Failed to set format on ISP capture1 device: "
-				<< format.toString();
-			return ret;
-		}
-		/*
-		 * If we have not yet provided a stream for this config, it
-		 * means this is to be routed from Output1.
-		 */
-		if (!cfg.stream()) {
-			cfg.setStream(&data->isp_[Isp::Output1]);
-			data->isp_[Isp::Output1].setExternal(true);
+				<< "Failed to set requested format on " << stream->name()
+				<< ", returned " << format.toString();
+			return -EINVAL;
 		}
+
+		cfg.setStream(stream);
+		stream->setExternal(true);
 	}
 
 	/* ISP statistics output format. */
-- 
2.25.1



More information about the libcamera-devel mailing list