Revert "adaptivedemux: answer duration queries for live streams"
authorMatthew Waters <matthew@centricular.com>
Tue, 14 Mar 2017 05:49:25 +0000 (16:49 +1100)
committerMatthew Waters <matthew@centricular.com>
Tue, 14 Mar 2017 05:50:30 +0000 (16:50 +1100)
Completely disabling duration reporting with live streams is not cool.

This reverts commit e1b68d9a65ba512a52c3a2b298fa830a445eb451.

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

ext/dash/gstmpdparser.c
ext/hls/m3u8.c
ext/smoothstreaming/gstmssmanifest.c
gst-libs/gst/adaptivedemux/gstadaptivedemux.c
gst-libs/gst/adaptivedemux/gstadaptivedemux.h
tests/check/elements/hlsdemux_m3u8.c

index 25eaab7..baf5dbc 100644 (file)
@@ -5483,12 +5483,18 @@ gst_mpd_client_get_next_fragment_duration (GstMpdClient * client,
 GstClockTime
 gst_mpd_client_get_media_presentation_duration (GstMpdClient * client)
 {
+  GstClockTime duration;
+
   g_return_val_if_fail (client != NULL, GST_CLOCK_TIME_NONE);
 
-  /* Note: adaptivedemux makes sure we only get duration queries for on-demand streams */
-  g_return_val_if_fail (client->mpd_node->mediaPresentationDuration != -1,
-      GST_CLOCK_TIME_NONE);
-  return client->mpd_node->mediaPresentationDuration * GST_MSECOND;
+  if (client->mpd_node->mediaPresentationDuration != -1) {
+    duration = client->mpd_node->mediaPresentationDuration * GST_MSECOND;
+  } else {
+    /* We can only get the duration for on-demand streams */
+    duration = GST_CLOCK_TIME_NONE;
+  }
+
+  return duration;
 }
 
 gboolean
index edf08ac..807002f 100644 (file)
@@ -1015,7 +1015,9 @@ gst_m3u8_get_duration (GstM3U8 * m3u8)
 
   GST_M3U8_LOCK (m3u8);
 
-  /* Note: adaptivedemux makes sure we only get duration queries for on-demand streams */
+  /* We can only get the duration for on-demand streams */
+  if (!m3u8->endlist)
+    goto out;
 
   if (!GST_CLOCK_TIME_IS_VALID (m3u8->duration) && m3u8->files != NULL) {
     GList *f;
@@ -1026,6 +1028,8 @@ gst_m3u8_get_duration (GstM3U8 * m3u8)
   }
   duration = m3u8->duration;
 
+out:
+
   GST_M3U8_UNLOCK (m3u8);
 
   return duration;
index 111fb78..7ef1114 100644 (file)
@@ -934,7 +934,7 @@ guint64
 gst_mss_manifest_get_duration (GstMssManifest * manifest)
 {
   gchar *duration;
-  guint64 dur = GST_CLOCK_TIME_NONE;
+  guint64 dur = -1;
 
   /* try the property */
   duration =
index 0ffb530..e46dc3a 100644 (file)
@@ -1748,12 +1748,12 @@ gst_adaptive_demux_src_query (GstPad * pad, GstObject * parent,
       GST_MANIFEST_LOCK (demux);
 
       if (fmt == GST_FORMAT_TIME && demux->priv->have_manifest) {
-        if (gst_adaptive_demux_is_live (demux))
-          duration = GST_CLOCK_TIME_NONE;
-        else
-          duration = demux_class->get_duration (demux);
-        gst_query_set_duration (query, GST_FORMAT_TIME, duration);
-        ret = TRUE;
+        duration = demux_class->get_duration (demux);
+
+        if (GST_CLOCK_TIME_IS_VALID (duration) && duration > 0) {
+          gst_query_set_duration (query, GST_FORMAT_TIME, duration);
+          ret = TRUE;
+        }
       }
 
       GST_MANIFEST_UNLOCK (demux);
index d2d2f01..8301714 100644 (file)
@@ -293,18 +293,6 @@ struct _GstAdaptiveDemuxClass
   GstFlowReturn (*update_manifest_data) (GstAdaptiveDemux * demux, GstBuffer * buf);
 
   gboolean      (*is_live)          (GstAdaptiveDemux * demux);
-
-  /**
-   * get_duration:
-   * @demux: #GstAdaptiveDemux
-   *
-   * For non-live streams, this will be called to query the duration of the
-   * stream.
-   *
-   * Returns: The duration of the stream, or #GST_CLOCK_TIME_NONE if the
-   * duration is unknown
-   * Since: 1.6
-   */
   GstClockTime  (*get_duration)     (GstAdaptiveDemux * demux);
 
   /**
index 28952d7..a77aca1 100644 (file)
@@ -843,6 +843,13 @@ GST_START_TEST (test_get_duration)
 
   assert_equals_uint64 (gst_m3u8_get_duration (pl), 40 * GST_SECOND);
   gst_hls_master_playlist_unref (master);
+
+  /* Test duration for live playlists */
+  master = load_playlist (LIVE_PLAYLIST);
+  pl = master->default_variant->m3u8;
+  assert_equals_uint64 (gst_m3u8_get_duration (pl), GST_CLOCK_TIME_NONE);
+
+  gst_hls_master_playlist_unref (master);
 }
 
 GST_END_TEST;