[libcamera-devel] [PATCH 07/10] libcamera: ipu3: Queue requests to the pipeline

Laurent Pinchart laurent.pinchart at ideasonboard.com
Sat Mar 2 23:56:38 CET 2019


Hi Jacopo,

Thank you for the patch.

On Thu, Feb 28, 2019 at 09:04:07PM +0100, Jacopo Mondi wrote:
> Implement queueRequest for the IPU3 pipeline manager. When a request is
> queued, a new buffer is queued to the ImgU output and the CIO2 output.
> Also queue buffers for the viewfinder and stat video nodes, even if
> they're not used at the moment.
> 
> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> ---
>  src/libcamera/pipeline/ipu3/ipu3.cpp | 27 ++++++++++++++++++++++++++-
>  1 file changed, 26 insertions(+), 1 deletion(-)
> 
> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
> index 60a48859b398..8ce661e27f62 100644
> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp
> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
> @@ -152,11 +152,15 @@ private:
>  
>  	std::shared_ptr<MediaDevice> cio2MediaDev_;
>  	std::shared_ptr<MediaDevice> imguMediaDev_;
> +
> +	unsigned int tmpBufferCount;
>  };
>  
>  PipelineHandlerIPU3::PipelineHandlerIPU3(CameraManager *manager)
>  	: PipelineHandler(manager), cio2MediaDev_(nullptr), imguMediaDev_(nullptr)
>  {
> +	/* FIXME: this is an hack. */
> +	tmpBufferCount = 0;
>  }
>  
>  PipelineHandlerIPU3::~PipelineHandlerIPU3()
> @@ -430,9 +434,30 @@ void PipelineHandlerIPU3::stop(const Camera *camera)
>  int PipelineHandlerIPU3::queueRequest(const Camera *camera, Request *request)
>  {
>  	IPU3CameraData *data = cameraData(camera);
> +	V4L2Device *viewfinder = data->imgu->viewfinder;
> +	V4L2Device *output = data->imgu->output;
>  	V4L2Device *cio2 = data->cio2.output;
> +	V4L2Device *stat = data->imgu->stat;
>  	Stream *stream = &data->stream_;
> +	Buffer *tmpBuffer;
> +
> +	/*
> +	 * Queue buffer on VF and stat.
> +	 * FIXME: this is an hack!
> +	 */
> +	tmpBuffer = &data->imgu->vfPool.buffers()[tmpBufferCount];
> +	viewfinder->queueBuffer(tmpBuffer);
> +
> +	tmpBuffer = &data->imgu->statPool.buffers()[tmpBufferCount];
> +	stat->queueBuffer(tmpBuffer);

Let's not use the video nodes we don't need and get rid of this hack.

> +
> +	tmpBuffer = &data->cio2.pool.buffers()[tmpBufferCount];
> +	cio2->queueBuffer(tmpBuffer);

All cio2 buffers should be queued internally at stream start, they're
unrelated to requests.

> +
> +	tmpBufferCount++;
> +	tmpBufferCount %= IPU3_BUF_NUM;
>  
> +	/* Queue a buffer to the ImgU output for capture. */
>  	Buffer *buffer = request->findBuffer(stream);
>  	if (!buffer) {
>  		LOG(IPU3, Error)
> @@ -440,7 +465,7 @@ int PipelineHandlerIPU3::queueRequest(const Camera *camera, Request *request)
>  		return -ENOENT;
>  	}
>  
> -	cio2->queueBuffer(buffer);
> +	output->queueBuffer(buffer);
>  
>  	return 0;
>  }

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list