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