[libcamera-devel,v8,10/13] libcamera: ipu3: Connect CIO2 and ImgU bufferReady signals

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

Commit Message

Jacopo Mondi April 3, 2019, 8:01 a.m. UTC
Connect the CIO2 output bufferRead signal to a slot that simply
queue the received buffer to ImgU for processing, and connect the ImgU
main output bufferReady signal to the cameraData slot that notifies
to applications that a new image buffer is available.

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
---
 src/libcamera/pipeline/ipu3/ipu3.cpp | 59 +++++++++++++++++++++++++---
 1 file changed, 54 insertions(+), 5 deletions(-)

Patch

diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index 3225de29d168..5fe036a3b239 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -159,7 +159,9 @@  private:
 		{
 		}
 
-		void bufferReady(Buffer *buffer);
+		void imguOutputBufferReady(Buffer *buffer);
+		void imguInputBufferReady(Buffer *buffer);
+		void cio2BufferReady(Buffer *buffer);
 
 		CIO2Device cio2_;
 		ImgUDevice *imgu_;
@@ -526,15 +528,28 @@  int PipelineHandlerIPU3::registerCameras()
 		 */
 		data->imgu_ = numCameras ? &imgu1_ : &imgu0_;
 
+		/*
+		 * Connect video devices' 'bufferReady' signals to their
+		 * slot to implement the image processing pipeline.
+		 *
+		 * Frames produced by the CIO2 unit are passed to the
+		 * associated ImgU input where they get processed and
+		 * returned through the ImgU main and secondary outputs.
+		 */
+		data->cio2_.output_->bufferReady.connect(data.get(),
+					&IPU3CameraData::cio2BufferReady);
+		data->imgu_->input_->bufferReady.connect(data.get(),
+					&IPU3CameraData::imguInputBufferReady);
+		data->imgu_->output_.dev->bufferReady.connect(data.get(),
+					&IPU3CameraData::imguOutputBufferReady);
+
+		/* Create and register the Camera instance. */
 		std::string cameraName = cio2->sensor_->entityName() + " "
 				       + std::to_string(id);
 		std::shared_ptr<Camera> camera = Camera::create(this,
 								cameraName,
 								streams);
 
-		cio2->output_->bufferReady.connect(data.get(),
-						   &IPU3CameraData::bufferReady);
-
 		registerCamera(std::move(camera), std::move(data));
 
 		LOG(IPU3, Info)
@@ -548,7 +563,29 @@  int PipelineHandlerIPU3::registerCameras()
 	return numCameras ? 0 : -ENODEV;
 }
 
-void PipelineHandlerIPU3::IPU3CameraData::bufferReady(Buffer *buffer)
+/* -----------------------------------------------------------------------------
+ * Buffer Ready slots
+ */
+
+/**
+ * \brief Handle buffers completion at the ImgU input
+ * \param buffer The completed buffer
+ *
+ * Buffers completed from the ImgU input are immediately queued back to the
+ * CIO2 unit to continue frame capture.
+ */
+void PipelineHandlerIPU3::IPU3CameraData::imguInputBufferReady(Buffer *buffer)
+{
+	cio2_.output_->queueBuffer(buffer);
+}
+
+/**
+ * \brief Handle buffers completion at the ImgU output
+ * \param buffer The completed buffer
+ *
+ * Buffers completed from the ImgU output are directed to the application.
+ */
+void PipelineHandlerIPU3::IPU3CameraData::imguOutputBufferReady(Buffer *buffer)
 {
 	Request *request = queuedRequests_.front();
 
@@ -556,6 +593,18 @@  void PipelineHandlerIPU3::IPU3CameraData::bufferReady(Buffer *buffer)
 	pipe_->completeRequest(camera_, request);
 }
 
+/**
+ * \brief Handle buffers completion at the CIO2 output
+ * \param buffer The completed buffer
+ *
+ * Buffers completed from the CIO2 are immediately queued to the ImgU unit
+ * for further processing.
+ */
+void PipelineHandlerIPU3::IPU3CameraData::cio2BufferReady(Buffer *buffer)
+{
+	imgu_->input_->queueBuffer(buffer);
+}
+
 /* -----------------------------------------------------------------------------
  * ImgU Device
  */