{"id":25720,"url":"https://patchwork.libcamera.org/api/1.1/covers/25720/?format=json","web_url":"https://patchwork.libcamera.org/cover/25720/","project":{"id":1,"url":"https://patchwork.libcamera.org/api/1.1/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":"<20260113000808.15395-1-laurent.pinchart@ideasonboard.com>","date":"2026-01-13T00:07:32","name":"[00/36] libcamera: Global configuration file improvements","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/1.1/people/2/?format=json","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"mbox":"https://patchwork.libcamera.org/cover/25720/mbox/","series":[{"id":5703,"url":"https://patchwork.libcamera.org/api/1.1/series/5703/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=5703","date":"2026-01-13T00:07:32","name":"libcamera: Global configuration file improvements","version":1,"mbox":"https://patchwork.libcamera.org/series/5703/mbox/"}],"comments":"https://patchwork.libcamera.org/api/covers/25720/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 0B602BDCBF\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 13 Jan 2026 00:08:33 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 2B3B061FC3;\n\tTue, 13 Jan 2026 01:08:32 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id D5F40606D5\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 13 Jan 2026 01:08:29 +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 00C8C50A\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 13 Jan 2026 01:08:03 +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=\"J8A0gv0g\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1768262884;\n\tbh=U5DcdYlL4Ah+tz8xXT/sGAvEUai+xsKp2xXIsIhTmhY=;\n\th=From:To:Subject:Date:From;\n\tb=J8A0gv0gE9sg/tAJhnRT/lP3XkqCx/YdyK7NTQTEY4rU6+nuHYnS9XM0FTqNO7NVv\n\tSQKpseTgszdDuYIwribj4zvDDfmtap3LSxsn/n5Euk6cIR7rUVteH4lUEMRlKy5BE1\n\tW5QnvtWHg+R5CUXHNCuVEwT9afcYDLFMcy4UCqS4=","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"libcamera-devel@lists.libcamera.org","Subject":"[PATCH 00/36] libcamera: Global configuration file improvements","Date":"Tue, 13 Jan 2026 02:07:32 +0200","Message-ID":"<20260113000808.15395-1-laurent.pinchart@ideasonboard.com>","X-Mailer":"git-send-email 2.51.2","MIME-Version":"1.0","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 (long overdue) series started small with a few improvements to the\nglobal configuration file handling, fixing some issues I pointed out\nduring reviews. It then grew over time, and while I have ideas for more\nimprovements, adding more patches will only slow down review.\n\nThe series starts with a few drive-by cleanups in patches 01/36 to\n07/36. Those could be merged separately, but some of them would then end\nup conflicting with the rest of the series, so I've included them here.\n\nThe rework of the configuration file starts in patch 08/36 with\nimprovements to the YamlParser and YamlObject classes, until patch 19/36\nthat renames YamlObject to ValueNode to make the class usable outside of\nYAML parsing use cases.\n\nPatches 20/36 to 24/36 then move to reworking the global configuration\nclass, with the most notable change in 20/36 that passes a CameraManager\naround to access the GlobalConfiguration. Patches 25/36 to 30/36 then go\nback to the ValueNode class to extend it with new functions that are\nused by subsequent patches.\n\nAfter that, Patches 31/36 and 32/36 centralizes configuration override\nthrough environment variables. This simplifies usage of the\nGlobalConfiguration class through libcamera, at the cost of splitting\ninformation about environment variables from the place where the\ncorresponding 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 33/36 is a small documentation improvement, before the last three\npatches that break backward compatibility. They are conceptually\nindependent from each other, 36/36 currently depends on 35/36, but it\ncould be rebased if 35/36 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 tree of\nValueNode instances. Another possible improvement would be to\nrestructure the configuration file to provide per-camera configuration\nin addition to per-pipeline handler options. If anyone is interested in\ngiving this a try, let's discuss it.\n\nLaurent 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\nbase-commit: 5e59969dbb7313228bc8641e5e611a8ecd0eadcf\n--\nRegards,\n\nLaurent Pinchart"}