Skip to content

Commit

Permalink
HLS: Fix issue where a live event doesn't transition to STATE_ENDED
Browse files Browse the repository at this point in the history
The problem occurs when the primary media playlist URL switches
from one whose latest snapshot has not yet got the ended tag, to
one whose latest snapshot already has the ended tag. In this case:

- We trigger a redundant load of the ended playlist.
- When the redundant load completes,
  MediaPlaylistBundle.processLoadedPlaylist detects that the
  playlist is unchanged from the one it already has, and so
  doesn't call onPlaylistUpdated.
- PrimaryPlaylistListener.onPrimaryPlaylistRefreshed is never
  called with the new primary. Hence the externally visible primary
  is still the one that hasn't ended. HlsMediaSource therefore thinks
  the event hasn't ended, which in turn prevents the player from
  transitioning to the ended state.

This commit detects when the new primary already has the ended tag.
In this case, we call onPrimaryPlaylistRefreshed directly and remove
the unnecessary playlist load.

Issue: #9067
#minor-release
PiperOrigin-RevId: 380680532
  • Loading branch information
ojw28 authored and icbaker committed Jul 16, 2021
1 parent 79f03df commit 5b8be42
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 3 deletions.
3 changes: 3 additions & 0 deletions RELEASENOTES.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -339,9 +339,16 @@ private void maybeSetPrimaryUrl(Uri url) {
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) {
Expand Down

0 comments on commit 5b8be42

Please sign in to comment.