From a7f6b878e0974645a7cf5b45f334e8909668585e 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 48d1bb86e8..f04bae1444 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 cb7b0d92b3..f6c1ba6b36 100644 --- a/subprojects/gst-plugins-good/sys/v4l2/gstv4l2bufferpool.c +++ b/subprojects/gst-plugins-good/sys/v4l2/gstv4l2bufferpool.c @@ -1258,7 +1258,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; @@ -1408,7 +1408,7 @@ poll_failed: } eos: { - return GST_FLOW_EOS; + return GST_V4L2_FLOW_LAST_BUFFER; } dqbuf_failed: { @@ -2165,7 +2165,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;