[PATCH v4 2/3] libcamera: simple: Track requests in conversionQueue_
Milan Zamazal
mzamazal at redhat.com
Fri Oct 18 11:27:15 CEST 2024
Simple pipeline retrieves the requests to complete from the
conversionQueue_. This patch stores the requests in conversionQueue_
explicitly. This explicit tracking is supposed to be preferred to
implicit retrieval and it simplifies the completion code a bit here and
in the followup patch that adds request cleanup on stop.
The change as implemented assumes that all the buffers in each of the
conversionQueue_ elements point to the same request, the one specified.
Signed-off-by: Milan Zamazal <mzamazal at redhat.com>
---
src/libcamera/pipeline/simple/simple.cpp | 22 +++++++++-------------
1 file changed, 9 insertions(+), 13 deletions(-)
diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp
index 3ddce71d3..a1339d87c 100644
--- a/src/libcamera/pipeline/simple/simple.cpp
+++ b/src/libcamera/pipeline/simple/simple.cpp
@@ -282,7 +282,7 @@ public:
std::unique_ptr<DelayedControls> delayedCtrls_;
std::vector<std::unique_ptr<FrameBuffer>> conversionBuffers_;
- std::queue<std::map<const Stream *, FrameBuffer *>> conversionQueue_;
+ std::queue<std::pair<Request *, std::map<const Stream *, FrameBuffer *>>> conversionQueue_;
bool useConversion_;
std::unique_ptr<Converter> converter_;
@@ -813,16 +813,12 @@ void SimpleCameraData::bufferReady(FrameBuffer *buffer)
if (conversionQueue_.empty())
return;
- Request *request = nullptr;
- for (auto &item : conversionQueue_.front()) {
- FrameBuffer *outputBuffer = item.second;
- request = outputBuffer->request();
- pipe->completeBuffer(request, outputBuffer);
- }
+ Request *request = conversionQueue_.front().first;
+ for (auto &item : conversionQueue_.front().second)
+ pipe->completeBuffer(request, item.second);
+ pipe->completeRequest(request);
conversionQueue_.pop();
- if (request)
- pipe->completeRequest(request);
return;
}
@@ -838,7 +834,7 @@ void SimpleCameraData::bufferReady(FrameBuffer *buffer)
if (useConversion_ && !conversionQueue_.empty()) {
const std::map<const Stream *, FrameBuffer *> &outputs =
- conversionQueue_.front();
+ conversionQueue_.front().second;
if (!outputs.empty()) {
FrameBuffer *outputBuffer = outputs.begin()->second;
if (outputBuffer)
@@ -862,7 +858,7 @@ void SimpleCameraData::bufferReady(FrameBuffer *buffer)
}
if (converter_)
- converter_->queueBuffers(buffer, conversionQueue_.front());
+ converter_->queueBuffers(buffer, conversionQueue_.front().second);
else
/*
* request->sequence() cannot be retrieved from `buffer' inside
@@ -870,7 +866,7 @@ void SimpleCameraData::bufferReady(FrameBuffer *buffer)
* already here.
*/
swIsp_->queueBuffers(request->sequence(), buffer,
- conversionQueue_.front());
+ conversionQueue_.front().second);
conversionQueue_.pop();
return;
@@ -1434,7 +1430,7 @@ int SimplePipelineHandler::queueRequestDevice(Camera *camera, Request *request)
}
if (data->useConversion_) {
- data->conversionQueue_.push(std::move(buffers));
+ data->conversionQueue_.push(std::make_pair(request, std::move(buffers)));
if (data->swIsp_)
data->swIsp_->queueRequest(request->sequence(), request->controls());
}
--
2.44.1
More information about the libcamera-devel
mailing list