From d6b6600a28b959ef9b9e1f3bb3135f2e81355f13 Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 26 Nov 2018 12:10:02 +0000 Subject: [PATCH] Fix unnecessary media playlist requests when playing live streams Issue: #5059 PiperOrigin-RevId: 222803511 --- RELEASENOTES.md | 2 ++ .../android/exoplayer2/source/hls/HlsChunkSource.java | 8 +++++--- .../source/hls/playlist/DefaultHlsPlaylistTracker.java | 4 ++-- .../source/hls/playlist/HlsPlaylistTracker.java | 4 +++- 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index f7766696dd..2a90cba3d5 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -2,6 +2,8 @@ ### dev-v2 (not yet released) ### +* HLS: Fix issue causing unnecessary media playlist requests when playing live + streams ([#5059](https://github.com/google/ExoPlayer/issues/5059)). * MP4: Support Opus and FLAC in the MP4 container, and in DASH ([#4883](https://github.com/google/ExoPlayer/issues/4883)). * DASH: Fix detecting the end of live events diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsChunkSource.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsChunkSource.java index f000187827..d01476d004 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsChunkSource.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsChunkSource.java @@ -262,7 +262,8 @@ import java.util.List; // Retry when playlist is refreshed. return; } - HlsMediaPlaylist mediaPlaylist = playlistTracker.getPlaylistSnapshot(selectedUrl); + HlsMediaPlaylist mediaPlaylist = + playlistTracker.getPlaylistSnapshot(selectedUrl, /* isForPlayback= */ true); independentSegments = mediaPlaylist.hasIndependentSegments; updateLiveEdgeTimeUs(mediaPlaylist); @@ -279,7 +280,7 @@ import java.util.List; // behind the live window. selectedVariantIndex = oldVariantIndex; selectedUrl = variants[selectedVariantIndex]; - mediaPlaylist = playlistTracker.getPlaylistSnapshot(selectedUrl); + mediaPlaylist = playlistTracker.getPlaylistSnapshot(selectedUrl, /* isForPlayback= */ true); startOfPlaylistInPeriodUs = mediaPlaylist.startTimeUs - playlistTracker.getInitialStartTimeUs(); chunkMediaSequence = previous.getNextChunkIndex(); @@ -435,7 +436,8 @@ import java.util.List; chunkIterators[i] = MediaChunkIterator.EMPTY; continue; } - HlsMediaPlaylist playlist = playlistTracker.getPlaylistSnapshot(variantUrl); + HlsMediaPlaylist playlist = + playlistTracker.getPlaylistSnapshot(variantUrl, /* isForPlayback= */ false); long startOfPlaylistInPeriodUs = playlist.startTimeUs - playlistTracker.getInitialStartTimeUs(); boolean switchingVariant = variantIndex != oldVariantIndex; diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/DefaultHlsPlaylistTracker.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/DefaultHlsPlaylistTracker.java index 4e34c556e0..4269b66d30 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/DefaultHlsPlaylistTracker.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/DefaultHlsPlaylistTracker.java @@ -162,9 +162,9 @@ public final class DefaultHlsPlaylistTracker } @Override - public HlsMediaPlaylist getPlaylistSnapshot(HlsUrl url) { + public HlsMediaPlaylist getPlaylistSnapshot(HlsUrl url, boolean isForPlayback) { HlsMediaPlaylist snapshot = playlistBundles.get(url).getPlaylistSnapshot(); - if (snapshot != null) { + if (snapshot != null && isForPlayback) { maybeSetPrimaryUrl(url); } return snapshot; diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistTracker.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistTracker.java index b83ae43f47..c73c9fa835 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistTracker.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistTracker.java @@ -167,11 +167,13 @@ public interface HlsPlaylistTracker { * HlsUrl}. * * @param url The {@link HlsUrl} corresponding to the requested media playlist. + * @param isForPlayback Whether the caller might use the snapshot to request media segments for + * playback. If true, the primary playlist may be updated to the one requested. * @return The most recent snapshot of the playlist referenced by the provided {@link HlsUrl}. May * be null if no snapshot has been loaded yet. */ @Nullable - HlsMediaPlaylist getPlaylistSnapshot(HlsUrl url); + HlsMediaPlaylist getPlaylistSnapshot(HlsUrl url, boolean isForPlayback); /** * Returns the start time of the first loaded primary playlist, or {@link C#TIME_UNSET} if no