[v5,06/12] libcamera: simple: Add plain output configurations
diff mbox series

Message ID 20250520123158.44237-7-mzamazal@redhat.com
State New
Headers show
Series
  • Enable raw streams with software ISP
Related show

Commit Message

Milan Zamazal May 20, 2025, 12:31 p.m. UTC
Output configurations in simple pipeline are added depending on whether
a converter, software ISP or none of them are used.  If a converter or
software ISP is used, no raw output configurations are added.  Unless
only raw configurations are available, in which case we add them to
avoid ...

In order to support raw output at least with software ISP, let's always
add raw output configurations.  A flag is added to
SimpleCameraData::Configuration indicating whether it's for a raw or a
converted output.  We later filter formats and output sizes for
particular stream configurations according to the new configuration
flag.

This is just preparation and raw output is still not supported.  At the
moment, we simply filter out raw configurations unconditionally to keep
the current code working; this will be changed in followup patches.

Signed-off-by: Milan Zamazal <mzamazal@redhat.com>
---
 src/libcamera/pipeline/simple/simple.cpp | 34 +++++++++++++++---------
 1 file changed, 22 insertions(+), 12 deletions(-)

Patch
diff mbox series

diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp
index 60b7e1b1..d0f44c7d 100644
--- a/src/libcamera/pipeline/simple/simple.cpp
+++ b/src/libcamera/pipeline/simple/simple.cpp
@@ -319,6 +319,7 @@  public:
 		Size captureSize;
 		std::vector<PixelFormat> outputFormats;
 		SizeRange outputSizes;
+		bool raw;
 	};
 
 	std::vector<Stream> streams_;
@@ -708,27 +709,33 @@  void SimpleCameraData::tryPipeline(unsigned int code, const Size &size)
 			continue;
 
 		Configuration config;
+
+		/* Raw configuration */
 		config.code = code;
 		config.sensorSize = size;
 		config.captureFormat = pixelFormat;
 		config.captureSize = format.size;
+		config.outputFormats = { pixelFormat };
+		config.outputSizes = config.captureSize;
+		config.raw = true;
+		configs_.push_back(config);
 
+		/* Modified, non-raw, configuration */
+		config.raw = false;
 		if (converter_) {
 			config.outputFormats = converter_->formats(pixelFormat);
 			config.outputSizes = converter_->sizes(format.size);
 		} else if (swIsp_) {
-			config.outputFormats = swIsp_->formats(pixelFormat);
-			config.outputSizes = swIsp_->sizes(pixelFormat, format.size);
-			if (config.outputFormats.empty()) {
+			std::vector<PixelFormat> outputFormats = swIsp_->formats(pixelFormat);
+			if (outputFormats.empty()) {
 				/* Do not use swIsp for unsupported pixelFormat's. */
-				config.outputFormats = { pixelFormat };
-				config.outputSizes = config.captureSize;
+				continue;
 			}
+			config.outputFormats = outputFormats;
+			config.outputSizes = swIsp_->sizes(pixelFormat, format.size);
 		} else {
-			config.outputFormats = { pixelFormat };
-			config.outputSizes = config.captureSize;
+			continue;
 		}
-
 		configs_.push_back(config);
 	}
 }
@@ -1301,10 +1308,13 @@  SimplePipelineHandler::generateConfiguration(Camera *camera, Span<const StreamRo
 	/* Create the formats map. */
 	std::map<PixelFormat, std::vector<SizeRange>> formats;
 
-	for (const SimpleCameraData::Configuration &cfg : data->configs_) {
-		for (PixelFormat format : cfg.outputFormats)
-			formats[format].push_back(cfg.outputSizes);
-	}
+	const bool rawOnly = std::all_of(data->configs_.cbegin(),
+					 data->configs_.cend(),
+					 [](const auto &c) { return c.raw; });
+	for (const SimpleCameraData::Configuration &cfg : data->configs_)
+		if (!cfg.raw || rawOnly)
+			for (PixelFormat format : cfg.outputFormats)
+				formats[format].push_back(cfg.outputSizes);
 
 	/* Sort the sizes and merge any consecutive overlapping ranges. */
 	for (auto &[format, sizes] : formats) {