diff options
author | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2019-07-12 13:51:12 +0300 |
---|---|---|
committer | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2019-07-14 16:00:56 +0300 |
commit | 4e79b2ef310c3a68e4e9af4ee9c5e99fc0c17109 (patch) | |
tree | 35eeb9466b6ddf82a7677fba35140423f0dd3484 /src/libcamera/pipeline_handler.cpp | |
parent | a2bcf6feee5ae6077225cc787c3d1a25d9ef95e7 (diff) |
libcamera: v4l2_videodevice: Signal buffer completion at streamoff time
When stopping the stream buffers have been queued, in which case their
completion is never be notified to the user. This can lead to memory
leaks. Fix it by notifying completion of all queued buffers with the
status set to error.
As a result the base PipelineHandler implementation can be simplified,
as all requests complete as the result of stopping the stream. The
stop() method that manually completes all queued requests isn't needed
anymore.
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Diffstat (limited to 'src/libcamera/pipeline_handler.cpp')
-rw-r--r-- | src/libcamera/pipeline_handler.cpp | 29 |
1 files changed, 3 insertions, 26 deletions
diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp index c6092002..83938a71 100644 --- a/src/libcamera/pipeline_handler.cpp +++ b/src/libcamera/pipeline_handler.cpp @@ -328,31 +328,7 @@ const ControlInfoMap &PipelineHandler::controls(Camera *camera) * * This method stops capturing and processing requests immediately. All pending * requests are cancelled and complete immediately in an error state. - * - * Pipeline handlers shall override this method to stop the pipeline, ensure - * that all pending request completion signaled through completeRequest() have - * returned, and call the base implementation of the stop() method as the last - * step of their implementation. The base implementation cancels all requests - * queued but not yet complete. */ -void PipelineHandler::stop(Camera *camera) -{ - CameraData *data = cameraData(camera); - - while (!data->queuedRequests_.empty()) { - Request *request = data->queuedRequests_.front(); - data->queuedRequests_.pop_front(); - - while (!request->pending_.empty()) { - Buffer *buffer = *request->pending_.begin(); - buffer->cancel(); - completeBuffer(camera, request, buffer); - } - - request->complete(Request::RequestCancelled); - camera->requestComplete(request); - } -} /** * \fn PipelineHandler::queueRequest() @@ -420,15 +396,16 @@ bool PipelineHandler::completeBuffer(Camera *camera, Request *request, */ void PipelineHandler::completeRequest(Camera *camera, Request *request) { - request->complete(Request::RequestComplete); + request->complete(); CameraData *data = cameraData(camera); while (!data->queuedRequests_.empty()) { request = data->queuedRequests_.front(); - if (request->hasPendingBuffers()) + if (request->status() == Request::RequestPending) break; + ASSERT(!request->hasPendingBuffers()); data->queuedRequests_.pop_front(); camera->requestComplete(request); } |