From 28eaa2cb248d54323e19e43cf1c7110d84163cd9 Mon Sep 17 00:00:00 2001 From: "[]inger" <[]inger@google.com> Date: Tue, 10 May 2016 02:52:30 -0700 Subject: [PATCH] Support Ogg containers without a properly flagged last page. Such files are slightly off spec but easy to support.(https://github.com/google/ExoPlayer/issues/1506) ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=121927762 --- .../google/android/exoplayer/extractor/ogg/OggParser.java | 7 ++----- .../android/exoplayer/extractor/ogg/VorbisReader.java | 4 +++- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/ogg/OggParser.java b/library/src/main/java/com/google/android/exoplayer/extractor/ogg/OggParser.java index 8bef5ab61e..c66adcabe6 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/ogg/OggParser.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/ogg/OggParser.java @@ -112,12 +112,9 @@ import java.io.IOException; Assertions.checkArgument(input.getLength() != C.LENGTH_UNBOUNDED); // never read forever! OggUtil.skipToNextPage(input); pageHeader.reset(); - while ((pageHeader.type & 0x04) != 0x04) { - if (pageHeader.bodySize > 0) { - input.skipFully(pageHeader.bodySize); - } + while ((pageHeader.type & 0x04) != 0x04 && input.getPosition() < input.getLength()) { OggUtil.populatePageHeader(input, pageHeader, headerArray, false); - input.skipFully(pageHeader.headerSize); + input.skipFully(pageHeader.headerSize + pageHeader.bodySize); } return pageHeader.granulePosition; } diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/ogg/VorbisReader.java b/library/src/main/java/com/google/android/exoplayer/extractor/ogg/VorbisReader.java index 1953149ee1..5bac358dee 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/ogg/VorbisReader.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/ogg/VorbisReader.java @@ -34,6 +34,8 @@ import java.util.ArrayList; */ /* package */ final class VorbisReader extends StreamReader implements SeekMap { + private static final long LARGEST_EXPECTED_PAGE_SIZE = 8000; + private VorbisSetup vorbisSetup; private int previousPacketBlockSize; private long elapsedSamples; @@ -78,7 +80,7 @@ import java.util.ArrayList; extractorOutput.seekMap(this); if (inputLength != C.LENGTH_UNBOUNDED) { // seek to the end just before the last page of stream to get the duration - seekPosition.position = input.getLength() - 8000; + seekPosition.position = Math.max(0, input.getLength() - LARGEST_EXPECTED_PAGE_SIZE); return Extractor.RESULT_SEEK; } }