@@ -95,7 +95,9 @@ public:
{
}
- void bufferReady(Buffer *buffer);
+ void imguOutputBufferReady(Buffer *buffer);
+ void imguInputBufferReady(Buffer *buffer);
+ void cio2BufferReady(Buffer *buffer);
CIO2Device cio2;
ImgUDevice *imgu;
@@ -402,6 +404,21 @@ int PipelineHandlerIPU3::start(Camera *camera)
IPU3CameraData *data = cameraData(camera);
int ret;
+ /*
+ * Connect video devices' 'bufferReady' signals to their slot to
+ * implement the image processing pipeline.
+ *
+ * Frames produced by the CIO2 unit are shared with the associated
+ * ImgU input where they get processed and returned through the ImgU
+ * main and secondary outputs.
+ */
+ data->cio2.output->bufferReady.connect(data,
+ &IPU3CameraData::cio2BufferReady);
+ data->imgu->input->bufferReady.connect(data,
+ &IPU3CameraData::imguInputBufferReady);
+ data->imgu->output->bufferReady.connect(data,
+ &IPU3CameraData::imguOutputBufferReady);
+
/*
* Enqueue all available buffers to the CIO2 unit to start frame
* capture. Start ImgU video devices and queue buffers to the output
@@ -1001,9 +1018,6 @@ void PipelineHandlerIPU3::registerCameras()
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)
@@ -1015,7 +1029,29 @@ void PipelineHandlerIPU3::registerCameras()
}
}
-void IPU3CameraData::bufferReady(Buffer *buffer)
+/* ----------------------------------------------------------------------------
+ * Buffer Ready slots
+ */
+
+/**
+ * \brief ImgU input BufferReady slot
+ * \param buffer The completed buffer
+ *
+ * Buffer completed from the ImgU input are immediately queued back to the
+ * CIO2 unit to continue frame capture.
+ */
+void IPU3CameraData::imguInputBufferReady(Buffer *buffer)
+{
+ cio2.output->queueBuffer(buffer);
+}
+
+/**
+ * \brief ImgU output BufferReady slot
+ * \param buffer The completed buffer
+ *
+ * Buffer completed from the ImgU output are directed to the applications.
+ */
+void IPU3CameraData::imguOutputBufferReady(Buffer *buffer)
{
Request *request = queuedRequests_.front();
@@ -1023,6 +1059,18 @@ void IPU3CameraData::bufferReady(Buffer *buffer)
pipe_->completeRequest(camera_, request);
}
+/**
+ * \brief CIO2 BufferReady slot
+ * \param buffer The completed buffer
+ *
+ * Buffer completed from the CIO2 are immediately queued to the ImgU unit
+ * for further processing.
+ */
+void IPU3CameraData::cio2BufferReady(Buffer *buffer)
+{
+ imgu->input->queueBuffer(buffer);
+}
+
REGISTER_PIPELINE_HANDLER(PipelineHandlerIPU3);
} /* namespace libcamera */
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. Signed-off-by: Jacopo Mondi <jacopo@jmondi.org> --- src/libcamera/pipeline/ipu3/ipu3.cpp | 58 +++++++++++++++++++++++++--- 1 file changed, 53 insertions(+), 5 deletions(-)