From patchwork Thu Jul 3 11:42:21 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 23736 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 E67C9C3293 for ; Thu, 3 Jul 2025 11:42:57 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 9B29468E64; Thu, 3 Jul 2025 13:42:57 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="K1IVA8ln"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 0D46468E52 for ; Thu, 3 Jul 2025 13:42:56 +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 E340782E; Thu, 3 Jul 2025 13:42:30 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1751542952; bh=kC7XA7hFK5mk28YAu8uyaO9xVQYEwDVa+a8Yh/1qIvw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=K1IVA8lngWNWk+KybPc5cX+fQLguMtXD3BhUc5YsjLFlu0DVBwgg3XUZCuX4m+9EN tNtI93412YSe5riP/ZVLI1g2UzXk+lFSMIzOH781rOE/T0kXdW4GQCx2xz7PAeQdZ3 TiDCQYZY+tQJBW4hwl9IQ66Eu9UjsMQcdaEFSnsw= From: Paul Elder To: libcamera-devel@lists.libcamera.org Cc: Paul Elder , kieran.bingham@ideasonboard.com, barnabas.pocze@ideasonboard.com Subject: [PATCH v2 6/8] libcamera: camera: Hook into the LayerManager Date: Thu, 3 Jul 2025 20:42:21 +0900 Message-ID: <20250703114225.2074071-7-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.47.2 In-Reply-To: <20250703114225.2074071-1-paul.elder@ideasonboard.com> References: <20250703114225.2074071-1-paul.elder@ideasonboard.com> 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" Add hooks into the CameraManager to call into the LayerManager on all relevant public-facing interface of Camera. The entry point for each function into the LayerManager is has been chosen based on the capabilities that we want to allow to Layer implementations. Signed-off-by: Paul Elder --- Changes in v2: - move the LayerManager out of Camera into the CameraManager - remove hooks for generateConfiguration() and streams() - Camera now passes itself into the layer hooks, as it is required for the LayerManager to fetch the closure based on the camera to pass to each layer --- src/libcamera/camera.cpp | 40 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp index c3e656cab671..665fc5157349 100644 --- a/src/libcamera/camera.cpp +++ b/src/libcamera/camera.cpp @@ -18,6 +18,7 @@ #include #include +#include #include #include #include @@ -27,6 +28,8 @@ #include "libcamera/internal/camera.h" #include "libcamera/internal/camera_controls.h" +#include "libcamera/internal/camera_manager.h" +#include "libcamera/internal/layer_manager.h" #include "libcamera/internal/pipeline_handler.h" #include "libcamera/internal/request.h" @@ -741,18 +744,24 @@ void Camera::Private::setState(State state) void Camera::Private::emitBufferCompleted(Request *request, FrameBuffer *buffer) { Camera *camera = _o(); + LayerManager *layerManager = pipe()->cameraManager()->_d()->layerManager(); + layerManager->bufferCompleted(camera, request, buffer); camera->bufferCompleted.emit(request, buffer); } void Camera::Private::emitRequestCompleted(Request *request) { Camera *camera = _o(); + LayerManager *layerManager = pipe()->cameraManager()->_d()->layerManager(); + layerManager->requestCompleted(camera, request); camera->requestCompleted.emit(request); } void Camera::Private::emitDisconnected() { Camera *camera = _o(); + LayerManager *layerManager = pipe()->cameraManager()->_d()->layerManager(); + layerManager->disconnected(camera); camera->disconnected.emit(); } @@ -943,10 +952,14 @@ Camera::Camera(std::unique_ptr d, const std::string &id, _d()->id_ = id; _d()->streams_ = streams; _d()->validator_ = std::make_unique(this); + _d()->pipe()->cameraManager()->_d()->layerManager()->init(this, + _d()->properties_, + _d()->controlInfo_); } Camera::~Camera() { + _d()->pipe()->cameraManager()->_d()->layerManager()->terminate(this); } /** @@ -1032,6 +1045,9 @@ int Camera::acquire() return -EBUSY; } + LayerManager *layerManager = d->pipe()->cameraManager()->_d()->layerManager(); + layerManager->acquire(this); + d->setState(Private::CameraAcquired); return 0; @@ -1064,6 +1080,9 @@ int Camera::release() d->pipe_->invokeMethod(&PipelineHandler::release, ConnectionTypeBlocking, this); + LayerManager *layerManager = d->pipe()->cameraManager()->_d()->layerManager(); + layerManager->release(this); + d->setState(Private::CameraAvailable); return 0; @@ -1081,7 +1100,8 @@ int Camera::release() */ const ControlInfoMap &Camera::controls() const { - return _d()->controlInfo_; + LayerManager *layerManager = _d()->pipe()->cameraManager()->_d()->layerManager(); + return layerManager->controls(this); } /** @@ -1094,7 +1114,8 @@ const ControlInfoMap &Camera::controls() const */ const ControlList &Camera::properties() const { - return _d()->properties_; + LayerManager *layerManager = _d()->pipe()->cameraManager()->_d()->layerManager(); + return layerManager->properties(this); } /** @@ -1242,6 +1263,9 @@ int Camera::configure(CameraConfiguration *config) d->activeStreams_.insert(stream); } + LayerManager *layerManager = d->pipe()->cameraManager()->_d()->layerManager(); + layerManager->configure(this, config, d->controlInfo_); + d->setState(Private::CameraConfigured); return 0; @@ -1282,6 +1306,9 @@ std::unique_ptr Camera::createRequest(uint64_t cookie) /* Associate the request with the pipeline handler. */ d->pipe_->registerRequest(request.get()); + LayerManager *layerManager = d->pipe()->cameraManager()->_d()->layerManager(); + layerManager->createRequest(this, cookie, request.get()); + return request; } @@ -1366,6 +1393,9 @@ int Camera::queueRequest(Request *request) } } + LayerManager *layerManager = d->pipe()->cameraManager()->_d()->layerManager(); + layerManager->queueRequest(this, request); + d->pipe_->invokeMethod(&PipelineHandler::queueRequest, ConnectionTypeQueued, request); @@ -1402,6 +1432,9 @@ int Camera::start(const ControlList *controls) ASSERT(d->requestSequence_ == 0); + LayerManager *layerManager = d->pipe()->cameraManager()->_d()->layerManager(); + layerManager->start(this, controls); + ret = d->pipe_->invokeMethod(&PipelineHandler::start, ConnectionTypeBlocking, this, controls); if (ret) @@ -1446,6 +1479,9 @@ int Camera::stop() d->setState(Private::CameraStopping); + LayerManager *layerManager = d->pipe()->cameraManager()->_d()->layerManager(); + layerManager->stop(this); + d->pipe_->invokeMethod(&PipelineHandler::stop, ConnectionTypeBlocking, this);