Fix buffer re-evaluation edge cases

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=179917833
This commit is contained in:
olly 2017-12-22 05:28:52 -08:00 committed by Oliver Woodman
parent 7fb296dab9
commit 6f4110f3f8

View File

@ -408,8 +408,31 @@ public class ChunkSampleStream<T extends ChunkSource> implements SampleStream, S
if (loader.isLoading() || isPendingReset()) {
return;
}
int queueSize = chunkSource.getPreferredQueueSize(positionUs, readOnlyMediaChunks);
discardUpstreamMediaChunks(queueSize);
int currentQueueSize = mediaChunks.size();
int preferredQueueSize = chunkSource.getPreferredQueueSize(positionUs, readOnlyMediaChunks);
if (currentQueueSize <= preferredQueueSize) {
return;
}
int newQueueSize = currentQueueSize;
for (int i = preferredQueueSize; i < currentQueueSize; i++) {
if (!haveReadFromMediaChunk(i)) {
newQueueSize = i;
break;
}
}
if (newQueueSize == currentQueueSize) {
return;
}
long endTimeUs = getLastMediaChunk().endTimeUs;
BaseMediaChunk firstRemovedChunk = discardUpstreamMediaChunksFromIndex(newQueueSize);
if (mediaChunks.isEmpty()) {
pendingResetPositionUs = lastSeekPositionUs;
}
loadingFinished = false;
eventDispatcher.upstreamDiscarded(primaryTrackType, firstRemovedChunk.startTimeUs, endTimeUs);
}
// Internal methods
@ -483,37 +506,6 @@ public class ChunkSampleStream<T extends ChunkSource> implements SampleStream, S
return mediaChunks.get(mediaChunks.size() - 1);
}
/**
* Discard upstream media chunks until the queue length is equal to the length specified, but
* avoid discarding any chunk whose samples have been read by either primary sample stream or
* embedded sample streams.
*
* @param desiredQueueSize The desired length of the queue. The final queue size after discarding
* maybe larger than this if there are chunks after the specified position that have been read
* by either primary sample stream or embedded sample streams.
*/
private void discardUpstreamMediaChunks(int desiredQueueSize) {
if (mediaChunks.size() <= desiredQueueSize) {
return;
}
int firstIndexToRemove = desiredQueueSize;
for (int i = firstIndexToRemove; i < mediaChunks.size(); i++) {
if (!haveReadFromMediaChunk(i)) {
firstIndexToRemove = i;
break;
}
}
if (firstIndexToRemove == mediaChunks.size()) {
return;
}
long endTimeUs = getLastMediaChunk().endTimeUs;
BaseMediaChunk firstRemovedChunk = discardUpstreamMediaChunksFromIndex(firstIndexToRemove);
loadingFinished = false;
eventDispatcher.upstreamDiscarded(primaryTrackType, firstRemovedChunk.startTimeUs, endTimeUs);
}
/**
* Discard upstream media chunks from {@code chunkIndex} and corresponding samples from sample
* queues.