discoverer: Don't remove element when switching to PLAYING
authorEdward Hervey <edward@centricular.com>
Wed, 15 Nov 2017 09:51:33 +0000 (10:51 +0100)
committerEdward Hervey <bilboed@bilboed.com>
Wed, 15 Nov 2017 09:55:56 +0000 (10:55 +0100)
There is a race going on somewhere when we attempt to remove elements
*while* the parent container is switching to PLAYING.

In order to avoid this issue with discoverer, make sure we never
remove elements while switching to PLAYING.

gst-libs/gst/pbutils/gstdiscoverer.c

index 576f0e882d91b0946d7e4b79424ed611d333c08f..09936160ca58bf2552c255de7628fe7d75b3611e 100644 (file)
@@ -743,7 +743,6 @@ uridecodebin_pad_removed_cb (GstElement * uridecodebin, GstPad * pad,
     gst_pad_remove_probe (pad, ps->probe_id);
 
   dc->priv->streams = g_list_delete_link (dc->priv->streams, tmp);
-  DISCO_UNLOCK (dc);
 
   gst_element_set_state (ps->sink, GST_STATE_NULL);
   gst_element_set_state (ps->queue, GST_STATE_NULL);
@@ -756,6 +755,7 @@ uridecodebin_pad_removed_cb (GstElement * uridecodebin, GstPad * pad,
   /* references removed here */
   gst_bin_remove_many (dc->priv->pipeline, ps->sink, ps->queue, NULL);
 
+  DISCO_UNLOCK (dc);
   if (ps->tags) {
     gst_tag_list_unref (ps->tags);
   }
@@ -1340,7 +1340,10 @@ discoverer_collect (GstDiscoverer * dc)
          * completely bogus values. We need some API extensions to solve this
          * better. */
         GST_INFO ("No duration yet, try a bit harder..");
+        /* Make sure we don't add/remove elements while switching to PLAYING itself */
+        DISCO_LOCK (dc);
         sret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
+        DISCO_UNLOCK (dc);
         if (sret != GST_STATE_CHANGE_FAILURE) {
           int i;