From ead63a268647eff2bcf92d8dc55ca41ee44247c2 Mon Sep 17 00:00:00 2001 From: Thiago Santos Date: Mon, 29 May 2017 22:47:10 -0700 Subject: [PATCH] dashdemux: update manifest streams correctly if pads aren't exposed In some cases, it is possible that we need to update the manifest before pads have been exposed at all. If there are no current pads, just expose the next prepared streams. This doesn't handle the case where a manifest update would happen while a live streams is changing periods, which is a type of use case that we're unaware of real usages yet. https://bugzilla.gnome.org/show_bug.cgi?id=783028 --- ext/dash/gstdashdemux.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/ext/dash/gstdashdemux.c b/ext/dash/gstdashdemux.c index 0131df2bab..baad2cfb7e 100644 --- a/ext/dash/gstdashdemux.c +++ b/ext/dash/gstdashdemux.c @@ -2411,6 +2411,7 @@ gst_dash_demux_update_manifest_data (GstAdaptiveDemux * demux, guint period_idx; GList *iter; GList *streams_iter; + GList *streams; /* prepare the new manifest and try to transfer the stream position * status from the old manifest client */ @@ -2449,8 +2450,18 @@ gst_dash_demux_update_manifest_data (GstAdaptiveDemux * demux, return GST_FLOW_ERROR; } + /* If no pads have been exposed yet, need to use those */ + streams = NULL; + if (demux->streams == NULL) { + if (demux->prepared_streams) { + streams = demux->prepared_streams; + } + } else { + streams = demux->streams; + } + /* update the streams to play from the next segment */ - for (iter = demux->streams, streams_iter = new_client->active_streams; + for (iter = streams, streams_iter = new_client->active_streams; iter && streams_iter; iter = g_list_next (iter), streams_iter = g_list_next (streams_iter)) { GstDashDemuxStream *demux_stream = iter->data;