From 5698eadc0854753db6ad48bccc433a4bb3ddd5c9 Mon Sep 17 00:00:00 2001 From: tonihei Date: Mon, 16 Nov 2020 13:37:59 +0000 Subject: [PATCH] Discard buffer synchronously after seek before cancelling a load. This ensures the buffer is not full when the `DefaultLoadControl` determines whether we should continue loading and thus prevents a false warning about not having enough memory left. PiperOrigin-RevId: 342616623 --- .../android/exoplayer2/source/ProgressiveMediaPeriod.java | 4 ++++ .../android/exoplayer2/source/chunk/ChunkSampleStream.java | 5 +++++ .../exoplayer2/source/hls/HlsSampleStreamWrapper.java | 6 ++++++ 3 files changed, 15 insertions(+) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaPeriod.java b/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaPeriod.java index 121eeb940d..a5c8ff631d 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaPeriod.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaPeriod.java @@ -435,6 +435,10 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; pendingResetPositionUs = positionUs; loadingFinished = false; if (loader.isLoading()) { + // Discard as much as we can synchronously. + for (SampleQueue sampleQueue : sampleQueues) { + sampleQueue.discardToEnd(); + } loader.cancelLoading(); } else { loader.clearFatalError(); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.java b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.java index 1a451cb0c3..1a5371c83f 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.java @@ -315,6 +315,11 @@ public class ChunkSampleStream implements SampleStream, S mediaChunks.clear(); nextNotifyPrimaryFormatMediaChunkIndex = 0; if (loader.isLoading()) { + // Discard as much as we can synchronously. + primarySampleQueue.discardToEnd(); + for (SampleQueue embeddedSampleQueue : embeddedSampleQueues) { + embeddedSampleQueue.discardToEnd(); + } loader.cancelLoading(); } else { loader.clearFatalError(); diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java index 7f1af4496f..fb1a6c53d9 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java @@ -490,6 +490,12 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; loadingFinished = false; mediaChunks.clear(); if (loader.isLoading()) { + if (sampleQueuesBuilt) { + // Discard as much as we can synchronously. + for (SampleQueue sampleQueue : sampleQueues) { + sampleQueue.discardToEnd(); + } + } loader.cancelLoading(); } else { loader.clearFatalError();