@@ -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);
/*
@@ -129,8 +129,6 @@ public:
return state_ != State::Stopped && state_ != State::Error;
}
- std::queue<Request *> requestQueue_;
-
/* For handling digital zoom. */
IPACameraSensorInfo sensorInfo_;
@@ -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. */
@@ -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. */
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(-)