diff --git a/subprojects/gst-plugins-good/ext/adaptivedemux2/hls/gsthlsdemux.c b/subprojects/gst-plugins-good/ext/adaptivedemux2/hls/gsthlsdemux.c index 3daf93023a..c6dfce21d9 100644 --- a/subprojects/gst-plugins-good/ext/adaptivedemux2/hls/gsthlsdemux.c +++ b/subprojects/gst-plugins-good/ext/adaptivedemux2/hls/gsthlsdemux.c @@ -1268,10 +1268,11 @@ gst_hls_demux_get_live_seek_range (GstAdaptiveDemux * demux, gint64 * start, GstHLSDemux *hlsdemux = GST_HLS_DEMUX_CAST (demux); gboolean ret = FALSE; - if (hlsdemux->main_stream && hlsdemux->main_stream->playlist) + if (hlsdemux->main_stream && hlsdemux->main_stream->playlist) { ret = gst_hls_media_playlist_get_seek_range (hlsdemux->main_stream->playlist, - start, stop); + hlsdemux->main_stream->llhls_enabled, start, stop); + } return ret; } diff --git a/subprojects/gst-plugins-good/ext/adaptivedemux2/hls/m3u8.c b/subprojects/gst-plugins-good/ext/adaptivedemux2/hls/m3u8.c index d1affe5d7d..04ce298fb8 100644 --- a/subprojects/gst-plugins-good/ext/adaptivedemux2/hls/m3u8.c +++ b/subprojects/gst-plugins-good/ext/adaptivedemux2/hls/m3u8.c @@ -2487,10 +2487,9 @@ gst_hls_media_playlist_has_lost_sync (GstHLSMediaPlaylist * m3u8, gboolean gst_hls_media_playlist_get_seek_range (GstHLSMediaPlaylist * m3u8, - gint64 * start, gint64 * stop) + gboolean low_latency, gint64 * start, gint64 * stop) { GstM3U8MediaSegment *first, *last; - guint min_distance = 1; g_return_val_if_fail (m3u8 != NULL, FALSE); @@ -2500,17 +2499,31 @@ gst_hls_media_playlist_get_seek_range (GstHLSMediaPlaylist * m3u8, first = g_ptr_array_index (m3u8->segments, 0); *start = first->stream_time; - if (GST_HLS_MEDIA_PLAYLIST_IS_LIVE (m3u8) && m3u8->segments->len > 1) { - /* min_distance is used to make sure the seek range is never closer than - GST_M3U8_LIVE_MIN_FRAGMENT_DISTANCE fragments from the end of a live - playlist - see 6.3.3. "Playing the Playlist file" of the HLS draft */ - min_distance = - MIN (GST_M3U8_LIVE_MIN_FRAGMENT_DISTANCE, m3u8->segments->len - 1); - } - - last = g_ptr_array_index (m3u8->segments, m3u8->segments->len - min_distance); + /* Default is the end of the playlist */ + last = g_ptr_array_index (m3u8->segments, m3u8->segments->len - 1); *stop = last->stream_time + last->duration; + /* For live playlists, take the minimum hold back into account + * for the end of the seek range */ + if (GST_HLS_MEDIA_PLAYLIST_IS_LIVE (m3u8)) { + GstM3U8SeekResult seek_result; + + if (gst_hls_media_playlist_get_starting_segment (m3u8, low_latency, + &seek_result)) { + if (seek_result.found_partial_segment) { + GstM3U8PartialSegment *part = + g_ptr_array_index (seek_result.segment->partial_segments, + seek_result.part_idx); + *stop = part->stream_time + part->duration; + } else { + *stop = + seek_result.segment->stream_time + seek_result.segment->duration; + } + + gst_m3u8_media_segment_unref (seek_result.segment); + } + } + return TRUE; } diff --git a/subprojects/gst-plugins-good/ext/adaptivedemux2/hls/m3u8.h b/subprojects/gst-plugins-good/ext/adaptivedemux2/hls/m3u8.h index 923abb7d9e..8eb6d527e7 100644 --- a/subprojects/gst-plugins-good/ext/adaptivedemux2/hls/m3u8.h +++ b/subprojects/gst-plugins-good/ext/adaptivedemux2/hls/m3u8.h @@ -335,7 +335,7 @@ gboolean gst_hls_media_playlist_is_live (GstHLSMediaPlaylist * m3u8); gboolean -gst_hls_media_playlist_get_seek_range (GstHLSMediaPlaylist * m3u8, +gst_hls_media_playlist_get_seek_range (GstHLSMediaPlaylist * m3u8, gboolean low_latency, gint64 * start, gint64 * stop); diff --git a/subprojects/gst-plugins-good/tests/check/elements/hlsdemux_m3u8.c b/subprojects/gst-plugins-good/tests/check/elements/hlsdemux_m3u8.c index 588a6b1e3d..c4e4ae2a18 100644 --- a/subprojects/gst-plugins-good/tests/check/elements/hlsdemux_m3u8.c +++ b/subprojects/gst-plugins-good/tests/check/elements/hlsdemux_m3u8.c @@ -524,7 +524,8 @@ GST_START_TEST (test_playlist_with_doubles_duration) assert_equals_float (file->duration / (double) GST_SECOND, 10.2344); file = GST_M3U8_MEDIA_SEGMENT (g_ptr_array_index (pl->segments, 3)); assert_equals_float (file->duration / (double) GST_SECOND, 9.92); - fail_unless (gst_hls_media_playlist_get_seek_range (pl, &start, &stop)); + fail_unless (gst_hls_media_playlist_get_seek_range (pl, FALSE, &start, + &stop)); assert_equals_int64 (start, 0); assert_equals_float (stop / (double) GST_SECOND, 10.321 + 9.6789 + 10.2344 + 9.92);