From patchwork Thu Jun 18 12:38:18 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: 26965 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 0855EBF415 for ; Thu, 18 Jun 2026 12:38:57 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id D1AB0656E7; Thu, 18 Jun 2026 14:38:52 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="SV26I6Tl"; 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 C968C629AD for ; Thu, 18 Jun 2026 14:38:48 +0200 (CEST) Received: from pb-laptop.local (185.182.214.63.nat.pool.zt.hu [185.182.214.63]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id B95A1DF3 for ; Thu, 18 Jun 2026 14:38:13 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1781786293; bh=+qbOOs9ZFFzV7sK0m0MjaIWTfgAYus9i/dOB6EryRB0=; h=From:To:Subject:Date:In-Reply-To:References:From; b=SV26I6TlTvU9PE896mA29CVELe4Ww8+W4x4nhyzjaDn/gc8ZIrdx+ptPXg+C1fyKo 0omm11s6YzGhD8pmriUjEILiZsYl1QK+l4h6QJJumyEL2zuvCO2sGWY5urTu/9Wuzu 0hRxUyFDoQY1MltiMSM+Hvk++5ZJ07Z00mDdxl08= From: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= To: libcamera-devel@lists.libcamera.org Subject: [RFC PATCH v1 01/27] apps: cam: Simplify buffer reuse Date: Thu, 18 Jun 2026 14:38:18 +0200 Message-ID: <20260618123844.656396-2-barnabas.pocze@ideasonboard.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260618123844.656396-1-barnabas.pocze@ideasonboard.com> References: <20260618123844.656396-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" Remove code duplication by calling `sinkRelease()` instead. Signed-off-by: Barnabás Pőcze --- src/apps/cam/camera_session.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/apps/cam/camera_session.cpp b/src/apps/cam/camera_session.cpp index 17444a217b..ce8ee354f0 100644 --- a/src/apps/cam/camera_session.cpp +++ b/src/apps/cam/camera_session.cpp @@ -542,11 +542,8 @@ void CameraSession::processRequest(Request *request) * If the frame sink holds on the request, we'll requeue it later in the * complete handler. */ - if (!requeue) - return; - - request->reuse(Request::ReuseBuffers); - queueRequest(request); + if (requeue) + sinkRelease(request); } void CameraSession::sinkRelease(Request *request) From patchwork Thu Jun 18 12:38:19 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: 26966 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 4CF25BF415 for ; Thu, 18 Jun 2026 12:39:00 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 7B2DA656E4; Thu, 18 Jun 2026 14:38:54 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="NvczzRdC"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id DE265629E0 for ; Thu, 18 Jun 2026 14:38:48 +0200 (CEST) Received: from pb-laptop.local (185.182.214.63.nat.pool.zt.hu [185.182.214.63]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id E7F841894 for ; Thu, 18 Jun 2026 14:38:13 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1781786294; bh=G9E3MiS16ADVtBPpBAXgn6HC2Ogh1myfLFKuYuDtyxE=; h=From:To:Subject:Date:In-Reply-To:References:From; b=NvczzRdCp4EZZyE6jAvcTythzZSV7wbcJ+FeNCtYSCH6jdx7zX7+DwUb9cZyze/uO PxKzSsH7mvl55ViCtj+Cl2DZIwLaKMSoFJi9LXqe8MsUxGqtX5trrpfMkzI8Xmlxox fug5CIqsAPaCMXaN1pXuiWpkagLHvHG5C1qmS2+4= From: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= To: libcamera-devel@lists.libcamera.org Subject: [RFC PATCH v1 02/27] libcamera: request: Inline `Private::hasPendingRequests()` Date: Thu, 18 Jun 2026 14:38:19 +0200 Message-ID: <20260618123844.656396-3-barnabas.pocze@ideasonboard.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260618123844.656396-1-barnabas.pocze@ideasonboard.com> References: <20260618123844.656396-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" It is a trivial function, inline it. Signed-off-by: Barnabás Pőcze --- include/libcamera/internal/request.h | 2 +- src/libcamera/request.cpp | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/include/libcamera/internal/request.h b/include/libcamera/internal/request.h index 693097ee9a..382ed28bca 100644 --- a/include/libcamera/internal/request.h +++ b/include/libcamera/internal/request.h @@ -34,7 +34,7 @@ public: ~Private(); Camera *camera() const { return camera_; } - bool hasPendingBuffers() const; + bool hasPendingBuffers() const { return !pending_.empty(); } ControlList &metadata() { return metadata_; } diff --git a/src/libcamera/request.cpp b/src/libcamera/request.cpp index b50a642052..e31c9c006a 100644 --- a/src/libcamera/request.cpp +++ b/src/libcamera/request.cpp @@ -74,15 +74,12 @@ Request::Private::~Private() */ /** + * \fn Request::Private::hasPendingBuffers() * \brief Check if a request has buffers yet to be completed * * \return True if the request has buffers pending for completion, false * otherwise */ -bool Request::Private::hasPendingBuffers() const -{ - return !pending_.empty(); -} /** * \fn Request::Private::metadata() From patchwork Thu Jun 18 12:38:20 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: 26967 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 52430C328C for ; Thu, 18 Jun 2026 12:39:03 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id D284E656D4; Thu, 18 Jun 2026 14:38:55 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="vGYnOfRg"; 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 0DA47629E3 for ; Thu, 18 Jun 2026 14:38:49 +0200 (CEST) Received: from pb-laptop.local (185.182.214.63.nat.pool.zt.hu [185.182.214.63]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 1FBE22F8 for ; Thu, 18 Jun 2026 14:38:14 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1781786294; bh=fCBgk0E9ocfN4euT9lYa38GvfNnlNvZ6daZ7spRHyf8=; h=From:To:Subject:Date:In-Reply-To:References:From; b=vGYnOfRgIQcHXcOlyg1zfn1kCPwrdtgmqCVj71gRuicvCSWsDCDjKOwSdgsLWdzQZ tclBmFd98MYujY5uDmedwBbK9U8Hh6CHOYb8TQkpMxIO+ZA04E7SNVUpmZUcZy3B6d jFuDuD3LGKPkIf9oeGQlAzVfY5KWdsUYjZZ7Q968= From: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= To: libcamera-devel@lists.libcamera.org Subject: [RFC PATCH v1 03/27] libcamera: request: hasPendingBuffers(): Simplify Date: Thu, 18 Jun 2026 14:38:20 +0200 Message-ID: <20260618123844.656396-4-barnabas.pocze@ideasonboard.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260618123844.656396-1-barnabas.pocze@ideasonboard.com> References: <20260618123844.656396-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" Simplify by calling the equivalent method of the "Private" type. Signed-off-by: Barnabás Pőcze --- src/libcamera/request.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libcamera/request.cpp b/src/libcamera/request.cpp index e31c9c006a..163d8cf920 100644 --- a/src/libcamera/request.cpp +++ b/src/libcamera/request.cpp @@ -575,7 +575,7 @@ uint32_t Request::sequence() const */ bool Request::hasPendingBuffers() const { - return !_d()->pending_.empty(); + return _d()->hasPendingBuffers(); } /** From patchwork Thu Jun 18 12:38:21 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: 26968 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 AE663C3301 for ; Thu, 18 Jun 2026 12:39:05 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id C6151656FF; Thu, 18 Jun 2026 14:38:56 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="BCpMCXMy"; 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 4571C62B29 for ; Thu, 18 Jun 2026 14:38:49 +0200 (CEST) Received: from pb-laptop.local (185.182.214.63.nat.pool.zt.hu [185.182.214.63]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 56467DF3 for ; Thu, 18 Jun 2026 14:38:14 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1781786294; bh=8nKOaAObOZ2q+PjgR/9/xS1H3dZFC3JvN9UWeRHFOTA=; h=From:To:Subject:Date:In-Reply-To:References:From; b=BCpMCXMym9thO7EWHKNOc/t8YNCxpLfV4vDd5QSte1EMonWmzniT/ig27k9ifRCZL 67AiaAIO3ltkxaY95xpo4lGicTFnks5nh7UJveE1gvDIDBzAkbZ1rYeGxLtfk68o/n U1MMVDHIvRt9Ufx9rA04BEPOlIdk37UPV8ZJdMio= From: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= To: libcamera-devel@lists.libcamera.org Subject: [RFC PATCH v1 04/27] libcamera: request: Disassociate buffer when cancelling Date: Thu, 18 Jun 2026 14:38:21 +0200 Message-ID: <20260618123844.656396-5-barnabas.pocze@ideasonboard.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260618123844.656396-1-barnabas.pocze@ideasonboard.com> References: <20260618123844.656396-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" Match the behaviour of `completeBuffer()` by unsetting the "parent" `Request` pointer of the `FrameBuffer`. Signed-off-by: Barnabás Pőcze --- src/libcamera/request.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libcamera/request.cpp b/src/libcamera/request.cpp index 163d8cf920..5f983e0ce6 100644 --- a/src/libcamera/request.cpp +++ b/src/libcamera/request.cpp @@ -143,6 +143,7 @@ void Request::Private::doCancelRequest() for (FrameBuffer *buffer : pending_) { buffer->_d()->cancel(); camera_->bufferCompleted.emit(request, buffer); + buffer->_d()->setRequest(nullptr); } cancelled_ = true; From patchwork Thu Jun 18 12:38:22 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: 26969 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 731AEC3302 for ; Thu, 18 Jun 2026 12:39:07 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 622A3656FB; Thu, 18 Jun 2026 14:38:58 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="UKkEGHma"; 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 71EE262B32 for ; Thu, 18 Jun 2026 14:38:49 +0200 (CEST) Received: from pb-laptop.local (185.182.214.63.nat.pool.zt.hu [185.182.214.63]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 8E1CF2F8 for ; Thu, 18 Jun 2026 14:38:14 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1781786294; bh=7pk2akcIO+LKapSx5LH2m1u6MaKxxgke+i79MVQIb/I=; h=From:To:Subject:Date:In-Reply-To:References:From; b=UKkEGHmauLG8/BH+N451VSynDZMgTDNSS9rvIH/XcMoniugJF+J5iYadwTWJeqI38 gm2Oib7H7ouZilgCA3cgPxvruVKAQXrllg5W8EYV5+qJKd2Ihe95vG+CFzctrtxpaU fGeDf7UaBdo8ulfTcntC1UgYhEn6BgaDzNSPdl1I= From: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= To: libcamera-devel@lists.libcamera.org Subject: [RFC PATCH v1 05/27] libcamera: software_isp: Replace open-coded buffer cancellation Date: Thu, 18 Jun 2026 14:38:22 +0200 Message-ID: <20260618123844.656396-6-barnabas.pocze@ideasonboard.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260618123844.656396-1-barnabas.pocze@ideasonboard.com> References: <20260618123844.656396-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" Instead of manually setting `FrameMetadata::status`, simply call the appropriate `cancel()` method. Signed-off-by: Barnabás Pőcze --- src/libcamera/software_isp/software_isp.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/libcamera/software_isp/software_isp.cpp b/src/libcamera/software_isp/software_isp.cpp index 1b316c54c6..c73a16ce0a 100644 --- a/src/libcamera/software_isp/software_isp.cpp +++ b/src/libcamera/software_isp/software_isp.cpp @@ -406,15 +406,13 @@ void SoftwareIsp::stop() ipa_->stop(); for (auto buffer : queuedOutputBuffers_) { - FrameMetadata &metadata = buffer->_d()->metadata(); - metadata.status = FrameMetadata::FrameCancelled; + buffer->_d()->cancel(); outputBufferReady.emit(buffer); } queuedOutputBuffers_.clear(); for (auto buffer : queuedInputBuffers_) { - FrameMetadata &metadata = buffer->_d()->metadata(); - metadata.status = FrameMetadata::FrameCancelled; + buffer->_d()->cancel(); inputBufferReady.emit(buffer); } queuedInputBuffers_.clear(); From patchwork Thu Jun 18 12:38:23 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: 26970 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 731B9BF415 for ; Thu, 18 Jun 2026 12:39:09 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 4A74F656F3; Thu, 18 Jun 2026 14:38:59 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="LfjgGEkx"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id A8F9262988 for ; Thu, 18 Jun 2026 14:38:49 +0200 (CEST) Received: from pb-laptop.local (185.182.214.63.nat.pool.zt.hu [185.182.214.63]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id C02BBDF3 for ; Thu, 18 Jun 2026 14:38:14 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1781786294; bh=O3We75ZOHawp7iJV9ga2dmQR4w67y7tlCrcU0AUq7fY=; h=From:To:Subject:Date:In-Reply-To:References:From; b=LfjgGEkx85p+fIVU6kk6F//gtlBoJHhg+TG4/hfna+4y+1Sm2C9BEozSf6lHC3vVL xyvFEq+4+RQQpB547vi0rYbhADpLH4sA9DQ2Td69JIkSP9c9AlOpD+JZ4x5zEwTGKP iTPiAinXe8E5c28AA/7ofytOQbK/A9uj9LVB4Sn8= From: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= To: libcamera-devel@lists.libcamera.org Subject: [RFC PATCH v1 06/27] libcamera: pipeline: Replace open-coded buffer cancellation Date: Thu, 18 Jun 2026 14:38:23 +0200 Message-ID: <20260618123844.656396-7-barnabas.pocze@ideasonboard.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260618123844.656396-1-barnabas.pocze@ideasonboard.com> References: <20260618123844.656396-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" Use `PipelineHander::cancelRequest()` instead of manually cancelling, completing each buffer, then completing the request. This has the same behaviour unless the request has no pending buffers. Signed-off-by: Barnabás Pőcze --- src/libcamera/pipeline/ipu3/ipu3.cpp | 14 ++------------ .../pipeline/rpi/common/pipeline_base.cpp | 16 +--------------- src/libcamera/pipeline/vimc/vimc.cpp | 7 +------ 3 files changed, 4 insertions(+), 33 deletions(-) diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp index bf4c2921f2..560fccd8c0 100644 --- a/src/libcamera/pipeline/ipu3/ipu3.cpp +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp @@ -790,12 +790,7 @@ void IPU3CameraData::cancelPendingRequests() while (!pendingRequests_.empty()) { Request *request = pendingRequests_.front(); - for (const auto &[stream, buffer] : request->buffers()) { - buffer->_d()->cancel(); - pipe()->completeBuffer(request, buffer); - } - - pipe()->completeRequest(request); + pipe()->cancelRequest(request); pendingRequests_.pop(); } } @@ -1299,13 +1294,8 @@ void IPU3CameraData::cio2BufferReady(FrameBuffer *buffer) /* If the buffer is cancelled force a complete of the whole request. */ if (buffer->metadata().status == FrameMetadata::FrameCancelled) { - for (const auto &[stream, b] : request->buffers()) { - b->_d()->cancel(); - pipe()->completeBuffer(request, b); - } - frameInfos_.remove(info); - pipe()->completeRequest(request); + pipe()->cancelRequest(request); return; } diff --git a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp index 5a5acf6a16..6a6be5c820 100644 --- a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp +++ b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp @@ -1401,21 +1401,7 @@ void CameraData::clearIncompleteRequests() * back to the application. */ while (!requestQueue_.empty()) { - Request *request = requestQueue_.front(); - - for (auto &b : request->buffers()) { - FrameBuffer *buffer = b.second; - /* - * Has the buffer already been handed back to the - * request? If not, do so now. - */ - if (buffer->request()) { - buffer->_d()->cancel(); - pipe()->completeBuffer(request, buffer); - } - } - - pipe()->completeRequest(request); + pipe()->cancelRequest(requestQueue_.front()); requestQueue_.pop(); } } diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp index 6681c74ee5..3d010d80e5 100644 --- a/src/libcamera/pipeline/vimc/vimc.cpp +++ b/src/libcamera/pipeline/vimc/vimc.cpp @@ -605,12 +605,7 @@ void VimcCameraData::imageBufferReady(FrameBuffer *buffer) /* If the buffer is cancelled force a complete of the whole request. */ if (buffer->metadata().status == FrameMetadata::FrameCancelled) { - for (const auto &[stream, b] : request->buffers()) { - b->_d()->cancel(); - pipe->completeBuffer(request, b); - } - - pipe->completeRequest(request); + pipe->cancelRequest(request); return; } From patchwork Thu Jun 18 12:38:24 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: 26971 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 76B5FC3303 for ; Thu, 18 Jun 2026 12:39:11 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id E0F8E62C7B; Thu, 18 Jun 2026 14:39:00 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="Wn3ZkPsV"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id D402F62B3F for ; Thu, 18 Jun 2026 14:38:49 +0200 (CEST) Received: from pb-laptop.local (185.182.214.63.nat.pool.zt.hu [185.182.214.63]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id ED0AA2F8 for ; Thu, 18 Jun 2026 14:38:14 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1781786295; bh=x8gcCAIS/4cUnDTG2+3N95O71DzE410X4cOw9WYp6SQ=; h=From:To:Subject:Date:In-Reply-To:References:From; b=Wn3ZkPsVJWCxMD3uviXY5ugl7u7sBx4l6SD4v6ykFWvMz9jLLxZSdIYNxHUCoHi58 uSmMMvXgsyztjg1yvtv+W/4OQjnSt0aOd+/xE9p8w2yLW1I1IPmK96vFwMRZQ5CprT f/QN9Bmj/1VV5iIeuAwmPbGN7DExPrT88szIgnMI= From: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= To: libcamera-devel@lists.libcamera.org Subject: [RFC PATCH v1 07/27] libcamera: pipeline: imx8-isi: Use `completeBuffer()` return value Date: Thu, 18 Jun 2026 14:38:24 +0200 Message-ID: <20260618123844.656396-8-barnabas.pocze@ideasonboard.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260618123844.656396-1-barnabas.pocze@ideasonboard.com> References: <20260618123844.656396-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" There is no need to check `hasPendingBuffers()` since `completeBuffer()` return `true` if there are no buffers left to complete in the request. Signed-off-by: Barnabás Pőcze --- src/libcamera/pipeline/imx8-isi/imx8-isi.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp b/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp index 706681fce5..c3d2695556 100644 --- a/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp +++ b/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp @@ -1131,11 +1131,8 @@ void PipelineHandlerISI::bufferReady(FrameBuffer *buffer) metadata.set(controls::SensorTimestamp, buffer->metadata().timestamp); - completeBuffer(request, buffer); - if (request->hasPendingBuffers()) - return; - - completeRequest(request); + if (completeBuffer(request, buffer)) + completeRequest(request); } /* Original function taken from simple.cpp */ From patchwork Thu Jun 18 12:38:25 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: 26972 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 EA6DAC328C for ; Thu, 18 Jun 2026 12:39:12 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id D223565702; Thu, 18 Jun 2026 14:39:03 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="CmCXqXPh"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 05B0A62B2B for ; Thu, 18 Jun 2026 14:38:50 +0200 (CEST) Received: from pb-laptop.local (185.182.214.63.nat.pool.zt.hu [185.182.214.63]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 237F11894 for ; Thu, 18 Jun 2026 14:38:15 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1781786295; bh=sGXTWWmMp6Fi3e+EBGURZjujEJ8RE1acQMhO/Uan8q0=; h=From:To:Subject:Date:In-Reply-To:References:From; b=CmCXqXPhnSCsOIPLWoo7Wmvqeitw0wHR7+J7+oeiwHKj2hHuqDXPyeiUoGaXcuuYW EKYux4yXh4VG7u+X2tyA75rJSx/xf4dovHAgzv3nNlwz4ABlEz0IUG4LeSXJ99aaEs 7/9DYitOvRG12lOkMjv4w0u2gYyMiQHRtu/T6Se8= From: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= To: libcamera-devel@lists.libcamera.org Subject: [RFC PATCH v1 08/27] libcamera: pipeline: imx8-isi: pipeFromStream(): Take `ISICameraData` Date: Thu, 18 Jun 2026 14:38:25 +0200 Message-ID: <20260618123844.656396-9-barnabas.pocze@ideasonboard.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260618123844.656396-1-barnabas.pocze@ideasonboard.com> References: <20260618123844.656396-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" The function actually needs the pipeline handler specific camera data, and in most callers it is already available, so accept that as argument. Signed-off-by: Barnabás Pőcze --- src/libcamera/pipeline/imx8-isi/imx8-isi.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp b/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp index c3d2695556..5f15fbdc08 100644 --- a/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp +++ b/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp @@ -136,7 +136,7 @@ private: return static_cast(camera->_d()); } - Pipe *pipeFromStream(Camera *camera, const Stream *stream); + Pipe *pipeFromStream(ISICameraData *data, const Stream *stream); StreamConfiguration generateYUVConfiguration(Camera *camera, const Size &size); @@ -865,7 +865,7 @@ int PipelineHandlerISI::configure(Camera *camera, CameraConfiguration *c) */ data->enabledStreams_.clear(); for (const auto &config : *c) { - Pipe *pipe = pipeFromStream(camera, config.stream()); + Pipe *pipe = pipeFromStream(data, config.stream()); /* * Configure the ISI sink compose rectangle to downscale the @@ -915,7 +915,7 @@ int PipelineHandlerISI::exportFrameBuffers(Camera *camera, Stream *stream, std::vector> *buffers) { unsigned int count = stream->configuration().bufferCount; - Pipe *pipe = pipeFromStream(camera, stream); + Pipe *pipe = pipeFromStream(cameraData(camera), stream); return pipe->capture->exportBuffers(count, buffers); } @@ -926,7 +926,7 @@ int PipelineHandlerISI::start(Camera *camera, ISICameraData *data = cameraData(camera); for (const auto &stream : data->enabledStreams_) { - Pipe *pipe = pipeFromStream(camera, stream); + Pipe *pipe = pipeFromStream(data, stream); const StreamConfiguration &config = stream->configuration(); int ret = pipe->capture->importBuffers(config.bufferCount); @@ -946,7 +946,7 @@ void PipelineHandlerISI::stopDevice(Camera *camera) ISICameraData *data = cameraData(camera); for (const auto &stream : data->enabledStreams_) { - Pipe *pipe = pipeFromStream(camera, stream); + Pipe *pipe = pipeFromStream(data, stream); pipe->capture->streamOff(); pipe->capture->releaseBuffers(); @@ -955,8 +955,10 @@ void PipelineHandlerISI::stopDevice(Camera *camera) int PipelineHandlerISI::queueRequestDevice(Camera *camera, Request *request) { + ISICameraData *data = cameraData(camera); + for (auto &[stream, buffer] : request->buffers()) { - Pipe *pipe = pipeFromStream(camera, stream); + Pipe *pipe = pipeFromStream(data, stream); int ret = pipe->capture->queueBuffer(buffer); if (ret) @@ -1110,10 +1112,9 @@ bool PipelineHandlerISI::match(DeviceEnumerator *enumerator) return numCameras > 0; } -PipelineHandlerISI::Pipe *PipelineHandlerISI::pipeFromStream(Camera *camera, +PipelineHandlerISI::Pipe *PipelineHandlerISI::pipeFromStream(ISICameraData *data, const Stream *stream) { - ISICameraData *data = cameraData(camera); unsigned int pipeIndex = data->pipeIndex(stream); ASSERT(pipeIndex < pipes_.size()); From patchwork Thu Jun 18 12:38:26 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: 26973 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 9538FC3304 for ; Thu, 18 Jun 2026 12:39:14 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 45B5262C6E; Thu, 18 Jun 2026 14:39:06 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="B/Khb1/g"; 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 33BDB62C71 for ; Thu, 18 Jun 2026 14:38:50 +0200 (CEST) Received: from pb-laptop.local (185.182.214.63.nat.pool.zt.hu [185.182.214.63]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 4F3842F8 for ; Thu, 18 Jun 2026 14:38:15 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1781786295; bh=VQWdVx/eE22959ha/DrBlHrz40UMBHdLJiA9tE+UnuQ=; h=From:To:Subject:Date:In-Reply-To:References:From; b=B/Khb1/gmt10W6X949kyEFk6XWa/E+f8b6O1elrw2aQtFT7CJfRqswrz47qpVt7jM EV7n71tIY5Dxo8m0cgQBKFXCTw3OCAlGvGvnBdEhhhYgC2i/+gLnUzp6sE+AEhi2nY 40Ar5cZH7nw+c+gHFpjfIZHU3JB+KrcCb0ttCO7k= From: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= To: libcamera-devel@lists.libcamera.org Subject: [RFC PATCH v1 09/27] libcamera: pipeline: ipu3: Remove `setRequest()` calls Date: Thu, 18 Jun 2026 14:38:26 +0200 Message-ID: <20260618123844.656396-10-barnabas.pocze@ideasonboard.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260618123844.656396-1-barnabas.pocze@ideasonboard.com> References: <20260618123844.656396-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" No component queries the associated request of any buffer, so setting it is unnecessary. Signed-off-by: Barnabás Pőcze --- src/libcamera/pipeline/ipu3/cio2.cpp | 3 +-- src/libcamera/pipeline/ipu3/cio2.h | 3 +-- src/libcamera/pipeline/ipu3/frames.cpp | 3 --- src/libcamera/pipeline/ipu3/ipu3.cpp | 2 +- 4 files changed, 3 insertions(+), 8 deletions(-) diff --git a/src/libcamera/pipeline/ipu3/cio2.cpp b/src/libcamera/pipeline/ipu3/cio2.cpp index b6fe84fe70..7481b2686d 100644 --- a/src/libcamera/pipeline/ipu3/cio2.cpp +++ b/src/libcamera/pipeline/ipu3/cio2.cpp @@ -378,7 +378,7 @@ int CIO2Device::stop() return ret; } -FrameBuffer *CIO2Device::queueBuffer(Request *request, FrameBuffer *rawBuffer) +FrameBuffer *CIO2Device::queueBuffer(FrameBuffer *rawBuffer) { FrameBuffer *buffer = rawBuffer; @@ -391,7 +391,6 @@ FrameBuffer *CIO2Device::queueBuffer(Request *request, FrameBuffer *rawBuffer) buffer = availableBuffers_.front(); availableBuffers_.pop(); - buffer->_d()->setRequest(request); } int ret = output_->queueBuffer(buffer); diff --git a/src/libcamera/pipeline/ipu3/cio2.h b/src/libcamera/pipeline/ipu3/cio2.h index d844cb7ae8..91651a1640 100644 --- a/src/libcamera/pipeline/ipu3/cio2.h +++ b/src/libcamera/pipeline/ipu3/cio2.h @@ -22,7 +22,6 @@ class CameraSensor; class FrameBuffer; class MediaDevice; class PixelFormat; -class Request; class Size; class SizeRange; struct StreamConfiguration; @@ -56,7 +55,7 @@ public: CameraSensor *sensor() { return sensor_.get(); } const CameraSensor *sensor() const { return sensor_.get(); } - FrameBuffer *queueBuffer(Request *request, FrameBuffer *rawBuffer); + FrameBuffer *queueBuffer(FrameBuffer *rawBuffer); void tryReturnBuffer(FrameBuffer *buffer); Signal &bufferReady() { return output_->bufferReady; } Signal &frameStart() { return csi2_->frameStart; } diff --git a/src/libcamera/pipeline/ipu3/frames.cpp b/src/libcamera/pipeline/ipu3/frames.cpp index 4232e976a9..67ec922e49 100644 --- a/src/libcamera/pipeline/ipu3/frames.cpp +++ b/src/libcamera/pipeline/ipu3/frames.cpp @@ -58,9 +58,6 @@ IPU3Frames::Info *IPU3Frames::create(Request *request) FrameBuffer *paramBuffer = availableParamBuffers_.front(); FrameBuffer *statBuffer = availableStatBuffers_.front(); - paramBuffer->_d()->setRequest(request); - statBuffer->_d()->setRequest(request); - availableParamBuffers_.pop(); availableStatBuffers_.pop(); diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp index 560fccd8c0..af1b79d708 100644 --- a/src/libcamera/pipeline/ipu3/ipu3.cpp +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp @@ -810,7 +810,7 @@ void IPU3CameraData::queuePendingRequests() * otherwise. */ FrameBuffer *reqRawBuffer = request->findBuffer(&rawStream_); - FrameBuffer *rawBuffer = cio2_.queueBuffer(request, reqRawBuffer); + FrameBuffer *rawBuffer = cio2_.queueBuffer(reqRawBuffer); /* * \todo If queueBuffer fails in queuing a buffer to the device, * report the request as error by cancelling the request and From patchwork Thu Jun 18 12:38:27 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: 26974 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 2513DC3305 for ; Thu, 18 Jun 2026 12:39:16 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id CC2BD6570F; Thu, 18 Jun 2026 14:39:07 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="Cv/JlmmV"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 68DCD62C78 for ; Thu, 18 Jun 2026 14:38:50 +0200 (CEST) Received: from pb-laptop.local (185.182.214.63.nat.pool.zt.hu [185.182.214.63]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 7C494DF3 for ; Thu, 18 Jun 2026 14:38:15 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1781786295; bh=BvF25pcIHPC7otTXCZwerTl8qaQb/ZFckr9lEKMV/to=; h=From:To:Subject:Date:In-Reply-To:References:From; b=Cv/JlmmVywpejuGaFoBxdaysExXaxNIULLkjV3B/h6wpUVvcBVQTTLL+ZFMV5PxSU qD1YlAHYfAdLwqFWlysLNNPZfZP78DykJ5DNHJqtgK9Om8OsTBYNqIN412G0t7BN3m u+yPbjGXzgxF8T5Fr6tiwUJqq2n0AEg0FwASE4Kw= From: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= To: libcamera-devel@lists.libcamera.org Subject: [RFC PATCH v1 10/27] libcamera: pipeline: mali-c55: Add missing `` include Date: Thu, 18 Jun 2026 14:38:27 +0200 Message-ID: <20260618123844.656396-11-barnabas.pocze@ideasonboard.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260618123844.656396-1-barnabas.pocze@ideasonboard.com> References: <20260618123844.656396-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" The `std::queue` is used, but the appropriate header was not included, fix that. Signed-off-by: Barnabás Pőcze --- src/libcamera/pipeline/mali-c55/mali-c55.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libcamera/pipeline/mali-c55/mali-c55.cpp b/src/libcamera/pipeline/mali-c55/mali-c55.cpp index ce2469ed19..599ff88b59 100644 --- a/src/libcamera/pipeline/mali-c55/mali-c55.cpp +++ b/src/libcamera/pipeline/mali-c55/mali-c55.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include From patchwork Thu Jun 18 12:38:28 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: 26975 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 4902FC3306 for ; Thu, 18 Jun 2026 12:39:17 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id DB16A62C71; Thu, 18 Jun 2026 14:39:09 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="CfjemyL4"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 9591562C7B for ; Thu, 18 Jun 2026 14:38:50 +0200 (CEST) Received: from pb-laptop.local (185.182.214.63.nat.pool.zt.hu [185.182.214.63]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id B09A92F8 for ; Thu, 18 Jun 2026 14:38:15 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1781786295; bh=/sen95RERCEquFIDbNJtVDMphehdZ7RPBhlxdSVRpeg=; h=From:To:Subject:Date:In-Reply-To:References:From; b=CfjemyL4f1RapiGMG+ki5hXrpljvi93F6qQMdcataLAAFluYjc66cCVY6Cj551MAa Z9Cw9X1vkG1mWW5jEIo8xLLDMHL3B9SnfDXhOXjhVPg6bLaGO/MBht7gTCk2R8jxFC f4gXNkLuqPporIdy3D8khVdZe39He56c+foVnFRs= From: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= To: libcamera-devel@lists.libcamera.org Subject: [RFC PATCH v1 11/27] libcamera: pipeline: rkisp1: Simplify dewarper configuration Date: Thu, 18 Jun 2026 14:38:28 +0200 Message-ID: <20260618123844.656396-12-barnabas.pocze@ideasonboard.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260618123844.656396-1-barnabas.pocze@ideasonboard.com> References: <20260618123844.656396-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" There is no need for to define a separate vector, initializing the argument in the call expression works. So do that. Signed-off-by: Barnabás Pőcze --- src/libcamera/pipeline/rkisp1/rkisp1.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp index 9606459fc2..4f9c0aa741 100644 --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp @@ -1042,7 +1042,6 @@ int PipelineHandlerRkISP1::configure(Camera *camera, CameraConfiguration *c) data->properties_.set(properties::ScalerCropMaximum, sensorCrop); std::map streamConfig; - std::vector> outputCfgs; for (const StreamConfiguration &cfg : *config) { if (cfg.stream() == &data->mainPathStream_) { @@ -1053,15 +1052,13 @@ int PipelineHandlerRkISP1::configure(Camera *camera, CameraConfiguration *c) */ StreamConfiguration ispCfg = cfg; if (data->usesDewarper_) { - outputCfgs.push_back(const_cast(cfg)); - ispCfg.bufferCount = kRkISP1MinBufferCount; ispCfg.size = format.size; ispCfg.stride = PixelFormatInfo::info(ispCfg.pixelFormat) .stride(ispCfg.size.width, 0); - ret = dewarper_->configure(ispCfg, outputCfgs); + ret = dewarper_->configure(ispCfg, { cfg }); if (ret) return ret; From patchwork Thu Jun 18 12:38:29 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: 26976 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 180F3C3307 for ; Thu, 18 Jun 2026 12:39:18 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 2890065713; Thu, 18 Jun 2026 14:39:12 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="L1xyu23F"; 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 BE74B629E0 for ; Thu, 18 Jun 2026 14:38:50 +0200 (CEST) Received: from pb-laptop.local (185.182.214.63.nat.pool.zt.hu [185.182.214.63]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id DAED6DF3 for ; Thu, 18 Jun 2026 14:38:15 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1781786295; bh=oy05+rxbDZ7R2o7AbVBp2jD7UhTXB1amh2TQyRbO8Gc=; h=From:To:Subject:Date:In-Reply-To:References:From; b=L1xyu23F7DSD93vAS7gsltbvUJStU8nsKQFhLCtB2AaiZTw/a3B1Dj4E2Pmns8BrY 1elEXKb/iQPKUxIqo3C5FnE+kFSPkw4vYCvzqwLEEunOgo75V5lmlITv7C0PXmGsaS wkWHRIgR/Vx8xKq4bMJh+eKRqZEPSMRwB6sEfDyU= From: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= To: libcamera-devel@lists.libcamera.org Subject: [RFC PATCH v1 12/27] libcamera: pipeline: rpi: Remove `requestQueue_` Date: Thu, 18 Jun 2026 14:38:29 +0200 Message-ID: <20260618123844.656396-13-barnabas.pocze@ideasonboard.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260618123844.656396-1-barnabas.pocze@ideasonboard.com> References: <20260618123844.656396-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" The pipeline handler base class already tracks the queued requests of a camera in the `Camera::Private` type, so there is no reason to have another queue in the derived camera type that does the same. So remove it. The only significant difference is that if `queueRequestDevice()` fails, the request can still stay in `queuedRequests_` if there were successfully queued requests before it. This, however, does not cause issues as only the oldest queued request is accessed in the rpi pipeline handler, and that cannot be a cancelled request (it would have already been completed). Signed-off-by: Barnabás Pőcze --- .../pipeline/rpi/common/pipeline_base.cpp | 17 ++++++----------- .../pipeline/rpi/common/pipeline_base.h | 2 -- src/libcamera/pipeline/rpi/pisp/pisp.cpp | 6 +++--- src/libcamera/pipeline/rpi/vc4/vc4.cpp | 6 +++--- 4 files changed, 12 insertions(+), 19 deletions(-) diff --git a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp index 6a6be5c820..efe06c6807 100644 --- a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp +++ b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp @@ -786,8 +786,6 @@ int PipelineHandlerBase::queueRequestDevice(Camera *camera, Request *request) return ret; } - /* Push the request to the back of the queue. */ - data->requestQueue_.push(request); data->handleState(); return 0; @@ -1241,7 +1239,7 @@ void CameraData::metadataReady(const ControlList &metadata) /* Add to the Request metadata buffer what the IPA has provided. */ /* Last thing to do is to fill up the request metadata. */ - Request *request = requestQueue_.front(); + Request *request = queuedRequests_.front(); request->_d()->metadata().merge(metadata); /* @@ -1400,10 +1398,8 @@ void CameraData::clearIncompleteRequests() * All outstanding requests (and associated buffers) must be returned * back to the application. */ - while (!requestQueue_.empty()) { - pipe()->cancelRequest(requestQueue_.front()); - requestQueue_.pop(); - } + while (!queuedRequests_.empty()) + pipe()->cancelRequest(queuedRequests_.front()); } void CameraData::handleStreamBuffer(FrameBuffer *buffer, RPi::Stream *stream) @@ -1413,7 +1409,7 @@ void CameraData::handleStreamBuffer(FrameBuffer *buffer, RPi::Stream *stream) * that we actually have one to action, otherwise we just return * buffer back to the stream. */ - Request *request = requestQueue_.empty() ? nullptr : requestQueue_.front(); + Request *request = queuedRequests_.empty() ? nullptr : queuedRequests_.front(); if (request && request->findBuffer(stream) == buffer) { FrameMetadata &md = buffer->_d()->metadata(); @@ -1468,7 +1464,7 @@ void CameraData::handleState() void CameraData::checkRequestCompleted() { - Request *request = requestQueue_.front(); + Request *request = queuedRequests_.front(); if (request->hasPendingBuffers()) return; @@ -1480,7 +1476,6 @@ void CameraData::checkRequestCompleted() << request->sequence(); pipe()->completeRequest(request); - requestQueue_.pop(); LOG(RPI, Debug) << "Going into Idle state"; state_ = State::Idle; @@ -1536,7 +1531,7 @@ void CameraData::handleControlLists(uint32_t delayContext, ControlList ¶mCon * in the metadata, being the sequence number of the request whose ControlList * has just been applied. */ - Request *request = requestQueue_.front(); + Request *request = queuedRequests_.front(); request->_d()->metadata().set(controls::rpi::ControlListSequence, delayContext); /* diff --git a/src/libcamera/pipeline/rpi/common/pipeline_base.h b/src/libcamera/pipeline/rpi/common/pipeline_base.h index 758155ee0d..4a8a769fd8 100644 --- a/src/libcamera/pipeline/rpi/common/pipeline_base.h +++ b/src/libcamera/pipeline/rpi/common/pipeline_base.h @@ -129,8 +129,6 @@ public: return state_ != State::Stopped && state_ != State::Error; } - std::queue requestQueue_; - /* For handling digital zoom. */ IPACameraSensorInfo sensorInfo_; diff --git a/src/libcamera/pipeline/rpi/pisp/pisp.cpp b/src/libcamera/pipeline/rpi/pisp/pisp.cpp index b744c901f7..ef34be8338 100644 --- a/src/libcamera/pipeline/rpi/pisp/pisp.cpp +++ b/src/libcamera/pipeline/rpi/pisp/pisp.cpp @@ -2308,13 +2308,13 @@ void PiSPCameraData::prepareBe(uint32_t bufferId, bool stitchSwapBuffers) void PiSPCameraData::tryRunPipeline() { /* If any of our request or buffer queues are empty, we cannot proceed. */ - if (state_ != State::Idle || requestQueue_.empty() || !cfeJobComplete()) + if (state_ != State::Idle || queuedRequests_.empty() || !cfeJobComplete()) return; CfeJob &job = cfeJobQueue_.front(); /* Take the first request from the queue and action the IPA. */ - Request *request = requestQueue_.front(); + Request *request = queuedRequests_.front(); ASSERT(request->metadata().empty()); /* See if a new ScalerCrop value needs to be applied. */ @@ -2335,7 +2335,7 @@ void PiSPCameraData::tryRunPipeline() params.buffers.bayer = RPi::MaskBayerData | bayerId; params.buffers.stats = RPi::MaskStats | statsId; params.buffers.embedded = 0; - params.ipaContext = requestQueue_.front()->sequence(); + params.ipaContext = request->sequence(); params.delayContext = job.delayContext; params.sensorControls = std::move(job.sensorControls); /* params.requestControls is set by handleControlLists. */ diff --git a/src/libcamera/pipeline/rpi/vc4/vc4.cpp b/src/libcamera/pipeline/rpi/vc4/vc4.cpp index 3e9a490589..4c159527be 100644 --- a/src/libcamera/pipeline/rpi/vc4/vc4.cpp +++ b/src/libcamera/pipeline/rpi/vc4/vc4.cpp @@ -839,7 +839,7 @@ void Vc4CameraData::ispOutputDequeue(FrameBuffer *buffer) if (stream == &isp_[Isp::Stats]) { ipa::RPi::ProcessParams params; params.buffers.stats = index | RPi::MaskStats; - params.ipaContext = requestQueue_.front()->sequence(); + params.ipaContext = queuedRequests_.front()->sequence(); ipa_->processStats(params); } else { /* Any other ISP output can be handed back to the application now. */ @@ -923,7 +923,7 @@ void Vc4CameraData::tryRunPipeline() BayerFrame bayerFrame; /* If any of our request or buffer queues are empty, we cannot proceed. */ - if (state_ != State::Idle || requestQueue_.empty() || + if (state_ != State::Idle || queuedRequests_.empty() || bayerQueue_.empty() || (embeddedQueue_.empty() && sensorMetadata_)) return; @@ -931,7 +931,7 @@ void Vc4CameraData::tryRunPipeline() return; /* Take the first request from the queue and action the IPA. */ - Request *request = requestQueue_.front(); + Request *request = queuedRequests_.front(); ASSERT(request->metadata().empty()); /* See if a new ScalerCrop value needs to be applied. */ From patchwork Thu Jun 18 12:38:30 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: 26977 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 21C02C3301 for ; Thu, 18 Jun 2026 12:39:19 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 59DCA62C7B; Thu, 18 Jun 2026 14:39:13 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="E/N9uqwD"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id F07C3656C7 for ; Thu, 18 Jun 2026 14:38:50 +0200 (CEST) Received: from pb-laptop.local (185.182.214.63.nat.pool.zt.hu [185.182.214.63]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 112412F8 for ; Thu, 18 Jun 2026 14:38:16 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1781786296; bh=YdnQKEA4cjCE/QtSQXKKRRDTNSOgXYSvz9IHtLgnY1w=; h=From:To:Subject:Date:In-Reply-To:References:From; b=E/N9uqwDG8GestQHW7c/RvE+Ug1nnPjmyVzq6ZrXvt968qNbu57cR2Wvaz5a57bPU xKlZ5/uUUs9k0ZIGpMLk+C6eb9syUEsaZgstTSQkQ+Q3jvcgsnKGM4wk2jVQf6Itvr tg76arcOTxMSGNeh31z5Sg8mP6WvmDEf3g4phKUc= From: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= To: libcamera-devel@lists.libcamera.org Subject: [RFC PATCH v1 13/27] libcamera: pipeline: virtual: Make copy of request's buffer map Date: Thu, 18 Jun 2026 14:38:30 +0200 Message-ID: <20260618123844.656396-14-barnabas.pocze@ideasonboard.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260618123844.656396-1-barnabas.pocze@ideasonboard.com> References: <20260618123844.656396-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" The change that moved frame generation to a separate thread introduced a race condition. After the last buffer of a request is completed, the loop in `VirtualCameraData::processRequest()` will reference the buffer map in the loop condition. This is problematic because concurrently the request will be completed, then reused or destroyed. This was mostly hidden by the fact that most application use `ReuseBuffers`, so the buffer map nodes do not change. Fix that by making a copy of the (stream, buffer) pairs locally. Fixes: 6c251ae3ef0e ("libcamera: pipeline: virtual: Move image generation to separate thread") Signed-off-by: Barnabás Pőcze --- src/libcamera/pipeline/virtual/virtual.cpp | 40 +++++++++++++--------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/src/libcamera/pipeline/virtual/virtual.cpp b/src/libcamera/pipeline/virtual/virtual.cpp index 81d2dddab8..a7cd76e226 100644 --- a/src/libcamera/pipeline/virtual/virtual.cpp +++ b/src/libcamera/pipeline/virtual/virtual.cpp @@ -130,33 +130,39 @@ VirtualCameraData::VirtualCameraData(PipelineHandler *pipe, void VirtualCameraData::processRequest(Request *request) { + std::array, kMaxStream> buffers; + size_t bufferCount = 0; + for (const auto &[stream, buffer] : request->buffers()) { bool found = false; - /* map buffer and fill test patterns */ for (auto &streamConfig : streamConfigs_) { if (stream == &streamConfig.stream) { - FrameMetadata &fmd = buffer->_d()->metadata(); - - fmd.status = FrameMetadata::Status::FrameSuccess; - fmd.sequence = streamConfig.seq++; - fmd.timestamp = currentTimestamp(); - - Span planes = buffer->planes(); - for (const auto [i, p] : utils::enumerate(planes)) - fmd.planes()[i].bytesused = p.length; - + buffers[bufferCount++] = { &streamConfig, buffer }; found = true; - - if (streamConfig.frameGenerator->generateFrame( - stream->configuration().size, buffer)) - fmd.status = FrameMetadata::Status::FrameError; - - bufferCompleted.emit(buffer); break; } } ASSERT(found); } + + for (size_t i = 0; i < bufferCount; i++) { + const auto &[stream, buffer] = buffers[i]; + FrameMetadata &fmd = buffer->_d()->metadata(); + + fmd.status = FrameMetadata::Status::FrameSuccess; + fmd.sequence = stream->seq++; + fmd.timestamp = currentTimestamp(); + + Span planes = buffer->planes(); + for (const auto [j, p] : utils::enumerate(planes)) + fmd.planes()[j].bytesused = p.length; + + if (stream->frameGenerator->generateFrame(stream->stream.configuration().size, + buffer)) + fmd.status = FrameMetadata::Status::FrameError; + + bufferCompleted.emit(buffer); + } } VirtualCameraConfiguration::VirtualCameraConfiguration(VirtualCameraData *data) From patchwork Thu Jun 18 12:38:31 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: 26978 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 EEE74C3308 for ; Thu, 18 Jun 2026 12:39:19 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 3F76065704; Thu, 18 Jun 2026 14:39:14 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="esm84nfa"; 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 3766862C6E for ; Thu, 18 Jun 2026 14:38:51 +0200 (CEST) Received: from pb-laptop.local (185.182.214.63.nat.pool.zt.hu [185.182.214.63]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 3D6C6DF3 for ; Thu, 18 Jun 2026 14:38:16 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1781786296; bh=5HoGTnAuAMAuURHusMAP/WfTDH02mzRGqaZU7rgEFDY=; h=From:To:Subject:Date:In-Reply-To:References:From; b=esm84nfa0kVO5SAuSiUuxCtiwvof2d+2uZ/Qkts4jUVTV2hCibrJKomtyCDHGdD2t bX7qcHCGlG68jkHdOvOtq1SnHrI7aYCUqNYyhUBFPotoT680DKzUbqPI5z57Hm4GjM qOOOX9TYe7bJ+OABIfHtfITQGINJEh/QW/ihKtI8= From: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= To: libcamera-devel@lists.libcamera.org Subject: [RFC PATCH v1 14/27] libcamera: camera: Add missing `span.h` include Date: Thu, 18 Jun 2026 14:38:31 +0200 Message-ID: <20260618123844.656396-15-barnabas.pocze@ideasonboard.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260618123844.656396-1-barnabas.pocze@ideasonboard.com> References: <20260618123844.656396-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" Signed-off-by: Barnabás Pőcze --- include/libcamera/camera.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h index b24a297400..443116b588 100644 --- a/include/libcamera/camera.h +++ b/include/libcamera/camera.h @@ -18,6 +18,7 @@ #include #include #include +#include #include #include From patchwork Thu Jun 18 12:38:32 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: 26980 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 1745AC330F for ; Thu, 18 Jun 2026 12:39:22 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 9771D656EE; Thu, 18 Jun 2026 14:39:16 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="TnQr8Sl8"; 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 5A0C46301A for ; Thu, 18 Jun 2026 14:38:51 +0200 (CEST) Received: from pb-laptop.local (185.182.214.63.nat.pool.zt.hu [185.182.214.63]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 717CB2F8 for ; Thu, 18 Jun 2026 14:38:16 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1781786296; bh=o4EqpachFxbgXREAs9t0tKVRdw4gsuifEkINBGGzND4=; h=From:To:Subject:Date:In-Reply-To:References:From; b=TnQr8Sl82zM/fXGjNYNsGX/ATt1Yrq/+vbkV5gl5SLQ5KsYRX4c2EF6QOiL0cbCn8 a3Vtp1rn+/RTT3iy7mrMDdqhSdKKE4M07KkdtK5uUM5rFs0QLwYDhvaaL0fWyKyk1y oPrtzkgTyiHizI3MVkju6amwmkGlkzLp9+gVQf+k= From: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= To: libcamera-devel@lists.libcamera.org Subject: [RFC PATCH v1 15/27] libcamera: request: completeBuffer(): Emit `bufferCompleted` here Date: Thu, 18 Jun 2026 14:38:32 +0200 Message-ID: <20260618123844.656396-16-barnabas.pocze@ideasonboard.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260618123844.656396-1-barnabas.pocze@ideasonboard.com> References: <20260618123844.656396-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" The `Request` class already manages the emission of that signal in `doCancelRequest()`, so let's move the normal emission from the pipeline handler base class while keeping the ordering of things. Signed-off-by: Barnabás Pőcze --- src/libcamera/pipeline_handler.cpp | 2 -- src/libcamera/request.cpp | 3 +++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp index e7145c1d48..3d49f85cfa 100644 --- a/src/libcamera/pipeline_handler.cpp +++ b/src/libcamera/pipeline_handler.cpp @@ -562,8 +562,6 @@ void PipelineHandler::doQueueRequests(Camera *camera) */ bool PipelineHandler::completeBuffer(Request *request, FrameBuffer *buffer) { - Camera *camera = request->_d()->camera(); - camera->bufferCompleted.emit(request, buffer); return request->_d()->completeBuffer(buffer); } diff --git a/src/libcamera/request.cpp b/src/libcamera/request.cpp index 5f983e0ce6..022a97f169 100644 --- a/src/libcamera/request.cpp +++ b/src/libcamera/request.cpp @@ -104,6 +104,9 @@ bool Request::Private::completeBuffer(FrameBuffer *buffer) { LIBCAMERA_TRACEPOINT(request_complete_buffer, this, buffer); + Request *request = LIBCAMERA_O_PTR(); + camera_->bufferCompleted.emit(request, buffer); + int ret = pending_.erase(buffer); ASSERT(ret == 1); From patchwork Thu Jun 18 12:38:33 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: 26979 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 F1F2DC330A for ; Thu, 18 Jun 2026 12:39:20 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 657B965719; Thu, 18 Jun 2026 14:39:15 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="rLU528l0"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 88A5C629E3 for ; Thu, 18 Jun 2026 14:38:51 +0200 (CEST) Received: from pb-laptop.local (185.182.214.63.nat.pool.zt.hu [185.182.214.63]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id A04771894 for ; Thu, 18 Jun 2026 14:38:16 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1781786296; bh=u5Bzr+zTn6uTqpAfQHEARolODp7/ssqvNRWMyaWTmNE=; h=From:To:Subject:Date:In-Reply-To:References:From; b=rLU528l0zQ0Ji7SRLygrwO/Jw6p8T5CnFmKipSNGyRl1W6sD1cKNGkMSDLv/G+ZyU z7RYOLYzPUcpMKbkoyST/0lCTCd55yCIyQZHSU/7xa+eSCb9IqjUTThGTl2cLFd4XM EhNUpu7NQp4herEPGHeLTDH6xqZxAlcHWS5ieUQI= From: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= To: libcamera-devel@lists.libcamera.org Subject: [RFC PATCH v1 16/27] libcamera: pipeline_handler: completeBuffer(): Inline and `static` Date: Thu, 18 Jun 2026 14:38:33 +0200 Message-ID: <20260618123844.656396-17-barnabas.pocze@ideasonboard.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260618123844.656396-1-barnabas.pocze@ideasonboard.com> References: <20260618123844.656396-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" The function now only calls a method in `Request::Private`, so inline it, and also make it `static` since it needs no access to the pipeline handler members. Signed-off-by: Barnabás Pőcze --- include/libcamera/internal/pipeline_handler.h | 7 ++++++- src/libcamera/pipeline_handler.cpp | 5 +---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/include/libcamera/internal/pipeline_handler.h b/include/libcamera/internal/pipeline_handler.h index 6922ce18ec..cc52c6b045 100644 --- a/include/libcamera/internal/pipeline_handler.h +++ b/include/libcamera/internal/pipeline_handler.h @@ -19,6 +19,7 @@ #include "libcamera/internal/camera_manager.h" #include "libcamera/internal/ipa_manager.h" +#include "libcamera/internal/request.h" namespace libcamera { @@ -60,7 +61,11 @@ public: void registerRequest(Request *request); void queueRequest(Request *request); - bool completeBuffer(Request *request, FrameBuffer *buffer); + static bool completeBuffer(Request *request, FrameBuffer *buffer) + { + return request->_d()->completeBuffer(buffer); + } + void completeRequest(Request *request); void cancelRequest(Request *request); diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp index 3d49f85cfa..99f35d1e42 100644 --- a/src/libcamera/pipeline_handler.cpp +++ b/src/libcamera/pipeline_handler.cpp @@ -544,6 +544,7 @@ void PipelineHandler::doQueueRequests(Camera *camera) */ /** + * \fn PipelineHandler::completeBuffer(Request *request, FrameBuffer *buffer) * \brief Complete a buffer for a request * \param[in] request The request the buffer belongs to * \param[in] buffer The buffer that has completed @@ -560,10 +561,6 @@ void PipelineHandler::doQueueRequests(Camera *camera) * \return True if all buffers contained in the request have completed, false * otherwise */ -bool PipelineHandler::completeBuffer(Request *request, FrameBuffer *buffer) -{ - return request->_d()->completeBuffer(buffer); -} /** * \brief Signal request completion From patchwork Thu Jun 18 12:38:34 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: 26982 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 2BBCBC3316 for ; Thu, 18 Jun 2026 12:39:24 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 5B54965702; Thu, 18 Jun 2026 14:39:18 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="AvJvnfSl"; 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 C6CBC62C6F for ; Thu, 18 Jun 2026 14:38:51 +0200 (CEST) Received: from pb-laptop.local (185.182.214.63.nat.pool.zt.hu [185.182.214.63]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id D5BAF2F8 for ; Thu, 18 Jun 2026 14:38:16 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1781786297; bh=EcfYKHGpz3/abJQGTuFyGSU5AQ37uNVNq64FIVh25TU=; h=From:To:Subject:Date:In-Reply-To:References:From; b=AvJvnfSl/7UrpaGsaU+coLMMfLH04T/HUm+rvjb8AS+I/JidDkYDg0qKoJiq+/2Fq LAtUTjzizLmjU3hRB1YDSV0gjiT6GiCh1aLKYmcEF6hdnY+YAzevZ9hRPPrA0GIYlt 37x+TNOO3FDl4fusehcpPdM7GQCKnYuXYYx9BdXM= From: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= To: libcamera-devel@lists.libcamera.org Subject: [RFC PATCH v1 17/27] libcamera: pipeline_handler: Use `std::deque` Date: Thu, 18 Jun 2026 14:38:34 +0200 Message-ID: <20260618123844.656396-18-barnabas.pocze@ideasonboard.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260618123844.656396-1-barnabas.pocze@ideasonboard.com> References: <20260618123844.656396-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" `std::queue` already uses `std::deque` as its implementation, so there is no difference there. And getting a specific index of `std::list` is a linear operation, so replace it with an `std::deque`, to enable pipeline handlers to look into the list more easily. Signed-off-by: Barnabás Pőcze --- include/libcamera/internal/camera.h | 7 +++---- src/libcamera/pipeline_handler.cpp | 8 ++++---- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/include/libcamera/internal/camera.h b/include/libcamera/internal/camera.h index 8a2e9ed589..be3e5ff97e 100644 --- a/include/libcamera/internal/camera.h +++ b/include/libcamera/internal/camera.h @@ -8,9 +8,8 @@ #pragma once #include -#include +#include #include -#include #include #include #include @@ -36,8 +35,8 @@ public: PipelineHandler *pipe() { return pipe_.get(); } const PipelineHandler *pipe() const { return pipe_.get(); } - std::list queuedRequests_; - std::queue waitingRequests_; + std::deque queuedRequests_; + std::deque waitingRequests_; ControlInfoMap controlInfo_; ControlList properties_; diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp index 99f35d1e42..5376fee299 100644 --- a/src/libcamera/pipeline_handler.cpp +++ b/src/libcamera/pipeline_handler.cpp @@ -372,7 +372,7 @@ void PipelineHandler::stop(Camera *camera) * after the device to keep them in order. */ Camera::Private *data = camera->_d(); - std::queue waitingRequests; + std::deque waitingRequests; waitingRequests.swap(data->waitingRequests_); /* Stop the pipeline handler and let the queued requests complete. */ @@ -381,7 +381,7 @@ void PipelineHandler::stop(Camera *camera) /* Cancel and signal as complete all waiting requests. */ while (!waitingRequests.empty()) { Request *request = waitingRequests.front(); - waitingRequests.pop(); + waitingRequests.pop_front(); /* * Cancel all requests by marking them as cancelled and calling @@ -472,7 +472,7 @@ void PipelineHandler::queueRequest(Request *request) Camera *camera = request->_d()->camera(); Camera::Private *data = camera->_d(); - data->waitingRequests_.push(request); + data->waitingRequests_.push_back(request); request->_d()->prepare(300ms); } @@ -521,7 +521,7 @@ void PipelineHandler::doQueueRequests(Camera *camera) * Pop the request first, in case doQueueRequests() is called * recursively from within doQueueRequest() */ - data->waitingRequests_.pop(); + data->waitingRequests_.pop_front(); doQueueRequest(request); } } From patchwork Thu Jun 18 12:38:35 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: 26981 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 0C330C3310 for ; Thu, 18 Jun 2026 12:39:23 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 74A71656F9; Thu, 18 Jun 2026 14:39:17 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="lOuxjLHg"; 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 09E56656BE for ; Thu, 18 Jun 2026 14:38:52 +0200 (CEST) Received: from pb-laptop.local (185.182.214.63.nat.pool.zt.hu [185.182.214.63]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 1E29ADF3 for ; Thu, 18 Jun 2026 14:38:17 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1781786297; bh=m/NduSJK/FnZrbiPGysq2v0bVGFljAowl9OynKG4K0c=; h=From:To:Subject:Date:In-Reply-To:References:From; b=lOuxjLHgQrlMvmoiKL6jZcSLAsyxMvkzao122mnoSnkb6Z3DFbBX5Ox5BXlnlTpMe 8vh8aaApJaY9e9m1MqbhQj4keBiFL9iRSrcwXLMcKq6DjO+CJOBdQsd9EevSJmtCe8 c27vx2RzW90+AA0YGg0+BfSOcf2zL0xX/2cOiW1w= From: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= To: libcamera-devel@lists.libcamera.org Subject: [RFC PATCH v1 18/27] py: examples: simple-continuous-capture: Fix comment Date: Thu, 18 Jun 2026 14:38:35 +0200 Message-ID: <20260618123844.656396-19-barnabas.pocze@ideasonboard.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260618123844.656396-1-barnabas.pocze@ideasonboard.com> References: <20260618123844.656396-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" The request cookie is the index of the `CameraCaptureContext` object not the buffer index, so adjust the comment. Fixes: d6cfb080604a ("py: examples: Add simple-continuous-capture.py") Signed-off-by: Barnabás Pőcze --- src/py/examples/simple-continuous-capture.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/py/examples/simple-continuous-capture.py b/src/py/examples/simple-continuous-capture.py index e1cb931e51..5ae841519e 100755 --- a/src/py/examples/simple-continuous-capture.py +++ b/src/py/examples/simple-continuous-capture.py @@ -56,7 +56,7 @@ class CameraCaptureContext: self.mfbs = {} for i in range(num_bufs): - # Use the buffer index as the "cookie" + # Use the camera index as the "cookie" req = cam.create_request(idx) buffer = allocator.buffers(stream)[i] From patchwork Thu Jun 18 12:38:36 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: 26983 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 E74BEC3302 for ; Thu, 18 Jun 2026 12:39:24 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 3F59465707; Thu, 18 Jun 2026 14:39:19 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="M4p6egLj"; 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 41264656C6 for ; Thu, 18 Jun 2026 14:38:52 +0200 (CEST) Received: from pb-laptop.local (185.182.214.63.nat.pool.zt.hu [185.182.214.63]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 4E82B2F8 for ; Thu, 18 Jun 2026 14:38:17 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1781786297; bh=sVZCK5DrKyV2wHgXoq5/9A5spH9uovod9Cma3px3fMU=; h=From:To:Subject:Date:In-Reply-To:References:From; b=M4p6egLjXJt/KKhiF3z66I9QaZs0lXCEz8gMItHySOIK0mre2T991sjuZt49zuJnx Fd3bCjNavqBwbQM99BqfjsBq4jnnatWbp2vD3N4UpDXPluTEkoQXivaosQa1yyfIwQ Fs0qAbKWMayrjmci/WDiQuQ7aNfSUyzkz/q4mZdA= From: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= To: libcamera-devel@lists.libcamera.org Subject: [RFC PATCH v1 19/27] py: cam: Remove unnecessary check Date: Thu, 18 Jun 2026 14:38:36 +0200 Message-ID: <20260618123844.656396-20-barnabas.pocze@ideasonboard.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260618123844.656396-1-barnabas.pocze@ideasonboard.com> References: <20260618123844.656396-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" The `create_request` method will throw an exception if the request could not be created, it never returns `None`. Signed-off-by: Barnabás Pőcze --- src/py/cam/cam.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/py/cam/cam.py b/src/py/cam/cam.py index ff4b7f663e..73764a8af7 100755 --- a/src/py/cam/cam.py +++ b/src/py/cam/cam.py @@ -206,10 +206,6 @@ class CameraContext: for buf_num in range(num_bufs): request = self.camera.create_request(self.idx) - if request is None: - print('Can not create request') - exit(-1) - for stream in self.streams: buffers = self.allocator.buffers(stream) buffer = buffers[buf_num] From patchwork Thu Jun 18 12:38:37 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: 26985 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 9FD08C331D for ; Thu, 18 Jun 2026 12:39:26 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 2874165729; Thu, 18 Jun 2026 14:39:24 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="Hdm/j9eM"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 6F5DF62B29 for ; Thu, 18 Jun 2026 14:38:52 +0200 (CEST) Received: from pb-laptop.local (185.182.214.63.nat.pool.zt.hu [185.182.214.63]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 85188DF3 for ; Thu, 18 Jun 2026 14:38:17 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1781786297; bh=k2p7+a1HsYWsur0N/4I5XSOEbYNefgqL9qhidFP2ltM=; h=From:To:Subject:Date:In-Reply-To:References:From; b=Hdm/j9eM/sbZqAHRBPyKVM+0zsK6Z8NUIPtZnmKXbU/oGGzYbx0x3tDtm4/GVvz8q ReWcdn9i+pClVHu3ezq0edWbYcOpR1N3NGnmHTJmhT1ofS1z0tgnPg3l6bkzgyEBFC 3/QJioyALSTnEkFvCTuLFKLitrcuO6ksjdDVSgAA= From: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= To: libcamera-devel@lists.libcamera.org Subject: [RFC PATCH v1 20/27] gstreamer: allocator: get_pool_size(): Fix return value Date: Thu, 18 Jun 2026 14:38:37 +0200 Message-ID: <20260618123844.656396-21-barnabas.pocze@ideasonboard.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260618123844.656396-1-barnabas.pocze@ideasonboard.com> References: <20260618123844.656396-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" Return `0` instead of `false` in the error case. Signed-off-by: Barnabás Pőcze --- src/gstreamer/gstlibcameraallocator.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gstreamer/gstlibcameraallocator.cpp b/src/gstreamer/gstlibcameraallocator.cpp index d4492d994b..d9d771d545 100644 --- a/src/gstreamer/gstlibcameraallocator.cpp +++ b/src/gstreamer/gstlibcameraallocator.cpp @@ -260,7 +260,7 @@ gst_libcamera_allocator_get_pool_size(GstLibcameraAllocator *self, GLibLocker lock(GST_OBJECT(self)); auto *pool = reinterpret_cast(g_hash_table_lookup(self->pools, stream)); - g_return_val_if_fail(pool, false); + g_return_val_if_fail(pool, 0); return pool->length; } From patchwork Thu Jun 18 12:38:38 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: 26986 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 99DC7C3323 for ; Thu, 18 Jun 2026 12:39:27 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 2C97765718; Thu, 18 Jun 2026 14:39:26 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="JHH/wm8h"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 9D82E656C1 for ; Thu, 18 Jun 2026 14:38:52 +0200 (CEST) Received: from pb-laptop.local (185.182.214.63.nat.pool.zt.hu [185.182.214.63]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id BAECB2F8 for ; Thu, 18 Jun 2026 14:38:17 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1781786297; bh=DUQ/KdTHe3MZyPeFGHix4N1v0F/tbiou66p+M6o+MDM=; h=From:To:Subject:Date:In-Reply-To:References:From; b=JHH/wm8hsEBmY1RxA5hcpOpXFh75UGMoamxiFqQgmX2SyUEtyTMbdY5VcqxkUloLK 4GhcUdNvIiamRYkvMHmiZrY6kuoAthmW3hcgxKape3m72Dle2a8pxeiTyEf0jtVCZm xn/GisakvCPXxXhQL0MT9sSCfv/YMUpw33TbB1Ik= From: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= To: libcamera-devel@lists.libcamera.org Subject: [RFC PATCH v1 21/27] gstreamer: Use `FrameBuffer` cookie to associate with `GstBuffer` Date: Thu, 18 Jun 2026 14:38:38 +0200 Message-ID: <20260618123844.656396-22-barnabas.pocze@ideasonboard.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260618123844.656396-1-barnabas.pocze@ideasonboard.com> References: <20260618123844.656396-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" Use the `FrameBuffer`'s arbitrary "cookie" data to reference the associated `GstBuffer` while the `FrameBuffer` is attached to a particular request. Otherwise keep the cookie 0. This is allowed since the `FrameBuffer`s are allocated with the `FrameBufferAllocator`. This also removes the need for the explicit mapping of Stream -> GstBuffer in `RequestWrap`. Signed-off-by: Barnabás Pőcze --- src/gstreamer/gstlibcamerasrc.cpp | 37 ++++++++++++++++--------------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp index 5d3ee3a213..9061f9163c 100644 --- a/src/gstreamer/gstlibcamerasrc.cpp +++ b/src/gstreamer/gstlibcamerasrc.cpp @@ -52,7 +52,6 @@ struct RequestWrap { GstBuffer *detachBuffer(GstPad *srcpad); std::unique_ptr request_; - std::map buffers_; GstClockTime latency_; GstClockTime pts_; @@ -65,9 +64,15 @@ RequestWrap::RequestWrap(std::unique_ptr request) RequestWrap::~RequestWrap() { - for (std::pair &item : buffers_) { - if (item.second) - gst_buffer_unref(item.second); + if (!request_) + return; + + for (const auto &[stream, fb] : request_->buffers()) { + auto *buffer = reinterpret_cast(fb->cookie()); + if (buffer) + gst_buffer_unref(buffer); + + fb->setCookie(0); } } @@ -77,25 +82,21 @@ void RequestWrap::attachBuffer(GstPad *srcpad, GstBuffer *buffer) Stream *stream = gst_libcamera_pad_get_stream(srcpad); request_->addBuffer(stream, fb); - - auto item = buffers_.find(srcpad); - if (item != buffers_.end()) { - gst_buffer_unref(item->second); - item->second = buffer; - } else { - buffers_[srcpad] = buffer; - } + fb->setCookie(reinterpret_cast(buffer)); } GstBuffer *RequestWrap::detachBuffer(GstPad *srcpad) { - GstBuffer *buffer = nullptr; + const Stream *stream = gst_libcamera_pad_get_stream(srcpad); + FrameBuffer *fb = request_->findBuffer(stream); + if (!fb) + return nullptr; - auto item = buffers_.find(srcpad); - if (item != buffers_.end()) { - buffer = item->second; - item->second = nullptr; - } + auto *buffer = reinterpret_cast(fb->cookie()); + + fb->setCookie(0); + + g_assert(!buffer || fb == gst_libcamera_buffer_get_frame_buffer(buffer)); return buffer; } From patchwork Thu Jun 18 12:38:39 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: 26984 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 EC581C3318 for ; Thu, 18 Jun 2026 12:39:25 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 6D71665716; Thu, 18 Jun 2026 14:39:21 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="hKC25zwB"; 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 E294B62B32 for ; Thu, 18 Jun 2026 14:38:52 +0200 (CEST) Received: from pb-laptop.local (185.182.214.63.nat.pool.zt.hu [185.182.214.63]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id E7A81DF3 for ; Thu, 18 Jun 2026 14:38:17 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1781786298; bh=rJmuAswBm1gnfX4cU7FIDte9K62dIwjJE69ylzW2nig=; h=From:To:Subject:Date:In-Reply-To:References:From; b=hKC25zwBLcPRZJ3MjB4kL9Hyg7jqxl8oaWb9E9bWydIfYoHbKASeqni2+HZvNy1RV biS/XYCL99sdbx7e0a0cXD8UhyGpSNKPWarXD/wYXwXAZSvEyiBU5B6zFci+Rly9nZ jXmivVIKQcip1eu8OFtqMgxLdhJkFMSRFtTU+dHk= From: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= To: libcamera-devel@lists.libcamera.org Subject: [RFC PATCH v1 22/27] v4l2: v4l2_camera: Avoid a level of indirection Date: Thu, 18 Jun 2026 14:38:39 +0200 Message-ID: <20260618123844.656396-23-barnabas.pocze@ideasonboard.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260618123844.656396-1-barnabas.pocze@ideasonboard.com> References: <20260618123844.656396-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" Convert the `completedBuffers_` container to store the items directly and not via an `std::unique_ptr`. Signed-off-by: Barnabás Pőcze --- src/v4l2/v4l2_camera.cpp | 11 ++++------- src/v4l2/v4l2_camera.h | 2 +- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/v4l2/v4l2_camera.cpp b/src/v4l2/v4l2_camera.cpp index 412ab4ea67..648578c22b 100644 --- a/src/v4l2/v4l2_camera.cpp +++ b/src/v4l2/v4l2_camera.cpp @@ -70,11 +70,10 @@ void V4L2Camera::unbind() std::vector V4L2Camera::completedBuffers() { - std::vector v; - MutexLocker lock(bufferLock_); - for (std::unique_ptr &metadata : completedBuffers_) - v.push_back(*metadata.get()); + std::vector v(std::move_iterator(completedBuffers_.begin()), + std::move_iterator(completedBuffers_.end())); + completedBuffers_.clear(); return v; @@ -88,9 +87,7 @@ void V4L2Camera::requestComplete(Request *request) /* We only have one stream at the moment. */ bufferLock_.lock(); FrameBuffer *buffer = request->buffers().begin()->second; - std::unique_ptr metadata = - std::make_unique(request->cookie(), buffer->metadata()); - completedBuffers_.push_back(std::move(metadata)); + completedBuffers_.emplace_back(request->cookie(), buffer->metadata()); bufferLock_.unlock(); uint64_t data = 1; diff --git a/src/v4l2/v4l2_camera.h b/src/v4l2/v4l2_camera.h index 3d09ae7d60..1528f9aad8 100644 --- a/src/v4l2/v4l2_camera.h +++ b/src/v4l2/v4l2_camera.h @@ -85,7 +85,7 @@ private: std::vector> requestPool_; std::deque pendingRequests_; - std::deque> completedBuffers_ + std::deque completedBuffers_ LIBCAMERA_TSA_GUARDED_BY(bufferLock_); int efd_; From patchwork Thu Jun 18 12:38:40 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: 26989 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 BBDD4C3330 for ; Thu, 18 Jun 2026 12:39:29 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id DBC406571F; Thu, 18 Jun 2026 14:39:28 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="Cj3jTjSE"; 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 2432B656EE for ; Thu, 18 Jun 2026 14:38:53 +0200 (CEST) Received: from pb-laptop.local (185.182.214.63.nat.pool.zt.hu [185.182.214.63]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 3D9D22F8 for ; Thu, 18 Jun 2026 14:38:18 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1781786298; bh=5s0Z+l6TGSaezBCuWFzaKWnSxqQ7o6cTa1zn+6LVF1s=; h=From:To:Subject:Date:In-Reply-To:References:From; b=Cj3jTjSE0C7lBxnHQAP1234auoWMRSoKvYV7krdtd/Q5JP3ygOz0yiLTjVhAcfsB4 O2GujWFCNlfqAz6gZWSgS4lmqLkRci2ibir0AMhnR0YW39I7h42qj5hHAv6rjNzmOO 5mtrrP/3Nvo7oijs4ybioCyZqBlHa0FM4uWwB44U= From: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= To: libcamera-devel@lists.libcamera.org Subject: [RFC PATCH v1 23/27] v4l2: v4l2_camera: Use actually allocated buffer count Date: Thu, 18 Jun 2026 14:38:40 +0200 Message-ID: <20260618123844.656396-24-barnabas.pocze@ideasonboard.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260618123844.656396-1-barnabas.pocze@ideasonboard.com> References: <20260618123844.656396-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" Make `V4L2Camera::allocBuffers()` simply create as many requests as the number of buffers allocated instead of taking it as an argument. The two should be the same, so no functional changes intended. Signed-off-by: Barnabás Pőcze --- src/v4l2/v4l2_camera.cpp | 8 +++++--- src/v4l2/v4l2_camera.h | 2 +- src/v4l2/v4l2_camera_proxy.cpp | 11 +++++------ 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/v4l2/v4l2_camera.cpp b/src/v4l2/v4l2_camera.cpp index 648578c22b..75428b8adc 100644 --- a/src/v4l2/v4l2_camera.cpp +++ b/src/v4l2/v4l2_camera.cpp @@ -154,7 +154,7 @@ int V4L2Camera::validateConfiguration(const PixelFormat &pixelFormat, return 0; } -int V4L2Camera::allocBuffers(unsigned int count) +int V4L2Camera::allocBuffers() { Stream *stream = config_->at(0).stream(); @@ -162,7 +162,9 @@ int V4L2Camera::allocBuffers(unsigned int count) if (ret < 0) return ret; - for (unsigned int i = 0; i < count; i++) { + const auto &buffers = bufferAllocator_->buffers(stream); + + for (size_t i = 0; i < buffers.size(); i++) { std::unique_ptr request = camera_->createRequest(i); if (!request) { requestPool_.clear(); @@ -171,7 +173,7 @@ int V4L2Camera::allocBuffers(unsigned int count) requestPool_.push_back(std::move(request)); } - return ret; + return buffers.size(); } void V4L2Camera::freeBuffers() diff --git a/src/v4l2/v4l2_camera.h b/src/v4l2/v4l2_camera.h index 1528f9aad8..8a58169d89 100644 --- a/src/v4l2/v4l2_camera.h +++ b/src/v4l2/v4l2_camera.h @@ -54,7 +54,7 @@ public: libcamera::ControlList &controls() { return controls_; } const libcamera::ControlInfoMap &controlInfo() { return camera_->controls(); } - int allocBuffers(unsigned int count); + int allocBuffers(); void freeBuffers(); int getBufferFd(unsigned int index); diff --git a/src/v4l2/v4l2_camera_proxy.cpp b/src/v4l2/v4l2_camera_proxy.cpp index 03cd4810cc..5281f10552 100644 --- a/src/v4l2/v4l2_camera_proxy.cpp +++ b/src/v4l2/v4l2_camera_proxy.cpp @@ -543,17 +543,16 @@ int V4L2CameraProxy::vidioc_reqbufs(V4L2CameraFile *file, struct v4l2_requestbuf if (ret < 0) return -EINVAL; - setFmtFromConfig(streamConfig_); - - arg->count = streamConfig_.bufferCount; - bufferCount_ = arg->count; - - ret = vcam_->allocBuffers(arg->count); + ret = vcam_->allocBuffers(); if (ret < 0) { arg->count = 0; return ret; } + bufferCount_ = arg->count = ret; + + setFmtFromConfig(streamConfig_); + buffers_.resize(arg->count); for (unsigned int i = 0; i < arg->count; i++) { struct v4l2_buffer buf = {}; From patchwork Thu Jun 18 12:38:41 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: 26987 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 4F180C3329 for ; Thu, 18 Jun 2026 12:39:28 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 4F20C6571B; Thu, 18 Jun 2026 14:39:27 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="PHW0wEEW"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 51F8362988 for ; Thu, 18 Jun 2026 14:38:53 +0200 (CEST) Received: from pb-laptop.local (185.182.214.63.nat.pool.zt.hu [185.182.214.63]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 6C314DF3 for ; Thu, 18 Jun 2026 14:38:18 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1781786298; bh=sopiKBDQMtAt07ooCAVtMn05RUsUGv007Kpx1frGX9s=; h=From:To:Subject:Date:In-Reply-To:References:From; b=PHW0wEEWkCZ58pFgwQjK4geQ8tMk9UWux2UthiBkwScSTrKzL+ESRfXMxpAAASHOA zXmHjMYY4Nnw0qnuwZbX5+JOV6RIQ8U9YfXeHcDXaGvCJpD5kUQ1Sxs+7vcZWkIxmE HUunU/1pqI0Kp0pNoHqTYzEXsOpLHo0dc3Jrp+VE= From: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= To: libcamera-devel@lists.libcamera.org Subject: [RFC PATCH v1 24/27] v4l2: v4l2_camera: Use buffer cookie for indexing Date: Thu, 18 Jun 2026 14:38:41 +0200 Message-ID: <20260618123844.656396-25-barnabas.pocze@ideasonboard.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260618123844.656396-1-barnabas.pocze@ideasonboard.com> References: <20260618123844.656396-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" Use the buffer cookie to store the index of the buffer instead of relying on the 1-to-1 association between requests and buffers, which will be broken by the split of requests and buffers. Signed-off-by: Barnabás Pőcze --- src/v4l2/v4l2_camera.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/v4l2/v4l2_camera.cpp b/src/v4l2/v4l2_camera.cpp index 75428b8adc..7dd0ea1ef9 100644 --- a/src/v4l2/v4l2_camera.cpp +++ b/src/v4l2/v4l2_camera.cpp @@ -87,7 +87,7 @@ void V4L2Camera::requestComplete(Request *request) /* We only have one stream at the moment. */ bufferLock_.lock(); FrameBuffer *buffer = request->buffers().begin()->second; - completedBuffers_.emplace_back(request->cookie(), buffer->metadata()); + completedBuffers_.emplace_back(buffer->cookie(), buffer->metadata()); bufferLock_.unlock(); uint64_t data = 1; @@ -171,6 +171,8 @@ int V4L2Camera::allocBuffers() return -ENOMEM; } requestPool_.push_back(std::move(request)); + + buffers[i]->setCookie(i); } return buffers.size(); From patchwork Thu Jun 18 12:38:42 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: 26988 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 EF951C332A for ; Thu, 18 Jun 2026 12:39:28 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 22F326571E; Thu, 18 Jun 2026 14:39:28 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="kfpEUblP"; 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 8A25E656F6 for ; Thu, 18 Jun 2026 14:38:53 +0200 (CEST) Received: from pb-laptop.local (185.182.214.63.nat.pool.zt.hu [185.182.214.63]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 98E0A2F8 for ; Thu, 18 Jun 2026 14:38:18 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1781786298; bh=pIXJf1n38uFdSboSrG9npAOlghWJrOkjcNt4p8VZOUM=; h=From:To:Subject:Date:In-Reply-To:References:From; b=kfpEUblPrmhQfG8kozcCrHTF9nB387ozWTvQ2BVxrnzyDPOTNx/gPGWAhSaQl8Rxo cNIl71TBicOqyjlimVJtiWNaWv1S4cySdbnRBe4cYBgRCKu6ExQETSbKgIFBG6pFlY uDu/GbwhK6Ty408HoLY/qF+q8/4V1GmlhZATBnPo= From: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= To: libcamera-devel@lists.libcamera.org Subject: [RFC PATCH v1 25/27] v4l2: v4l2_camera: Rename `Buffer` to `CompletedBuffer` Date: Thu, 18 Jun 2026 14:38:42 +0200 Message-ID: <20260618123844.656396-26-barnabas.pocze@ideasonboard.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260618123844.656396-1-barnabas.pocze@ideasonboard.com> References: <20260618123844.656396-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" This expresses the meaning better. Signed-off-by: Barnabás Pőcze --- src/v4l2/v4l2_camera.cpp | 2 +- src/v4l2/v4l2_camera.h | 8 ++++---- src/v4l2/v4l2_camera_proxy.cpp | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/v4l2/v4l2_camera.cpp b/src/v4l2/v4l2_camera.cpp index 7dd0ea1ef9..e72b73a22a 100644 --- a/src/v4l2/v4l2_camera.cpp +++ b/src/v4l2/v4l2_camera.cpp @@ -68,7 +68,7 @@ void V4L2Camera::unbind() efd_ = -1; } -std::vector V4L2Camera::completedBuffers() +std::vector V4L2Camera::completedBuffers() { MutexLocker lock(bufferLock_); std::vector v(std::move_iterator(completedBuffers_.begin()), diff --git a/src/v4l2/v4l2_camera.h b/src/v4l2/v4l2_camera.h index 8a58169d89..1d90eb43e4 100644 --- a/src/v4l2/v4l2_camera.h +++ b/src/v4l2/v4l2_camera.h @@ -23,8 +23,8 @@ class V4L2Camera { public: - struct Buffer { - Buffer(unsigned int index, const libcamera::FrameMetadata &data) + struct CompletedBuffer { + CompletedBuffer(unsigned int index, const libcamera::FrameMetadata &data) : index_(index), data_(data) { } @@ -41,7 +41,7 @@ public: void bind(int efd); void unbind(); - std::vector completedBuffers() LIBCAMERA_TSA_EXCLUDES(bufferLock_); + std::vector completedBuffers() LIBCAMERA_TSA_EXCLUDES(bufferLock_); int configure(libcamera::StreamConfiguration *streamConfigOut, const libcamera::Size &size, @@ -85,7 +85,7 @@ private: std::vector> requestPool_; std::deque pendingRequests_; - std::deque completedBuffers_ + std::deque completedBuffers_ LIBCAMERA_TSA_GUARDED_BY(bufferLock_); int efd_; diff --git a/src/v4l2/v4l2_camera_proxy.cpp b/src/v4l2/v4l2_camera_proxy.cpp index 5281f10552..820a417a9c 100644 --- a/src/v4l2/v4l2_camera_proxy.cpp +++ b/src/v4l2/v4l2_camera_proxy.cpp @@ -243,8 +243,8 @@ void V4L2CameraProxy::querycap(std::shared_ptr camera) void V4L2CameraProxy::updateBuffers() { - std::vector completedBuffers = vcam_->completedBuffers(); - for (const V4L2Camera::Buffer &buffer : completedBuffers) { + std::vector completedBuffers = vcam_->completedBuffers(); + for (const V4L2Camera::CompletedBuffer &buffer : completedBuffers) { const FrameMetadata &fmd = buffer.data_; struct v4l2_buffer &buf = buffers_[buffer.index_]; From patchwork Thu Jun 18 12:38:43 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: 26990 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 41956C3332 for ; Thu, 18 Jun 2026 12:39:30 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 8F8E365720; Thu, 18 Jun 2026 14:39:29 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="u24i0n+u"; 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 B2008656F2 for ; Thu, 18 Jun 2026 14:38:53 +0200 (CEST) Received: from pb-laptop.local (185.182.214.63.nat.pool.zt.hu [185.182.214.63]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id CA9AEDF3 for ; Thu, 18 Jun 2026 14:38:18 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1781786298; bh=sdHFz5WtSyn48bsJYYGaKLdonMkPV576UuxPKIjZc+g=; h=From:To:Subject:Date:In-Reply-To:References:From; b=u24i0n+uhQ3t1AbgNrnPlA2mKMt8RDCVmTCyURzV5KlMMCwQkKcHvZBNXJGkItPAq +TVNuMrsqoEktd5DFSg1axrtB3nlS4225ligyzaw1M72Hy/XvvhT6dUAxgaIP41t2I YsyMbiGuUezWiyGug++LDawC6EPgqysctqIYhBHo= From: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= To: libcamera-devel@lists.libcamera.org Subject: [RFC PATCH v1 26/27] v4l2: v4l2_camera: Always clear pending requests Date: Thu, 18 Jun 2026 14:38:43 +0200 Message-ID: <20260618123844.656396-27-barnabas.pocze@ideasonboard.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260618123844.656396-1-barnabas.pocze@ideasonboard.com> References: <20260618123844.656396-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" Clear the list of pending requests regardless whether the camera is running or not. The list should only contain entries when `!isRunning_`, in which case it was not cleared previously. Signed-off-by: Barnabás Pőcze --- src/v4l2/v4l2_camera.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/v4l2/v4l2_camera.cpp b/src/v4l2/v4l2_camera.cpp index e72b73a22a..8c7de8e92b 100644 --- a/src/v4l2/v4l2_camera.cpp +++ b/src/v4l2/v4l2_camera.cpp @@ -226,6 +226,8 @@ int V4L2Camera::streamOn() int V4L2Camera::streamOff() { + pendingRequests_.clear(); + if (!isRunning_) { for (std::unique_ptr &req : requestPool_) req->reuse(); @@ -233,8 +235,6 @@ int V4L2Camera::streamOff() return 0; } - pendingRequests_.clear(); - int ret = camera_->stop(); if (ret < 0) return ret == -EACCES ? -EBUSY : ret; From patchwork Thu Jun 18 12:38:44 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: 26991 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 EE0F4C3333 for ; Thu, 18 Jun 2026 12:39:30 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 5D32B65721; Thu, 18 Jun 2026 14:39:30 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="GJLEBwnk"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id E9247656F9 for ; Thu, 18 Jun 2026 14:38:53 +0200 (CEST) Received: from pb-laptop.local (185.182.214.63.nat.pool.zt.hu [185.182.214.63]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 054B72393 for ; Thu, 18 Jun 2026 14:38:18 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1781786299; bh=06tF2XpQR52p8Wyt40okZlVtNLZGHQx5hmAOtCLzikQ=; h=From:To:Subject:Date:In-Reply-To:References:From; b=GJLEBwnk/JPG60ikRedZTiYSOZ/mdiKeVQmextE72rZK32hEAzM2WWQPes1mD0z99 IPTjBL4pQ9lTZpKFZryznQHlhMNkFF07bv8WjmlmC+s3RDTGiWLUTfvAcrqF13B5aN KxPjuNp83BAmiPEnXv53cn1SS0OIwufduE18GukM= From: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= To: libcamera-devel@lists.libcamera.org Subject: [RFC PATCH v1 27/27] v4l2: v4l2_camera: Provide buffers one by one Date: Thu, 18 Jun 2026 14:38:44 +0200 Message-ID: <20260618123844.656396-28-barnabas.pocze@ideasonboard.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260618123844.656396-1-barnabas.pocze@ideasonboard.com> References: <20260618123844.656396-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" Instead of processing a set of buffers at a time and cycling through the buffers using `V4L2CameraProxy::currentBuf_`, add a new function to query just the least recently completed buffer and use that to service `VIDIOC_DQBUF`. This ensures that the reported index will denote the buffer that was actually completed after the request-buffer split. Signed-off-by: Barnabás Pőcze --- src/v4l2/v4l2_camera.cpp | 62 ++++++++++--------------- src/v4l2/v4l2_camera.h | 13 ++---- src/v4l2/v4l2_camera_proxy.cpp | 84 +++++++++++++++++----------------- src/v4l2/v4l2_camera_proxy.h | 2 - 4 files changed, 69 insertions(+), 92 deletions(-) diff --git a/src/v4l2/v4l2_camera.cpp b/src/v4l2/v4l2_camera.cpp index 8c7de8e92b..90773e00bf 100644 --- a/src/v4l2/v4l2_camera.cpp +++ b/src/v4l2/v4l2_camera.cpp @@ -20,7 +20,7 @@ LOG_DECLARE_CATEGORY(V4L2Compat) V4L2Camera::V4L2Camera(std::shared_ptr camera) : camera_(camera), controls_(controls::controls), isRunning_(false), - efd_(-1), bufferAvailableCount_(0) + efd_(-1) { camera_->requestCompleted.connect(this, &V4L2Camera::requestComplete); } @@ -68,38 +68,25 @@ void V4L2Camera::unbind() efd_ = -1; } -std::vector V4L2Camera::completedBuffers() -{ - MutexLocker lock(bufferLock_); - std::vector v(std::move_iterator(completedBuffers_.begin()), - std::move_iterator(completedBuffers_.end())); - - completedBuffers_.clear(); - - return v; -} - void V4L2Camera::requestComplete(Request *request) { if (request->status() == Request::RequestCancelled) return; /* We only have one stream at the moment. */ - bufferLock_.lock(); - FrameBuffer *buffer = request->buffers().begin()->second; - completedBuffers_.emplace_back(buffer->cookie(), buffer->metadata()); - bufferLock_.unlock(); - - uint64_t data = 1; - int ret = ::write(efd_, &data, sizeof(data)); - if (ret != sizeof(data)) - LOG(V4L2Compat, Error) << "Failed to signal eventfd POLLIN"; - - request->reuse(); { MutexLocker locker(bufferMutex_); - bufferAvailableCount_++; + FrameBuffer *buffer = request->buffers().begin()->second; + completedBuffers_.emplace_back(buffer->cookie(), buffer->metadata()); + + uint64_t data = 1; + int ret = ::write(efd_, &data, sizeof(data)); + if (ret != sizeof(data)) + LOG(V4L2Compat, Error) << "Failed to signal eventfd POLLIN"; + + request->reuse(); } + bufferCV_.notify_all(); } @@ -280,24 +267,23 @@ int V4L2Camera::qbuf(unsigned int index) return 0; } -void V4L2Camera::waitForBufferAvailable() +std::optional V4L2Camera::nextBuffer(bool wait) { MutexLocker locker(bufferMutex_); - bufferCV_.wait(locker, [&]() LIBCAMERA_TSA_REQUIRES(bufferMutex_) { - return bufferAvailableCount_ >= 1 || !isRunning_; - }); - if (isRunning_) - bufferAvailableCount_--; -} -bool V4L2Camera::isBufferAvailable() -{ - MutexLocker locker(bufferMutex_); - if (bufferAvailableCount_ < 1) - return false; + if (wait) { + bufferCV_.wait(locker, [&]() LIBCAMERA_TSA_REQUIRES(bufferMutex_) { + return !completedBuffers_.empty() || !isRunning_; + }); + } + + if (!isRunning_) + return {}; + + auto buffer = std::move(completedBuffers_.front()); + completedBuffers_.pop_front(); - bufferAvailableCount_--; - return true; + return buffer; } bool V4L2Camera::isRunning() diff --git a/src/v4l2/v4l2_camera.h b/src/v4l2/v4l2_camera.h index 1d90eb43e4..06e37077b2 100644 --- a/src/v4l2/v4l2_camera.h +++ b/src/v4l2/v4l2_camera.h @@ -9,6 +9,7 @@ #include #include +#include #include #include @@ -41,8 +42,6 @@ public: void bind(int efd); void unbind(); - std::vector completedBuffers() LIBCAMERA_TSA_EXCLUDES(bufferLock_); - int configure(libcamera::StreamConfiguration *streamConfigOut, const libcamera::Size &size, const libcamera::PixelFormat &pixelformat, @@ -63,14 +62,12 @@ public: int qbuf(unsigned int index); - void waitForBufferAvailable() LIBCAMERA_TSA_EXCLUDES(bufferMutex_); - bool isBufferAvailable() LIBCAMERA_TSA_EXCLUDES(bufferMutex_); + std::optional nextBuffer(bool wait) LIBCAMERA_TSA_EXCLUDES(bufferMutex_); bool isRunning(); private: - void requestComplete(libcamera::Request *request) - LIBCAMERA_TSA_EXCLUDES(bufferLock_); + void requestComplete(libcamera::Request *request); std::shared_ptr camera_; std::unique_ptr config_; @@ -79,18 +76,16 @@ private: bool isRunning_; - libcamera::Mutex bufferLock_; std::unique_ptr bufferAllocator_; std::vector> requestPool_; std::deque pendingRequests_; std::deque completedBuffers_ - LIBCAMERA_TSA_GUARDED_BY(bufferLock_); + LIBCAMERA_TSA_GUARDED_BY(bufferMutex_); int efd_; libcamera::Mutex bufferMutex_; libcamera::ConditionVariable bufferCV_; - unsigned int bufferAvailableCount_ LIBCAMERA_TSA_GUARDED_BY(bufferMutex_); }; diff --git a/src/v4l2/v4l2_camera_proxy.cpp b/src/v4l2/v4l2_camera_proxy.cpp index 820a417a9c..3a34e84071 100644 --- a/src/v4l2/v4l2_camera_proxy.cpp +++ b/src/v4l2/v4l2_camera_proxy.cpp @@ -39,9 +39,37 @@ using namespace std::literals::chrono_literals; LOG_DECLARE_CATEGORY(V4L2Compat) +namespace { + +void updateBuffer(v4l2_buffer &buf, const FrameMetadata &fmd) +{ + switch (fmd.status) { + case FrameMetadata::FrameSuccess: + buf.bytesused = std::accumulate(fmd.planes().begin(), + fmd.planes().end(), 0, + [](unsigned int total, const auto &plane) { + return total + plane.bytesused; + }); + buf.field = V4L2_FIELD_NONE; + buf.timestamp.tv_sec = fmd.timestamp / 1000000000; + buf.timestamp.tv_usec = (fmd.timestamp / 1000) % 1000000; + buf.sequence = fmd.sequence; + + buf.flags |= V4L2_BUF_FLAG_DONE; + break; + case FrameMetadata::FrameError: + buf.flags |= V4L2_BUF_FLAG_ERROR; + break; + default: + break; + } +} + +} /* namespace */ + V4L2CameraProxy::V4L2CameraProxy(unsigned int index, std::shared_ptr camera) - : refcount_(0), index_(index), bufferCount_(0), currentBuf_(0), + : refcount_(0), index_(index), bufferCount_(0), vcam_(std::make_unique(camera)), owner_(nullptr) { querycap(camera); @@ -241,36 +269,6 @@ void V4L2CameraProxy::querycap(std::shared_ptr camera) memset(capabilities_.reserved, 0, sizeof(capabilities_.reserved)); } -void V4L2CameraProxy::updateBuffers() -{ - std::vector completedBuffers = vcam_->completedBuffers(); - for (const V4L2Camera::CompletedBuffer &buffer : completedBuffers) { - const FrameMetadata &fmd = buffer.data_; - struct v4l2_buffer &buf = buffers_[buffer.index_]; - - switch (fmd.status) { - case FrameMetadata::FrameSuccess: - buf.bytesused = std::accumulate(fmd.planes().begin(), - fmd.planes().end(), 0, - [](unsigned int total, const auto &plane) { - return total + plane.bytesused; - }); - buf.field = V4L2_FIELD_NONE; - buf.timestamp.tv_sec = fmd.timestamp / 1000000000; - buf.timestamp.tv_usec = (fmd.timestamp / 1000) % 1000000; - buf.sequence = fmd.sequence; - - buf.flags |= V4L2_BUF_FLAG_DONE; - break; - case FrameMetadata::FrameError: - buf.flags |= V4L2_BUF_FLAG_ERROR; - break; - default: - break; - } - } -} - int V4L2CameraProxy::vidioc_querycap(V4L2CameraFile *file, struct v4l2_capability *arg) { LOG(V4L2Compat, Debug) @@ -585,8 +583,6 @@ int V4L2CameraProxy::vidioc_querybuf(V4L2CameraFile *file, struct v4l2_buffer *a arg->index >= bufferCount_) return -EINVAL; - updateBuffers(); - *arg = buffers_[arg->index]; return 0; @@ -674,30 +670,34 @@ int V4L2CameraProxy::vidioc_dqbuf(V4L2CameraFile *file, struct v4l2_buffer *arg, !validateMemoryType(arg->memory)) return -EINVAL; + std::optional b; + if (!file->nonBlocking()) { lock->unlock(); - vcam_->waitForBufferAvailable(); + b = vcam_->nextBuffer(true); lock->lock(); - } else if (!vcam_->isBufferAvailable()) - return -EAGAIN; + } else { + b = vcam_->nextBuffer(false); + } /* * We need to check here again in case stream was turned off while we - * were blocked on waitForBufferAvailable(). + * were blocked in nextBuffer(). */ if (!vcam_->isRunning()) return -EINVAL; - updateBuffers(); + if (!b) + return -EAGAIN; + + struct v4l2_buffer &buf = buffers_[b->index_]; - struct v4l2_buffer &buf = buffers_[currentBuf_]; + updateBuffer(buf, b->data_); buf.flags &= ~(V4L2_BUF_FLAG_QUEUED | V4L2_BUF_FLAG_DONE | V4L2_BUF_FLAG_PREPARED); buf.length = sizeimage_; *arg = buf; - currentBuf_ = (currentBuf_ + 1) % bufferCount_; - uint64_t data; int ret = ::read(file->efd(), &data, sizeof(data)); if (ret != sizeof(data)) @@ -753,8 +753,6 @@ int V4L2CameraProxy::vidioc_streamon(V4L2CameraFile *file, int *arg) if (vcam_->isRunning()) return 0; - currentBuf_ = 0; - return vcam_->streamOn(); } diff --git a/src/v4l2/v4l2_camera_proxy.h b/src/v4l2/v4l2_camera_proxy.h index 5aa352c36f..e8f3583aa6 100644 --- a/src/v4l2/v4l2_camera_proxy.h +++ b/src/v4l2/v4l2_camera_proxy.h @@ -44,7 +44,6 @@ private: void querycap(std::shared_ptr camera); int tryFormat(struct v4l2_format *arg); enum v4l2_priority maxPriority(); - void updateBuffers(); void freeBuffers(); int vidioc_querycap(V4L2CameraFile *file, struct v4l2_capability *arg); @@ -81,7 +80,6 @@ private: libcamera::StreamConfiguration streamConfig_; unsigned int bufferCount_; - unsigned int currentBuf_; unsigned int sizeimage_; struct v4l2_capability capabilities_;