smoothstreaming: use the duration from the list of fragments if not present in the...
authorMatthew Waters <matthew@centricular.com>
Thu, 10 Nov 2016 06:20:27 +0000 (17:20 +1100)
committerMatthew Waters <matthew@centricular.com>
Thu, 10 Nov 2016 13:18:47 +0000 (00:18 +1100)
Provides a more accurate duration for live streams that may be minutes
or hours in front of the earliest fragment.

https://bugzilla.gnome.org/show_bug.cgi?id=774178

ext/smoothstreaming/gstmssmanifest.c

index 317b3cef9b9f4b7626702541333915b4a9451ca3..144bbb42d6e30ed60d853e7a9aa7a4880b236344 100644 (file)
@@ -888,6 +888,7 @@ gst_mss_manifest_get_duration (GstMssManifest * manifest)
   gchar *duration;
   guint64 dur = -1;
 
+  /* try the property */
   duration =
       (gchar *) xmlGetProp (manifest->xmlrootnode,
       (xmlChar *) MSS_PROP_STREAM_DURATION);
@@ -895,6 +896,29 @@ gst_mss_manifest_get_duration (GstMssManifest * manifest)
     dur = g_ascii_strtoull (duration, NULL, 10);
     xmlFree (duration);
   }
+  /* else use the fragment list */
+  if (dur <= 0) {
+    guint64 max_dur = 0;
+    GSList *iter;
+
+    for (iter = manifest->streams; iter; iter = g_slist_next (iter)) {
+      GstMssStream *stream = iter->data;
+
+      if (stream->active) {
+        if (stream->fragments) {
+          GList *l = g_list_last (stream->fragments);
+          GstMssStreamFragment *fragment = (GstMssStreamFragment *) l->data;
+          guint64 frag_dur =
+              fragment->time + fragment->duration * fragment->repetitions;
+          max_dur = MAX (frag_dur, max_dur);
+        }
+      }
+    }
+
+    if (max_dur != 0)
+      dur = max_dur;
+  }
+
   return dur;
 }