Commit 798b29e3 by aquilescanta Committed by Oliver Woodman

Normalize timestamps in HlsChunkSource

Issue:#4394

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=201178909
parent 680d3fda
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
extractor for this ([#4297](https://github.com/google/ExoPlayer/issues/4297)). extractor for this ([#4297](https://github.com/google/ExoPlayer/issues/4297)).
* DASH: Fix playback getting stuck when playing representations that have both * DASH: Fix playback getting stuck when playing representations that have both
sidx atoms and non-zero presentationTimeOffset values. sidx atoms and non-zero presentationTimeOffset values.
* HLS: Fix adaptation in live playlists with EXT-X-PROGRAM-DATE-TIME tags.
* Mitigate memory leaks when `MediaSource` loads are slow to cancel * Mitigate memory leaks when `MediaSource` loads are slow to cancel
([#4249](https://github.com/google/ExoPlayer/issues/4249)). ([#4249](https://github.com/google/ExoPlayer/issues/4249)).
* Fix inconsistent `Player.EventListener` invocations for recursive player state * Fix inconsistent `Player.EventListener` invocations for recursive player state
......
...@@ -104,7 +104,7 @@ import java.util.List; ...@@ -104,7 +104,7 @@ import java.util.List;
// the way in which HlsSampleStreamWrapper generates track groups. Use only index based methods // the way in which HlsSampleStreamWrapper generates track groups. Use only index based methods
// in TrackSelection to avoid unexpected behavior. // in TrackSelection to avoid unexpected behavior.
private TrackSelection trackSelection; private TrackSelection trackSelection;
private long liveEdgeTimeUs; private long liveEdgeInPeriodTimeUs;
private boolean seenExpectedPlaylistError; private boolean seenExpectedPlaylistError;
/** /**
...@@ -128,7 +128,7 @@ import java.util.List; ...@@ -128,7 +128,7 @@ import java.util.List;
this.variants = variants; this.variants = variants;
this.timestampAdjusterProvider = timestampAdjusterProvider; this.timestampAdjusterProvider = timestampAdjusterProvider;
this.muxedCaptionFormats = muxedCaptionFormats; this.muxedCaptionFormats = muxedCaptionFormats;
liveEdgeTimeUs = C.TIME_UNSET; liveEdgeInPeriodTimeUs = C.TIME_UNSET;
Format[] variantFormats = new Format[variants.length]; Format[] variantFormats = new Format[variants.length];
int[] initialTrackSelection = new int[variants.length]; int[] initialTrackSelection = new int[variants.length];
for (int i = 0; i < variants.length; i++) { for (int i = 0; i < variants.length; i++) {
...@@ -254,16 +254,17 @@ import java.util.List; ...@@ -254,16 +254,17 @@ import java.util.List;
// Select the chunk. // Select the chunk.
long chunkMediaSequence; long chunkMediaSequence;
long startOfPlaylistInPeriodUs =
mediaPlaylist.startTimeUs - playlistTracker.getInitialStartTimeUs();
if (previous == null || switchingVariant) { if (previous == null || switchingVariant) {
long targetPositionUs = (previous == null || independentSegments) ? loadPositionUs long endOfPlaylistInPeriodUs = startOfPlaylistInPeriodUs + mediaPlaylist.durationUs;
: previous.startTimeUs; long targetPositionInPeriodUs =
if (!mediaPlaylist.hasEndTag && targetPositionUs >= mediaPlaylist.getEndTimeUs()) { (previous == null || independentSegments) ? loadPositionUs : previous.startTimeUs;
if (!mediaPlaylist.hasEndTag && targetPositionInPeriodUs >= endOfPlaylistInPeriodUs) {
// If the playlist is too old to contain the chunk, we need to refresh it. // If the playlist is too old to contain the chunk, we need to refresh it.
chunkMediaSequence = mediaPlaylist.mediaSequence + mediaPlaylist.segments.size(); chunkMediaSequence = mediaPlaylist.mediaSequence + mediaPlaylist.segments.size();
} else { } else {
long positionOfPlaylistInPeriodUs = long targetPositionInPlaylistUs = targetPositionInPeriodUs - startOfPlaylistInPeriodUs;
mediaPlaylist.startTimeUs - playlistTracker.getInitialStartTimeUs();
long targetPositionInPlaylistUs = targetPositionUs - positionOfPlaylistInPeriodUs;
chunkMediaSequence = chunkMediaSequence =
Util.binarySearchFloor( Util.binarySearchFloor(
mediaPlaylist.segments, mediaPlaylist.segments,
...@@ -277,6 +278,8 @@ import java.util.List; ...@@ -277,6 +278,8 @@ import java.util.List;
selectedVariantIndex = oldVariantIndex; selectedVariantIndex = oldVariantIndex;
selectedUrl = variants[selectedVariantIndex]; selectedUrl = variants[selectedVariantIndex];
mediaPlaylist = playlistTracker.getPlaylistSnapshot(selectedUrl); mediaPlaylist = playlistTracker.getPlaylistSnapshot(selectedUrl);
startOfPlaylistInPeriodUs =
mediaPlaylist.startTimeUs - playlistTracker.getInitialStartTimeUs();
chunkMediaSequence = previous.getNextChunkIndex(); chunkMediaSequence = previous.getNextChunkIndex();
} }
} }
...@@ -331,9 +334,7 @@ import java.util.List; ...@@ -331,9 +334,7 @@ import java.util.List;
} }
// Compute start time of the next chunk. // Compute start time of the next chunk.
long positionOfPlaylistInPeriodUs = long segmentStartTimeInPeriodUs = startOfPlaylistInPeriodUs + segment.relativeStartTimeUs;
mediaPlaylist.startTimeUs - playlistTracker.getInitialStartTimeUs();
long segmentStartTimeInPeriodUs = positionOfPlaylistInPeriodUs + segment.relativeStartTimeUs;
int discontinuitySequence = mediaPlaylist.discontinuitySequence int discontinuitySequence = mediaPlaylist.discontinuitySequence
+ segment.relativeDiscontinuitySequence; + segment.relativeDiscontinuitySequence;
TimestampAdjuster timestampAdjuster = timestampAdjusterProvider.getAdjuster( TimestampAdjuster timestampAdjuster = timestampAdjusterProvider.getAdjuster(
...@@ -420,12 +421,17 @@ import java.util.List; ...@@ -420,12 +421,17 @@ import java.util.List;
// Private methods. // Private methods.
private long resolveTimeToLiveEdgeUs(long playbackPositionUs) { private long resolveTimeToLiveEdgeUs(long playbackPositionUs) {
final boolean resolveTimeToLiveEdgePossible = liveEdgeTimeUs != C.TIME_UNSET; final boolean resolveTimeToLiveEdgePossible = liveEdgeInPeriodTimeUs != C.TIME_UNSET;
return resolveTimeToLiveEdgePossible ? liveEdgeTimeUs - playbackPositionUs : C.TIME_UNSET; return resolveTimeToLiveEdgePossible
? liveEdgeInPeriodTimeUs - playbackPositionUs
: C.TIME_UNSET;
} }
private void updateLiveEdgeTimeUs(HlsMediaPlaylist mediaPlaylist) { private void updateLiveEdgeTimeUs(HlsMediaPlaylist mediaPlaylist) {
liveEdgeTimeUs = mediaPlaylist.hasEndTag ? C.TIME_UNSET : mediaPlaylist.getEndTimeUs(); liveEdgeInPeriodTimeUs =
mediaPlaylist.hasEndTag
? C.TIME_UNSET
: (mediaPlaylist.getEndTimeUs() - playlistTracker.getInitialStartTimeUs());
} }
private EncryptionKeyChunk newEncryptionKeyChunk(Uri keyUri, String iv, int variantIndex, private EncryptionKeyChunk newEncryptionKeyChunk(Uri keyUri, String iv, int variantIndex,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment