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 4c0c840b4c..e02e208bcf 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayerImplInternal.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayerImplInternal.java @@ -965,6 +965,13 @@ import java.util.concurrent.atomic.AtomicBoolean; ? playingPeriodHolder.mediaPeriod.readDiscontinuity() : C.TIME_UNSET; if (discontinuityPositionUs != C.TIME_UNSET) { + if (!playingPeriodHolder.isFullyBuffered()) { + // The discontinuity caused the period to not be fully buffered. Continue loading from this + // period again and discard all other periods we already started loading. + queue.removeAfter(playingPeriodHolder); + handleLoadingMediaPeriodChanged(/* loadingTrackSelectionChanged= */ false); + maybeContinueLoading(); + } resetRendererPosition(discontinuityPositionUs); // A MediaPeriod may report a discontinuity at the current playback position to ensure the // renderers are flushed. Only report the discontinuity externally if the position changed. diff --git a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/e2etest/MergingPlaylistPlaybackTest.java b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/e2etest/MergingPlaylistPlaybackTest.java index e2180aa814..555a2f3419 100644 --- a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/e2etest/MergingPlaylistPlaybackTest.java +++ b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/e2etest/MergingPlaylistPlaybackTest.java @@ -15,8 +15,6 @@ */ package androidx.media3.exoplayer.e2etest; -import static org.junit.Assume.assumeTrue; - import android.content.Context; import android.graphics.SurfaceTexture; import android.view.Surface; @@ -86,11 +84,6 @@ public final class MergingPlaylistPlaybackTest { @Test public void test() throws Exception { - // TODO: These cases are reliably failing due to a bug in ExoPlayerImplInternal that doesn't - // reset its loading period when reading a discontinuity and the current period requires more - // loading as a result. - assumeTrue(!firstItemVideoClipped); - Context applicationContext = ApplicationProvider.getApplicationContext(); CapturingRenderersFactory capturingRenderersFactory = new CapturingRenderersFactory(applicationContext);