Commit 3562fe1c by Oliver Woodman

SampleStream fixes

parent 75b90625
...@@ -361,7 +361,7 @@ import java.util.Arrays; ...@@ -361,7 +361,7 @@ import java.util.Arrays;
// SampleStream methods. // SampleStream methods.
/* package */ boolean isReady(int track) { /* package */ boolean isReady(int track) {
return loadingFinished || (!isPendingReset() && sampleQueues[track].hasNextSample()); return !suppressRead() && (loadingFinished || sampleQueues[track].hasNextSample());
} }
/* package */ void maybeThrowError() throws IOException { /* package */ void maybeThrowError() throws IOException {
...@@ -370,7 +370,7 @@ import java.util.Arrays; ...@@ -370,7 +370,7 @@ import java.util.Arrays;
/* package */ int readData(int track, FormatHolder formatHolder, DecoderInputBuffer buffer, /* package */ int readData(int track, FormatHolder formatHolder, DecoderInputBuffer buffer,
boolean formatRequired) { boolean formatRequired) {
if (notifyDiscontinuity || isPendingReset()) { if (suppressRead()) {
return C.RESULT_NOTHING_READ; return C.RESULT_NOTHING_READ;
} }
return sampleQueues[track].read(formatHolder, buffer, formatRequired, loadingFinished, return sampleQueues[track].read(formatHolder, buffer, formatRequired, loadingFinished,
...@@ -378,6 +378,9 @@ import java.util.Arrays; ...@@ -378,6 +378,9 @@ import java.util.Arrays;
} }
/* package */ int skipData(int track, long positionUs) { /* package */ int skipData(int track, long positionUs) {
if (suppressRead()) {
return 0;
}
SampleQueue sampleQueue = sampleQueues[track]; SampleQueue sampleQueue = sampleQueues[track];
if (loadingFinished && positionUs > sampleQueue.getLargestQueuedTimestampUs()) { if (loadingFinished && positionUs > sampleQueue.getLargestQueuedTimestampUs()) {
return sampleQueue.advanceToEnd(); return sampleQueue.advanceToEnd();
...@@ -387,6 +390,10 @@ import java.util.Arrays; ...@@ -387,6 +390,10 @@ import java.util.Arrays;
} }
} }
private boolean suppressRead() {
return notifyDiscontinuity || isPendingReset();
}
// Loader.Callback implementation. // Loader.Callback implementation.
@Override @Override
......
...@@ -272,9 +272,11 @@ public class ChunkSampleStream<T extends ChunkSource> implements SampleStream, S ...@@ -272,9 +272,11 @@ public class ChunkSampleStream<T extends ChunkSource> implements SampleStream, S
@Override @Override
public int skipData(long positionUs) { public int skipData(long positionUs) {
if (isPendingReset()) {
return 0;
}
int skipCount; int skipCount;
if (loadingFinished && positionUs > primarySampleQueue.getLargestQueuedTimestampUs()) { if (loadingFinished && positionUs > primarySampleQueue.getLargestQueuedTimestampUs()) {
primarySampleQueue.advanceToEnd();
skipCount = primarySampleQueue.advanceToEnd(); skipCount = primarySampleQueue.advanceToEnd();
} else { } else {
skipCount = primarySampleQueue.advanceTo(positionUs, true, true); skipCount = primarySampleQueue.advanceTo(positionUs, true, true);
...@@ -282,7 +284,9 @@ public class ChunkSampleStream<T extends ChunkSource> implements SampleStream, S ...@@ -282,7 +284,9 @@ public class ChunkSampleStream<T extends ChunkSource> implements SampleStream, S
skipCount = 0; skipCount = 0;
} }
} }
primarySampleQueue.discardToRead(); if (skipCount > 0) {
primarySampleQueue.discardToRead();
}
return skipCount; return skipCount;
} }
......
...@@ -385,7 +385,35 @@ import java.util.LinkedList; ...@@ -385,7 +385,35 @@ import java.util.LinkedList;
if (isPendingReset()) { if (isPendingReset()) {
return C.RESULT_NOTHING_READ; 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()) { if (!mediaChunks.isEmpty()) {
while (mediaChunks.size() > 1 && finishedReadingChunk(mediaChunks.getFirst())) { while (mediaChunks.size() > 1 && finishedReadingChunk(mediaChunks.getFirst())) {
mediaChunks.removeFirst(); mediaChunks.removeFirst();
...@@ -399,19 +427,6 @@ import java.util.LinkedList; ...@@ -399,19 +427,6 @@ import java.util.LinkedList;
} }
downstreamTrackFormat = trackFormat; 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) { private boolean finishedReadingChunk(HlsMediaChunk chunk) {
......
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