[libcamera-devel] [PATCH 15/20] libcamera: pipeline: simple: Add output formats to Configuration
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Sun Jan 31 23:46:57 CET 2021
Store the list of converter output formats in the Configuration
structure, to be used to implement multi-stream support. As the
Configuration structure grows bigger, avoid duplicating it in the
formats_ map for each supported pixel format by storing it in a configs_
vector instead, and storing pointers only in the map.
Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
---
src/libcamera/pipeline/simple/simple.cpp | 40 ++++++++++++++----------
1 file changed, 23 insertions(+), 17 deletions(-)
diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp
index c44fa9ee28ed..6a8253101a61 100644
--- a/src/libcamera/pipeline/simple/simple.cpp
+++ b/src/libcamera/pipeline/simple/simple.cpp
@@ -159,6 +159,7 @@ public:
uint32_t code;
PixelFormat captureFormat;
Size captureSize;
+ std::vector<PixelFormat> outputFormats;
SizeRange outputSizes;
};
@@ -167,7 +168,8 @@ public:
std::list<Entity> entities_;
V4L2VideoDevice *video_;
- std::map<PixelFormat, Configuration> formats_;
+ std::vector<Configuration> configs_;
+ std::map<PixelFormat, const Configuration *> formats_;
};
class SimpleCameraConfiguration : public CameraConfiguration
@@ -371,13 +373,6 @@ int SimpleCameraData::init()
})
<< " ]";
- /*
- * Store the configuration in the formats_ map, mapping the
- * PixelFormat to the corresponding configuration. Any
- * previously stored value is overwritten, as the pipeline
- * handler currently doesn't care about how a particular
- * PixelFormat is achieved.
- */
for (const auto &videoFormat : videoFormats) {
PixelFormat pixelFormat = videoFormat.first.toPixelFormat();
if (!pixelFormat)
@@ -389,23 +384,34 @@ int SimpleCameraData::init()
config.captureSize = format.size;
if (!converter) {
+ config.outputFormats = { pixelFormat };
config.outputSizes = config.captureSize;
- formats_[pixelFormat] = config;
- continue;
+ } else {
+ config.outputFormats = converter->formats(pixelFormat);
+ config.outputSizes = converter->sizes(format.size);
}
- config.outputSizes = converter->sizes(format.size);
-
- for (PixelFormat fmt : converter->formats(pixelFormat))
- formats_[fmt] = config;
+ configs_.push_back(config);
}
}
- if (formats_.empty()) {
+ if (configs_.empty()) {
LOG(SimplePipeline, Error) << "No valid configuration found";
return -EINVAL;
}
+ /*
+ * Map the pixel formats to configurations. Any previously stored value
+ * is overwritten, as the pipeline handler currently doesn't care about
+ * how a particular PixelFormat is achieved.
+ */
+ for (const Configuration &config : configs_) {
+ formats_[config.captureFormat] = &config;
+
+ for (PixelFormat fmt : config.outputFormats)
+ formats_[fmt] = &config;
+ }
+
properties_ = sensor_->properties();
return 0;
@@ -548,7 +554,7 @@ CameraConfiguration::Status SimpleCameraConfiguration::validate()
status = Adjusted;
}
- pipeConfig_ = &it->second;
+ pipeConfig_ = it->second;
if (!pipeConfig_->outputSizes.contains(cfg.size)) {
LOG(SimplePipeline, Debug)
<< "Adjusting size from " << cfg.size.toString()
@@ -614,7 +620,7 @@ CameraConfiguration *SimplePipelineHandler::generateConfiguration(Camera *camera
std::inserter(formats, formats.end()),
[](const auto &format) -> decltype(formats)::value_type {
const PixelFormat &pixelFormat = format.first;
- const Size &size = format.second.captureSize;
+ const Size &size = format.second->captureSize;
return { pixelFormat, { size } };
});
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list