diff --git a/RELEASENOTES.md b/RELEASENOTES.md index d6eba89c0e7..eaec2111352 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -61,6 +61,8 @@ * Cronet extension: * RTMP extension: * HLS extension: + * Prevent excessive reloads by waiting for half the part target duration + when `CAN-BLOCK-RELOAD=YES` is not honored. * DASH extension: * Smooth Streaming extension: * RTSP extension: diff --git a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/DefaultHlsPlaylistTracker.java b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/DefaultHlsPlaylistTracker.java index 9f8cce43739..6a4c013d003 100644 --- a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/DefaultHlsPlaylistTracker.java +++ b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/DefaultHlsPlaylistTracker.java @@ -853,6 +853,13 @@ private void processLoadedPlaylist( playlistSnapshot != oldPlaylist ? playlistSnapshot.targetDurationUs : (playlistSnapshot.targetDurationUs / 2); + } else if ( + playlistSnapshot == oldPlaylist && playlistSnapshot.partTargetDurationUs != C.TIME_UNSET + ) { + // To prevent infinite requests when the server responds with CAN-BLOCK-RELOAD=YES but does + // not actually block until the playlist updates, wait for half the part target duration + // before retrying. + durationUntilNextLoadUs = playlistSnapshot.partTargetDurationUs / 2; } earliestNextLoadTimeMs = currentTimeMs + Util.usToMs(durationUntilNextLoadUs) - loadEventInfo.loadDurationMs;