[PATCH v3 2/2] libcamera: camera_manager: Add environment variable to order pipelines match

Milan Zamazal mzamazal at redhat.com
Tue Apr 23 12:34:56 CEST 2024


Kieran Bingham <kieran.bingham at ideasonboard.com> writes:

> Quoting Julien Vuillaumier (2024-03-27 17:27:31)
>> 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="PipelineHandlerRkISP1,SimplePipelineHandler"
>
> I still think this env variable (and presumably also possible to set in
> a configuration file with Milan's configuration file work) makes sense.

As for the configuration file, I just posted "Add global configuration file"
patch series.  I haven't tried to include these patches there but feel free to
comment on / use / ignore the configuration file patches.

Regards,
Milan

> I do wish the match list used the short names that are equivalent to how
> the meson configuration would name them though. Perhaps as you suggested
> by using a parameter to the pipeline handler registration instead so
> that a more suitable name is used for the references.
>
> That would still then work with the previous patch I believe.
>
> So ... I think it's worth making the naming easier for users if we set
> this ... but I also think this patch is ok.
>
>
> Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
>
> So the question is - if we merge this - does it become some sort of
> expected ABI and mean we /shouldn't/ then change the name to the more
> user-friendly ones? And therefore we should do that first? or just do it
> on top ?
>
> --
> Kieran
>
>
>> 
>> Signed-off-by: Julien Vuillaumier <julien.vuillaumier at nxp.com>
>> Reviewed-by: Jacopo Mondi <jacopo.mondi at ideasonboard.com>
>> ---
>>  Documentation/environment_variables.rst     |  8 ++++
>>  include/libcamera/internal/camera_manager.h |  1 +
>>  src/libcamera/camera_manager.cpp            | 53 ++++++++++++++++-----
>>  3 files changed, 50 insertions(+), 12 deletions(-)
>> 
>> diff --git a/Documentation/environment_variables.rst b/Documentation/environment_variables.rst
>> index a9b230bc..c763435c 100644
>> --- a/Documentation/environment_variables.rst
>> +++ b/Documentation/environment_variables.rst
>> @@ -37,6 +37,14 @@ LIBCAMERA_IPA_MODULE_PATH
>>  
>>     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: ``PipelineHandlerRkISP1,SimplePipelineHandler``
>> +
>>  LIBCAMERA_RPI_CONFIG_FILE
>>     Define a custom configuration file to use in the Raspberry Pi pipeline handler.
>>  
>> diff --git a/include/libcamera/internal/camera_manager.h b/include/libcamera/internal/camera_manager.h
>> index 33ebe069..5694d40d 100644
>> --- a/include/libcamera/internal/camera_manager.h
>> +++ b/include/libcamera/internal/camera_manager.h
>> @@ -44,6 +44,7 @@ protected:
>>  private:
>>         int init();
>>         void createPipelineHandlers();
>> +       void pipelineFactoryMatch(const PipelineHandlerFactoryBase *factory);
>>         void cleanup() LIBCAMERA_TSA_EXCLUDES(mutex_);
>>  
>>         /*
>> diff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp
>> index 355f3ada..ce6607e1 100644
>> --- a/src/libcamera/camera_manager.cpp
>> +++ b/src/libcamera/camera_manager.cpp
>> @@ -99,16 +99,37 @@ int CameraManager::Private::init()
>>  
>>  void CameraManager::Private::createPipelineHandlers()
>>  {
>> -       CameraManager *const o = LIBCAMERA_O_PTR();
>> -
>>         /*
>>          * \todo Try to read handlers and order from configuration
>> -        * file and only fallback on all handlers if there is no
>> -        * configuration file.
>> +        * file and only fallback on environment variable or all handlers, if
>> +        * 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 =
>>                 PipelineHandlerFactoryBase::factories();
>>  
>> +       /* Match all the registered pipeline handlers. */
>>         for (const PipelineHandlerFactoryBase *factory : factories) {
>>                 LOG(Camera, Debug)
>>                         << "Found registered pipeline handler '"
>> @@ -117,15 +138,23 @@ void CameraManager::Private::createPipelineHandlers()
>>                  * Try each pipeline handler until it exhaust
>>                  * all pipelines it can provide.
>>                  */
>> -               while (1) {
>> -                       std::shared_ptr<PipelineHandler> pipe = factory->create(o);
>> -                       if (!pipe->match(enumerator_.get()))
>> -                               break;
>> +               pipelineFactoryMatch(factory);
>> +       }
>> +}
>>  
>> -                       LOG(Camera, Debug)
>> -                               << "Pipeline handler \"" << factory->name()
>> -                               << "\" matched";
>> -               }
>> +void CameraManager::Private::pipelineFactoryMatch(const PipelineHandlerFactoryBase *factory)
>> +{
>> +       CameraManager *const o = LIBCAMERA_O_PTR();
>> +
>> +       /* Provide as many matching pipelines as possible. */
>> +       while (1) {
>> +               std::shared_ptr<PipelineHandler> pipe = factory->create(o);
>> +               if (!pipe->match(enumerator_.get()))
>> +                       break;
>> +
>> +               LOG(Camera, Debug)
>> +                       << "Pipeline handler \"" << factory->name()
>> +                       << "\" matched";
>>         }
>>  }
>>  
>> -- 
>> 2.34.1
>>



More information about the libcamera-devel mailing list