urisourcebin: Avoid races when setting up typefind
authorEdward Hervey <edward@centricular.com>
Thu, 12 Jan 2017 09:51:34 +0000 (10:51 +0100)
committerEdward Hervey <bilboed@bilboed.com>
Thu, 12 Jan 2017 09:51:34 +0000 (10:51 +0100)
The state of urisourcebin (and all elements contained within) can
change at any point in time, including when setting up the typefind
element.

In order to avoid ending up with typefind starting without being fully
connected, lock the state and connect to the 'have-type' signal.

gst/playback/gsturisourcebin.c

index f87f8f8..5b39a03 100644 (file)
@@ -1996,6 +1996,9 @@ setup_typefind (GstURISourceBin * urisrc, GstPad * srcpad)
   if (!typefind)
     goto no_typefind;
 
+  /* Make sure the bin doesn't set the typefind running yet */
+  gst_element_set_locked_state (typefind, TRUE);
+
   gst_bin_add (GST_BIN_CAST (urisrc), typefind);
 
   if (!srcpad) {
@@ -2011,14 +2014,16 @@ setup_typefind (GstURISourceBin * urisrc, GstPad * srcpad)
       goto could_not_link;
   }
 
-  gst_element_sync_state_with_parent (typefind);
-
   urisrc->typefinds = g_list_append (urisrc->typefinds, typefind);
 
   /* connect a signal to find out when the typefind element found
    * a type */
   g_signal_connect (typefind, "have-type", G_CALLBACK (type_found), urisrc);
 
+  /* Now it can start */
+  gst_element_set_locked_state (typefind, FALSE);
+  gst_element_sync_state_with_parent (typefind);
+
   return TRUE;
 
   /* ERRORS */