diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java index 6d8725e9fa..d81eb16b83 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java @@ -661,6 +661,8 @@ import java.util.concurrent.CopyOnWriteArrayList; maskingPeriodIndex = getCurrentPeriodIndex(); maskingWindowPositionMs = getCurrentPosition(); } + // Also reset period-based PlaybackInfo positions if resetting the state. + resetPosition = resetPosition || resetState; MediaPeriodId mediaPeriodId = resetPosition ? playbackInfo.getDummyFirstMediaPeriodId(shuffleModeEnabled, window) 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 4c8cda9e27..9dbe8f2e90 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 @@ -436,12 +436,6 @@ import java.util.concurrent.atomic.AtomicBoolean; private void prepareInternal(MediaSource mediaSource, boolean resetPosition, boolean resetState) { pendingPrepareCount++; - if (!resetPosition && pendingInitialSeekPosition == null && !playbackInfo.timeline.isEmpty()) { - playbackInfo.timeline.getPeriodByUid(playbackInfo.periodId.periodUid, period); - long windowPositionUs = playbackInfo.positionUs + period.getPositionInWindowUs(); - pendingInitialSeekPosition = - new SeekPosition(Timeline.EMPTY, period.windowIndex, windowPositionUs); - } resetInternal( /* resetRenderers= */ false, /* releaseMediaSource= */ true, resetPosition, resetState); loadControl.onPrepared(); @@ -864,11 +858,23 @@ import java.util.concurrent.atomic.AtomicBoolean; } } enabledRenderers = new Renderer[0]; - queue.clear(/* keepFrontPeriodUid= */ !resetPosition); - setIsLoading(false); + if (resetPosition) { pendingInitialSeekPosition = null; + } else if (resetState) { + // When resetting the state, also reset the period-based PlaybackInfo position and convert + // existing position to initial seek instead. + resetPosition = true; + if (pendingInitialSeekPosition == null && !playbackInfo.timeline.isEmpty()) { + playbackInfo.timeline.getPeriodByUid(playbackInfo.periodId.periodUid, period); + long windowPositionUs = playbackInfo.positionUs + period.getPositionInWindowUs(); + pendingInitialSeekPosition = + new SeekPosition(Timeline.EMPTY, period.windowIndex, windowPositionUs); + } } + + queue.clear(/* keepFrontPeriodUid= */ !resetPosition); + setIsLoading(false); if (resetState) { queue.setTimeline(Timeline.EMPTY); for (PendingMessageInfo pendingMessageInfo : pendingMessages) {