From 2380857bf247f3d1f3d95144e74a2eb9fcbe4581 Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 14 Mar 2016 09:41:10 -0700 Subject: [PATCH] Clip the skip length in DefaultExtractorInput. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=117141509 --- .../extractor/DefaultExtractorInputTest.java | 19 +++++++++++++++++++ .../extractor/DefaultExtractorInput.java | 3 ++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/library/src/androidTest/java/com/google/android/exoplayer/extractor/DefaultExtractorInputTest.java b/library/src/androidTest/java/com/google/android/exoplayer/extractor/DefaultExtractorInputTest.java index 19c6586bf5..d38339413f 100644 --- a/library/src/androidTest/java/com/google/android/exoplayer/extractor/DefaultExtractorInputTest.java +++ b/library/src/androidTest/java/com/google/android/exoplayer/extractor/DefaultExtractorInputTest.java @@ -34,6 +34,7 @@ public class DefaultExtractorInputTest extends TestCase { private static final String TEST_URI = "http://www.google.com"; private static final byte[] TEST_DATA = new byte[] {0, 1, 2, 3, 4, 5, 6, 7, 8}; + private static final int LARGE_TEST_DATA_LENGTH = 8192; public void testInitialPosition() throws IOException { FakeDataSource testDataSource = buildDataSource(); @@ -182,6 +183,16 @@ public class DefaultExtractorInputTest extends TestCase { assertEquals(-1, expectedEndOfInput); } + public void testLargeSkip() throws IOException, InterruptedException { + FakeDataSource testDataSource = buildLargeDataSource(); + DefaultExtractorInput input = new DefaultExtractorInput(testDataSource, 0, C.LENGTH_UNBOUNDED); + // Check that skipping the entire data source succeeds. + int bytesToSkip = LARGE_TEST_DATA_LENGTH; + while (bytesToSkip > 0) { + bytesToSkip -= input.skip(bytesToSkip); + } + } + public void testSkipFullyOnce() throws IOException, InterruptedException { // Skip TEST_DATA. DefaultExtractorInput input = createDefaultExtractorInput(); @@ -391,6 +402,14 @@ public class DefaultExtractorInputTest extends TestCase { return testDataSource; } + private static FakeDataSource buildLargeDataSource() throws IOException { + FakeDataSource.Builder builder = new FakeDataSource.Builder(); + builder.appendReadData(new byte[LARGE_TEST_DATA_LENGTH]); + FakeDataSource testDataSource = builder.build(); + testDataSource.open(new DataSpec(Uri.parse(TEST_URI))); + return testDataSource; + } + private static DefaultExtractorInput createDefaultExtractorInput() throws IOException { FakeDataSource testDataSource = buildDataSource(); return new DefaultExtractorInput(testDataSource, 0, C.LENGTH_UNBOUNDED); diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/DefaultExtractorInput.java b/library/src/main/java/com/google/android/exoplayer/extractor/DefaultExtractorInput.java index ca60e546b8..78cdedb251 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/DefaultExtractorInput.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/DefaultExtractorInput.java @@ -80,7 +80,8 @@ public final class DefaultExtractorInput implements ExtractorInput { public int skip(int length) throws IOException, InterruptedException { int bytesSkipped = skipFromPeekBuffer(length); if (bytesSkipped == 0) { - bytesSkipped = readFromDataSource(SCRATCH_SPACE, 0, length, 0, true); + bytesSkipped = + readFromDataSource(SCRATCH_SPACE, 0, Math.min(length, SCRATCH_SPACE.length), 0, true); } commitBytesRead(bytesSkipped); return bytesSkipped;