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 9d5a405c2f..b64dec59bf 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,7 +315,7 @@ public class ChunkSampleStream implements SampleStream, S IOException error) { long bytesLoaded = loadable.bytesLoaded(); boolean isMediaChunk = isMediaChunk(loadable); - boolean cancelable = !isMediaChunk || bytesLoaded == 0 || mediaChunks.size() > 1; + boolean cancelable = bytesLoaded == 0 || !isMediaChunk || !haveReadFromLastMediaChunk(); boolean canceled = false; if (chunkSource.onChunkLoadError(loadable, cancelable, error)) { canceled = true; @@ -415,6 +415,22 @@ public class ChunkSampleStream implements SampleStream, S return chunk instanceof BaseMediaChunk; } + /** + * Returns whether samples have been read from {@code mediaChunks.getLast()}. + */ + private boolean haveReadFromLastMediaChunk() { + BaseMediaChunk lastChunk = mediaChunks.getLast(); + if (primarySampleQueue.getReadIndex() > lastChunk.getFirstSampleIndex(0)) { + return true; + } + for (int i = 0; i < embeddedSampleQueues.length; i++) { + if (embeddedSampleQueues[i].getReadIndex() > lastChunk.getFirstSampleIndex(i + 1)) { + return true; + } + } + return false; + } + /* package */ boolean isPendingReset() { return pendingResetPositionUs != C.TIME_UNSET; }