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

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

Commit Message

Jacopo Mondi March 12, 2019, 12:12 p.m. UTC
Implement queueRequest for the IPU3 pipeline manager. When a request is
queued, a new buffer is queued to the ImgU 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 | 25 +++++++++++++++++++++++--
 1 file changed, 23 insertions(+), 2 deletions(-)

Patch

diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index badde4839f99..1a7b96d9ada7 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -160,11 +160,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()
@@ -464,9 +468,26 @@  void PipelineHandlerIPU3::stop(Camera *camera)
 int PipelineHandlerIPU3::queueRequest(Camera *camera, Request *request)
 {
 	IPU3CameraData *data = cameraData(camera);
-	V4L2Device *cio2 = data->cio2.output;
+	V4L2Device *viewfinder = data->imgu->viewfinder;
+	V4L2Device *output = data->imgu->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);
+
+	tmpBufferCount++;
+	tmpBufferCount %= IPU3_IMGU_BUFFER_COUNT;
 
+	/* Queue a buffer to the ImgU output for capture. */
 	Buffer *buffer = request->findBuffer(stream);
 	if (!buffer) {
 		LOG(IPU3, Error)
@@ -474,7 +495,7 @@  int PipelineHandlerIPU3::queueRequest(Camera *camera, Request *request)
 		return -ENOENT;
 	}
 
-	int ret = cio2->queueBuffer(buffer);
+	int ret = output->queueBuffer(buffer);
 	if (ret < 0)
 		return ret;