[PATCH v1 1/1] libcamera: camera_manager: Add environment variable to order pipelines match
Julien Vuillaumier
julien.vuillaumier at nxp.com
Mon Mar 4 19:18:16 CET 2024
To match the enumerated media devices, each pipeline handler registered
is used in no specific order. It is a limitation when several pipelines
can match the devices, and user has to select a specific pipeline.
For this purpose, environment variable LIBCAMERA_PIPELINES_MATCH_LIST is
created that gives the option to define an ordered list of pipelines
to invoke during the match process.
LIBCAMERA_PIPELINES_MATCH_LIST="<name1>[,<name2>[,<name3>...]]]"
Example:
LIBCAMERA_PIPELINES_MATCH_LIST="PipelineHandlerRkISP1,SimplePipelineHandler"
Signed-off-by: Julien Vuillaumier <julien.vuillaumier at nxp.com>
---
Documentation/environment_variables.rst | 5 +++
src/libcamera/camera_manager.cpp | 51 +++++++++++++++++++++----
2 files changed, 48 insertions(+), 8 deletions(-)
diff --git a/Documentation/environment_variables.rst b/Documentation/environment_variables.rst
index a9b230bc..f3a0d431 100644
--- a/Documentation/environment_variables.rst
+++ b/Documentation/environment_variables.rst
@@ -37,6 +37,11 @@ LIBCAMERA_IPA_MODULE_PATH
Example value: ``${HOME}/.libcamera/lib:/opt/libcamera/vendor/lib``
+LIBCAMERA_PIPELINES_MATCH_LIST
+ Define ordered list of pipelines to be used to match the media devices.
+
+ Example value: ``PipelineHandlerRkISP1,SimplePipelineHandler``
+
LIBCAMERA_RPI_CONFIG_FILE
Define a custom configuration file to use in the Raspberry Pi pipeline handler.
diff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp
index 355f3ada..9568801e 100644
--- a/src/libcamera/camera_manager.cpp
+++ b/src/libcamera/camera_manager.cpp
@@ -109,14 +109,7 @@ void CameraManager::Private::createPipelineHandlers()
const std::vector<PipelineHandlerFactoryBase *> &factories =
PipelineHandlerFactoryBase::factories();
- for (const PipelineHandlerFactoryBase *factory : factories) {
- LOG(Camera, Debug)
- << "Found registered pipeline handler '"
- << factory->name() << "'";
- /*
- * Try each pipeline handler until it exhaust
- * all pipelines it can provide.
- */
+ auto pipeMatch = [&](const PipelineHandlerFactoryBase *factory) {
while (1) {
std::shared_ptr<PipelineHandler> pipe = factory->create(o);
if (!pipe->match(enumerator_.get()))
@@ -126,6 +119,48 @@ void CameraManager::Private::createPipelineHandlers()
<< "Pipeline handler \"" << factory->name()
<< "\" matched";
}
+ };
+
+ /*
+ * When a list of preferred pipelines is defined, iterate through the
+ * ordered list to match the devices enumerated.
+ * Otherwise, devices matching is done in no specific order with each
+ * pipeline handler registered.
+ */
+ const char *pipesLists =
+ utils::secure_getenv("LIBCAMERA_PIPELINES_MATCH_LIST");
+ if (pipesLists) {
+ for (const auto &pipeName : utils::split(pipesLists, ",")) {
+ if (pipeName.empty())
+ continue;
+
+ auto nameMatch = [pipeName](const PipelineHandlerFactoryBase *f) {
+ return (f->name() == pipeName);
+ };
+
+ auto iter = std::find_if(factories.begin(),
+ factories.end(),
+ nameMatch);
+
+ if (iter != factories.end()) {
+ LOG(Camera, Debug)
+ << "Found pipeline handler from list '"
+ << (*iter)->name() << "'";
+ pipeMatch(*iter);
+ }
+ }
+ return;
+ }
+
+ for (const PipelineHandlerFactoryBase *factory : factories) {
+ LOG(Camera, Debug)
+ << "Found registered pipeline handler '"
+ << factory->name() << "'";
+ /*
+ * Try each pipeline handler until it exhausts
+ * all pipelines it can provide.
+ */
+ pipeMatch(factory);
}
}
--
2.34.1
More information about the libcamera-devel
mailing list