hlsdemux: select correct position for live streams that don't remove fragments
authorAthanasios Oikonomou <athoik@gmail.com>
Fri, 7 Aug 2015 09:53:23 +0000 (12:53 +0300)
committerSebastian Dröge <sebastian@centricular.com>
Wed, 26 Aug 2015 09:11:57 +0000 (12:11 +0300)
Some live streams (eg youtube) don't remove fragments in order to allow
seeking back in time (live + vod).

When gst_m3u8_client_has_next_fragment is called, we are getting wrong fragment
because current_file points in first file of the fragments list resulting in
watching the stream from the beginning again.

This patch sets current_file to nth fragment for live streams, then on
gst_m3u8_client_has_next_fragment will keep up with the live stream.

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

ext/hls/m3u8.c

index 1273b71016fb21b9471734114c1488be8c9df1d0..b931749fa86e56f52cf54e72b97d76dfce3f2403 100755 (executable)
@@ -853,17 +853,16 @@ gst_m3u8_client_update (GstM3U8Client * self, gchar * data)
   }
 
   if (m3u8->files && self->sequence == -1) {
-    self->current_file = g_list_first (m3u8->files);
     if (GST_M3U8_CLIENT_IS_LIVE (self)) {
       /* for live streams, start GST_M3U8_LIVE_MIN_FRAGMENT_DISTANCE from
          the end of the playlist. See section 6.3.3 of HLS draft */
       gint pos =
           g_list_length (m3u8->files) - GST_M3U8_LIVE_MIN_FRAGMENT_DISTANCE;
-      self->sequence =
-          GST_M3U8_MEDIA_FILE (g_list_nth_data (m3u8->files,
-              pos >= 0 ? pos : 0))->sequence;
-    } else
-      self->sequence = GST_M3U8_MEDIA_FILE (self->current_file->data)->sequence;
+      self->current_file = g_list_nth (m3u8->files, pos >= 0 ? pos : 0);
+    } else {
+      self->current_file = g_list_first (m3u8->files);
+    }
+    self->sequence = GST_M3U8_MEDIA_FILE (self->current_file->data)->sequence;
     self->sequence_position = 0;
     GST_DEBUG ("Setting first sequence at %u", (guint) self->sequence);
   }