[RFC,v1,12/27] libcamera: pipeline: rpi: Remove `requestQueue_`
diff mbox series

Message ID 20260618123844.656396-13-barnabas.pocze@ideasonboard.com
State New
Headers show
Series
  • Misc. changes before request-buffer split
Related show

Commit Message

Barnabás Pőcze June 18, 2026, 12:38 p.m. UTC
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 <barnabas.pocze@ideasonboard.com>
---
 .../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(-)

Patch
diff mbox series

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 &paramCon
 	 * 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<Request *> 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. */