mirror of
https://git.libcamera.org/libcamera/libcamera.git
synced 2025-07-13 07:19:45 +03:00
libcamera: camera_manager: Add environment variable to order pipelines match
To match the enumerated media devices, each registered pipeline handler 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 to give the option to define an ordered list of pipelines to match on. LIBCAMERA_PIPELINES_MATCH_LIST="<name1>[,<name2>[,<name3>...]]]" Example: LIBCAMERA_PIPELINES_MATCH_LIST="rkisp1,simple" Signed-off-by: Julien Vuillaumier <julien.vuillaumier@nxp.com> Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
parent
353ccef143
commit
d258025da7
3 changed files with 50 additions and 12 deletions
|
@ -37,6 +37,14 @@ LIBCAMERA_IPA_MODULE_PATH
|
||||||
|
|
||||||
Example value: ``${HOME}/.libcamera/lib:/opt/libcamera/vendor/lib``
|
Example value: ``${HOME}/.libcamera/lib:/opt/libcamera/vendor/lib``
|
||||||
|
|
||||||
|
LIBCAMERA_PIPELINES_MATCH_LIST
|
||||||
|
Define an ordered list of pipeline names to be used to match the media
|
||||||
|
devices in the system. The pipeline handler names used to populate the
|
||||||
|
variable are the ones passed to the REGISTER_PIPELINE_HANDLER() macro in the
|
||||||
|
source code.
|
||||||
|
|
||||||
|
Example value: ``rkisp1,simple``
|
||||||
|
|
||||||
LIBCAMERA_RPI_CONFIG_FILE
|
LIBCAMERA_RPI_CONFIG_FILE
|
||||||
Define a custom configuration file to use in the Raspberry Pi pipeline handler.
|
Define a custom configuration file to use in the Raspberry Pi pipeline handler.
|
||||||
|
|
||||||
|
|
|
@ -44,6 +44,7 @@ protected:
|
||||||
private:
|
private:
|
||||||
int init();
|
int init();
|
||||||
void createPipelineHandlers();
|
void createPipelineHandlers();
|
||||||
|
void pipelineFactoryMatch(const PipelineHandlerFactoryBase *factory);
|
||||||
void cleanup() LIBCAMERA_TSA_EXCLUDES(mutex_);
|
void cleanup() LIBCAMERA_TSA_EXCLUDES(mutex_);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -99,16 +99,37 @@ int CameraManager::Private::init()
|
||||||
|
|
||||||
void CameraManager::Private::createPipelineHandlers()
|
void CameraManager::Private::createPipelineHandlers()
|
||||||
{
|
{
|
||||||
CameraManager *const o = LIBCAMERA_O_PTR();
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* \todo Try to read handlers and order from configuration
|
* \todo Try to read handlers and order from configuration
|
||||||
* file and only fallback on all handlers if there is no
|
* file and only fallback on environment variable or all handlers, if
|
||||||
* configuration file.
|
* there is no configuration file.
|
||||||
*/
|
*/
|
||||||
|
const char *pipesList =
|
||||||
|
utils::secure_getenv("LIBCAMERA_PIPELINES_MATCH_LIST");
|
||||||
|
if (pipesList) {
|
||||||
|
/*
|
||||||
|
* When a list of preferred pipelines is defined, iterate
|
||||||
|
* through the ordered list to match the enumerated devices.
|
||||||
|
*/
|
||||||
|
for (const auto &pipeName : utils::split(pipesList, ",")) {
|
||||||
|
const PipelineHandlerFactoryBase *factory;
|
||||||
|
factory = PipelineHandlerFactoryBase::getFactoryByName(pipeName);
|
||||||
|
if (!factory)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
LOG(Camera, Debug)
|
||||||
|
<< "Found listed pipeline handler '"
|
||||||
|
<< pipeName << "'";
|
||||||
|
pipelineFactoryMatch(factory);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const std::vector<PipelineHandlerFactoryBase *> &factories =
|
const std::vector<PipelineHandlerFactoryBase *> &factories =
|
||||||
PipelineHandlerFactoryBase::factories();
|
PipelineHandlerFactoryBase::factories();
|
||||||
|
|
||||||
|
/* Match all the registered pipeline handlers. */
|
||||||
for (const PipelineHandlerFactoryBase *factory : factories) {
|
for (const PipelineHandlerFactoryBase *factory : factories) {
|
||||||
LOG(Camera, Debug)
|
LOG(Camera, Debug)
|
||||||
<< "Found registered pipeline handler '"
|
<< "Found registered pipeline handler '"
|
||||||
|
@ -117,6 +138,15 @@ void CameraManager::Private::createPipelineHandlers()
|
||||||
* Try each pipeline handler until it exhaust
|
* Try each pipeline handler until it exhaust
|
||||||
* all pipelines it can provide.
|
* all pipelines it can provide.
|
||||||
*/
|
*/
|
||||||
|
pipelineFactoryMatch(factory);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CameraManager::Private::pipelineFactoryMatch(const PipelineHandlerFactoryBase *factory)
|
||||||
|
{
|
||||||
|
CameraManager *const o = LIBCAMERA_O_PTR();
|
||||||
|
|
||||||
|
/* Provide as many matching pipelines as possible. */
|
||||||
while (1) {
|
while (1) {
|
||||||
std::shared_ptr<PipelineHandler> pipe = factory->create(o);
|
std::shared_ptr<PipelineHandler> pipe = factory->create(o);
|
||||||
if (!pipe->match(enumerator_.get()))
|
if (!pipe->match(enumerator_.get()))
|
||||||
|
@ -126,7 +156,6 @@ void CameraManager::Private::createPipelineHandlers()
|
||||||
<< "Pipeline handler \"" << factory->name()
|
<< "Pipeline handler \"" << factory->name()
|
||||||
<< "\" matched";
|
<< "\" matched";
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CameraManager::Private::cleanup()
|
void CameraManager::Private::cleanup()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue