Commit d90d0419 by olly Committed by Oliver Woodman

Allow chunk cancelation only if nothing has been consumed from it.

The mediaChunks.size() > 1 check was supposed to ensure this, and
did roughly the right thing when there was only a single stream
(although it was unnecessarily restrictive in preventing chunk
cancelation for the first chunk, where bytesLoaded != 0 and none
of the samples had been consumed).

Now we have multiple streams the check doesn't do the right thing,
and adding a back-buffer feature will make even more incorrect.
This change switches to checking the condition we actually want
to check directly :).

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=174449398
parent b6b09ad4
...@@ -315,7 +315,7 @@ public class ChunkSampleStream<T extends ChunkSource> implements SampleStream, S ...@@ -315,7 +315,7 @@ public class ChunkSampleStream<T extends ChunkSource> implements SampleStream, S
IOException error) { IOException error) {
long bytesLoaded = loadable.bytesLoaded(); long bytesLoaded = loadable.bytesLoaded();
boolean isMediaChunk = isMediaChunk(loadable); boolean isMediaChunk = isMediaChunk(loadable);
boolean cancelable = !isMediaChunk || bytesLoaded == 0 || mediaChunks.size() > 1; boolean cancelable = bytesLoaded == 0 || !isMediaChunk || !haveReadFromLastMediaChunk();
boolean canceled = false; boolean canceled = false;
if (chunkSource.onChunkLoadError(loadable, cancelable, error)) { if (chunkSource.onChunkLoadError(loadable, cancelable, error)) {
canceled = true; canceled = true;
...@@ -415,6 +415,22 @@ public class ChunkSampleStream<T extends ChunkSource> implements SampleStream, S ...@@ -415,6 +415,22 @@ public class ChunkSampleStream<T extends ChunkSource> implements SampleStream, S
return chunk instanceof BaseMediaChunk; 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() { /* package */ boolean isPendingReset() {
return pendingResetPositionUs != C.TIME_UNSET; return pendingResetPositionUs != C.TIME_UNSET;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment