dashdemux: update manifest streams correctly if pads aren't exposed
authorThiago Santos <thiagossantos@gmail.com>
Tue, 30 May 2017 05:47:10 +0000 (22:47 -0700)
committerEdward Hervey <bilboed@bilboed.com>
Thu, 13 Jul 2017 06:33:17 +0000 (08:33 +0200)
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

index 83bcb03021f396c273655e66c52ed9d0a5aef599..0f96e339ca024e44ecc62d8368ac8ea08866aa9f 100644 (file)
@@ -1787,6 +1787,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  */
@@ -1825,8 +1826,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;