[libcamera-devel,v2,06/20] libcamera: ipu3: Report StreamFormats

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

Commit Message

Jacopo Mondi July 9, 2020, 8:41 a.m. UTC
Report StreamFormats associated to each StreamConfiguration generated
by the IPU3 pipeline handler.

The StreamFormats are generated differently for RAW and processed
streams, with the former using the sensor enumerated resolutions and
the latter using a continuous range of sizes constructed by matching the
sensor capabilities with the platform constraints.

Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
---
 src/libcamera/pipeline/ipu3/ipu3.cpp | 50 ++++++++++++++++++----------
 1 file changed, 33 insertions(+), 17 deletions(-)

Patch

diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index 978a6e58c72f..d27acb405a1d 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -306,7 +306,10 @@  CameraConfiguration *PipelineHandlerIPU3::generateConfiguration(Camera *camera,
 
 	Size sensorResolution = data->cio2_.sensor()->resolution();
 	for (const StreamRole role : roles) {
-		StreamConfiguration cfg = {};
+		std::map<PixelFormat, std::vector<SizeRange>> streamFormats;
+		unsigned int bufferCount;
+		PixelFormat pixelFormat;
+		Size size;
 
 		switch (role) {
 		case StreamRole::StillCapture:
@@ -314,20 +317,27 @@  CameraConfiguration *PipelineHandlerIPU3::generateConfiguration(Camera *camera,
 			 * Use the sensor resolution aligned to the ImgU
 			 * output constraints.
 			 */
-			cfg.size.width = std::min(sensorResolution.width,
-						  IPU3_OUTPUT_MAX_WIDTH);
-			cfg.size.height = std::min(sensorResolution.height,
-						   IPU3_OUTPUT_MAX_HEIGHT);
-			cfg.size.width &= ~IPU3_OUTPUT_WIDTH_ALIGN;
-			cfg.size.height &= ~IPU3_OUTPUT_HEIGHT_ALIGN;
-			cfg.pixelFormat = formats::NV12;
-			cfg.bufferCount = IPU3_BUFFER_COUNT;
+			size.width = std::min(sensorResolution.width,
+					      IPU3_OUTPUT_MAX_WIDTH);
+			size.height = std::min(sensorResolution.height,
+					       IPU3_OUTPUT_MAX_HEIGHT);
+			size.width &= ~IPU3_OUTPUT_WIDTH_ALIGN;
+			size.height &= ~IPU3_OUTPUT_HEIGHT_ALIGN;
+			pixelFormat = formats::NV12;
+			bufferCount = IPU3_BUFFER_COUNT;
+			streamFormats[pixelFormat] = { { minIPU3OutputSize, size } };
 
 			break;
 
 		case StreamRole::StillCaptureRaw: {
-			cfg = data->cio2_.generateConfiguration(sensorResolution);
-			cfg.bufferCount = 1;
+			StreamConfiguration cio2Config =
+				data->cio2_.generateConfiguration(sensorResolution);
+			pixelFormat = cio2Config.pixelFormat;
+			size = cio2Config.size;
+			bufferCount = cio2Config.bufferCount;
+
+			for (const PixelFormat &format : data->cio2_.formats())
+				streamFormats[format] = data->cio2_.sizes();
 
 			break;
 		}
@@ -339,12 +349,13 @@  CameraConfiguration *PipelineHandlerIPU3::generateConfiguration(Camera *camera,
 			 * sensor resolution and aligned to the ImgU output
 			 * constraints.
 			 */
-			cfg.size.width = std::min(1280U, sensorResolution.width);
-			cfg.size.height = std::min(720U, sensorResolution.height);
-			cfg.size.width &= ~IPU3_OUTPUT_WIDTH_ALIGN;
-			cfg.size.height &= ~IPU3_OUTPUT_HEIGHT_ALIGN;
-			cfg.pixelFormat = formats::NV12;
-			cfg.bufferCount = IPU3_BUFFER_COUNT;
+			size.width = std::min(1280U, sensorResolution.width);
+			size.height = std::min(720U, sensorResolution.height);
+			size.width &= ~IPU3_OUTPUT_WIDTH_ALIGN;
+			size.height &= ~IPU3_OUTPUT_HEIGHT_ALIGN;
+			pixelFormat = formats::NV12;
+			bufferCount = IPU3_BUFFER_COUNT;
+			streamFormats[pixelFormat] = { { minIPU3OutputSize, size } };
 
 			break;
 		}
@@ -356,6 +367,11 @@  CameraConfiguration *PipelineHandlerIPU3::generateConfiguration(Camera *camera,
 			return nullptr;
 		}
 
+		StreamFormats formats(streamFormats);
+		StreamConfiguration cfg(formats);
+		cfg.size = size;
+		cfg.pixelFormat = pixelFormat;
+		cfg.bufferCount = bufferCount;
 		config->addConfiguration(cfg);
 	}