From 1fe7fbc4cd3f92e38b9c4852264fbbe23655fbc8 Mon Sep 17 00:00:00 2001 From: Justin Wong <46082645+uvjustin@users.noreply.github.com> Date: Sun, 28 Mar 2021 23:59:00 +0800 Subject: [PATCH 1/2] Use most recent part for start position --- .../exoplayer2/source/hls/HlsMediaSource.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java index e5c233ef43..4eaed25f11 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java @@ -601,7 +601,18 @@ public final class HlsMediaSource extends BaseMediaSource && segments.get(segmentIndex).relativeStartTimeUs > minStartPositionUs) { segmentIndex--; } - return segments.get(segmentIndex).relativeStartTimeUs; + HlsMediaPlaylist.Segment segment = segments.get(segmentIndex); + List parts = segment.parts; + int partIndex = parts.size(); + if (partIndex > 1) { + HlsMediaPlaylist.Part part; + do { + partIndex--; + part = parts.get(partIndex); + } while (part.relativeStartTimeUs > minStartPositionUs || !part.isIndependent); + return part.relativeStartTimeUs; + } + return segment.relativeStartTimeUs; } private void maybeUpdateMediaItem(long targetLiveOffsetUs) { From b3c8ffeb500555457bccd8f760dfd87c60143fbf Mon Sep 17 00:00:00 2001 From: Justin Wong <46082645+uvjustin@users.noreply.github.com> Date: Mon, 29 Mar 2021 00:48:10 +0800 Subject: [PATCH 2/2] Use #EXT-X-START PRECISE attribute --- .../exoplayer2/source/hls/HlsMediaSource.java | 22 +++++++++++-------- .../source/hls/playlist/HlsMediaPlaylist.java | 8 +++++++ .../hls/playlist/HlsPlaylistParser.java | 5 +++++ 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java index 4eaed25f11..94f584332c 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java @@ -597,20 +597,24 @@ public final class HlsMediaSource extends BaseMediaSource int segmentIndex = segments.size() - 1; long minStartPositionUs = playlist.durationUs + liveEdgeOffsetUs - C.msToUs(liveConfiguration.targetOffsetMs); + if (playlist.preciseStart) + return minStartPositionUs; while (segmentIndex > 0 && segments.get(segmentIndex).relativeStartTimeUs > minStartPositionUs) { segmentIndex--; } HlsMediaPlaylist.Segment segment = segments.get(segmentIndex); - List parts = segment.parts; - int partIndex = parts.size(); - if (partIndex > 1) { - HlsMediaPlaylist.Part part; - do { - partIndex--; - part = parts.get(partIndex); - } while (part.relativeStartTimeUs > minStartPositionUs || !part.isIndependent); - return part.relativeStartTimeUs; + if (playlist.startOffsetUs == C.TIME_UNSET) { + List parts = segment.parts; + int partIndex = parts.size(); + if (partIndex > 1) { + HlsMediaPlaylist.Part part; + do { + partIndex--; + part = parts.get(partIndex); + } while (part.relativeStartTimeUs > minStartPositionUs || !part.isIndependent); + return part.relativeStartTimeUs; + } } return segment.relativeStartTimeUs; } diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsMediaPlaylist.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsMediaPlaylist.java index c4ab3fc662..b7491e6729 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsMediaPlaylist.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsMediaPlaylist.java @@ -397,6 +397,10 @@ public final class HlsMediaPlaylist extends HlsPlaylist { * The start offset in microseconds, as defined by #EXT-X-START. */ public final long startOffsetUs; + /** + * Whether the start position should be precise, as defined by #EXT-X-START. + */ + public final boolean preciseStart; /** * If {@link #hasProgramDateTime} is true, contains the datetime as microseconds since epoch. * Otherwise, contains the aggregated duration of removed segments up to this snapshot of the @@ -481,6 +485,7 @@ public final class HlsMediaPlaylist extends HlsPlaylist { String baseUri, List tags, long startOffsetUs, + boolean preciseStart, long startTimeUs, boolean hasDiscontinuitySequence, int discontinuitySequence, @@ -499,6 +504,7 @@ public final class HlsMediaPlaylist extends HlsPlaylist { super(baseUri, tags, hasIndependentSegments); this.playlistType = playlistType; this.startTimeUs = startTimeUs; + this.preciseStart = preciseStart; this.hasDiscontinuitySequence = hasDiscontinuitySequence; this.discontinuitySequence = discontinuitySequence; this.mediaSequence = mediaSequence; @@ -576,6 +582,7 @@ public final class HlsMediaPlaylist extends HlsPlaylist { baseUri, tags, startOffsetUs, + preciseStart, startTimeUs, /* hasDiscontinuitySequence= */ true, discontinuitySequence, @@ -606,6 +613,7 @@ public final class HlsMediaPlaylist extends HlsPlaylist { baseUri, tags, startOffsetUs, + preciseStart, startTimeUs, hasDiscontinuitySequence, discontinuitySequence, diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java index 62357ecdea..4dbc8f7750 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java @@ -210,6 +210,7 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser