From patchwork Mon Jul 28 11:55:50 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 24000 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 3CF07C3323 for ; Mon, 28 Jul 2025 11:56:16 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id A0A726916F; Mon, 28 Jul 2025 13:56:15 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="mtSqQUlM"; 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 044C26915F for ; Mon, 28 Jul 2025 13:56:13 +0200 (CEST) Received: from neptunite.hamster-moth.ts.net (unknown [IPv6:2404:7a81:160:2100:5715:34ad:7742:5049]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 7C9A16DC; Mon, 28 Jul 2025 13:55:29 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1753703731; bh=ch6CzQ4knxf2A1jDaoEblQso/M9vCieLW4Ene6CBpIk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=mtSqQUlMY9Y5Fx1RLFoNKOJFNs0rZ0H3+gocD/fIxsrfSznK08pqhKbQoPCioBF0C dkgQSS/LOVMCQHn40C9mUykllw20i0HdH6DKCYAZ/3IHVFNPtdn+t6kbVBxbNTcdJ+ ClpOJ3tn5sV+vBQ6JXgLKkOvBCzSI8maypQioYeE= From: Paul Elder To: libcamera-devel@lists.libcamera.org Cc: Paul Elder , kieran.bingham@ideasonboard.com, barnabas.pocze@ideasonboard.com, Stefan Klug Subject: [PATCH v3 3/8] libcamera: camera: Add indirection to Camera signal emissions Date: Mon, 28 Jul 2025 20:55:50 +0900 Message-ID: <20250728115556.2886082-4-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.47.2 In-Reply-To: <20250728115556.2886082-1-paul.elder@ideasonboard.com> References: <20250728115556.2886082-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 --- 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 2e1e146a25b1..99aed4f0703a 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, @@ -1480,7 +1523,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 e5f9e55c9783..a7d98fe2fa65 100644 --- a/src/libcamera/pipeline_handler.cpp +++ b/src/libcamera/pipeline_handler.cpp @@ -552,7 +552,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 7f1e11e8f913..b4ae0f41a34c 100644 --- a/src/libcamera/request.cpp +++ b/src/libcamera/request.cpp @@ -137,7 +137,7 @@ void Request::Private::doCancelRequest() for (FrameBuffer *buffer : pending_) { buffer->_d()->cancel(); - camera_->bufferCompleted.emit(request, buffer); + camera_->_d()->emitBufferCompleted(request, buffer); } cancelled_ = true;