[libcamera-devel] [PATCH v2 03/16] libcamera: pipeline_handler: Simplify request completion

Jacopo Mondi jacopo at jmondi.org
Sun Jul 14 09:30:27 CEST 2019


HI Laurent,

On Sat, Jul 13, 2019 at 08:23:38PM +0300, Laurent Pinchart wrote:
> libcamera guarantees that requests complete in sequence. This
> requirement is currently pushed down to pipeline handlers. Three out of
> four of our pipeline handlers implement that requirement based on the
> sole assumption that buffers will always complete in sequeuence, while
> the IPU3 pipeline handler implements a more complex logic.
>
> It turns out that the logic can be moved to the base PipelineHandler
> class with support from the Request class. Do so to simplify the
> pipeline handlers.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> ---
>  src/libcamera/pipeline/ipu3/ipu3.cpp     | 10 ++-------
>  src/libcamera/pipeline/rkisp1/rkisp1.cpp |  4 +---
>  src/libcamera/pipeline/uvcvideo.cpp      |  2 +-
>  src/libcamera/pipeline/vimc.cpp          |  2 +-
>  src/libcamera/pipeline_handler.cpp       | 26 ++++++++++++++++--------
>  5 files changed, 22 insertions(+), 22 deletions(-)
>
> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
> index e4efb9722f76..1abd20e5fee5 100644
> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp
> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
> @@ -927,14 +927,8 @@ void IPU3CameraData::imguOutputBufferReady(Buffer *buffer)
>  		/* Request not completed yet, return here. */
>  		return;
>
> -	/* Complete the pending requests in queueing order. */
> -	while (1) {
> -		request = queuedRequests_.front();
> -		if (request->hasPendingBuffers())
> -			break;
> -
> -		pipe_->completeRequest(camera_, request);
> -	}
> +	/* Mark the request as complete. */
> +	pipe_->completeRequest(camera_, request);
>  }
>
>  /**
> diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> index 4a5898d25f91..383236435a7f 100644
> --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> @@ -491,9 +491,7 @@ bool PipelineHandlerRkISP1::match(DeviceEnumerator *enumerator)
>  void PipelineHandlerRkISP1::bufferReady(Buffer *buffer)
>  {
>  	ASSERT(activeCamera_);
> -
> -	RkISP1CameraData *data = cameraData(activeCamera_);
> -	Request *request = data->queuedRequests_.front();
> +	Request *request = buffer->request();
>
>  	completeBuffer(activeCamera_, request, buffer);
>  	completeRequest(activeCamera_, request);
> diff --git a/src/libcamera/pipeline/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo.cpp
> index 72313cfd246f..387d71ef567c 100644
> --- a/src/libcamera/pipeline/uvcvideo.cpp
> +++ b/src/libcamera/pipeline/uvcvideo.cpp
> @@ -382,7 +382,7 @@ int UVCCameraData::init(MediaEntity *entity)
>
>  void UVCCameraData::bufferReady(Buffer *buffer)
>  {
> -	Request *request = queuedRequests_.front();
> +	Request *request = buffer->request();
>
>  	pipe_->completeBuffer(camera_, request, buffer);
>  	pipe_->completeRequest(camera_, request);
> diff --git a/src/libcamera/pipeline/vimc.cpp b/src/libcamera/pipeline/vimc.cpp
> index f8a58be060bb..ff2529c974fd 100644
> --- a/src/libcamera/pipeline/vimc.cpp
> +++ b/src/libcamera/pipeline/vimc.cpp
> @@ -376,7 +376,7 @@ int VimcCameraData::init(MediaDevice *media)
>
>  void VimcCameraData::bufferReady(Buffer *buffer)
>  {
> -	Request *request = queuedRequests_.front();
> +	Request *request = buffer->request();
>
>  	pipe_->completeBuffer(camera_, request, buffer);
>  	pipe_->completeRequest(camera_, request);
> diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp
> index 0283e4e5ad51..c609200252f1 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)
>  {
> -	CameraData *data = cameraData(camera);
> -	ASSERT(request == data->queuedRequests_.front());
> -	data->queuedRequests_.pop_front();
> -
>  	request->complete(Request::RequestComplete);
> -	camera->requestComplete(request);
> +

Nit: empty line

> +	CameraData *data = cameraData(camera);
> +
> +	while (!data->queuedRequests_.empty()) {
> +		request = data->queuedRequests_.front();
> +		if (request->hasPendingBuffers())
> +			break;
> +
> +		data->queuedRequests_.pop_front();
> +		camera->requestComplete(request);
> +	}
>  }
>
>  /**
> --
> Regards,
>
> Laurent Pinchart
>
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel at lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <https://lists.libcamera.org/pipermail/libcamera-devel/attachments/20190714/88949b20/attachment.sig>


More information about the libcamera-devel mailing list