From 4b1b924cf1ec7b54e8d9e21b5b2d5bd9ffd8740f Mon Sep 17 00:00:00 2001 From: mdobrzyn71 Date: Tue, 6 Oct 2020 10:51:49 -0700 Subject: [PATCH] Fix for Apple's I-Frame-only stream playback. See bug: https://github.com/google/ExoPlayer/issues/7512 --- .../source/hls/BundledHlsMediaChunkExtractor.java | 5 +++++ .../android/exoplayer2/source/hls/HlsMediaChunk.java | 9 +++++++++ .../exoplayer2/source/hls/HlsMediaChunkExtractor.java | 8 ++++++++ 3 files changed, 22 insertions(+) diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/BundledHlsMediaChunkExtractor.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/BundledHlsMediaChunkExtractor.java index 78fc9ae732..6c5ece1c08 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/BundledHlsMediaChunkExtractor.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/BundledHlsMediaChunkExtractor.java @@ -67,6 +67,11 @@ public final class BundledHlsMediaChunkExtractor implements HlsMediaChunkExtract return extractor.read(extractorInput, POSITION_HOLDER) == Extractor.RESULT_CONTINUE; } + @Override + public void seek(long position, long timeUs) { + extractor.seek( position, timeUs ); + } + @Override public boolean isPackedAudioExtractor() { return extractor instanceof AdtsExtractor diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaChunk.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaChunk.java index 9994ede1cf..a275abf503 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaChunk.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaChunk.java @@ -403,6 +403,15 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; } try { while (!loadCanceled && extractor.read(input)) {} + } catch(EOFException e) { + // See bug: https://github.com/google/ExoPlayer/issues/7512 for more details. + if( input.getPosition() == dataSpec.position + input.getLength() ) { + extractor.seek(0, C.TIME_UNSET); + } + else { + e.fillInStackTrace(); + throw e; + } } finally { nextLoadPosition = (int) (input.getPosition() - dataSpec.position); } diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaChunkExtractor.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaChunkExtractor.java index 0ca5c5d0ad..09028e91b1 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaChunkExtractor.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaChunkExtractor.java @@ -48,6 +48,14 @@ public interface HlsMediaChunkExtractor { */ boolean read(ExtractorInput extractorInput) throws IOException; + /** + * Notifies the extractor that a seek has occurred. + * + * @param position The byte offset in the stream from which data will be provided. + * @param timeUs The seek time in microseconds. + */ + void seek(long position, long timeUs); + /** Returns whether this is a packed audio extractor, as defined in RFC 8216, Section 3.4. */ boolean isPackedAudioExtractor();