[libcamera-devel,11/20] libcamera: ipu3: Validate the stream combination

Message ID 20200714104212.48683-12-jacopo@jmondi.org
State Accepted
Headers show
Series
  • libcamera: ipu3: Rework pipe configuration
Related show

Commit Message

Jacopo Mondi July 14, 2020, 10:42 a.m. UTC
The IPU3 pipeline handler supports 2 processed RGB/YUV streams
and one RAW stream. Validate that the requested stream combination is
supported in the pipeline handler validate() implementation and return
an error in case it's not.

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
---
 src/libcamera/pipeline/ipu3/ipu3.cpp | 23 +++++++++++++++++++----
 1 file changed, 19 insertions(+), 4 deletions(-)

Patch

diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index 6a93a48c2402..19e07fd57e39 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -241,19 +241,34 @@  CameraConfiguration::Status IPU3CameraConfiguration::validate()
 	}
 
 	/*
-	 * Select the sensor format by collecting the maximum width and height
-	 * and picking the closest larger match, as the IPU3 can downscale
-	 * only. If no resolution is requested for any stream, or if no sensor
-	 * resolution is large enough, pick the largest one.
+	 * Validate the requested stream configuration and select the sensor
+	 * format by collecting the maximum width and height and picking the
+	 * closest larger match, as the IPU3 can downscale only. If no
+	 * resolution is requested for any stream, or if no sensor resolution is
+	 * large enough, pick the largest one.
 	 */
+	unsigned int rawCount = 0;
+	unsigned int yuvCount = 0;
 	Size size;
 
 	for (const StreamConfiguration &cfg : config_) {
+		const PixelFormatInfo &info = PixelFormatInfo::info(cfg.pixelFormat);
+
+		if (info.colourEncoding == PixelFormatInfo::ColourEncodingRAW)
+			rawCount++;
+		else
+			yuvCount++;
+
 		if (cfg.size.width > size.width)
 			size.width = cfg.size.width;
 		if (cfg.size.height > size.height)
 			size.height = cfg.size.height;
 	}
+	if (rawCount > 1 || yuvCount > 2) {
+		LOG(IPU3, Debug)
+			<< "Camera configuration not supported";
+		return Invalid;
+	}
 
 	/* Generate raw configuration from CIO2. */
 	cio2Configuration_ = data_->cio2_.generateConfiguration(size);