From patchwork Thu Jun 26 09:59:35 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 23658 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 C57EEBDCBF for ; Thu, 26 Jun 2025 10:00:15 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 81EB668DF6; Thu, 26 Jun 2025 12:00:15 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="dNvJW+ls"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 235F868DE8 for ; Thu, 26 Jun 2025 12:00:14 +0200 (CEST) Received: from neptunite.hamster-moth.ts.net (unknown [IPv6:2404:7a81:160:2100:258b:9e43:6dff:c39d]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 4C99C6AE; Thu, 26 Jun 2025 11:59:54 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1750931995; bh=mmorMg534SxD9viJQuEBmJyF+ov+qlQM18sycvCxFGk=; h=From:To:Cc:Subject:Date:From; b=dNvJW+lsM8FEseuWkr4PD2y3l8RVpZJe6TMNkGAsjlDB0wVOKYpdG/4xpRFykiNna LtgWUhMWBzGLuBwTrSwYUK/KmAW8riyMCKy/1nxgWX+2lji8k7D54VuSHtRspjKklA iReikNEpj0WFSupdKULSJdeByy9k1TBgmw45QcVQ= From: Paul Elder To: libcamera-devel@lists.libcamera.org Cc: Paul Elder , kieran.bingham@ideasonboard.com Subject: [RFC PATCH 0/7] Add Layers support Date: Thu, 26 Jun 2025 18:59:35 +0900 Message-ID: <20250626095944.1746345-1-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.47.2 MIME-Version: 1.0 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 series introduces a new concept to libcamera, called Layers. They sit between the application and the Camera, and hook into a subset of the Camera calls. This allows things that don't belong inside a Camera/IPA nor inside an application to be implemented, such as the Sync algorithm. As a light demonstration of the capabilities of Layers, this series implements a Layer that intercepts all control-related calls to implement the AeEnable control transparently. Patches 1~3 are refactoring and reorganizing existing code. Patch 4 implements the LayerManager, which is the main component. Patch 5 connects the Camera to the layer infrastructure. Finally patches 6~7 implement a simple layer that implements the AeEnable control, to demonstrate how a Layer might work. Paul Elder (7): libcamera: ipa_manager: Factor out .so file searching libcamera: ipa_module: Factor out ELF file handling libcamera: camera: Add indirection to Camera signal emissions libcamera: layer_manager: Add LayerManager implementation libcamera: camera: Hook into the LayerManager layer: Add layer to inject AeEnable control camera, ipa: all: Remove AeEnable handling include/libcamera/internal/camera.h | 8 + include/libcamera/internal/ipa_manager.h | 4 - include/libcamera/internal/layer_manager.h | 74 +++++ include/libcamera/internal/meson.build | 2 + include/libcamera/internal/utils.h | 32 ++ include/libcamera/layer.h | 56 ++++ include/libcamera/meson.build | 1 + src/ipa/mali-c55/algorithms/agc.cpp | 1 + src/ipa/rkisp1/algorithms/agc.cpp | 2 - src/ipa/rpi/common/ipa_base.cpp | 2 - src/layer/inject_controls/inject_controls.cpp | 164 +++++++++ src/layer/inject_controls/inject_controls.h | 29 ++ src/layer/inject_controls/meson.build | 15 + src/layer/meson.build | 12 + src/libcamera/camera.cpp | 66 ++-- src/libcamera/ipa_manager.cpp | 108 ++---- src/libcamera/ipa_module.cpp | 152 +-------- src/libcamera/layer_manager.cpp | 314 ++++++++++++++++++ src/libcamera/meson.build | 2 + src/libcamera/pipeline/uvcvideo/uvcvideo.cpp | 5 - src/libcamera/pipeline_handler.cpp | 2 +- src/libcamera/request.cpp | 2 +- src/libcamera/utils.cpp | 264 +++++++++++++++ src/meson.build | 1 + 24 files changed, 1042 insertions(+), 276 deletions(-) create mode 100644 include/libcamera/internal/layer_manager.h create mode 100644 include/libcamera/internal/utils.h create mode 100644 include/libcamera/layer.h create mode 100644 src/layer/inject_controls/inject_controls.cpp create mode 100644 src/layer/inject_controls/inject_controls.h create mode 100644 src/layer/inject_controls/meson.build create mode 100644 src/layer/meson.build create mode 100644 src/libcamera/layer_manager.cpp create mode 100644 src/libcamera/utils.cpp