From patchwork Mon Jun 29 16:30:00 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= X-Patchwork-Id: 27116 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 160A5C3261 for ; Mon, 29 Jun 2026 16:31:29 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 8E11165FAC; Mon, 29 Jun 2026 18:31:28 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="f9Prlu1Y"; 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 39FD365F5A for ; Mon, 29 Jun 2026 18:30:29 +0200 (CEST) Received: from pb-laptop.local (185.221.140.128.nat.pool.zt.hu [185.221.140.128]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 14C5FE91 for ; Mon, 29 Jun 2026 18:29:46 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1782750586; bh=t85wYxmHMVG+Juya15nQvnb0oywUplTp+vdfjueU+z8=; h=From:To:Subject:Date:In-Reply-To:References:From; b=f9Prlu1YwIRKl2CTvEGHzhyUPxh7bgMCUXo/f73jl4GNT/sm3BPSulkuuBdngWA1S 8sR8S+M0yjHRXimGThudkLoGkA3NJE6iA92ZsoQky9la1IRvvBwfQvknJe5QegULm9 TqUIrWPGHtpMTe92BdhPgEPpkJX6d0PrLVeFZEYw= From: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= To: libcamera-devel@lists.libcamera.org Subject: [RFC PATCH v1 37/54] libcamera: camera: bufferCompleted: Pass `Stream` as well Date: Mon, 29 Jun 2026 18:30:00 +0200 Message-ID: <20260629163017.863145-38-barnabas.pocze@ideasonboard.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260629163017.863145-1-barnabas.pocze@ideasonboard.com> References: <20260629163017.863145-1-barnabas.pocze@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" Provide information about which stream the just completed buffer belongs to. This makes it easier for applications to know how to process the request, since they do not need to have a buffer -> stream mapping or a series of `request->findBuffer(stream) == buffer` conditions. Signed-off-by: Barnabás Pőcze --- include/libcamera/camera.h | 2 +- src/libcamera/camera.cpp | 10 ++++++---- src/libcamera/pipeline_handler.cpp | 8 ++++---- src/libcamera/request.cpp | 5 +++-- test/camera/buffer_import.cpp | 1 + test/camera/capture.cpp | 1 + 6 files changed, 16 insertions(+), 11 deletions(-) diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h index 471975a890..0195a9f3a8 100644 --- a/include/libcamera/camera.h +++ b/include/libcamera/camera.h @@ -124,7 +124,7 @@ public: const std::string &id() const; - Signal bufferCompleted; + Signal bufferCompleted; Signal requestCompleted; Signal<> disconnected; diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp index be55ed72c4..1bb696566c 100644 --- a/src/libcamera/camera.cpp +++ b/src/libcamera/camera.cpp @@ -800,12 +800,14 @@ Camera::Private::acquireBuffer(const Stream *stream) */ void Camera::Private::rejectBuffer(FrameBuffer *buffer) { + const Stream *stream = buffer->_d()->stream_; + ASSERT(!buffer->_d()->request()); - ASSERT(buffer->_d()->stream_); + ASSERT(stream); LOG(Camera, Debug) << "Camera:" << LIBCAMERA_O_PTR() << " rejects buffer:" - << buffer << " for stream:" << buffer->_d()->stream_; + << buffer << " for stream:" << stream; /* * \todo Not `FrameError` because that requires `timestamp` and @@ -814,8 +816,8 @@ void Camera::Private::rejectBuffer(FrameBuffer *buffer) buffer->_d()->cancel(); buffer->_d()->stream_ = nullptr; - // \todo separate event (with stream) ? - LIBCAMERA_O_PTR()->bufferCompleted.emit(nullptr, buffer); + // \todo separate event? + LIBCAMERA_O_PTR()->bufferCompleted.emit(nullptr, stream, buffer); } /** diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp index 755c78b308..27ce25ad11 100644 --- a/src/libcamera/pipeline_handler.cpp +++ b/src/libcamera/pipeline_handler.cpp @@ -421,20 +421,20 @@ void PipelineHandler::stop(Camera *camera) doQueueRequest(request); } - const auto returnBuffer = [&](FrameBuffer *buffer) { + const auto returnBuffer = [&](const Stream *stream, FrameBuffer *buffer) { ASSERT(!buffer->_d()->stream_); buffer->_d()->cancel(); - camera->bufferCompleted.emit(nullptr, buffer); + camera->bufferCompleted.emit(nullptr, stream, buffer); }; for (auto &pf : data->pendingFences_) - returnBuffer(pf.buffer); + returnBuffer(pf.stream, pf.buffer); data->pendingFences_.clear(); for (auto &[stream, streamData] : data->streamData_) { for (FrameBuffer *buffer : streamData.buffers) - returnBuffer(buffer); + returnBuffer(stream, buffer); streamData.buffers.clear(); } diff --git a/src/libcamera/request.cpp b/src/libcamera/request.cpp index ecdf558066..4fb8c0a659 100644 --- a/src/libcamera/request.cpp +++ b/src/libcamera/request.cpp @@ -108,7 +108,8 @@ bool Request::Private::completeBuffer(FrameBuffer *buffer) LIBCAMERA_TRACEPOINT(request_complete_buffer, this, buffer); Request *request = LIBCAMERA_O_PTR(); - auto it = request->bufferMap_.find(buffer->_d()->stream_); + const Stream *stream = buffer->_d()->stream_; + auto it = request->bufferMap_.find(stream); ASSERT(it != request->bufferMap_.end()); ASSERT(it->second == buffer || !it->second); @@ -122,7 +123,7 @@ bool Request::Private::completeBuffer(FrameBuffer *buffer) if (buffer->metadata().status == FrameMetadata::FrameCancelled) cancelled_ = true; - camera_->bufferCompleted.emit(request, buffer); + camera_->bufferCompleted.emit(request, stream, buffer); return !hasPendingBuffers(); } diff --git a/test/camera/buffer_import.cpp b/test/camera/buffer_import.cpp index 5e271ad3d0..c6f35a3135 100644 --- a/test/camera/buffer_import.cpp +++ b/test/camera/buffer_import.cpp @@ -39,6 +39,7 @@ public: protected: void bufferComplete([[maybe_unused]] Request *request, + [[maybe_unused]] const Stream *stream, FrameBuffer *buffer) { if (buffer->metadata().status != FrameMetadata::FrameSuccess) diff --git a/test/camera/capture.cpp b/test/camera/capture.cpp index fabe297e53..bc8cf4c59d 100644 --- a/test/camera/capture.cpp +++ b/test/camera/capture.cpp @@ -35,6 +35,7 @@ protected: unsigned int completeRequestsCount_; void bufferComplete([[maybe_unused]] Request *request, + [[maybe_unused]] const Stream *stream, FrameBuffer *buffer) { if (buffer->metadata().status != FrameMetadata::FrameSuccess)