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:
parent
fe68cd0d7d
commit
2cc52d6835
1 changed files with 13 additions and 13 deletions
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue