[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