[libcamera-devel] [PATCH v7 10/13] libcamera: ipu3: Connect CIO2 and ImgU bufferReady signals
Jacopo Mondi
jacopo at jmondi.org
Tue Apr 2 19:13:06 CEST 2019
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 at ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
---
src/libcamera/pipeline/ipu3/ipu3.cpp | 59 +++++++++++++++++++++++++---
1 file changed, 54 insertions(+), 5 deletions(-)
diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index 9bceb8bfab35..f6d08af906da 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -173,7 +173,9 @@ private:
{
}
- void bufferReady(Buffer *buffer);
+ void imguOutputBufferReady(Buffer *buffer);
+ void imguInputBufferReady(Buffer *buffer);
+ void cio2BufferReady(Buffer *buffer);
CIO2Device cio2_;
ImgUDevice *imgu_;
@@ -539,15 +541,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)
@@ -561,7 +576,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();
@@ -569,6 +606,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
*/
--
2.21.0
More information about the libcamera-devel
mailing list