From 0c9ab49579be1447327be40d0aa48a90e15a9242 Mon Sep 17 00:00:00 2001 From: Nicolas Dufresne Date: Thu, 18 May 2023 11:58:51 -0400 Subject: [PATCH] v4l2: videodec: Fix stalls on empty buffer Drivers may signal end of sequence using an empty buffer and LAST buffer set, or just an empty buffer on certain legacy implementation. When this occured, we'd send GST_V4L2_FLOW_LAST_BUFFER were the code expected GST_FLOW_EOS. Stop abusing GST_FLOW_EOS and port all the code to the new GST_V4L2_FLOW_LAST_BUFFER. Part-of: --- subprojects/gst-plugins-good/sys/v4l2/gstv4l2allocator.c | 2 +- subprojects/gst-plugins-good/sys/v4l2/gstv4l2bufferpool.c | 6 +++--- subprojects/gst-plugins-good/sys/v4l2/gstv4l2videodec.c | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/subprojects/gst-plugins-good/sys/v4l2/gstv4l2allocator.c b/subprojects/gst-plugins-good/sys/v4l2/gstv4l2allocator.c index 2a4c192ef6..33a5fd2cfc 100644 --- a/subprojects/gst-plugins-good/sys/v4l2/gstv4l2allocator.c +++ b/subprojects/gst-plugins-good/sys/v4l2/gstv4l2allocator.c @@ -1399,7 +1399,7 @@ gst_v4l2_allocator_dqbuf (GstV4l2Allocator * allocator, error: if (errno == EPIPE) { GST_DEBUG_OBJECT (allocator, "broken pipe signals last buffer"); - return GST_FLOW_EOS; + return GST_V4L2_FLOW_LAST_BUFFER; } GST_ERROR_OBJECT (allocator, "failed dequeuing a %s buffer: %s", diff --git a/subprojects/gst-plugins-good/sys/v4l2/gstv4l2bufferpool.c b/subprojects/gst-plugins-good/sys/v4l2/gstv4l2bufferpool.c index 819bc28d64..2c771a6f80 100644 --- a/subprojects/gst-plugins-good/sys/v4l2/gstv4l2bufferpool.c +++ b/subprojects/gst-plugins-good/sys/v4l2/gstv4l2bufferpool.c @@ -1261,7 +1261,7 @@ gst_v4l2_buffer_pool_dqbuf (GstV4l2BufferPool * pool, GstBuffer ** buffer, GST_LOG_OBJECT (pool, "dequeueing a buffer"); res = gst_v4l2_allocator_dqbuf (pool->vallocator, &group); - if (res == GST_FLOW_EOS) + if (res == GST_V4L2_FLOW_LAST_BUFFER) goto eos; if (res != GST_FLOW_OK) goto dqbuf_failed; @@ -1411,7 +1411,7 @@ poll_failed: } eos: { - return GST_FLOW_EOS; + return GST_V4L2_FLOW_LAST_BUFFER; } dqbuf_failed: { @@ -2168,7 +2168,7 @@ buffer_truncated: } eos: { - GST_DEBUG_OBJECT (pool, "end of stream reached"); + GST_DEBUG_OBJECT (pool, "end of sequence reached"); gst_buffer_unref (*buf); *buf = NULL; return GST_V4L2_FLOW_LAST_BUFFER; diff --git a/subprojects/gst-plugins-good/sys/v4l2/gstv4l2videodec.c b/subprojects/gst-plugins-good/sys/v4l2/gstv4l2videodec.c index 1c1a3f42a6..facaf658b5 100644 --- a/subprojects/gst-plugins-good/sys/v4l2/gstv4l2videodec.c +++ b/subprojects/gst-plugins-good/sys/v4l2/gstv4l2videodec.c @@ -884,7 +884,7 @@ beach: return; } - if (ret == GST_FLOW_EOS) { + if (ret == GST_V4L2_FLOW_LAST_BUFFER) { GST_VIDEO_DECODER_STREAM_LOCK (decoder); if (self->draining) { self->draining = FALSE;