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

Jacopo Mondi jacopo at jmondi.org
Thu Feb 28 21:04:07 CET 2019


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);
+
+	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;
 }
-- 
2.20.1



More information about the libcamera-devel mailing list