From 75e2aee92e24cb6dcf7b486057750b17a7412c2f Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 25 Jul 2016 13:16:40 -0700 Subject: [PATCH] Fix janky post-track-selection behavior for HLS We were forgetting to reset renderers during track selections where muxed media is used. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=128391816 --- .../exoplayer2/source/hls/HlsMediaSource.java | 20 ++++++++++++++----- .../source/hls/HlsSampleStreamWrapper.java | 4 ++++ 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java b/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java index 5a3340a1aa..ae2c85acec 100644 --- a/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java @@ -81,6 +81,7 @@ public final class HlsMediaSource implements MediaPeriod, MediaSource, private boolean seenFirstTrackSelection; private long durationUs; + private long pendingDiscontinuityPositionUs; private boolean isLive; private TrackGroupArray trackGroups; private int[] selectedTrackCounts; @@ -104,6 +105,7 @@ public final class HlsMediaSource implements MediaPeriod, MediaSource, this.minLoadableRetryCount = minLoadableRetryCount; eventDispatcher = new EventDispatcher(eventHandler, eventListener); + pendingDiscontinuityPositionUs = C.UNSET_TIME_US; sampleStreamSources = new IdentityHashMap<>(); timestampAdjusterProvider = new PtsTimestampAdjusterProvider(); manifestParser = new HlsPlaylistParser(); @@ -177,7 +179,7 @@ public final class HlsMediaSource implements MediaPeriod, MediaSource, int enabledSampleStreamWrapperCount = 0; for (int i = 0; i < sampleStreamWrappers.length; i++) { selectedTrackCounts[i] += selectTracks(sampleStreamWrappers[i], oldStreams, newSelections, - newStreams); + newStreams, positionUs); if (selectedTrackCounts[i] > 0) { enabledSampleStreamWrapperCount++; } @@ -191,8 +193,9 @@ public final class HlsMediaSource implements MediaPeriod, MediaSource, enabledSampleStreamWrappers[enabledSampleStreamWrapperCount++] = sampleStreamWrappers[i]; } } - if (enabledSampleStreamWrapperCount > 0 && seenFirstTrackSelection - && !newSelections.isEmpty()) { + if (enabledSampleStreamWrapperCount == 0) { + pendingDiscontinuityPositionUs = C.UNSET_TIME_US; + } else if (seenFirstTrackSelection && !newSelections.isEmpty()) { seekToUs(positionUs); } seenFirstTrackSelection = true; @@ -211,7 +214,9 @@ public final class HlsMediaSource implements MediaPeriod, MediaSource, @Override public long readDiscontinuity() { - return C.UNSET_TIME_US; + long result = pendingDiscontinuityPositionUs; + pendingDiscontinuityPositionUs = C.UNSET_TIME_US; + return result; } @Override @@ -419,7 +424,7 @@ public final class HlsMediaSource implements MediaPeriod, MediaSource, private int selectTracks(HlsSampleStreamWrapper sampleStreamWrapper, List allOldStreams, List allNewSelections, - SampleStream[] allNewStreams) { + SampleStream[] allNewStreams, long positionUs) { // Get the subset of the old streams for the source. ArrayList oldStreams = new ArrayList<>(); for (int i = 0; i < allOldStreams.size(); i++) { @@ -444,6 +449,11 @@ public final class HlsMediaSource implements MediaPeriod, MediaSource, if (seenFirstTrackSelection && oldStreams.isEmpty() && newSelections.isEmpty()) { return 0; } + // If there are other active SampleStreams provided by the wrapper then we need to report a + // discontinuity so that the consuming renderers are reset. + if (sampleStreamWrapper.getEnabledTrackCount() > oldStreams.size()) { + pendingDiscontinuityPositionUs = positionUs; + } // Perform the selection. SampleStream[] newStreams = sampleStreamWrapper.selectTracks(oldStreams, newSelections, !seenFirstTrackSelection); diff --git a/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java b/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java index b44807eeb5..0f8b8b7791 100644 --- a/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java @@ -143,6 +143,10 @@ import java.util.List; return chunkSource.getDurationUs(); } + public int getEnabledTrackCount() { + return enabledTrackCount; + } + public boolean isLive() { return chunkSource.isLive(); }