From patchwork Thu Jul 3 11:42:15 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 23730 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 EF4C8BDCBF for ; Thu, 3 Jul 2025 11:42:46 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id B797C68E3B; Thu, 3 Jul 2025 13:42:45 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="WLM7746z"; 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 168F961528 for ; Thu, 3 Jul 2025 13:42:44 +0200 (CEST) Received: from neptunite.hamster-moth.ts.net (unknown [IPv6:2404:7a81:160:2100:c61b:f3bf:2578:6674]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id DDA08593; Thu, 3 Jul 2025 13:42:18 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1751542940; bh=F9sOwchRQYOKkUW/X//t82kx3IvZznWC+DUhbozMU78=; h=From:To:Cc:Subject:Date:From; b=WLM7746zfXaar+Rt/aKD23XZHB22dIIonVCDnNGHidtYSW8349fP6Frm4f7pDa11o oq1V8VDIlim3nU+0/9AjqZr7Sc5u8cSRtTbQxuq0rTnhtG3TJxlhKwFZCfuc+J7EQM vxkuDPKEUAZohsj5ZE7i8/+9/27amea2HOgkCMJM= From: Paul Elder To: libcamera-devel@lists.libcamera.org Cc: Paul Elder , kieran.bingham@ideasonboard.com, barnabas.pocze@ideasonboard.com Subject: [PATCH v2 0/8] Add Layers support Date: Thu, 3 Jul 2025 20:42:15 +0900 Message-ID: <20250703114225.2074071-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~6 connects the Camera to the layer infrastructure. Finally patches 7~8 implement a simple layer that implements the AeEnable control, to demonstrate how a Layer might work. v2 most notably reorganizes the LayerManager to be under the CameraManager instead of the Camera, and adds support for closures so that each layer can store its data per camera. Paul Elder (8): 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_manager: Add LayerManager libcamera: camera: Hook into the LayerManager layer: Add layer to inject AeEnable control camera, ipa: all: Remove AeEnable handling include/libcamera/internal/camera.h | 4 + include/libcamera/internal/camera_manager.h | 3 + include/libcamera/internal/ipa_manager.h | 4 - include/libcamera/internal/layer_manager.h | 117 ++++++ include/libcamera/internal/meson.build | 2 + include/libcamera/internal/utils.h | 32 ++ include/libcamera/layer.h | 54 +++ 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 | 176 ++++++++ src/layer/inject_controls/inject_controls.h | 24 ++ src/layer/inject_controls/meson.build | 16 + src/layer/meson.build | 12 + src/libcamera/camera.cpp | 80 +++- src/libcamera/camera_manager.cpp | 2 + src/libcamera/ipa_manager.cpp | 108 +---- src/libcamera/ipa_module.cpp | 152 +------ src/libcamera/layer_manager.cpp | 383 ++++++++++++++++++ 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 + 26 files changed, 1176 insertions(+), 275 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