diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java index e21e15fa58..caf64d4e90 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java @@ -541,7 +541,7 @@ import java.io.IOException; TraceUtil.beginSection("doSomeWork"); updatePlaybackPositions(); - playingPeriodHolder.mediaPeriod.discardBuffer(playbackInfo.positionUs); + playingPeriodHolder.mediaPeriod.discardBuffer(playbackInfo.positionUs, false); boolean allRenderersEnded = true; boolean allRenderersReadyOrEnded = true; @@ -732,7 +732,7 @@ import java.io.IOException; setPlayingPeriodHolder(newPlayingPeriodHolder); if (playingPeriodHolder.hasEnabledTracks) { periodPositionUs = playingPeriodHolder.mediaPeriod.seekToUs(periodPositionUs); - playingPeriodHolder.mediaPeriod.discardBuffer(periodPositionUs); + playingPeriodHolder.mediaPeriod.discardBuffer(periodPositionUs, false); } resetRendererPosition(periodPositionUs); maybeContinueLoading(); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/ClippingMediaPeriod.java b/library/core/src/main/java/com/google/android/exoplayer2/source/ClippingMediaPeriod.java index 89af07a3f0..7742444323 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/ClippingMediaPeriod.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/ClippingMediaPeriod.java @@ -121,8 +121,8 @@ public final class ClippingMediaPeriod implements MediaPeriod, MediaPeriod.Callb } @Override - public void discardBuffer(long positionUs) { - mediaPeriod.discardBuffer(positionUs + startUs); + public void discardBuffer(long positionUs, boolean toKeyframe) { + mediaPeriod.discardBuffer(positionUs + startUs, toKeyframe); } @Override diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/DynamicConcatenatingMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/DynamicConcatenatingMediaSource.java index e80abad3ef..6b5c8b2637 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/DynamicConcatenatingMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/DynamicConcatenatingMediaSource.java @@ -824,8 +824,8 @@ public final class DynamicConcatenatingMediaSource implements MediaSource, ExoPl } @Override - public void discardBuffer(long positionUs) { - mediaPeriod.discardBuffer(positionUs); + public void discardBuffer(long positionUs, boolean toKeyframe) { + mediaPeriod.discardBuffer(positionUs, toKeyframe); } @Override 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 d112d5eaf1..086d62e41d 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 @@ -276,10 +276,10 @@ import java.util.Arrays; } @Override - public void discardBuffer(long positionUs) { + public void discardBuffer(long positionUs, boolean toKeyframe) { int trackCount = sampleQueues.length; for (int i = 0; i < trackCount; i++) { - sampleQueues[i].discardTo(positionUs, false, trackEnabledStates[i]); + sampleQueues[i].discardTo(positionUs, toKeyframe, trackEnabledStates[i]); } } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/MediaPeriod.java b/library/core/src/main/java/com/google/android/exoplayer2/source/MediaPeriod.java index c297229d78..439562e0ab 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/MediaPeriod.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/MediaPeriod.java @@ -116,8 +116,10 @@ public interface MediaPeriod extends SequenceableLoader { * This method should only be called after the period has been prepared. * * @param positionUs The position in microseconds. + * @param toKeyframe If true then for each track discards samples up to the keyframe before or at + * the specified position, rather than any sample before or at that position. */ - void discardBuffer(long positionUs); + void discardBuffer(long positionUs, boolean toKeyframe); /** * Attempts to read a discontinuity. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/MergingMediaPeriod.java b/library/core/src/main/java/com/google/android/exoplayer2/source/MergingMediaPeriod.java index e6a4d4e603..786a4693d0 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/MergingMediaPeriod.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/MergingMediaPeriod.java @@ -129,9 +129,9 @@ import java.util.IdentityHashMap; } @Override - public void discardBuffer(long positionUs) { + public void discardBuffer(long positionUs, boolean toKeyframe) { for (MediaPeriod period : enabledPeriods) { - period.discardBuffer(positionUs); + period.discardBuffer(positionUs, toKeyframe); } } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaPeriod.java b/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaPeriod.java index 6101c79b7f..0cea0fad66 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaPeriod.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaPeriod.java @@ -116,7 +116,7 @@ import java.util.Arrays; } @Override - public void discardBuffer(long positionUs) { + public void discardBuffer(long positionUs, boolean toKeyframe) { // Do nothing. } 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 ca83f67c90..53742238ef 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 @@ -114,11 +114,13 @@ public class ChunkSampleStream implements SampleStream, S * Discards buffered media up to the specified position. * * @param positionUs The position to discard up to, in microseconds. + * @param toKeyframe If true then for each track discards samples up to the keyframe before or at + * the specified position, rather than any sample before or at that position. */ - public void discardBuffer(long positionUs) { - primarySampleQueue.discardTo(positionUs, false, true); + public void discardBuffer(long positionUs, boolean toKeyframe) { + primarySampleQueue.discardTo(positionUs, toKeyframe, true); for (int i = 0; i < embeddedSampleQueues.length; i++) { - embeddedSampleQueues[i].discardTo(positionUs, true, embeddedTracksSelected[i]); + embeddedSampleQueues[i].discardTo(positionUs, toKeyframe, embeddedTracksSelected[i]); } discardDownstreamMediaChunks(primarySampleQueue.getFirstIndex()); } diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaPeriod.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaPeriod.java index 3680dac821..5a60ee46ae 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaPeriod.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaPeriod.java @@ -259,9 +259,9 @@ import java.util.Map; } @Override - public void discardBuffer(long positionUs) { + public void discardBuffer(long positionUs, boolean toKeyframe) { for (ChunkSampleStream sampleStream : sampleStreams) { - sampleStream.discardBuffer(positionUs); + sampleStream.discardBuffer(positionUs, toKeyframe); } } diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaPeriod.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaPeriod.java index ea9e52e62e..bc2b92cfe8 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaPeriod.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaPeriod.java @@ -183,9 +183,9 @@ public final class HlsMediaPeriod implements MediaPeriod, HlsSampleStreamWrapper } @Override - public void discardBuffer(long positionUs) { + public void discardBuffer(long positionUs, boolean toKeyframe) { for (HlsSampleStreamWrapper sampleStreamWrapper : enabledSampleStreamWrappers) { - sampleStreamWrapper.discardBuffer(positionUs); + sampleStreamWrapper.discardBuffer(positionUs, toKeyframe); } } 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 07b60f05b0..adedee7e83 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 @@ -291,10 +291,10 @@ import java.util.LinkedList; return seekRequired; } - public void discardBuffer(long positionUs) { + public void discardBuffer(long positionUs, boolean toKeyframe) { int sampleQueueCount = sampleQueues.length; for (int i = 0; i < sampleQueueCount; i++) { - sampleQueues[i].discardTo(positionUs, false, sampleQueuesEnabledStates[i]); + sampleQueues[i].discardTo(positionUs, toKeyframe, sampleQueuesEnabledStates[i]); } } diff --git a/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaPeriod.java b/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaPeriod.java index 05fe22226f..3c51abcd49 100644 --- a/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaPeriod.java +++ b/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaPeriod.java @@ -138,9 +138,9 @@ import java.util.ArrayList; } @Override - public void discardBuffer(long positionUs) { + public void discardBuffer(long positionUs, boolean toKeyframe) { for (ChunkSampleStream sampleStream : sampleStreams) { - sampleStream.discardBuffer(positionUs); + sampleStream.discardBuffer(positionUs, toKeyframe); } } diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaPeriod.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaPeriod.java index 38a5e37fa5..153a427bbd 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaPeriod.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaPeriod.java @@ -85,7 +85,7 @@ public class FakeMediaPeriod implements MediaPeriod { } @Override - public void discardBuffer(long positionUs) { + public void discardBuffer(long positionUs, boolean toKeyframe) { // Do nothing. }