diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 1fbce913e7..19ede4cd03 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -65,6 +65,9 @@ ([#4083](https://github.com/google/ExoPlayer/issues/4083)). Such content is malformed and should be re-encoded. * HLS: + * Fix issue where playback of a live event could become stuck rather than + transitioning to `STATE_ENDED` when the event ends + ([#9067](https://github.com/google/ExoPlayer/issues/9067)). * Fix issue where a new initialization segment, as specified by an `EXT-X-MAP` tag in a media playlist, would not be loaded when encountered during playback 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 2a69f5c6af..9ad1cb5934 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 @@ -339,9 +339,16 @@ public final class DefaultHlsPlaylistTracker return; } primaryMediaPlaylistUrl = url; - playlistBundles - .get(primaryMediaPlaylistUrl) - .loadPlaylistInternal(getRequestUriForPrimaryChange(url)); + MediaPlaylistBundle newPrimaryBundle = playlistBundles.get(primaryMediaPlaylistUrl); + @Nullable HlsMediaPlaylist newPrimarySnapshot = newPrimaryBundle.playlistSnapshot; + if (newPrimarySnapshot != null && newPrimarySnapshot.hasEndTag) { + primaryMediaPlaylistSnapshot = newPrimarySnapshot; + primaryPlaylistListener.onPrimaryPlaylistRefreshed(newPrimarySnapshot); + } else { + // The snapshot for the new primary media playlist URL may be stale. Defer updating the + // primary snapshot until after we've refreshed it. + newPrimaryBundle.loadPlaylistInternal(getRequestUriForPrimaryChange(url)); + } } private Uri getRequestUriForPrimaryChange(Uri newPrimaryPlaylistUri) {