From patchwork Thu Jan 29 08:28:09 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 26031 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 91194C3226 for ; Thu, 29 Jan 2026 08:28:33 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 4A7BB61FCF; Thu, 29 Jan 2026 09:28:33 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="lxmGy67K"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 31E5961FC6 for ; Thu, 29 Jan 2026 09:28:30 +0100 (CET) Received: from neptunite.flets-east.jp (unknown [IPv6:2404:7a81:160:2100:2eea:f891:1bd7:2691]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 2E5AB1AED; Thu, 29 Jan 2026 09:27:50 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1769675272; bh=0JLjnVcYcwPLW/uhk53vTIOSM+l2ha7LNK092Powohg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=lxmGy67KLfxiua+OSzZDvtanyMS2yVfjDhBrWx3sUtz5e46I9d2eoWpcoTjUXWufz 4UIo7lhVzTjAbn2Z2e+pI3PGeF1x6LcK8VdLAZFnD3AHNbG2u6oyOJ3uGJ88wrhe9G deXgD2o8dXOffRR1T5mj10Bv2HQFcJOJipVpuh3w= From: Paul Elder To: libcamera-devel@lists.libcamera.org Cc: Paul Elder , Stefan Klug , Kieran Bingham Subject: [PATCH v6 3/8] libcamera: camera: Add indirection to Camera signal emissions Date: Thu, 29 Jan 2026 17:28:09 +0900 Message-ID: <20260129082814.1777779-4-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.47.2 In-Reply-To: <20260129082814.1777779-1-paul.elder@ideasonboard.com> References: <20260129082814.1777779-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 v6 No change in v5 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;