[{"id":37591,"web_url":"https://patchwork.libcamera.org/comment/37591/","msgid":"<f093a2a8-1fd5-424c-b7e5-4f0fcb5a9dc7@ideasonboard.com>","date":"2026-01-13T09:13:52","subject":"Re: [PATCH 00/36] libcamera: Global configuration file improvements","submitter":{"id":216,"url":"https://patchwork.libcamera.org/api/people/216/","name":"Barnabás Pőcze","email":"barnabas.pocze@ideasonboard.com"},"content":"2026. 01. 13. 1:07 keltezéssel, Laurent Pinchart írta:\n> Hello,\n> \n> This (long overdue) series started small with a few improvements to the\n> global configuration file handling, fixing some issues I pointed out\n> during reviews. It then grew over time, and while I have ideas for more\n> improvements, adding more patches will only slow down review.\n> \n> The series starts with a few drive-by cleanups in patches 01/36 to\n> 07/36. Those could be merged separately, but some of them would then end\n> up conflicting with the rest of the series, so I've included them here.\n> \n> The rework of the configuration file starts in patch 08/36 with\n> improvements to the YamlParser and YamlObject classes, until patch 19/36\n> that renames YamlObject to ValueNode to make the class usable outside of\n> \nYAML parsing use cases.\n> \n> Patches 20/36 to 24/36 then move to reworking the global configuration\n> class, with the most notable change in 20/36 that passes a CameraManager\n> around to access the GlobalConfiguration. Patches 25/36 to 30/36 then go\n> back to the ValueNode class to extend it with new functions that are\n> used by subsequent patches.\n> \n> After that, Patches 31/36 and 32/36 centralizes configuration override\n> through environment variables. This simplifies usage of the\n> GlobalConfiguration class through libcamera, at the cost of splitting\n> information about environment variables from the place where the\n> corresponding configuration setting is used. I believe this is an\n> acceptable drawback, as now that we have a configuration file new\n> environment variables should be introduced very seldom. An alternative\n> that I may explore at some point is an API that would allow components\n> within libcamera to declare the options they support, in which case\n> environment variables would be declared using the same API. This will be\n> a bigger rework that I don't plan to explore for the time being.\n> \n> Patch 33/36 is a small documentation improvement, before the last three\n> patches that break backward compatibility. They are conceptually\n> independent from each other, 36/36 currently depends on 35/36, but it\n> could be rebased if 35/36 is deemed undesirable.\n> \n> On top of this series I would like to extend the CameraManager class to\n> support overridding options, allowing applications to configure\n> libcamera programmatically. This could take the form of a tree of\n> ValueNode instances. Another possible improvement would be to\n> restructure the configuration file to provide per-camera configuration\n> in addition to per-pipeline handler options. If anyone is interested in\n> giving this a try, let's discuss it.\n> \n\nThere are two changes in https://patchwork.libcamera.org/project/libcamera/list/?series=5441\nthat remain, are there any plans to incorporate them here?\n\n\n> Laurent Pinchart (36):\n>    libcamera: Drop unneeded usage of this pointer\n>    libcamera: request: Move all private member variables to Private class\n>    libcamera: Replace plain pointers with std::unique<>\n>    libcamera: pipeline_handler: Add createIPA() function\n>    test: ipa: ipa_interface: Use IPAManager::createIPA()\n>    test: ipa: ipa_interface: Replace FIFO with pipe\n>    libcamera: camera_manager: Move IPAManager creation to start() time\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: 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: 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 nested children in one\n>      operation\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>   .../guides/application-developer.rst          |   5 +-\n>   Documentation/guides/ipa.rst                  |   8 +-\n>   Documentation/guides/pipeline-handler.rst     |   7 +-\n>   Documentation/runtime_configuration.rst       |  24 +-\n>   .../internal/converter/converter_dw100.h      |   2 +-\n>   .../internal/device_enumerator_udev.h         |   2 +-\n>   .../libcamera/internal/global_configuration.h |  22 +-\n>   include/libcamera/internal/ipa_manager.h      |  29 +-\n>   include/libcamera/internal/ipa_proxy.h        |   4 +-\n>   include/libcamera/internal/ipc_unixsocket.h   |   3 +-\n>   include/libcamera/internal/matrix.h           |  10 +-\n>   include/libcamera/internal/meson.build        |   1 +\n>   include/libcamera/internal/pipeline_handler.h |  11 +-\n>   include/libcamera/internal/request.h          |  12 +-\n>   .../libcamera/internal/shared_mem_object.h    |   4 +-\n>   .../internal/software_isp/benchmark.h         |   6 +-\n>   .../internal/software_isp/swstats_cpu.h       |   6 +-\n>   include/libcamera/internal/v4l2_device.h      |   2 +-\n>   include/libcamera/internal/v4l2_videodevice.h |  12 +-\n>   include/libcamera/internal/value_node.h       | 271 ++++++++\n>   include/libcamera/internal/vector.h           |  10 +-\n>   include/libcamera/internal/yaml_parser.h      | 227 +------\n>   include/libcamera/ipa/vimc.mojom              |   3 +-\n>   include/libcamera/request.h                   |  15 +-\n>   src/android/camera_hal_config.cpp             |  16 +-\n>   src/apps/qcam/main.cpp                        |   5 +-\n>   src/apps/qcam/main_window.cpp                 |  11 +-\n>   src/apps/qcam/main_window.h                   |   2 +-\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               |   4 +-\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             |  18 +-\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            |  10 +-\n>   src/ipa/rpi/controller/rpi/awb.h              |   8 +-\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/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/algorithms/lut.cpp             |   2 +-\n>   src/ipa/simple/algorithms/lut.h               |   2 +-\n>   src/ipa/simple/soft_simple.cpp                |   2 +-\n>   src/ipa/vimc/vimc.cpp                         |  33 +-\n>   src/libcamera/camera_manager.cpp              |   8 +-\n>   src/libcamera/converter/converter_dw100.cpp   |   4 +-\n>   src/libcamera/device_enumerator_udev.cpp      |   6 +-\n>   src/libcamera/geometry.cpp                    |  29 +\n>   src/libcamera/global_configuration.cpp        | 341 ++++++----\n>   src/libcamera/ipa_manager.cpp                 |  15 +-\n>   src/libcamera/ipa_proxy.cpp                   |  14 +-\n>   src/libcamera/ipc_unixsocket.cpp              |   7 +-\n>   src/libcamera/matrix.cpp                      |   2 +-\n>   src/libcamera/meson.build                     |   1 +\n>   src/libcamera/pipeline/ipu3/ipu3.cpp          |   3 +-\n>   src/libcamera/pipeline/mali-c55/mali-c55.cpp  |   3 +-\n>   src/libcamera/pipeline/rkisp1/rkisp1.cpp      |   5 +-\n>   .../pipeline/rpi/common/pipeline_base.cpp     |   8 +-\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      |  20 +-\n>   src/libcamera/pipeline/vimc/vimc.cpp          |   5 +-\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    |   2 +-\n>   src/libcamera/pipeline_handler.cpp            |  10 +\n>   src/libcamera/request.cpp                     | 106 +--\n>   src/libcamera/shared_mem_object.cpp           |   8 +-\n>   src/libcamera/software_isp/benchmark.cpp      |  17 +-\n>   src/libcamera/software_isp/debayer.cpp        |  13 +-\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      |   3 +-\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   |  18 +-\n>   src/libcamera/software_isp/swstats_cpu.cpp    |   8 +-\n>   src/libcamera/v4l2_device.cpp                 |   5 +-\n>   src/libcamera/v4l2_videodevice.cpp            |  22 +-\n>   src/libcamera/value_node.cpp                  | 621 ++++++++++++++++++\n>   src/libcamera/vector.cpp                      |   2 +-\n>   src/libcamera/yaml_parser.cpp                 | 475 ++------------\n>   src/v4l2/v4l2_camera.cpp                      |   7 +-\n>   src/v4l2/v4l2_camera.h                        |   2 +-\n>   src/v4l2/v4l2_compat_manager.cpp              |  18 +-\n>   src/v4l2/v4l2_compat_manager.h                |   2 +-\n>   test/ipa/ipa_interface_test.cpp               |  57 +-\n>   test/yaml-parser.cpp                          |  12 +-\n>   .../module_ipa_proxy.cpp.tmpl                 |   8 +-\n>   .../module_ipa_proxy.h.tmpl                   |   4 +-\n>   183 files changed, 1779 insertions(+), 1419 deletions(-)\n>   create mode 100644 include/libcamera/internal/value_node.h\n>   create mode 100644 src/libcamera/value_node.cpp\n> \n> \n> base-commit: 5e59969dbb7313228bc8641e5e611a8ecd0eadcf\n> --\n> Regards,\n> \n> Laurent Pinchart\n>","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 A6741BDCBF\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 13 Jan 2026 09:13:58 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id CA8FD61FA0;\n\tTue, 13 Jan 2026 10:13:57 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 3A37B61F84\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 13 Jan 2026 10:13:56 +0100 (CET)","from [192.168.33.30] (185.221.143.114.nat.pool.zt.hu\n\t[185.221.143.114])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 2AD1D177B;\n\tTue, 13 Jan 2026 10:13:30 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"TAVGxWgr\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1768295610;\n\tbh=iEjfvM++KSP0cBSW7oMlhhM2CLuIXD0r3w85fkmYQZA=;\n\th=Date:Subject:To:References:From:In-Reply-To:From;\n\tb=TAVGxWgr/bKhW8uxt4lfV38VWken6qnyXuR2ZB/JUmQ8dfc1VcAb6k4kkJtYn+7nx\n\tq+jKgzUWVIozLjdWzPfa4lWK3rYCIWbimZ3AiFz1yAJXPzkcChQqmIaN6MRh7uBgBC\n\tFku9dEcLVzU5H8UYZambrfnp8Ne99LZ3xRxD1rPE=","Message-ID":"<f093a2a8-1fd5-424c-b7e5-4f0fcb5a9dc7@ideasonboard.com>","Date":"Tue, 13 Jan 2026 10:13:52 +0100","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH 00/36] libcamera: Global configuration file improvements","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","References":"<PX6dEhSUDt2mD_Y4ec1MqgCOqa-GKp_F5m69tEyT_ORUpd0hSN1g9GJNWQRKm3MDFmGA0somY-ttjhTp3Ow56A==@protonmail.internalid>\n\t<20260113000808.15395-1-laurent.pinchart@ideasonboard.com>","From":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Content-Language":"en-US, hu-HU","In-Reply-To":"<20260113000808.15395-1-laurent.pinchart@ideasonboard.com>","Content-Type":"text/plain; charset=UTF-8; format=flowed","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>"}},{"id":37595,"web_url":"https://patchwork.libcamera.org/comment/37595/","msgid":"<20260113094344.GB18320@pendragon.ideasonboard.com>","date":"2026-01-13T09:43:44","subject":"Re: [PATCH 00/36] libcamera: Global configuration file improvements","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"On Tue, Jan 13, 2026 at 10:13:52AM +0100, Barnabás Pőcze wrote:\n> 2026. 01. 13. 1:07 keltezéssel, Laurent Pinchart írta:\n> > Hello,\n> > \n> > This (long overdue) series started small with a few improvements to the\n> > global configuration file handling, fixing some issues I pointed out\n> > during reviews. It then grew over time, and while I have ideas for more\n> > improvements, adding more patches will only slow down review.\n> > \n> > The series starts with a few drive-by cleanups in patches 01/36 to\n> > 07/36. Those could be merged separately, but some of them would then end\n> > up conflicting with the rest of the series, so I've included them here.\n> > \n> > The rework of the configuration file starts in patch 08/36 with\n> > improvements to the YamlParser and YamlObject classes, until patch 19/36\n> > that renames YamlObject to ValueNode to make the class usable outside of\n> > \n> YAML parsing use cases.\n> > \n> > Patches 20/36 to 24/36 then move to reworking the global configuration\n> > class, with the most notable change in 20/36 that passes a CameraManager\n> > around to access the GlobalConfiguration. Patches 25/36 to 30/36 then go\n> > back to the ValueNode class to extend it with new functions that are\n> > used by subsequent patches.\n> > \n> > After that, Patches 31/36 and 32/36 centralizes configuration override\n> > through environment variables. This simplifies usage of the\n> > GlobalConfiguration class through libcamera, at the cost of splitting\n> > information about environment variables from the place where the\n> > corresponding configuration setting is used. I believe this is an\n> > acceptable drawback, as now that we have a configuration file new\n> > environment variables should be introduced very seldom. An alternative\n> > that I may explore at some point is an API that would allow components\n> > within libcamera to declare the options they support, in which case\n> > environment variables would be declared using the same API. This will be\n> > a bigger rework that I don't plan to explore for the time being.\n> > \n> > Patch 33/36 is a small documentation improvement, before the last three\n> > patches that break backward compatibility. They are conceptually\n> > independent from each other, 36/36 currently depends on 35/36, but it\n> > could be rebased if 35/36 is deemed undesirable.\n> > \n> > On top of this series I would like to extend the CameraManager class to\n> > support overridding options, allowing applications to configure\n> > libcamera programmatically. This could take the form of a tree of\n> > ValueNode instances. Another possible improvement would be to\n> > restructure the configuration file to provide per-camera configuration\n> > in addition to per-pipeline handler options. If anyone is interested in\n> > giving this a try, let's discuss it.\n> \n> There are two changes in https://patchwork.libcamera.org/project/libcamera/list/?series=5441\n> that remain, are there any plans to incorporate them here?\n\nYes, I should have mentioned that, sorry. They're in my dev branch, I'll\nsubmit them next.\n\n> > Laurent Pinchart (36):\n> >    libcamera: Drop unneeded usage of this pointer\n> >    libcamera: request: Move all private member variables to Private class\n> >    libcamera: Replace plain pointers with std::unique<>\n> >    libcamera: pipeline_handler: Add createIPA() function\n> >    test: ipa: ipa_interface: Use IPAManager::createIPA()\n> >    test: ipa: ipa_interface: Replace FIFO with pipe\n> >    libcamera: camera_manager: Move IPAManager creation to start() time\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: 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: 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 nested children in one\n> >      operation\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> >   .../guides/application-developer.rst          |   5 +-\n> >   Documentation/guides/ipa.rst                  |   8 +-\n> >   Documentation/guides/pipeline-handler.rst     |   7 +-\n> >   Documentation/runtime_configuration.rst       |  24 +-\n> >   .../internal/converter/converter_dw100.h      |   2 +-\n> >   .../internal/device_enumerator_udev.h         |   2 +-\n> >   .../libcamera/internal/global_configuration.h |  22 +-\n> >   include/libcamera/internal/ipa_manager.h      |  29 +-\n> >   include/libcamera/internal/ipa_proxy.h        |   4 +-\n> >   include/libcamera/internal/ipc_unixsocket.h   |   3 +-\n> >   include/libcamera/internal/matrix.h           |  10 +-\n> >   include/libcamera/internal/meson.build        |   1 +\n> >   include/libcamera/internal/pipeline_handler.h |  11 +-\n> >   include/libcamera/internal/request.h          |  12 +-\n> >   .../libcamera/internal/shared_mem_object.h    |   4 +-\n> >   .../internal/software_isp/benchmark.h         |   6 +-\n> >   .../internal/software_isp/swstats_cpu.h       |   6 +-\n> >   include/libcamera/internal/v4l2_device.h      |   2 +-\n> >   include/libcamera/internal/v4l2_videodevice.h |  12 +-\n> >   include/libcamera/internal/value_node.h       | 271 ++++++++\n> >   include/libcamera/internal/vector.h           |  10 +-\n> >   include/libcamera/internal/yaml_parser.h      | 227 +------\n> >   include/libcamera/ipa/vimc.mojom              |   3 +-\n> >   include/libcamera/request.h                   |  15 +-\n> >   src/android/camera_hal_config.cpp             |  16 +-\n> >   src/apps/qcam/main.cpp                        |   5 +-\n> >   src/apps/qcam/main_window.cpp                 |  11 +-\n> >   src/apps/qcam/main_window.h                   |   2 +-\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               |   4 +-\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             |  18 +-\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            |  10 +-\n> >   src/ipa/rpi/controller/rpi/awb.h              |   8 +-\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/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/algorithms/lut.cpp             |   2 +-\n> >   src/ipa/simple/algorithms/lut.h               |   2 +-\n> >   src/ipa/simple/soft_simple.cpp                |   2 +-\n> >   src/ipa/vimc/vimc.cpp                         |  33 +-\n> >   src/libcamera/camera_manager.cpp              |   8 +-\n> >   src/libcamera/converter/converter_dw100.cpp   |   4 +-\n> >   src/libcamera/device_enumerator_udev.cpp      |   6 +-\n> >   src/libcamera/geometry.cpp                    |  29 +\n> >   src/libcamera/global_configuration.cpp        | 341 ++++++----\n> >   src/libcamera/ipa_manager.cpp                 |  15 +-\n> >   src/libcamera/ipa_proxy.cpp                   |  14 +-\n> >   src/libcamera/ipc_unixsocket.cpp              |   7 +-\n> >   src/libcamera/matrix.cpp                      |   2 +-\n> >   src/libcamera/meson.build                     |   1 +\n> >   src/libcamera/pipeline/ipu3/ipu3.cpp          |   3 +-\n> >   src/libcamera/pipeline/mali-c55/mali-c55.cpp  |   3 +-\n> >   src/libcamera/pipeline/rkisp1/rkisp1.cpp      |   5 +-\n> >   .../pipeline/rpi/common/pipeline_base.cpp     |   8 +-\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      |  20 +-\n> >   src/libcamera/pipeline/vimc/vimc.cpp          |   5 +-\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    |   2 +-\n> >   src/libcamera/pipeline_handler.cpp            |  10 +\n> >   src/libcamera/request.cpp                     | 106 +--\n> >   src/libcamera/shared_mem_object.cpp           |   8 +-\n> >   src/libcamera/software_isp/benchmark.cpp      |  17 +-\n> >   src/libcamera/software_isp/debayer.cpp        |  13 +-\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      |   3 +-\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   |  18 +-\n> >   src/libcamera/software_isp/swstats_cpu.cpp    |   8 +-\n> >   src/libcamera/v4l2_device.cpp                 |   5 +-\n> >   src/libcamera/v4l2_videodevice.cpp            |  22 +-\n> >   src/libcamera/value_node.cpp                  | 621 ++++++++++++++++++\n> >   src/libcamera/vector.cpp                      |   2 +-\n> >   src/libcamera/yaml_parser.cpp                 | 475 ++------------\n> >   src/v4l2/v4l2_camera.cpp                      |   7 +-\n> >   src/v4l2/v4l2_camera.h                        |   2 +-\n> >   src/v4l2/v4l2_compat_manager.cpp              |  18 +-\n> >   src/v4l2/v4l2_compat_manager.h                |   2 +-\n> >   test/ipa/ipa_interface_test.cpp               |  57 +-\n> >   test/yaml-parser.cpp                          |  12 +-\n> >   .../module_ipa_proxy.cpp.tmpl                 |   8 +-\n> >   .../module_ipa_proxy.h.tmpl                   |   4 +-\n> >   183 files changed, 1779 insertions(+), 1419 deletions(-)\n> >   create mode 100644 include/libcamera/internal/value_node.h\n> >   create mode 100644 src/libcamera/value_node.cpp\n> > \n> > \n> > base-commit: 5e59969dbb7313228bc8641e5e611a8ecd0eadcf","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 5FBDABDCBF\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 13 Jan 2026 09:44:07 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 0774F61FC1;\n\tTue, 13 Jan 2026 10:44:07 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id C41F161FA0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 13 Jan 2026 10:44:05 +0100 (CET)","from pendragon.ideasonboard.com (81-175-209-152.bb.dnainternet.fi\n\t[81.175.209.152])\n\tby perceval.ideasonboard.com (Postfix) with UTF8SMTPSA id C087650A;\n\tTue, 13 Jan 2026 10:43:39 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"Px8H/JzC\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1768297420;\n\tbh=nWnr2OhizjwvF3mBvMq+u+T8mNbfRBQIkEXhn9fom2s=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=Px8H/JzCaFNAcBEIAeVFFD5v9VDqSYUGi17Y3BPOin94fh/FWXdq0rkQEJBjOhKd4\n\tVr/SE+ZUY3YAFeXt1/V/+XTDXuIdvxZsEH8/JKjHesA6AqTKtkF2ozui4yv/88NVgo\n\txWi2DXXF6wVO3cRMvPYPVMM33TG840aKSm/g9jgs=","Date":"Tue, 13 Jan 2026 11:43:44 +0200","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH 00/36] libcamera: Global configuration file improvements","Message-ID":"<20260113094344.GB18320@pendragon.ideasonboard.com>","References":"<PX6dEhSUDt2mD_Y4ec1MqgCOqa-GKp_F5m69tEyT_ORUpd0hSN1g9GJNWQRKm3MDFmGA0somY-ttjhTp3Ow56A==@protonmail.internalid>\n\t<20260113000808.15395-1-laurent.pinchart@ideasonboard.com>\n\t<f093a2a8-1fd5-424c-b7e5-4f0fcb5a9dc7@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<f093a2a8-1fd5-424c-b7e5-4f0fcb5a9dc7@ideasonboard.com>","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>"}}]