[libcamera-devel] [PATCH v5 12/14] libcamera: ipu3: Connect viewfinder's BufferReady signal

Jacopo Mondi jacopo at jmondi.org
Thu Apr 18 12:47:13 CEST 2019


The viewfinder and main output require identical logic for buffer and
request completion. Rename the IPU3CameraData::imguOutputBufferReady()
slot to IPU3CameraData::imguCaptureBufferReady() to reflect this, and
connect the viewfinder bufferReady signal to the slot.

Update the slot logic to ignore internal buffers that are not part of
the request, and to complete the request only when the last buffer
completes.

Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
---
 src/libcamera/pipeline/ipu3/ipu3.cpp | 32 +++++++++++++++++++++++++---
 1 file changed, 29 insertions(+), 3 deletions(-)

diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index ee490a488cf7..71b36ecf6cd9 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -705,6 +705,8 @@ int PipelineHandlerIPU3::registerCameras()
 					&IPU3CameraData::imguInputBufferReady);
 		data->imgu_->output_.dev->bufferReady.connect(data.get(),
 					&IPU3CameraData::imguOutputBufferReady);
+		data->imgu_->viewfinder_.dev->bufferReady.connect(data.get(),
+					&IPU3CameraData::imguOutputBufferReady);
 
 		/* Initialize and register the Camera and its streams. */
 		std::string cameraName = cio2->sensor_->entityName() + " "
@@ -750,10 +752,34 @@ void PipelineHandlerIPU3::IPU3CameraData::imguInputBufferReady(Buffer *buffer)
  */
 void PipelineHandlerIPU3::IPU3CameraData::imguOutputBufferReady(Buffer *buffer)
 {
-	Request *request = queuedRequests_.front();
+	Request *request = buffer->request();
+	if (!request)
+		/* Completed buffers not part of a request are ignored. */
+		return;
+
+	if (!pipe_->completeBuffer(camera_, request, buffer))
+		/* Request not completed yet, return here. */
+		return;
+
+	/*
+	 * Complete requests in queuing order: if some other request is
+	 * pending, post-pone completion.
+	 */
+	Request *front = queuedRequests_.front();
+	if (front != request)
+		return;
 
-	pipe_->completeBuffer(camera_, request, buffer);
-	pipe_->completeRequest(camera_, request);
+	/*
+	 * Complete the current request, and all the other pending ones,
+	 * in queuing order.
+	 */
+	while (1) {
+		if (front->hasPendingBuffers())
+			break;
+
+		pipe_->completeRequest(camera_, front);
+		front = queuedRequests_.front();
+	}
 }
 
 /**
-- 
2.21.0



More information about the libcamera-devel mailing list