summaryrefslogtreecommitdiff
path: root/src/libcamera/pipeline
diff options
context:
space:
mode:
authorJacopo Mondi <jacopo@jmondi.org>2019-03-19 17:13:09 +0100
committerJacopo Mondi <jacopo@jmondi.org>2019-04-19 16:00:03 +0200
commita10fbfcaaa531e67229ad6d43eea0ad8ec3e75f5 (patch)
tree1e078f8f8478773b3608183dc108868b67a1534d /src/libcamera/pipeline
parent9f2bf7ba1e3e2647605da8bbc23d63fc0a4fb1c2 (diff)
libcamera: ipu3: Connect viewfinder's BufferReady signal
The viewfinder and main output require identical logic for buffer and request completion. Connect the viewfinder bufferReady signal to the slot and handle requests for both main output and viewfinder there. Update the slot logic to complete the request only when the last buffer has completed, and make sure to complete requests in the same order they have been queued to the pipeline handler. Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
Diffstat (limited to 'src/libcamera/pipeline')
-rw-r--r--src/libcamera/pipeline/ipu3/ipu3.cpp18
1 files changed, 15 insertions, 3 deletions
diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index 73e06a91..2c292920 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -761,6 +761,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);
/* Create and register the Camera instance. */
std::string cameraName = cio2->sensor_->entity()->name() + " "
@@ -806,10 +808,20 @@ void PipelineHandlerIPU3::IPU3CameraData::imguInputBufferReady(Buffer *buffer)
*/
void PipelineHandlerIPU3::IPU3CameraData::imguOutputBufferReady(Buffer *buffer)
{
- Request *request = queuedRequests_.front();
+ Request *request = buffer->request();
+
+ if (!pipe_->completeBuffer(camera_, request, buffer))
+ /* Request not completed yet, return here. */
+ return;
- pipe_->completeBuffer(camera_, request, buffer);
- pipe_->completeRequest(camera_, request);
+ /* Complete the pending requests in queuing order. */
+ while (1) {
+ request = queuedRequests_.front();
+ if (request->hasPendingBuffers())
+ break;
+
+ pipe_->completeRequest(camera_, request);
+ }
}
/**