SampleStream fixes

This commit is contained in:
Oliver Woodman 2017-11-22 20:38:53 +00:00
parent 75b9062583
commit 3562fe1c69
3 changed files with 43 additions and 17 deletions

View file

@ -361,7 +361,7 @@ import java.util.Arrays;
// SampleStream methods.
/* package */ boolean isReady(int track) {
return loadingFinished || (!isPendingReset() && sampleQueues[track].hasNextSample());
return !suppressRead() && (loadingFinished || sampleQueues[track].hasNextSample());
}
/* package */ void maybeThrowError() throws IOException {
@ -370,7 +370,7 @@ import java.util.Arrays;
/* package */ int readData(int track, FormatHolder formatHolder, DecoderInputBuffer buffer,
boolean formatRequired) {
if (notifyDiscontinuity || isPendingReset()) {
if (suppressRead()) {
return C.RESULT_NOTHING_READ;
}
return sampleQueues[track].read(formatHolder, buffer, formatRequired, loadingFinished,
@ -378,6 +378,9 @@ import java.util.Arrays;
}
/* package */ int skipData(int track, long positionUs) {
if (suppressRead()) {
return 0;
}
SampleQueue sampleQueue = sampleQueues[track];
if (loadingFinished && positionUs > sampleQueue.getLargestQueuedTimestampUs()) {
return sampleQueue.advanceToEnd();
@ -387,6 +390,10 @@ import java.util.Arrays;
}
}
private boolean suppressRead() {
return notifyDiscontinuity || isPendingReset();
}
// Loader.Callback implementation.
@Override

View file

@ -272,9 +272,11 @@ public class ChunkSampleStream<T extends ChunkSource> implements SampleStream, S
@Override
public int skipData(long positionUs) {
if (isPendingReset()) {
return 0;
}
int skipCount;
if (loadingFinished && positionUs > primarySampleQueue.getLargestQueuedTimestampUs()) {
primarySampleQueue.advanceToEnd();
skipCount = primarySampleQueue.advanceToEnd();
} else {
skipCount = primarySampleQueue.advanceTo(positionUs, true, true);
@ -282,7 +284,9 @@ public class ChunkSampleStream<T extends ChunkSource> implements SampleStream, S
skipCount = 0;
}
}
primarySampleQueue.discardToRead();
if (skipCount > 0) {
primarySampleQueue.discardToRead();
}
return skipCount;
}

View file

@ -385,7 +385,35 @@ import java.util.LinkedList;
if (isPendingReset()) {
return C.RESULT_NOTHING_READ;
}
int result = sampleQueues[trackGroupIndex].read(formatHolder, buffer, requireFormat,
loadingFinished, lastSeekPositionUs);
if (result == C.RESULT_BUFFER_READ) {
discardToRead();
}
return result;
}
public int skipData(int trackGroupIndex, long positionUs) {
if (isPendingReset()) {
return 0;
}
int skipCount;
SampleQueue sampleQueue = sampleQueues[trackGroupIndex];
if (loadingFinished && positionUs > sampleQueue.getLargestQueuedTimestampUs()) {
skipCount = sampleQueue.advanceToEnd();
} else {
skipCount = sampleQueue.advanceTo(positionUs, true, true);
if (skipCount == SampleQueue.ADVANCE_FAILED) {
skipCount = 0;
}
}
if (skipCount > 0) {
discardToRead();
}
return skipCount;
}
private void discardToRead() {
if (!mediaChunks.isEmpty()) {
while (mediaChunks.size() > 1 && finishedReadingChunk(mediaChunks.getFirst())) {
mediaChunks.removeFirst();
@ -399,19 +427,6 @@ import java.util.LinkedList;
}
downstreamTrackFormat = trackFormat;
}
return sampleQueues[trackGroupIndex].read(formatHolder, buffer, requireFormat, loadingFinished,
lastSeekPositionUs);
}
public int skipData(int trackGroupIndex, long positionUs) {
SampleQueue sampleQueue = sampleQueues[trackGroupIndex];
if (loadingFinished && positionUs > sampleQueue.getLargestQueuedTimestampUs()) {
return sampleQueue.advanceToEnd();
} else {
int skipCount = sampleQueue.advanceTo(positionUs, true, true);
return skipCount == SampleQueue.ADVANCE_FAILED ? 0 : skipCount;
}
}
private boolean finishedReadingChunk(HlsMediaChunk chunk) {