From 4ce2f06a1b2c22cdd6abe36d569b682937e4173e Mon Sep 17 00:00:00 2001 From: Jacopo Mondi Date: Thu, 28 Feb 2019 14:22:03 +0100 Subject: libcamera: ipu3: Connect CIO2 and ImgU bufferReady signals MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Niklas Söderlund Signed-off-by: Jacopo Mondi --- 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 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::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 */ -- cgit v1.2.1