From patchwork Wed Jan 28 07:49:51 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 25987 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 5554DC3200 for ; Wed, 28 Jan 2026 07:50:19 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 178D261FD9; Wed, 28 Jan 2026 08:50:19 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="Bn1QX9nP"; 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 7C7D461FD6 for ; Wed, 28 Jan 2026 08:50:14 +0100 (CET) Received: from neptunite.hamster-moth.ts.net (unknown [IPv6:2404:7a81:160:2100:508d:7983:72a6:2eeb]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 32F5173B; Wed, 28 Jan 2026 08:49:35 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1769586577; bh=d7RnAFYyUMzj5eb9/kqDiYc9gSjqLHUVZBP8MJNxyoQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Bn1QX9nPX2UCwK30yBHOkKxoUbOruEZQcGGoPuKI3Ldw8aeVXAWJ3cjRlo1DW6f4Y ceKE/aP9GF1tBPbqPeW97nAQLKWHSgBBEB7wuD4wFj1HbULWCD9QUqx96/SVfq55su 4qE1N2fSpYkfenzehgG2h0fvz59Z52xBtDTGNA9M= From: Paul Elder To: libcamera-devel@lists.libcamera.org Cc: Paul Elder , Stefan Klug , Kieran Bingham Subject: [PATCH v5 3/8] libcamera: camera: Add indirection to Camera signal emissions Date: Wed, 28 Jan 2026 16:49:51 +0900 Message-ID: <20260128074956.760538-4-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.47.2 In-Reply-To: <20260128074956.760538-1-paul.elder@ideasonboard.com> References: <20260128074956.760538-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 an extra level of indirection when emitting signals from the Camera. This is to facilitate the implementation of the layer system in the near future, which will need to hook into Camera signal emissions. Signed-off-by: Paul Elder Reviewed-by: Stefan Klug Reviewed-by: Kieran Bingham --- No change in v4 Changes in v3: - Add documentation No change in v2 --- include/libcamera/internal/camera.h | 4 +++ src/libcamera/camera.cpp | 47 +++++++++++++++++++++++++++-- src/libcamera/pipeline_handler.cpp | 2 +- src/libcamera/request.cpp | 2 +- 4 files changed, 51 insertions(+), 4 deletions(-) diff --git a/include/libcamera/internal/camera.h b/include/libcamera/internal/camera.h index 8a2e9ed5894d..d28cd921a0f9 100644 --- a/include/libcamera/internal/camera.h +++ b/include/libcamera/internal/camera.h @@ -36,6 +36,10 @@ public: PipelineHandler *pipe() { return pipe_.get(); } const PipelineHandler *pipe() const { return pipe_.get(); } + void emitBufferCompleted(Request *request, FrameBuffer *buffer); + void emitRequestCompleted(Request *request); + void emitDisconnected(); + std::list queuedRequests_; std::queue waitingRequests_; ControlInfoMap controlInfo_; diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp index 7c0e93ff483f..a2132e61a7bd 100644 --- a/src/libcamera/camera.cpp +++ b/src/libcamera/camera.cpp @@ -611,6 +611,30 @@ Camera::Private::~Private() * \copydoc Camera::Private::pipe() */ +/** + * \fn Camera::Private::emitBufferCompleted + * \copydoc Camera::bufferCompleted + * + * This is one level of indirection so that we can call into the LayerManager + * before actually emitting the Signal. + */ + +/** + * \fn Camera::Private::emitRequestCompleted + * \copydoc Camera::requestCompleted + * + * This is one level of indirection so that we can call into the LayerManager + * before actually emitting the Signal. + */ + +/** + * \fn Camera::Private::emitDisconnected + * \copydoc Camera::disconnected + * + * This is one level of indirection so that we can call into the LayerManager + * before actually emitting the Signal. + */ + /** * \fn Camera::Private::validator() * \brief Retrieve the control validator related to this camera @@ -746,6 +770,25 @@ void Camera::Private::setState(State state) { state_.store(state, std::memory_order_release); } + +void Camera::Private::emitBufferCompleted(Request *request, FrameBuffer *buffer) +{ + Camera *camera = _o(); + camera->bufferCompleted.emit(request, buffer); +} + +void Camera::Private::emitRequestCompleted(Request *request) +{ + Camera *camera = _o(); + camera->requestCompleted.emit(request); +} + +void Camera::Private::emitDisconnected() +{ + Camera *camera = _o(); + camera->disconnected.emit(); +} + #endif /* __DOXYGEN_PUBLIC__ */ /** @@ -956,7 +999,7 @@ void Camera::disconnect() LOG(Camera, Debug) << "Disconnecting camera " << id(); _d()->disconnect(); - disconnected.emit(); + _d()->emitDisconnected(); } int Camera::exportFrameBuffers(Stream *stream, @@ -1486,7 +1529,7 @@ void Camera::requestComplete(Request *request) true)) LOG(Camera, Fatal) << "Trying to complete a request when stopped"; - requestCompleted.emit(request); + _d()->emitRequestCompleted(request); } } /* namespace libcamera */ diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp index 5c469e5bad24..c51ce4048558 100644 --- a/src/libcamera/pipeline_handler.cpp +++ b/src/libcamera/pipeline_handler.cpp @@ -563,7 +563,7 @@ void PipelineHandler::doQueueRequests(Camera *camera) bool PipelineHandler::completeBuffer(Request *request, FrameBuffer *buffer) { Camera *camera = request->_d()->camera(); - camera->bufferCompleted.emit(request, buffer); + camera->_d()->emitBufferCompleted(request, buffer); return request->_d()->completeBuffer(buffer); } diff --git a/src/libcamera/request.cpp b/src/libcamera/request.cpp index 57f1f060d5b4..aa76188d3e42 100644 --- a/src/libcamera/request.cpp +++ b/src/libcamera/request.cpp @@ -145,7 +145,7 @@ void Request::Private::doCancelRequest() for (FrameBuffer *buffer : pending_) { buffer->_d()->cancel(); - camera_->bufferCompleted.emit(request, buffer); + camera_->_d()->emitBufferCompleted(request, buffer); } cancelled_ = true;