From 72d42fbc9faaf56980401d33fb2e5c93d2e161b4 Mon Sep 17 00:00:00 2001 From: Oliver Woodman Date: Wed, 15 Jul 2015 11:15:21 +0100 Subject: [PATCH] Fix an issue where retrying WebM extraction failed. The ID_SEGMENT can only be read once, as seeing the element a second time is assumed to indicate that the file contains multiple segment elements (which is not supported). This change allows the element to be read twice if it is at the same position, so that retrying loading from the start can succeed. --- .../exoplayer/extractor/webm/WebmExtractor.java | 2 +- .../extractor/webm/WebmExtractorTest.java | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/webm/WebmExtractor.java b/library/src/main/java/com/google/android/exoplayer/extractor/webm/WebmExtractor.java index 1976f2b8b6..ccc94ec3c3 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/webm/WebmExtractor.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/webm/WebmExtractor.java @@ -297,7 +297,7 @@ public final class WebmExtractor implements Extractor { throws ParserException { switch (id) { case ID_SEGMENT: - if (segmentContentPosition != UNKNOWN) { + if (segmentContentPosition != UNKNOWN && segmentContentPosition != contentPosition) { throw new ParserException("Multiple Segment elements not supported"); } segmentContentPosition = contentPosition; diff --git a/library/src/test/java/com/google/android/exoplayer/extractor/webm/WebmExtractorTest.java b/library/src/test/java/com/google/android/exoplayer/extractor/webm/WebmExtractorTest.java index ddcd9a9ac8..6b9492cc96 100644 --- a/library/src/test/java/com/google/android/exoplayer/extractor/webm/WebmExtractorTest.java +++ b/library/src/test/java/com/google/android/exoplayer/extractor/webm/WebmExtractorTest.java @@ -92,6 +92,21 @@ public final class WebmExtractorTest extends InstrumentationTestCase { assertIndex(new IndexPoint(0, 0, TEST_DURATION_US)); } + public void testReadSegmentTwice() throws IOException, InterruptedException { + byte[] data = new StreamBuilder() + .setHeader(WEBM_DOC_TYPE) + .setInfo(DEFAULT_TIMECODE_SCALE, TEST_DURATION_US) + .addVp9Track(TEST_WIDTH, TEST_HEIGHT, null) + .build(1); + + TestUtil.consumeTestData(extractor, data); + extractor.seek(); + TestUtil.consumeTestData(extractor, data); + + assertVp9VideoFormat(); + assertIndex(new IndexPoint(0, 0, TEST_DURATION_US)); + } + public void testPrepareOpus() throws IOException, InterruptedException { byte[] data = new StreamBuilder() .setHeader(WEBM_DOC_TYPE)