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. */