summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacopo Mondi <jacopo@jmondi.org>2019-02-28 14:22:03 +0100
committerJacopo Mondi <jacopo@jmondi.org>2019-04-03 10:11:17 +0200
commit4ce2f06a1b2c22cdd6abe36d569b682937e4173e (patch)
treeae581faddcce076cd8e00a5adb6375e79ff31335
parentb7ddedaf42aa16fd37000beb7f65b8bf25de8adc (diff)
libcamera: ipu3: Connect CIO2 and ImgU bufferReady signals
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>
-rw-r--r--src/libcamera/pipeline/ipu3/ipu3.cpp59
1 files changed, 54 insertions, 5 deletions
diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index 3c955ceb..dfb7eed3 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
*/