Fix buffer re-evaluation edge cases
------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=179917833
This commit is contained in:
parent
7fb296dab9
commit
6f4110f3f8
@ -408,8 +408,31 @@ public class ChunkSampleStream<T extends ChunkSource> implements SampleStream, S
|
|||||||
if (loader.isLoading() || isPendingReset()) {
|
if (loader.isLoading() || isPendingReset()) {
|
||||||
return;
|
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
|
// Internal methods
|
||||||
@ -483,37 +506,6 @@ public class ChunkSampleStream<T extends ChunkSource> implements SampleStream, S
|
|||||||
return mediaChunks.get(mediaChunks.size() - 1);
|
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
|
* Discard upstream media chunks from {@code chunkIndex} and corresponding samples from sample
|
||||||
* queues.
|
* queues.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user