From ed2e4dd91e4a32e7608dbb3fb64edea6df6038dd Mon Sep 17 00:00:00 2001 From: olly Date: Wed, 8 Nov 2017 08:45:17 -0800 Subject: [PATCH] Don't allow cancelation of non-cancelable loads Issue: #3441 ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=175011804 --- .../source/chunk/ChunkSampleStream.java | 28 ++++++++++++------- .../exoplayer2/source/chunk/ChunkSource.java | 3 +- 2 files changed, 20 insertions(+), 11 deletions(-) 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 b64dec59bf..8a9be92d75 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 @@ -15,6 +15,8 @@ */ package com.google.android.exoplayer2.source.chunk; +import android.util.Log; + import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.FormatHolder; @@ -38,6 +40,8 @@ import java.util.List; public class ChunkSampleStream implements SampleStream, SequenceableLoader, Loader.Callback, Loader.ReleaseCallback { + private static final String TAG = "ChunkSampleStream"; + private final int primaryTrackType; private final int[] embeddedTrackTypes; private final boolean[] embeddedTracksSelected; @@ -318,16 +322,20 @@ public class ChunkSampleStream implements SampleStream, S boolean cancelable = bytesLoaded == 0 || !isMediaChunk || !haveReadFromLastMediaChunk(); boolean canceled = false; if (chunkSource.onChunkLoadError(loadable, cancelable, error)) { - canceled = true; - if (isMediaChunk) { - BaseMediaChunk removed = mediaChunks.removeLast(); - Assertions.checkState(removed == loadable); - primarySampleQueue.discardUpstreamSamples(removed.getFirstSampleIndex(0)); - for (int i = 0; i < embeddedSampleQueues.length; i++) { - embeddedSampleQueues[i].discardUpstreamSamples(removed.getFirstSampleIndex(i + 1)); - } - if (mediaChunks.isEmpty()) { - pendingResetPositionUs = lastSeekPositionUs; + if (!cancelable) { + Log.w(TAG, "Ignoring attempt to cancel non-cancelable load."); + } else { + canceled = true; + if (isMediaChunk) { + BaseMediaChunk removed = mediaChunks.removeLast(); + Assertions.checkState(removed == loadable); + primarySampleQueue.discardUpstreamSamples(removed.getFirstSampleIndex(0)); + for (int i = 0; i < embeddedSampleQueues.length; i++) { + embeddedSampleQueues[i].discardUpstreamSamples(removed.getFirstSampleIndex(i + 1)); + } + if (mediaChunks.isEmpty()) { + pendingResetPositionUs = lastSeekPositionUs; + } } } } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSource.java index 6dffc457d6..b04dc7cbdb 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSource.java @@ -85,7 +85,8 @@ public interface ChunkSource { * @param chunk The chunk whose load encountered the error. * @param cancelable Whether the load can be canceled. * @param e The error. - * @return Whether the load should be canceled. + * @return Whether the load should be canceled. Should always be false if {@code cancelable} is + * false. */ boolean onChunkLoadError(Chunk chunk, boolean cancelable, Exception e);