From 8349d7849ee29d863b9382a90ef060e254a3e25e Mon Sep 17 00:00:00 2001 From: tonihei Date: Tue, 1 Dec 2020 10:02:49 +0000 Subject: [PATCH] Prevent reading into preload parts. This is to ensure we can still discard the data if needed. Issue: #5011 PiperOrigin-RevId: 344977548 --- .../source/hls/HlsSampleStreamWrapper.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) 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 2255151b92..66de6698b6 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 @@ -596,6 +596,11 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; downstreamTrackFormat = trackFormat; } + if (!mediaChunks.isEmpty() && !mediaChunks.get(0).isPublished()) { + // Don't read into preload chunks until we can be sure they are permanently published. + return C.RESULT_NOTHING_READ; + } + int result = sampleQueues[sampleQueueIndex].read(formatHolder, buffer, requireFormat, loadingFinished); if (result == C.RESULT_FORMAT_READ) { @@ -625,6 +630,21 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; SampleQueue sampleQueue = sampleQueues[sampleQueueIndex]; int skipCount = sampleQueue.getSkipCount(positionUs, loadingFinished); + + // Ensure we don't skip into preload chunks until we can be sure they are permanently published. + int readIndex = sampleQueue.getReadIndex(); + for (int i = 0; i < mediaChunks.size(); i++) { + HlsMediaChunk mediaChunk = mediaChunks.get(i); + int firstSampleIndex = mediaChunks.get(i).getFirstSampleIndex(sampleQueueIndex); + if (readIndex + skipCount <= firstSampleIndex) { + break; + } + if (!mediaChunk.isPublished()) { + skipCount = firstSampleIndex - readIndex; + break; + } + } + sampleQueue.skip(skipCount); return skipCount; }