From patchwork Tue Jun 24 08:35:57 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Milan Zamazal X-Patchwork-Id: 23630 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 68811C3237 for ; Tue, 24 Jun 2025 08:36:37 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 7715561534; Tue, 24 Jun 2025 10:36:34 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.b="RcYlrcAL"; dkim-atps=neutral Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id C43CB68DDD for ; Tue, 24 Jun 2025 10:36:30 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1750754188; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=Fs+21bW7IiEMj4T53+hhCKhOfhlOOZtsG5+kRNc/UJc=; b=RcYlrcALtUdTXKfq/9L87Ivmmbl71EECg+ZGTO0TgfDFHSImfVt1fRC6jNDZQvsy9PAee6 3qw0Jo4uiYJv4P8BEXO5M8n8LUtYqxPePWug+1EJw4mblg1/yJJNKtGRP9bEE9pzis+Ry5 vUOGTsxB4xa7vwRINlyWs5V2NFp+XA0= Received: from mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-344-QO-Le8s2O0SFPE47nOqYxA-1; Tue, 24 Jun 2025 04:36:21 -0400 X-MC-Unique: QO-Le8s2O0SFPE47nOqYxA-1 X-Mimecast-MFC-AGG-ID: QO-Le8s2O0SFPE47nOqYxA_1750754180 Received: from mx-prod-int-04.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-04.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.40]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id E21551956096; Tue, 24 Jun 2025 08:36:19 +0000 (UTC) Received: from mzamazal-thinkpadp1gen7.tpbc.com (unknown [10.43.17.27]) by mx-prod-int-04.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 5904B19560AB; Tue, 24 Jun 2025 08:36:18 +0000 (UTC) From: Milan Zamazal To: libcamera-devel@lists.libcamera.org Cc: Milan Zamazal , Kieran Bingham , =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= , Laurent Pinchart Subject: [PATCH v11 00/12] Add global configuration file Date: Tue, 24 Jun 2025 10:35:57 +0200 Message-ID: <20250624083612.27230-1-mzamazal@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.40 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: V2g-pIBIPuxC7RDefTYPV6j3KNwjg1ZMTZP0-85PSUU_1750754180 X-Mimecast-Originator: redhat.com X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" 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, with the exception of rpi configuration file (see “Look up rpi configuration in the configuration file” patch). 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. Logging is omitted from the configuration file for technical reasons. 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. Both the directories and file name of the configuration file can be overridden using newly introduced environment variables. The current configuration environment variables are still supported and take precedence, if defined, over the corresponding entries in the YAML file. 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. Changes in v11: - global_configuration.cpp moved out of base and yaml_parser.cpp left in its original place. - Configuration initialized as empty if there is no configuration file, preventing a segfault on later access. - Cosmetic changes suggested by Laurent. - GlobalConfiguration::get() removed, *yamlConfiguration_ used directly. - Failing to read an existent configuration file is an error, rather than warning, now. (It should be also fatal, but how to propagate it?) - Slash is used instead of dot to separate configuration names. - rpi configuration read is in the global configuration directly (unless overridden by LIBCAMERA_RPI_CONFIG_FILE) now. Changes in v10: - Minor improvements suggested by Barnabás. Changes in v9: - The configuration instance is now stored in CameraManager and accessed from there rather than being a separate singleton wrapped by global accessors. This solves the ugly problem of delayed initialization but I don’t like anything else about it. I played a bit with the idea of attaching it to Logger instead, see the commit message of patch 03 for some discussion, but stayed with the CameraManager proposal eventually. - I’ve given up on the logging configuration now when the configuration is stored in CameraManager and removed the corresponding patches. I think it’s possible to add it later, but for now, it’s already complicated enough. - Not much tested, let’s see first if the current implementation gets in an acceptable direction. Changes in v8: - Rebased on current master. - Anniversary edition: 400 days since v1 posted. ;-) Changes in v7: - Rebased on current master. - Tuning file path configuration updated for recent changes. A significant change is that the tuning file configuration is no longer sensor dependent as there is apparently no access to the sensor info in the IPA proxy. - Minor improvements of some commit messages. Changes in v6: - Rebased on master. - File names from file header descriptions removed. - Indentation fix in moved code as requested by checkstyle.py. - Unneeded const_cast's removed. - Using GlobalConfiguration namespace rather than a class. - Path configuration options are defined as sequences in YAML. - A patch introducing LIBCAMERA_CONFIG_NAME added. - A patch introducing LIBCAMERA_CONFIG_DIR added. - Miscellaneous minor code changes suggested by Barnabás. 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 (12): config: Introduce global runtime configuration config: Make GlobalConfiguration instance config: Add configuration retrieval helpers config: Look up rpi configuration in the configuration file config: Look up IPA configurables 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 config: Make configuration file configurable config: Make configuration directories configurable Documentation/documentation-contents.rst | 2 +- Documentation/index.rst | 2 +- Documentation/meson.build | 2 +- ...ariables.rst => runtime_configuration.rst} | 126 ++++++++- include/libcamera/internal/camera_manager.h | 8 + .../libcamera/internal/global_configuration.h | 71 +++++ include/libcamera/internal/ipa_manager.h | 8 +- include/libcamera/internal/ipa_proxy.h | 5 +- include/libcamera/internal/meson.build | 1 + src/libcamera/camera_manager.cpp | 19 +- src/libcamera/global_configuration.cpp | 254 ++++++++++++++++++ src/libcamera/ipa_manager.cpp | 37 ++- src/libcamera/ipa_proxy.cpp | 72 ++--- src/libcamera/meson.build | 1 + src/libcamera/pipeline/ipu3/ipu3.cpp | 3 +- src/libcamera/pipeline/mali-c55/mali-c55.cpp | 2 + src/libcamera/pipeline/rkisp1/rkisp1.cpp | 4 +- .../pipeline/rpi/common/pipeline_base.cpp | 63 +++-- .../pipeline/rpi/common/pipeline_base.h | 2 +- src/libcamera/pipeline/rpi/pisp/pisp.cpp | 14 +- src/libcamera/pipeline/rpi/vc4/vc4.cpp | 14 +- src/libcamera/pipeline/simple/simple.cpp | 13 + src/libcamera/pipeline/vimc/vimc.cpp | 3 +- src/libcamera/software_isp/TODO | 36 --- src/libcamera/software_isp/debayer_cpu.cpp | 32 ++- src/libcamera/software_isp/debayer_cpu.h | 10 +- src/libcamera/software_isp/software_isp.cpp | 6 +- test/ipa/ipa_interface_test.cpp | 3 +- .../module_ipa_proxy.cpp.tmpl | 4 +- .../module_ipa_proxy.h.tmpl | 2 +- 30 files changed, 641 insertions(+), 178 deletions(-) rename Documentation/{environment_variables.rst => runtime_configuration.rst} (59%) create mode 100644 include/libcamera/internal/global_configuration.h create mode 100644 src/libcamera/global_configuration.cpp