urisourcebin: Use GList for typefind elements

We need typefind elements per source element's srcpad

https://bugzilla.gnome.org/show_bug.cgi?id=776458
This commit is contained in:
Seungha Yang 2016-12-24 16:44:26 +09:00 committed by Jan Schmidt
parent 46c6e92abd
commit 5d0628ff52

View file

@ -122,7 +122,7 @@ struct _GstURISourceBin
gboolean use_buffering; gboolean use_buffering;
GstElement *source; GstElement *source;
GstElement *typefind; GList *typefinds; /* list of typefind element */
GstElement *demuxer; /* Adaptive demuxer if any */ GstElement *demuxer; /* Adaptive demuxer if any */
GSList *out_slots; GSList *out_slots;
@ -1986,12 +1986,11 @@ setup_streaming (GstURISourceBin * urisrc)
if (!gst_element_link_pads (urisrc->source, NULL, typefind, "sink")) if (!gst_element_link_pads (urisrc->source, NULL, typefind, "sink"))
goto could_not_link; goto could_not_link;
urisrc->typefind = typefind; urisrc->typefinds = g_list_append (urisrc->typefinds, typefind);
/* connect a signal to find out when the typefind element found /* connect a signal to find out when the typefind element found
* a type */ * a type */
g_signal_connect (urisrc->typefind, "have-type", g_signal_connect (typefind, "have-type", G_CALLBACK (type_found), urisrc);
G_CALLBACK (type_found), urisrc);
return TRUE; return TRUE;
@ -2068,11 +2067,19 @@ remove_source (GstURISourceBin * urisrc)
gst_bin_remove (GST_BIN_CAST (urisrc), source); gst_bin_remove (GST_BIN_CAST (urisrc), source);
urisrc->source = NULL; urisrc->source = NULL;
} }
if (urisrc->typefind) { if (urisrc->typefinds) {
GList *iter, *next;
GST_DEBUG_OBJECT (urisrc, "removing old typefind element"); GST_DEBUG_OBJECT (urisrc, "removing old typefind element");
gst_element_set_state (urisrc->typefind, GST_STATE_NULL); for (iter = urisrc->typefinds; iter; iter = next) {
gst_bin_remove (GST_BIN_CAST (urisrc), urisrc->typefind); GstElement *typefind = iter->data;
urisrc->typefind = NULL;
next = g_list_next (iter);
gst_element_set_state (typefind, GST_STATE_NULL);
gst_bin_remove (GST_BIN_CAST (urisrc), typefind);
}
urisrc->typefinds = NULL;
} }
GST_URI_SOURCE_BIN_LOCK (urisrc); GST_URI_SOURCE_BIN_LOCK (urisrc);
@ -2805,8 +2812,15 @@ gst_uri_source_bin_change_state (GstElement * element,
/* And now sync the states of everything we added */ /* And now sync the states of everything we added */
g_slist_foreach (urisrc->out_slots, (GFunc) sync_slot_queue, NULL); g_slist_foreach (urisrc->out_slots, (GFunc) sync_slot_queue, NULL);
if (urisrc->typefind) if (urisrc->typefinds) {
ret = gst_element_set_state (urisrc->typefind, GST_STATE_PAUSED); GList *iter;
for (iter = urisrc->typefinds; iter; iter = iter->next) {
GstElement *typefind = iter->data;
ret = gst_element_set_state (typefind, GST_STATE_PAUSED);
if (ret == GST_STATE_CHANGE_FAILURE)
goto setup_failed;
}
}
if (ret == GST_STATE_CHANGE_FAILURE) if (ret == GST_STATE_CHANGE_FAILURE)
goto setup_failed; goto setup_failed;
if (urisrc->source) if (urisrc->source)