From 3562fe1c69c8a085ff5c92449a6d4b2ff95a133e Mon Sep 17 00:00:00 2001 From: Oliver Woodman Date: Wed, 22 Nov 2017 20:38:53 +0000 Subject: [PATCH] SampleStream fixes --- .../source/ExtractorMediaPeriod.java | 11 ++++- .../source/chunk/ChunkSampleStream.java | 8 +++- .../source/hls/HlsSampleStreamWrapper.java | 41 +++++++++++++------ 3 files changed, 43 insertions(+), 17 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaPeriod.java b/library/core/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaPeriod.java index c418c427f7..1228061cde 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaPeriod.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaPeriod.java @@ -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 diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.java b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.java index 8a9be92d75..bb51ae074e 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.java @@ -272,9 +272,11 @@ public class ChunkSampleStream 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 implements SampleStream, S skipCount = 0; } } - primarySampleQueue.discardToRead(); + if (skipCount > 0) { + primarySampleQueue.discardToRead(); + } return skipCount; } diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java index 3eae83624b..ddd6689fa6 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java @@ -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) {