From 90e86b86385c89aaec4dcfd149203375cf2d313e Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Thu, 12 Jan 2017 10:51:34 +0100 Subject: [PATCH] urisourcebin: Avoid races when setting up typefind 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 | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/gst/playback/gsturisourcebin.c b/gst/playback/gsturisourcebin.c index f87f8f8f7d..5b39a032e2 100644 --- a/gst/playback/gsturisourcebin.c +++ b/gst/playback/gsturisourcebin.c @@ -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 */