{"id":26522,"url":"https://patchwork.libcamera.org/api/covers/26522/?format=json","web_url":"https://patchwork.libcamera.org/cover/26522/","project":{"id":1,"url":"https://patchwork.libcamera.org/api/projects/1/?format=json","name":"libcamera","link_name":"libcamera","list_id":"libcamera_core","list_email":"libcamera-devel@lists.libcamera.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20260423230059.3180987-1-laurent.pinchart@ideasonboard.com>","date":"2026-04-23T23:00:22","name":"[v3,00/37] libcamera: Global configuration file improvements","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/?format=json","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"mbox":"https://patchwork.libcamera.org/cover/26522/mbox/","series":[{"id":5883,"url":"https://patchwork.libcamera.org/api/series/5883/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=5883","date":"2026-04-23T23:00:22","name":"libcamera: Global configuration file improvements","version":3,"mbox":"https://patchwork.libcamera.org/series/5883/mbox/"}],"comments":"https://patchwork.libcamera.org/api/covers/26522/comments/","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 3B278BDCB5\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 23 Apr 2026 23:01:03 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 017F062F60;\n\tFri, 24 Apr 2026 01:01:01 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 05AC362EAA\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 24 Apr 2026 01:01:01 +0200 (CEST)","from killaraus.ideasonboard.com\n\t(2001-14ba-703d-e500--2a1.rev.dnainternet.fi\n\t[IPv6:2001:14ba:703d:e500::2a1])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 641A234\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 24 Apr 2026 00:59:21 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"W3M5KsJa\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1776985161;\n\tbh=AhgzrzoB2cF0TxaEICGJPjOzuMZx4M/vWzQOpVpk5qg=;\n\th=From:To:Subject:Date:From;\n\tb=W3M5KsJaoDev3cjLmRbMwgT7XiszYnN97BA5KYmZIK8ZbCpFkyxSTLW/w677/vDv+\n\tDZ6YGzqqXER4tea9edpz7+CBrR5ddiBBkCA4mQWhoeMlHO67KztL59/9pms5edayq4\n\tuBWcDJl4wqQB1W/6net4CE2Z8KInx7SiQJJtJRNE=","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"libcamera-devel@lists.libcamera.org","Subject":"[PATCH v3 00/37] libcamera: Global configuration file improvements","Date":"Fri, 24 Apr 2026 02:00:22 +0300","Message-ID":"<20260423230059.3180987-1-laurent.pinchart@ideasonboard.com>","X-Mailer":"git-send-email 2.53.0","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"},"content":"Hello,\n\nThis series started small with a few improvements to the global\nconfiguration file handling, fixing some issues I pointed out during\nreviews. It then grew over time, and while I have ideas for more\nimprovements, adding more patches will only slow down review.\n\nI have merged patches 01/42 and 03/42 to 07/42 from v2, which shrinks\nthis new version a little bit. Patch 02/42 has been postponed for the\ntime being and isn't included in v3.\n\nPatch 01/37 is a new version of \"[PATCH v8 2/8] libcamera: utils: Add\noverloaded visitor helpers\". It is included here as I later use the\nutils::overloaded helper. It can be merged through either series.\n\nThe rework of the configuration file starts in patch 02/37 with\nimprovements to the YamlParser and YamlObject classes, until patch 13/37\nthat renames YamlObject to ValueNode to make the class usable outside of\nYAML parsing use cases. Patches 14/37 to 20/37 continue with extensions\nto the ValueNode class with new functions that are used by subsequent\npatches. The next fives patches finishes the ValueNode rework with unit\ntests for the new class in 21/37, and simplification of the YamlParser\nunit tests in 22/37 to 25/37.\n\nAfter that, the focus shifs to the global configuration. Patches 26/37\nto 31/37 rework the GlobalConfiguration class, with the most notable\nchange in 26/37 that passes a CameraManager around to access the\nGlobalConfiguration. Patches 32/37 and 33/37 continue with centralizing\nconfiguration override through environment variables. This simplifies\nusage of the GlobalConfiguration class through libcamera, at the cost of\nsplitting information about environment variables from the place where\nthe corresponding configuration setting is used. I believe this is an\nacceptable drawback, as now that we have a configuration file, new\nenvironment variables should be introduced very seldom. An alternative\nthat I may explore at some point is an API that would allow components\nwithin libcamera to declare the options they support, in which case\nenvironment variables would be declared using the same API. This will be\na bigger rework that I don't plan to explore for the time being.\n\nPatch 34/37 is a small documentation improvement, before the last three\npatches that break backward compatibility. They are conceptually\nindependent from each other, 37/37 currently depends on 36/37, but it\ncould be rebased if 36/37 is deemed undesirable.\n\nOn top of this series I would like to extend the CameraManager class to\nsupport overridding options, allowing applications to configure\nlibcamera programmatically. This could take the form of a ValueNode.\nAnother possible improvement would be to restructure the configuration\nfile to provide per-camera configuration in addition to per-pipeline\nhandler options. If anyone is interested in giving this a try, let's\ndiscuss it.\n\nJacopo Mondi (1):\n  libcamera: utils: Add overloaded visitor helpers\n\nLaurent Pinchart (36):\n  libcamera: yaml_parser: Use std::make_unique<>\n  libcamera: yaml_parser: Rename Container to ValueContainer\n  libcamera: yaml_parser: Rename Getter to Accessor\n  libcamera: yaml_parser: Replace getList() with get() specializations\n  libcamera: yaml_parser: Add function to set a YamlObject value\n  libcamera: yaml_parser: Add functions to add children\n  libcamera: yaml_parser: Un-friend YamlParserContext from YamlObject\n  libcamera: yaml_parser: Move Size handling to geometry.cpp\n  libcamera: yaml_parser: Drop unneeded \\fn Doxygen commands\n  libcamera: yaml_parser: Split YamlObject from YamlParser\n  libcamera: yaml_object: Miscellaneous documentation improvements\n  libcamera: Rename YamlObject to ValueNode\n  libcamera: value_node: Add constructor with value\n  libcamera: value_node: Rework templates to prepare for mutable views\n  libcamera: value_node: Add mutable adapters\n  libcamera: value_node: Add mutable children accessors\n  libcamera: value_node: Support adding nested children in one operation\n  libcamera: value_node: Support looking up descendant node by path\n  libcamera: value_node: Add functions to erase child nodes\n  test: Add ValueNode unit test\n  test: yaml-parser: Simplify test\n  test: yaml-parser: Standardize on explicitly qualifying std namespace\n  test: yaml-parser: Fix typos in error messages\n  test: yaml-parser: Replace \"object\" with \"node\"\n  libcamera: Pass CameraManager around instead of GlobalConfiguration\n  libcamera: global_configuration: Reorder functions\n  libcamera: global_configuration: Add missing include and comment\n  libcamera: global_configuration: Rename yamlConfiguration_\n  libcamera: global_configuration: Rename Configuration to Option\n  libcamera: global_configuration: Drop Option type\n  libcamera: global_configuration: Populate empty configuration\n  libcamera: global_configuration: Override options with environment\n    variables\n  Documentation: Rename runtime configuration title\n  libcamera: software_isp: Rename \"measure\" option to \"benchmark\"\n  pipeline: simple: Rename supported_devices configuration option to\n    devices\n  pipeline: simple: Turn devices configuration option into dictionary\n\n Documentation/runtime_configuration.rst       |  24 +-\n include/libcamera/base/utils.h                |   9 +\n .../internal/converter/converter_dw100.h      |   2 +-\n .../libcamera/internal/global_configuration.h |  22 +-\n include/libcamera/internal/ipa_manager.h      |  10 +-\n include/libcamera/internal/ipa_proxy.h        |   4 +-\n include/libcamera/internal/matrix.h           |  10 +-\n include/libcamera/internal/meson.build        |   1 +\n .../internal/software_isp/benchmark.h         |   6 +-\n .../internal/software_isp/swstats_cpu.h       |   6 +-\n include/libcamera/internal/value_node.h       | 276 +++++++\n include/libcamera/internal/vector.h           |  10 +-\n include/libcamera/internal/yaml_parser.h      | 227 +-----\n src/android/camera_hal_config.cpp             |  16 +-\n src/ipa/ipu3/algorithms/agc.cpp               |   4 +-\n src/ipa/ipu3/algorithms/agc.h                 |   2 +-\n src/ipa/ipu3/ipu3.cpp                         |   2 +-\n src/ipa/libipa/agc_mean_luminance.cpp         |  20 +-\n src/ipa/libipa/agc_mean_luminance.h           |  12 +-\n src/ipa/libipa/algorithm.cpp                  |   2 +-\n src/ipa/libipa/algorithm.h                    |   4 +-\n src/ipa/libipa/awb.cpp                        |   6 +-\n src/ipa/libipa/awb.h                          |   6 +-\n src/ipa/libipa/awb_bayes.cpp                  |   8 +-\n src/ipa/libipa/awb_bayes.h                    |   6 +-\n src/ipa/libipa/awb_grey.cpp                   |   2 +-\n src/ipa/libipa/awb_grey.h                     |   2 +-\n src/ipa/libipa/interpolator.cpp               |   2 +-\n src/ipa/libipa/interpolator.h                 |   4 +-\n src/ipa/libipa/lsc_polynomial.h               |   8 +-\n src/ipa/libipa/lux.cpp                        |   6 +-\n src/ipa/libipa/lux.h                          |   4 +-\n src/ipa/libipa/module.cpp                     |   2 +-\n src/ipa/libipa/module.h                       |   6 +-\n src/ipa/libipa/pwl.cpp                        |   2 +-\n src/ipa/mali-c55/algorithms/agc.cpp           |   2 +-\n src/ipa/mali-c55/algorithms/agc.h             |   2 +-\n src/ipa/mali-c55/algorithms/blc.cpp           |   4 +-\n src/ipa/mali-c55/algorithms/blc.h             |   2 +-\n src/ipa/mali-c55/algorithms/lsc.cpp           |  12 +-\n src/ipa/mali-c55/algorithms/lsc.h             |   2 +-\n src/ipa/mali-c55/mali-c55.cpp                 |   2 +-\n src/ipa/rkisp1/algorithms/agc.cpp             |  12 +-\n src/ipa/rkisp1/algorithms/agc.h               |   4 +-\n src/ipa/rkisp1/algorithms/awb.cpp             |   2 +-\n src/ipa/rkisp1/algorithms/awb.h               |   2 +-\n src/ipa/rkisp1/algorithms/blc.cpp             |   4 +-\n src/ipa/rkisp1/algorithms/blc.h               |   2 +-\n src/ipa/rkisp1/algorithms/ccm.cpp             |   4 +-\n src/ipa/rkisp1/algorithms/ccm.h               |   4 +-\n src/ipa/rkisp1/algorithms/cproc.cpp           |   2 +-\n src/ipa/rkisp1/algorithms/cproc.h             |   2 +-\n src/ipa/rkisp1/algorithms/dpcc.cpp            |  22 +-\n src/ipa/rkisp1/algorithms/dpcc.h              |   2 +-\n src/ipa/rkisp1/algorithms/dpf.cpp             |  14 +-\n src/ipa/rkisp1/algorithms/dpf.h               |   2 +-\n src/ipa/rkisp1/algorithms/filter.cpp          |   2 +-\n src/ipa/rkisp1/algorithms/filter.h            |   2 +-\n src/ipa/rkisp1/algorithms/goc.cpp             |   4 +-\n src/ipa/rkisp1/algorithms/goc.h               |   2 +-\n src/ipa/rkisp1/algorithms/gsl.cpp             |  14 +-\n src/ipa/rkisp1/algorithms/gsl.h               |   2 +-\n src/ipa/rkisp1/algorithms/lsc.cpp             |  24 +-\n src/ipa/rkisp1/algorithms/lsc.h               |   2 +-\n src/ipa/rkisp1/algorithms/lux.cpp             |   2 +-\n src/ipa/rkisp1/algorithms/lux.h               |   2 +-\n src/ipa/rkisp1/algorithms/wdr.cpp             |   4 +-\n src/ipa/rkisp1/algorithms/wdr.h               |   2 +-\n src/ipa/rkisp1/rkisp1.cpp                     |   2 +-\n src/ipa/rpi/controller/algorithm.cpp          |   2 +-\n src/ipa/rpi/controller/algorithm.h            |   4 +-\n src/ipa/rpi/controller/controller.cpp         |   4 +-\n src/ipa/rpi/controller/controller.h           |   4 +-\n src/ipa/rpi/controller/rpi/af.cpp             |  10 +-\n src/ipa/rpi/controller/rpi/af.h               |   8 +-\n src/ipa/rpi/controller/rpi/agc.cpp            |   2 +-\n src/ipa/rpi/controller/rpi/agc.h              |   2 +-\n src/ipa/rpi/controller/rpi/agc_channel.cpp    |  28 +-\n src/ipa/rpi/controller/rpi/agc_channel.h      |  12 +-\n src/ipa/rpi/controller/rpi/alsc.cpp           |  10 +-\n src/ipa/rpi/controller/rpi/alsc.h             |   2 +-\n src/ipa/rpi/controller/rpi/awb.cpp            |   6 +-\n src/ipa/rpi/controller/rpi/awb.h              |   4 +-\n src/ipa/rpi/controller/rpi/awb_bayes.cpp      |  12 +-\n src/ipa/rpi/controller/rpi/black_level.cpp    |   2 +-\n src/ipa/rpi/controller/rpi/black_level.h      |   2 +-\n src/ipa/rpi/controller/rpi/cac.cpp            |   4 +-\n src/ipa/rpi/controller/rpi/cac.h              |   2 +-\n src/ipa/rpi/controller/rpi/ccm.cpp            |   2 +-\n src/ipa/rpi/controller/rpi/ccm.h              |   2 +-\n src/ipa/rpi/controller/rpi/contrast.cpp       |   2 +-\n src/ipa/rpi/controller/rpi/contrast.h         |   2 +-\n src/ipa/rpi/controller/rpi/decompand.cpp      |   2 +-\n src/ipa/rpi/controller/rpi/decompand.h        |   2 +-\n src/ipa/rpi/controller/rpi/denoise.cpp        |   4 +-\n src/ipa/rpi/controller/rpi/denoise.h          |   4 +-\n src/ipa/rpi/controller/rpi/dpc.cpp            |   2 +-\n src/ipa/rpi/controller/rpi/dpc.h              |   2 +-\n src/ipa/rpi/controller/rpi/geq.cpp            |   2 +-\n src/ipa/rpi/controller/rpi/geq.h              |   2 +-\n src/ipa/rpi/controller/rpi/hdr.cpp            |  12 +-\n src/ipa/rpi/controller/rpi/hdr.h              |   4 +-\n src/ipa/rpi/controller/rpi/lux.cpp            |   2 +-\n src/ipa/rpi/controller/rpi/lux.h              |   2 +-\n src/ipa/rpi/controller/rpi/noise.cpp          |   2 +-\n src/ipa/rpi/controller/rpi/noise.h            |   2 +-\n src/ipa/rpi/controller/rpi/saturation.cpp     |   2 +-\n src/ipa/rpi/controller/rpi/saturation.h       |   2 +-\n src/ipa/rpi/controller/rpi/sdn.cpp            |   2 +-\n src/ipa/rpi/controller/rpi/sdn.h              |   2 +-\n src/ipa/rpi/controller/rpi/sharpen.cpp        |   2 +-\n src/ipa/rpi/controller/rpi/sharpen.h          |   2 +-\n src/ipa/rpi/controller/rpi/tonemap.cpp        |   2 +-\n src/ipa/rpi/controller/rpi/tonemap.h          |   2 +-\n src/ipa/simple/algorithms/adjust.cpp          |   2 +-\n src/ipa/simple/algorithms/adjust.h            |   2 +-\n src/ipa/simple/algorithms/blc.cpp             |   2 +-\n src/ipa/simple/algorithms/blc.h               |   2 +-\n src/ipa/simple/algorithms/ccm.cpp             |   2 +-\n src/ipa/simple/algorithms/ccm.h               |   2 +-\n src/ipa/simple/soft_simple.cpp                |   2 +-\n src/libcamera/base/utils.cpp                  |  30 +\n src/libcamera/camera_manager.cpp              |   7 +-\n src/libcamera/converter/converter_dw100.cpp   |   4 +-\n src/libcamera/geometry.cpp                    |  29 +\n src/libcamera/global_configuration.cpp        | 316 ++++----\n src/libcamera/ipa_manager.cpp                 |  16 +-\n src/libcamera/ipa_proxy.cpp                   |  14 +-\n src/libcamera/matrix.cpp                      |   2 +-\n src/libcamera/meson.build                     |   1 +\n src/libcamera/pipeline/rkisp1/rkisp1.cpp      |   2 +-\n .../pipeline/rpi/common/pipeline_base.cpp     |   5 +-\n .../pipeline/rpi/common/pipeline_base.h       |   4 +-\n src/libcamera/pipeline/rpi/pisp/pisp.cpp      |   6 +-\n src/libcamera/pipeline/rpi/vc4/vc4.cpp        |   6 +-\n src/libcamera/pipeline/simple/simple.cpp      |  21 +-\n src/libcamera/pipeline/virtual/README.md      |   2 +-\n .../pipeline/virtual/config_parser.cpp        |  20 +-\n .../pipeline/virtual/config_parser.h          |  12 +-\n src/libcamera/pipeline/virtual/virtual.cpp    |  12 +-\n src/libcamera/software_isp/benchmark.cpp      |  17 +-\n src/libcamera/software_isp/debayer.cpp        |  14 +-\n src/libcamera/software_isp/debayer.h          |   4 +-\n src/libcamera/software_isp/debayer_cpu.cpp    |   7 +-\n src/libcamera/software_isp/debayer_cpu.h      |   4 +-\n src/libcamera/software_isp/debayer_egl.cpp    |   7 +-\n src/libcamera/software_isp/debayer_egl.h      |   4 +-\n src/libcamera/software_isp/software_isp.cpp   |  13 +-\n src/libcamera/software_isp/swstats_cpu.cpp    |   8 +-\n src/libcamera/value_node.cpp                  | 677 ++++++++++++++++++\n src/libcamera/vector.cpp                      |   2 +-\n src/libcamera/yaml_parser.cpp                 | 482 ++-----------\n test/ipa/ipa_interface_test.cpp               |   5 +-\n test/meson.build                              |   1 +\n test/value-node.cpp                           | 558 +++++++++++++++\n test/yaml-parser.cpp                          | 522 ++------------\n .../module_ipa_proxy.cpp.tmpl                 |   8 +-\n .../module_ipa_proxy.h.tmpl                   |   4 +-\n 158 files changed, 2300 insertions(+), 1649 deletions(-)\n create mode 100644 include/libcamera/internal/value_node.h\n create mode 100644 src/libcamera/value_node.cpp\n create mode 100644 test/value-node.cpp\n\n\nbase-commit: 9bd7dc3a699a801bbd327b0d693b4045a66cced0"}