[PATCH v3 3/8] libcamera: simple: Add plain output configurations
Milan Zamazal
mzamazal at redhat.com
Wed Mar 5 20:26:10 CET 2025
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.
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 at redhat.com>
---
src/libcamera/pipeline/simple/simple.cpp | 31 +++++++++++++++---------
1 file changed, 19 insertions(+), 12 deletions(-)
diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp
index 4af5926f..c805639c 100644
--- a/src/libcamera/pipeline/simple/simple.cpp
+++ b/src/libcamera/pipeline/simple/simple.cpp
@@ -273,6 +273,7 @@ public:
Size captureSize;
std::vector<PixelFormat> outputFormats;
SizeRange outputSizes;
+ bool raw;
};
std::vector<Stream> streams_;
@@ -636,27 +637,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);
}
}
@@ -1171,10 +1178,10 @@ 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);
- }
+ for (const SimpleCameraData::Configuration &cfg : data->configs_)
+ if (!cfg.raw)
+ 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) {
--
2.48.1
More information about the libcamera-devel
mailing list