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

Message ID 20190228200410.3022-8-jacopo@jmondi.org
State Superseded
Headers show
Series
  • libcamera: ipu3: ImgU support
Related show

Commit Message

Jacopo Mondi Feb. 28, 2019, 8:04 p.m. UTC
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@jmondi.org>
---
 src/libcamera/pipeline/ipu3/ipu3.cpp | 27 ++++++++++++++++++++++++++-
 1 file changed, 26 insertions(+), 1 deletion(-)

Comments

Laurent Pinchart March 2, 2019, 10:56 p.m. UTC | #1
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@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;
>  }

Patch

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);
+
+	tmpBuffer = &data->cio2.pool.buffers()[tmpBufferCount];
+	cio2->queueBuffer(tmpBuffer);
+
+	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;
 }