summaryrefslogtreecommitdiff
path: root/src/libcamera/pipeline_handler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libcamera/pipeline_handler.cpp')
-rw-r--r--src/libcamera/pipeline_handler.cpp24
1 files changed, 16 insertions, 8 deletions
diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp
index 0283e4e5..c6092002 100644
--- a/src/libcamera/pipeline_handler.cpp
+++ b/src/libcamera/pipeline_handler.cpp
@@ -391,8 +391,9 @@ int PipelineHandler::queueRequest(Camera *camera, Request *request)
* This method shall be called by pipeline handlers to signal completion of the
* \a buffer part of the \a request. It notifies applications of buffer
* completion and updates the request's internal buffer tracking. The request
- * is not completed automatically when the last buffer completes, pipeline
- * handlers shall complete requests explicitly with completeRequest().
+ * is not completed automatically when the last buffer completes to give
+ * pipeline handlers a chance to perform any operation that may still be
+ * needed. They shall complete requests explicitly with completeRequest().
*
* \return True if all buffers contained in the request have completed, false
* otherwise
@@ -413,17 +414,24 @@ bool PipelineHandler::completeBuffer(Camera *camera, Request *request,
* request has completed. The request is deleted and shall not be accessed once
* this method returns.
*
- * The pipeline handler shall ensure that requests complete in the same order
- * they are submitted.
+ * This method ensures that requests will be returned to the application in
+ * submission order, the pipeline handler may call it on any complete request
+ * without any ordering constraint.
*/
void PipelineHandler::completeRequest(Camera *camera, Request *request)
{
+ request->complete(Request::RequestComplete);
+
CameraData *data = cameraData(camera);
- ASSERT(request == data->queuedRequests_.front());
- data->queuedRequests_.pop_front();
- request->complete(Request::RequestComplete);
- camera->requestComplete(request);
+ while (!data->queuedRequests_.empty()) {
+ request = data->queuedRequests_.front();
+ if (request->hasPendingBuffers())
+ break;
+
+ data->queuedRequests_.pop_front();
+ camera->requestComplete(request);
+ }
}
/**