mirror of
https://github.com/samsonjs/media.git
synced 2026-04-27 15:07:40 +00:00
SampleStream fixes
This commit is contained in:
parent
75b9062583
commit
3562fe1c69
3 changed files with 43 additions and 17 deletions
|
|
@ -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;
|
||||||
|
|
||||||
/* 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
@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
|
||||||
skipCount = 0;
|
skipCount = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
primarySampleQueue.discardToRead();
|
if (skipCount > 0) {
|
||||||
|
primarySampleQueue.discardToRead();
|
||||||
|
}
|
||||||
return skipCount;
|
return skipCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
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) {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue