diff --git a/RELEASENOTES.md b/RELEASENOTES.md index a4a335b981..71d5b046ff 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -9,6 +9,9 @@ * Extractors: * Add support for MPEG-H 3D Audio in MP4 extractors ([#8860](https://github.com/google/ExoPlayer/pull/8860)). +* HLS + * Fix a bug where skipping into spliced-in chunks triggered an assertion + error ([#8937](https://github.com/google/ExoPlayer/issues/8937). ### 2.14.0 (2021-05-13) 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 61afe9bcd8..37468bfb1d 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 @@ -18,6 +18,7 @@ package com.google.android.exoplayer2.source.hls; import static com.google.android.exoplayer2.source.hls.HlsChunkSource.CHUNK_PUBLICATION_STATE_PUBLISHED; import static com.google.android.exoplayer2.source.hls.HlsChunkSource.CHUNK_PUBLICATION_STATE_REMOVED; import static java.lang.Math.max; +import static java.lang.Math.min; import android.net.Uri; import android.os.Handler; @@ -636,17 +637,11 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; int skipCount = sampleQueue.getSkipCount(positionUs, loadingFinished); // Ensure we don't skip into preload chunks until we can be sure they are permanently published. - int readIndex = sampleQueue.getReadIndex(); - for (int i = 0; i < mediaChunks.size(); i++) { - HlsMediaChunk mediaChunk = mediaChunks.get(i); - int firstSampleIndex = mediaChunks.get(i).getFirstSampleIndex(sampleQueueIndex); - if (readIndex + skipCount <= firstSampleIndex) { - break; - } - if (!mediaChunk.isPublished()) { - skipCount = firstSampleIndex - readIndex; - break; - } + @Nullable HlsMediaChunk lastChunk = Iterables.getLast(mediaChunks, /* defaultValue= */ null); + if (lastChunk != null && !lastChunk.isPublished()) { + int readIndex = sampleQueue.getReadIndex(); + int firstSampleIndex = lastChunk.getFirstSampleIndex(sampleQueueIndex); + skipCount = min(skipCount, firstSampleIndex - readIndex); } sampleQueue.skip(skipCount);