From edc44eefd25b0728be990c229a067de4695f5b85 Mon Sep 17 00:00:00 2001 From: michaelkatz Date: Wed, 5 Feb 2025 07:26:30 -0800 Subject: [PATCH] Limit dynamic scheduling by the playing period transition point In the case of replace stream media item transition, it is important that dynamic scheduling does not set the next work task later than the transition boundary. #cherrypick PiperOrigin-RevId: 723502204 --- .../media3/exoplayer/ExoPlayerImplInternal.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayerImplInternal.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayerImplInternal.java index c0d7612936..6d0ff9d2c8 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayerImplInternal.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayerImplInternal.java @@ -1377,6 +1377,16 @@ import java.util.concurrent.atomic.AtomicBoolean; rendererHolder.getMinDurationToProgressUs( rendererPositionUs, rendererPositionElapsedRealtimeUs))); } + + // Do not schedule next doSomeWork past the playing period transition point. + MediaPeriodHolder nextPlayingPeriodHolder = + queue.getPlayingPeriod() != null ? queue.getPlayingPeriod().getNext() : null; + if (nextPlayingPeriodHolder != null + && rendererPositionUs + + msToUs(wakeUpTimeIntervalMs) * playbackInfo.playbackParameters.speed + >= nextPlayingPeriodHolder.getStartPositionRendererTime()) { + wakeUpTimeIntervalMs = min(wakeUpTimeIntervalMs, BUFFERING_MAXIMUM_INTERVAL_MS); + } } handler.sendEmptyMessageAtTime( MSG_DO_SOME_WORK, thisOperationStartTimeMs + wakeUpTimeIntervalMs);