[EXT] Re: [PATCH v1 1/1] libcamera: camera_manager: Add environment variable to order pipelines match

Julien Vuillaumier julien.vuillaumier at nxp.com
Wed Mar 6 18:57:58 CET 2024


Hi Kieran,

On 05/03/2024 07:54, Kieran Bingham wrote:
> Caution: This is an external email. Please take care when clicking links or opening attachments. When in doubt, report the message using the 'Report this email' button
> 
> 
> Quoting Julien Vuillaumier (2024-03-04 18:18:16)
>> 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) {
> 
> Does this need to be a lambda? is there a specific benefit, or can it be
> a function? I find lambda's hard to parse :-( but perhaps that's just
> me, so lets see what others say.

This lambda can be moved to a function, but this function would probably 
never be used from anywhere else - for that reason it was made local as 
a lambda. But if consensus is to limit usage of lambda, a function can 
be used instead.

> 
>>                  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
> 
> s/devices/device/
> 

I will update in v2 - thanks.

>> +        * 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 we do this - I'd probably add support to the PipelineHandlerFactory
> to support getting by name as a preceeding patch.
> 

Sure, I can do - will update in v2.

>> +
>> +                       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