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; }