From patchwork Thu Jun 26 09:59:40 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 23663 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 DA594BDCBF for ; Thu, 26 Jun 2025 10:00:30 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 3335868E09; Thu, 26 Jun 2025 12:00:30 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="ESY7bwnt"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 267B468DFA for ; Thu, 26 Jun 2025 12:00:23 +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 4F0C01D54; Thu, 26 Jun 2025 12:00:03 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1750932004; bh=V/cY7vn7mRHYdKtgvbI8eScUhW68cgybMgTOSZc8C2k=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ESY7bwntxH6oUjxB5j0czSR4USpS+9GxXJBmnQl4Iih8NqK1JsCNyMlTVQtyXnb2b xSdQnOXOQjvnxXxoPcMjFaXJke2ClMWpOHPE9LcbCGFVPnBSDyq4H4wUr5VJIcntkL ra3QsgvnTC1/cLukcnbjT02ojSC6EZMGJz5pHtrI= From: Paul Elder To: libcamera-devel@lists.libcamera.org Cc: Paul Elder , kieran.bingham@ideasonboard.com Subject: [RFC PATCH 5/7] libcamera: camera: Hook into the LayerManager Date: Thu, 26 Jun 2025 18:59:40 +0900 Message-ID: <20250626095944.1746345-6-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.47.2 In-Reply-To: <20250626095944.1746345-1-paul.elder@ideasonboard.com> References: <20250626095944.1746345-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 --- include/libcamera/internal/camera.h | 4 ++++ src/libcamera/camera.cpp | 26 +++++++++++++++++++++++--- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/include/libcamera/internal/camera.h b/include/libcamera/internal/camera.h index 967d4e1693ec..1b9c3da695b6 100644 --- a/include/libcamera/internal/camera.h +++ b/include/libcamera/internal/camera.h @@ -18,6 +18,8 @@ #include +#include "libcamera/internal/layer_manager.h" + namespace libcamera { class CameraControlValidator; @@ -76,6 +78,8 @@ private: std::atomic state_; std::unique_ptr validator_; + + std::unique_ptr layerManager_; }; } /* namespace libcamera */ diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp index c3e656cab671..895180452edb 100644 --- a/src/libcamera/camera.cpp +++ b/src/libcamera/camera.cpp @@ -741,18 +741,21 @@ void Camera::Private::setState(State state) void Camera::Private::emitBufferCompleted(Request *request, FrameBuffer *buffer) { Camera *camera = _o(); + layerManager_->bufferCompleted(request, buffer); camera->bufferCompleted.emit(request, buffer); } void Camera::Private::emitRequestCompleted(Request *request) { Camera *camera = _o(); + layerManager_->requestCompleted(request); camera->requestCompleted.emit(request); } void Camera::Private::emitDisconnected() { Camera *camera = _o(); + layerManager_->disconnected(); camera->disconnected.emit(); } @@ -943,6 +946,7 @@ Camera::Camera(std::unique_ptr d, const std::string &id, _d()->id_ = id; _d()->streams_ = streams; _d()->validator_ = std::make_unique(this); + _d()->layerManager_ = std::make_unique(); } Camera::~Camera() @@ -1032,6 +1036,8 @@ int Camera::acquire() return -EBUSY; } + d->layerManager_->acquire(); + d->setState(Private::CameraAcquired); return 0; @@ -1064,6 +1070,8 @@ int Camera::release() d->pipe_->invokeMethod(&PipelineHandler::release, ConnectionTypeBlocking, this); + d->layerManager_->release(); + d->setState(Private::CameraAvailable); return 0; @@ -1081,7 +1089,7 @@ int Camera::release() */ const ControlInfoMap &Camera::controls() const { - return _d()->controlInfo_; + return _d()->layerManager_->controls(_d()->controlInfo_); } /** @@ -1094,7 +1102,7 @@ const ControlInfoMap &Camera::controls() const */ const ControlList &Camera::properties() const { - return _d()->properties_; + return _d()->layerManager_->properties(_d()->properties_); } /** @@ -1110,7 +1118,7 @@ const ControlList &Camera::properties() const */ const std::set &Camera::streams() const { - return _d()->streams_; + return _d()->layerManager_->streams(_d()->streams_); } /** @@ -1158,6 +1166,8 @@ std::unique_ptr Camera::generateConfiguration(SpanlayerManager_->generateConfiguration(roles, config.get()); + return config; } @@ -1242,6 +1252,8 @@ int Camera::configure(CameraConfiguration *config) d->activeStreams_.insert(stream); } + d->layerManager_->configure(config); + d->setState(Private::CameraConfigured); return 0; @@ -1282,6 +1294,8 @@ std::unique_ptr Camera::createRequest(uint64_t cookie) /* Associate the request with the pipeline handler. */ d->pipe_->registerRequest(request.get()); + d->layerManager_->createRequest(cookie, request.get()); + return request; } @@ -1366,6 +1380,8 @@ int Camera::queueRequest(Request *request) } } + d->layerManager_->queueRequest(request); + d->pipe_->invokeMethod(&PipelineHandler::queueRequest, ConnectionTypeQueued, request); @@ -1402,6 +1418,8 @@ int Camera::start(const ControlList *controls) ASSERT(d->requestSequence_ == 0); + d->layerManager_->start(controls); + ret = d->pipe_->invokeMethod(&PipelineHandler::start, ConnectionTypeBlocking, this, controls); if (ret) @@ -1446,6 +1464,8 @@ int Camera::stop() d->setState(Private::CameraStopping); + d->layerManager_->stop(); + d->pipe_->invokeMethod(&PipelineHandler::stop, ConnectionTypeBlocking, this);