[libcamera-devel] [PATCH] pipeline: raspberrypi: Fix erroneous bayer buffer requeue on buffer matching
Kieran Bingham
kieran.bingham at ideasonboard.com
Tue Nov 24 20:16:12 CET 2020
Hi Naush,
On 24/11/2020 17:59, Naushir Patuck wrote:
> With the recent change in the bayer/embedded buffer matching code,
> a condition would make the bayer buffer be requeued back to the device,
> even though it could potentially be queued for matching. This would
> cause unnecessary frame drops as sync would be lost.
>
> The fix is to ensure the bayer buffer only gets requeued if the embedded
> data buffer queue is not empty, i.e. the buffer truly is orphaned.
> Additionally, we do this test before deciding to flush any of the two
> queues of all their buffers.
>
> Fixes: 909882b (pipeline: raspberrypi: Rework bayer/embedded data buffer matching)
> Signed-off-by: Naushir Patuck <naush at raspberrypi.com>
Thanks for the quick turn around on this fix ;-)
Tested-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> ---
> .../pipeline/raspberrypi/raspberrypi.cpp | 38 +++++++++++--------
> 1 file changed, 23 insertions(+), 15 deletions(-)
>
> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> index 7271573a..fd306066 100644
> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> @@ -1679,8 +1679,23 @@ bool RPiCameraData::findMatchingBuffers(FrameBuffer *&bayerBuffer, FrameBuffer *
> }
>
> if (!embeddedBuffer) {
> + bool flushedBuffers = false;
> +
> LOG(RPI, Debug) << "Could not find matching embedded buffer";
>
> + if (!embeddedQueue_.empty()) {
> + /*
> + * Not found a matching embedded buffer for the bayer buffer in
> + * the front of the queue. This buffer is now orphaned, so requeue
> + * it back to the device.
> + */
> + unicam_[Unicam::Image].queueBuffer(bayerQueue_.front());
> + bayerQueue_.pop();
> + bayerRequeueCount++;
> + LOG(RPI, Warning) << "Dropping unmatched input frame in stream "
> + << unicam_[Unicam::Image].name();
> + }
> +
> /*
> * If we have requeued all available embedded data buffers in this loop,
> * then we are fully out of sync, so might as well requeue all the pending
> @@ -1695,20 +1710,9 @@ bool RPiCameraData::findMatchingBuffers(FrameBuffer *&bayerBuffer, FrameBuffer *
> unicam_[Unicam::Image].queueBuffer(bayerQueue_.front());
> bayerQueue_.pop();
> }
> - return false;
> + flushedBuffers = true;
> }
>
> - /*
> - * Not found a matching embedded buffer for the bayer buffer in
> - * the front of the queue. This buffer is now orphaned, so requeue
> - * it back to the device.
> - */
> - unicam_[Unicam::Image].queueBuffer(bayerQueue_.front());
> - bayerQueue_.pop();
> - bayerRequeueCount++;
> - LOG(RPI, Warning) << "Dropping unmatched input frame in stream "
> - << unicam_[Unicam::Image].name();
> -
> /*
> * Similar to the above, if we have requeued all available bayer buffers in
Is this statement now outdated? ('similar to "above"') or is it ok?
> * the loop, then we are fully out of sync, so might as well requeue all the
> @@ -1723,11 +1727,15 @@ bool RPiCameraData::findMatchingBuffers(FrameBuffer *&bayerBuffer, FrameBuffer *
> unicam_[Unicam::Embedded].queueBuffer(embeddedQueue_.front());
> embeddedQueue_.pop();
> }
> - return false;
> + flushedBuffers = true;
> }
>
> - /* If the embedded queue has become empty, we cannot do any more. */
> - if (embeddedQueue_.empty())
> + /*
> + * If the embedded queue has become empty, we cannot do any more.
> + * Similarly, if we have flushed any one of our queues, we cannot do
> + * any more. Return from here without a buffer pair.
> + */
> + if (embeddedQueue_.empty() || flushedBuffers)
> return false;
> } else {
> /*
>
--
Regards
--
Kieran
More information about the libcamera-devel
mailing list