appsink: Handle unlock in drain query handling too
authorSebastian Dröge <sebastian@centricular.com>
Wed, 2 May 2018 15:39:31 +0000 (18:39 +0300)
committerSebastian Dröge <sebastian@centricular.com>
Wed, 2 May 2018 16:14:16 +0000 (19:14 +0300)
And also handle flushing, we might otherwise wait here forever when
flushing too.

gst-libs/gst/app/gstappsink.c

index dba9043..00ee5a1 100644 (file)
@@ -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);