libcamera: simple: Track requests in conversionQueue_

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@redhat.com>
Tested-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Tested-by: Stanislaw Gruszka <stanislaw.gruszka@linux.intel.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
Milan Zamazal 2024-11-06 21:17:20 +01:00 committed by Laurent Pinchart
parent fe68cd0d7d
commit 2cc52d6835

View file

@ -282,7 +282,11 @@ public:
std::unique_ptr<DelayedControls> delayedCtrls_; std::unique_ptr<DelayedControls> delayedCtrls_;
std::vector<std::unique_ptr<FrameBuffer>> conversionBuffers_; std::vector<std::unique_ptr<FrameBuffer>> conversionBuffers_;
std::queue<std::map<const Stream *, FrameBuffer *>> conversionQueue_; struct RequestOutputs {
Request *request;
std::map<const Stream *, FrameBuffer *> outputs;
};
std::queue<RequestOutputs> conversionQueue_;
bool useConversion_; bool useConversion_;
std::unique_ptr<Converter> converter_; std::unique_ptr<Converter> converter_;
@ -808,16 +812,12 @@ void SimpleCameraData::bufferReady(FrameBuffer *buffer)
if (conversionQueue_.empty()) if (conversionQueue_.empty())
return; return;
Request *request = nullptr; const RequestOutputs &outputs = conversionQueue_.front();
for (auto &item : conversionQueue_.front()) { for (auto &[stream, buf] : outputs.outputs)
FrameBuffer *outputBuffer = item.second; pipe->completeBuffer(outputs.request, buf);
request = outputBuffer->request(); pipe->completeRequest(outputs.request);
pipe->completeBuffer(request, outputBuffer);
}
conversionQueue_.pop(); conversionQueue_.pop();
if (request)
pipe->completeRequest(request);
return; return;
} }
@ -833,7 +833,7 @@ void SimpleCameraData::bufferReady(FrameBuffer *buffer)
if (useConversion_ && !conversionQueue_.empty()) { if (useConversion_ && !conversionQueue_.empty()) {
const std::map<const Stream *, FrameBuffer *> &outputs = const std::map<const Stream *, FrameBuffer *> &outputs =
conversionQueue_.front(); conversionQueue_.front().outputs;
if (!outputs.empty()) { if (!outputs.empty()) {
FrameBuffer *outputBuffer = outputs.begin()->second; FrameBuffer *outputBuffer = outputs.begin()->second;
if (outputBuffer) if (outputBuffer)
@ -857,7 +857,7 @@ void SimpleCameraData::bufferReady(FrameBuffer *buffer)
} }
if (converter_) if (converter_)
converter_->queueBuffers(buffer, conversionQueue_.front()); converter_->queueBuffers(buffer, conversionQueue_.front().outputs);
else else
/* /*
* request->sequence() cannot be retrieved from `buffer' inside * request->sequence() cannot be retrieved from `buffer' inside
@ -865,7 +865,7 @@ void SimpleCameraData::bufferReady(FrameBuffer *buffer)
* already here. * already here.
*/ */
swIsp_->queueBuffers(request->sequence(), buffer, swIsp_->queueBuffers(request->sequence(), buffer,
conversionQueue_.front()); conversionQueue_.front().outputs);
conversionQueue_.pop(); conversionQueue_.pop();
return; return;
@ -1429,7 +1429,7 @@ int SimplePipelineHandler::queueRequestDevice(Camera *camera, Request *request)
} }
if (data->useConversion_) { if (data->useConversion_) {
data->conversionQueue_.push(std::move(buffers)); data->conversionQueue_.push({ request, std::move(buffers) });
if (data->swIsp_) if (data->swIsp_)
data->swIsp_->queueRequest(request->sequence(), request->controls()); data->swIsp_->queueRequest(request->sequence(), request->controls());
} }