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

Message ID 20200714104212.48683-10-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
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 | 45 +++++++++++++++++++---------
 1 file changed, 31 insertions(+), 14 deletions(-)

Comments

Laurent Pinchart July 14, 2020, 9:31 p.m. UTC | #1
Hi Jacopo,

Thank you for the patch.

On Tue, Jul 14, 2020 at 12:42:01PM +0200, Jacopo Mondi wrote:
> 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>

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

> ---
>  src/libcamera/pipeline/ipu3/ipu3.cpp | 45 +++++++++++++++++++---------
>  1 file changed, 31 insertions(+), 14 deletions(-)
> 
> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
> index 517d9bd11fbf..b480d41f89ab 100644
> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp
> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
> @@ -313,7 +313,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:
> @@ -322,18 +325,26 @@ CameraConfiguration *PipelineHandlerIPU3::generateConfiguration(Camera *camera,
>  			 * output constraints and required frame margin
>  			 * by rounding down to the closest alignment.
>  			 */
> -			cfg.size = sensorResolution.boundedTo(IMGU_OUTPUT_MAX_SIZE);
> -			cfg.size.width = utils::alignDown(cfg.size.width - 1,
> -							  IMGU_OUTPUT_WIDTH_MARGIN);
> -			cfg.size.height = utils::alignDown(cfg.size.height - 1,
> -							   IMGU_OUTPUT_HEIGHT_MARGIN);
> -			cfg.pixelFormat = formats::NV12;
> -			cfg.bufferCount = IPU3_BUFFER_COUNT;
> +			size = sensorResolution.boundedTo(IMGU_OUTPUT_MAX_SIZE);
> +			size.width = utils::alignDown(size.width - 1,
> +			    			      IMGU_OUTPUT_WIDTH_MARGIN);
> +			size.height = utils::alignDown(size.height - 1,
> +						       IMGU_OUTPUT_HEIGHT_MARGIN);
> +			pixelFormat = formats::NV12;
> +			bufferCount = IPU3_BUFFER_COUNT;
> +			streamFormats[pixelFormat] = { { IMGU_OUTPUT_MIN_SIZE, size } };
>  
>  			break;
>  
>  		case StreamRole::StillCaptureRaw: {
> -			cfg = data->cio2_.generateConfiguration(sensorResolution);
> +			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;
>  		}
> @@ -345,11 +356,12 @@ CameraConfiguration *PipelineHandlerIPU3::generateConfiguration(Camera *camera,
>  			 * capped to the maximum sensor resolution and aligned
>  			 * to the ImgU output constraints.
>  			 */
> -			cfg.size = sensorResolution.boundedTo({ 1280, 720 })
> -						   .alignedDownTo(IMGU_OUTPUT_WIDTH_ALIGN,
> -							          IMGU_OUTPUT_HEIGHT_ALIGN);
> -			cfg.pixelFormat = formats::NV12;
> -			cfg.bufferCount = IPU3_BUFFER_COUNT;
> +			size = sensorResolution.boundedTo({ 1280, 720 })
> +					       .alignedDownTo(IMGU_OUTPUT_WIDTH_ALIGN,
> +							      IMGU_OUTPUT_HEIGHT_ALIGN);
> +			pixelFormat = formats::NV12;
> +			bufferCount = IPU3_BUFFER_COUNT;
> +			streamFormats[pixelFormat] = { { IMGU_OUTPUT_MIN_SIZE, size } };
>  
>  			break;
>  		}
> @@ -361,6 +373,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);
>  	}
>

Patch

diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index 517d9bd11fbf..b480d41f89ab 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -313,7 +313,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:
@@ -322,18 +325,26 @@  CameraConfiguration *PipelineHandlerIPU3::generateConfiguration(Camera *camera,
 			 * output constraints and required frame margin
 			 * by rounding down to the closest alignment.
 			 */
-			cfg.size = sensorResolution.boundedTo(IMGU_OUTPUT_MAX_SIZE);
-			cfg.size.width = utils::alignDown(cfg.size.width - 1,
-							  IMGU_OUTPUT_WIDTH_MARGIN);
-			cfg.size.height = utils::alignDown(cfg.size.height - 1,
-							   IMGU_OUTPUT_HEIGHT_MARGIN);
-			cfg.pixelFormat = formats::NV12;
-			cfg.bufferCount = IPU3_BUFFER_COUNT;
+			size = sensorResolution.boundedTo(IMGU_OUTPUT_MAX_SIZE);
+			size.width = utils::alignDown(size.width - 1,
+			    			      IMGU_OUTPUT_WIDTH_MARGIN);
+			size.height = utils::alignDown(size.height - 1,
+						       IMGU_OUTPUT_HEIGHT_MARGIN);
+			pixelFormat = formats::NV12;
+			bufferCount = IPU3_BUFFER_COUNT;
+			streamFormats[pixelFormat] = { { IMGU_OUTPUT_MIN_SIZE, size } };
 
 			break;
 
 		case StreamRole::StillCaptureRaw: {
-			cfg = data->cio2_.generateConfiguration(sensorResolution);
+			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;
 		}
@@ -345,11 +356,12 @@  CameraConfiguration *PipelineHandlerIPU3::generateConfiguration(Camera *camera,
 			 * capped to the maximum sensor resolution and aligned
 			 * to the ImgU output constraints.
 			 */
-			cfg.size = sensorResolution.boundedTo({ 1280, 720 })
-						   .alignedDownTo(IMGU_OUTPUT_WIDTH_ALIGN,
-							          IMGU_OUTPUT_HEIGHT_ALIGN);
-			cfg.pixelFormat = formats::NV12;
-			cfg.bufferCount = IPU3_BUFFER_COUNT;
+			size = sensorResolution.boundedTo({ 1280, 720 })
+					       .alignedDownTo(IMGU_OUTPUT_WIDTH_ALIGN,
+							      IMGU_OUTPUT_HEIGHT_ALIGN);
+			pixelFormat = formats::NV12;
+			bufferCount = IPU3_BUFFER_COUNT;
+			streamFormats[pixelFormat] = { { IMGU_OUTPUT_MIN_SIZE, size } };
 
 			break;
 		}
@@ -361,6 +373,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);
 	}