From dbd9ff1cf5108aeb51e1559222f386eb85d2abd2 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sebastian=20Dr=C3=B6ge?= Date: Wed, 2 May 2018 18:39:31 +0300 Subject: [PATCH] appsink: Handle unlock in drain query handling too And also handle flushing, we might otherwise wait here forever when flushing too. --- gst-libs/gst/app/gstappsink.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/gst-libs/gst/app/gstappsink.c b/gst-libs/gst/app/gstappsink.c index dba9043bf..00ee5a1cf 100644 --- a/gst-libs/gst/app/gstappsink.c +++ b/gst-libs/gst/app/gstappsink.c @@ -1026,9 +1026,25 @@ gst_app_sink_query (GstBaseSink * bsink, GstQuery * query) g_mutex_lock (&priv->mutex); GST_DEBUG_OBJECT (appsink, "waiting buffers to be consumed"); while (priv->num_buffers > 0 || priv->preroll_buffer) { + if (priv->unlock) { + /* we are asked to unlock, call the wait_preroll method */ + g_mutex_unlock (&priv->mutex); + if (gst_base_sink_wait_preroll (bsink) != GST_FLOW_OK) { + /* Directly go out of here */ + return FALSE; + } + + /* we are allowed to continue now */ + g_mutex_lock (&priv->mutex); + continue; + } + priv->wait_status |= STREAM_WAITING; g_cond_wait (&priv->cond, &priv->mutex); priv->wait_status &= ~STREAM_WAITING; + + if (priv->flushing) + break; } g_mutex_unlock (&priv->mutex); ret = GST_BASE_SINK_CLASS (parent_class)->query (bsink, query); -- 2.34.1