[PATCH v5 00/15] Add global configuration file

Milan Zamazal mzamazal at redhat.com
Tue Oct 1 12:27:52 CEST 2024


This patch series introduces global configuration file for libcamera, to
provide runtime configuration means other than environment variables.
Instead of, or in addition to, the growing list of configuration
environment variables, the whole configuration can be specified in a
single configuration file.  This is both simpler and more flexible.

This is not a replacement for specific configuration files already
present in libcamera.

The patches implement what is needed to introduce a configuration file
that can handle the current environment variables and software ISP
TODOs.  They demonstrate how to deal with the key points that must be
considered.  See commit messages for more details.

The configuration file is a YAML file.  It is looked up in user’s home
directory or, if not present, in system-wide libcamera directories.
Environment variables, if set, still take precedence.

This patch series is not exhaustive, there can be future enhancements,
most notably configuration file validation to avoid confusions caused by
typos etc.

Not everything has been tested because some of the patches are related
to specific hardware.

Also, not everything is necessarily C++ elegant, suggestions for
improvements are welcome.  Note that there is an obstacle in that
configuration initialization may call logging and logging queries
configuration, as explained in the commit messages.  This complicates
transparent encapsulation.

Changes in v5:
- A pointer is used to store the global configuration singleton rather
  than a static variable.  This makes the things more robust and fixes
  the problem with re-entrancy on logging and a failing
  camera_reconfigure test.
- In relation to the change above, a new initialization method
  GlobalConfiguration::initialize() was introduced that replaces the
  initialization calls in CameraManager and IPAManager.
- Logging YAML errors when reading the configuration was also fixed.
- Global configuration is placed to base directly, without an
  intermediate patch.
- An `optional' value comparison simplified.
- A temporary typo in a comment fixed.
- Unused stdint.h include removed.

Changes in v4:
- Rebased on current master.
- Configuration option for LIBCAMERA_IPA_PROXY_PATH added.
- Added a patch to include stdlib.h instead of cstdlib in yaml_parser.cpp.

Changes in v3:
- Added a configuration item for the newly introduced
  LIBCAMERA_PIPELINES_MATCH_LIST variable.
- A minor indentation fix.
- Fixed `pipelines.' x `pipeline.' configuration item naming mismatch.
- Tuning files are looked up now by particular cameras attached rather than
  being specified for the whole pipeline.
- Helpers use std::string& instead of char* for confPath arguments.
- Protection against returning YamlObject::empty as a regular value (the
  problem has been probably exposed by addition of
  LIBCAMERA_PIPELINES_MATCH_LIST).

Changes in v2:
- Rebased on master.
- Various cleanups, documentation improvements and minor fixes.
- Configuration option for LIBCAMERA_RPI_TUNING_FILE added (Naush).
- Two more patches for software ISP configuration added.

Milan Zamazal (15):
  yaml: Include stdlib.h instead of cstdlib
  yaml: Move yaml_parser.cpp to base
  config: Introduce global runtime configuration
  config: Look up logging levels in the configuration file
  config: Add configuration retrieval helpers
  config: Look up log file in configuration file
  config: Look up log color configuration in configuration file
  config: Look up rpi paths in configuration file
  config: Look up IPA configurables in configuration file
  config: Look up RkISP1 tuning file in configuration file
  config: Look up pipelines match list in configuration file
  config: Allow enabling software ISP in runtime
  config: Add global configuration file documentation
  libcamera: software_isp: Make input buffer copying configurable
  libcamera: software_isp: Make measurement configurable

 Documentation/documentation-contents.rst      |   2 +-
 Documentation/index.rst                       |   4 +-
 Documentation/meson.build                     |   2 +-
 ...ariables.rst => runtime_configuration.rst} | 119 +++++++++-
 .../libcamera/internal/global_configuration.h |  72 ++++++
 include/libcamera/internal/meson.build        |   1 +
 src/libcamera/base/global_configuration.cpp   | 223 ++++++++++++++++++
 src/libcamera/base/log.cpp                    |  24 +-
 src/libcamera/base/meson.build                |  15 ++
 src/libcamera/{ => base}/yaml_parser.cpp      |   2 +-
 src/libcamera/camera_manager.cpp              |  10 +-
 src/libcamera/ipa_manager.cpp                 |  14 +-
 src/libcamera/ipa_proxy.cpp                   |  16 +-
 src/libcamera/meson.build                     |  14 --
 src/libcamera/pipeline/rkisp1/rkisp1.cpp      |  20 +-
 .../pipeline/rpi/common/pipeline_base.cpp     |  18 +-
 src/libcamera/pipeline/simple/simple.cpp      |  12 +
 src/libcamera/process.cpp                     |  11 +-
 src/libcamera/software_isp/TODO               |  36 ---
 src/libcamera/software_isp/debayer_cpu.cpp    |  30 ++-
 src/libcamera/software_isp/debayer_cpu.h      |   7 +-
 21 files changed, 540 insertions(+), 112 deletions(-)
 rename Documentation/{environment_variables.rst => runtime_configuration.rst} (61%)
 create mode 100644 include/libcamera/internal/global_configuration.h
 create mode 100644 src/libcamera/base/global_configuration.cpp
 rename src/libcamera/{ => base}/yaml_parser.cpp (99%)

-- 
2.44.1



More information about the libcamera-devel mailing list