diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java index 664801ffd4..f5c4b40d55 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java @@ -113,6 +113,7 @@ import java.util.concurrent.atomic.AtomicBoolean; private boolean released; private boolean playWhenReady; private boolean rebuffering; + private boolean shouldContinueLoading; @Player.RepeatMode private int repeatMode; private boolean shuffleModeEnabled; private boolean foregroundMode; @@ -415,12 +416,6 @@ import java.util.concurrent.atomic.AtomicBoolean; } } - private void setIsLoading(boolean isLoading) { - if (playbackInfo.isLoading != isLoading) { - playbackInfo = playbackInfo.copyWithIsLoading(isLoading); - } - } - private void maybeNotifyPlaybackInfoChanged() { if (playbackInfoUpdate.hasPendingUpdate(playbackInfo)) { eventHandler @@ -921,7 +916,7 @@ import java.util.concurrent.atomic.AtomicBoolean; } queue.clear(/* keepFrontPeriodUid= */ !resetState); - setIsLoading(false); + shouldContinueLoading = false; if (resetState) { queue.setTimeline(Timeline.EMPTY); for (PendingMessageInfo pendingMessageInfo : pendingMessages) { @@ -1546,17 +1541,16 @@ import java.util.concurrent.atomic.AtomicBoolean; info, emptyTrackSelectorResult); mediaPeriodHolder.mediaPeriod.prepare(this, info.startPositionUs); - setIsLoading(true); if (queue.getPlayingPeriod() == mediaPeriodHolder) { resetRendererPosition(mediaPeriodHolder.getStartPositionRendererTime()); } handleLoadingMediaPeriodChanged(/* loadingTrackSelectionChanged= */ false); } } - MediaPeriodHolder loadingPeriodHolder = queue.getLoadingPeriod(); - if (loadingPeriodHolder == null || loadingPeriodHolder.isFullyBuffered()) { - setIsLoading(false); - } else if (!playbackInfo.isLoading) { + if (shouldContinueLoading) { + shouldContinueLoading = isLoadingPossible(); + updateIsLoading(); + } else { maybeContinueLoading(); } } @@ -1757,20 +1751,41 @@ import java.util.concurrent.atomic.AtomicBoolean; } private void maybeContinueLoading() { - MediaPeriodHolder loadingPeriodHolder = queue.getLoadingPeriod(); - long nextLoadPositionUs = loadingPeriodHolder.getNextLoadPositionUs(); - if (nextLoadPositionUs == C.TIME_END_OF_SOURCE) { - setIsLoading(false); - return; + shouldContinueLoading = shouldContinueLoading(); + if (shouldContinueLoading) { + queue.getLoadingPeriod().continueLoading(rendererPositionUs); + } + updateIsLoading(); + } + + private boolean shouldContinueLoading() { + if (!isLoadingPossible()) { + return false; } long bufferedDurationUs = - getTotalBufferedDurationUs(/* bufferedPositionInLoadingPeriodUs= */ nextLoadPositionUs); - boolean continueLoading = - loadControl.shouldContinueLoading( - bufferedDurationUs, mediaClock.getPlaybackParameters().speed); - setIsLoading(continueLoading); - if (continueLoading) { - loadingPeriodHolder.continueLoading(rendererPositionUs); + getTotalBufferedDurationUs(queue.getLoadingPeriod().getNextLoadPositionUs()); + float playbackSpeed = mediaClock.getPlaybackParameters().speed; + return loadControl.shouldContinueLoading(bufferedDurationUs, playbackSpeed); + } + + private boolean isLoadingPossible() { + MediaPeriodHolder loadingPeriodHolder = queue.getLoadingPeriod(); + if (loadingPeriodHolder == null) { + return false; + } + long nextLoadPositionUs = loadingPeriodHolder.getNextLoadPositionUs(); + if (nextLoadPositionUs == C.TIME_END_OF_SOURCE) { + return false; + } + return true; + } + + private void updateIsLoading() { + MediaPeriodHolder loadingPeriod = queue.getLoadingPeriod(); + boolean isLoading = + shouldContinueLoading || (loadingPeriod != null && loadingPeriod.mediaPeriod.isLoading()); + if (isLoading != playbackInfo.isLoading) { + playbackInfo = playbackInfo.copyWithIsLoading(isLoading); } }