From 4297800f38a188f858da96ddf888c20f010f86e2 Mon Sep 17 00:00:00 2001 From: tonihei Date: Fri, 4 Oct 2019 08:38:06 +0100 Subject: [PATCH] Update logic to set isLoading. We currently set it to shouldContinueLoading, which isn't correct if shouldContinueLoading is set to false and we still have an ongoing load. Change it to also be true if the media period is still loading. PiperOrigin-RevId: 272823473 --- .../exoplayer2/ExoPlayerImplInternal.java | 63 ++++++++++++------- 1 file changed, 39 insertions(+), 24 deletions(-) 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); } }