From be50270b7dedd596d5cca34ca66dce82fc92fe73 Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Sat, 26 Dec 2020 23:45:04 +0200 Subject: libcamera: pipeline: simple: converter: Decouple input and output completion The SimpleConverter API signals completion of input and output buffer pairs. This unnecessarily delays requeueing the input buffer to the video capture queue until the output buffer completes, and also delays signalling request completion until the input buffer completes. While this shouldn't cause large delays in practice, it will also not scale when multi-stream support will be added to the converter class. To address the current issue and prepare for the future, decouple signalling of input and output buffers completion. Signed-off-by: Laurent Pinchart Tested-by: Phi-Bang Nguyen Reviewed-by: Kieran Bingham Reviewed-by: Paul Elder --- src/libcamera/pipeline/simple/converter.cpp | 24 ++++++------------------ 1 file changed, 6 insertions(+), 18 deletions(-) (limited to 'src/libcamera/pipeline/simple/converter.cpp') diff --git a/src/libcamera/pipeline/simple/converter.cpp b/src/libcamera/pipeline/simple/converter.cpp index f782fbc6..8324baed 100644 --- a/src/libcamera/pipeline/simple/converter.cpp +++ b/src/libcamera/pipeline/simple/converter.cpp @@ -45,8 +45,8 @@ SimpleConverter::SimpleConverter(MediaDevice *media) return; } - m2m_->output()->bufferReady.connect(this, &SimpleConverter::outputBufferReady); - m2m_->capture()->bufferReady.connect(this, &SimpleConverter::captureBufferReady); + m2m_->output()->bufferReady.connect(this, &SimpleConverter::m2mInputBufferReady); + m2m_->capture()->bufferReady.connect(this, &SimpleConverter::m2mOutputBufferReady); } std::vector SimpleConverter::formats(PixelFormat input) @@ -247,26 +247,14 @@ int SimpleConverter::queueBuffers(FrameBuffer *input, FrameBuffer *output) return 0; } -void SimpleConverter::captureBufferReady(FrameBuffer *buffer) +void SimpleConverter::m2mInputBufferReady(FrameBuffer *buffer) { - if (!outputDoneQueue_.empty()) { - FrameBuffer *other = outputDoneQueue_.front(); - outputDoneQueue_.pop(); - bufferReady.emit(other, buffer); - } else { - captureDoneQueue_.push(buffer); - } + inputBufferReady.emit(buffer); } -void SimpleConverter::outputBufferReady(FrameBuffer *buffer) +void SimpleConverter::m2mOutputBufferReady(FrameBuffer *buffer) { - if (!captureDoneQueue_.empty()) { - FrameBuffer *other = captureDoneQueue_.front(); - captureDoneQueue_.pop(); - bufferReady.emit(buffer, other); - } else { - outputDoneQueue_.push(buffer); - } + outputBufferReady.emit(buffer); } } /* namespace libcamera */ -- cgit v1.2.1