diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/SampleDataQueue.java b/library/core/src/main/java/com/google/android/exoplayer2/source/SampleDataQueue.java index 68761cef19..ade6c5c808 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/SampleDataQueue.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/SampleDataQueue.java @@ -18,7 +18,7 @@ package com.google.android.exoplayer2.source; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.decoder.DecoderInputBuffer; -import com.google.android.exoplayer2.extractor.ExtractorInput; +import com.google.android.exoplayer2.extractor.SampleDataReader; import com.google.android.exoplayer2.extractor.TrackOutput.CryptoData; import com.google.android.exoplayer2.source.SampleQueue.SampleExtrasHolder; import com.google.android.exoplayer2.upstream.Allocation; @@ -174,7 +174,7 @@ import java.nio.ByteBuffer; return totalBytesWritten; } - public int sampleData(ExtractorInput input, int length, boolean allowEndOfInput) + public int sampleData(SampleDataReader input, int length, boolean allowEndOfInput) throws IOException, InterruptedException { length = preAppend(length); int bytesAppended = diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/SampleQueue.java b/library/core/src/main/java/com/google/android/exoplayer2/source/SampleQueue.java index ff0221a73a..7100fdc45c 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/SampleQueue.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/SampleQueue.java @@ -26,7 +26,7 @@ import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.drm.DrmInitData; import com.google.android.exoplayer2.drm.DrmSession; import com.google.android.exoplayer2.drm.DrmSessionManager; -import com.google.android.exoplayer2.extractor.ExtractorInput; +import com.google.android.exoplayer2.extractor.SampleDataReader; import com.google.android.exoplayer2.extractor.TrackOutput; import com.google.android.exoplayer2.upstream.Allocator; import com.google.android.exoplayer2.util.Assertions; @@ -469,7 +469,7 @@ public class SampleQueue implements TrackOutput { } @Override - public final int sampleData(ExtractorInput input, int length, boolean allowEndOfInput) + public final int sampleData(SampleDataReader input, int length, boolean allowEndOfInput) throws IOException, InterruptedException { return sampleDataQueue.sampleData(input, length, allowEndOfInput); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkExtractorWrapper.java b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkExtractorWrapper.java index 7fdc5d34ca..0643a8ceca 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkExtractorWrapper.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkExtractorWrapper.java @@ -23,8 +23,8 @@ import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.extractor.DummyTrackOutput; import com.google.android.exoplayer2.extractor.Extractor; -import com.google.android.exoplayer2.extractor.ExtractorInput; import com.google.android.exoplayer2.extractor.ExtractorOutput; +import com.google.android.exoplayer2.extractor.SampleDataReader; import com.google.android.exoplayer2.extractor.SeekMap; import com.google.android.exoplayer2.extractor.TrackOutput; import com.google.android.exoplayer2.util.Assertions; @@ -203,7 +203,7 @@ public final class ChunkExtractorWrapper implements ExtractorOutput { } @Override - public int sampleData(ExtractorInput input, int length, boolean allowEndOfInput) + public int sampleData(SampleDataReader input, int length, boolean allowEndOfInput) throws IOException, InterruptedException { return castNonNull(trackOutput).sampleData(input, length, allowEndOfInput); } diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/PlayerEmsgHandler.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/PlayerEmsgHandler.java index 3b52e070a6..29f4146138 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/PlayerEmsgHandler.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/PlayerEmsgHandler.java @@ -25,7 +25,7 @@ import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.FormatHolder; import com.google.android.exoplayer2.ParserException; import com.google.android.exoplayer2.drm.DrmSessionManager; -import com.google.android.exoplayer2.extractor.ExtractorInput; +import com.google.android.exoplayer2.extractor.SampleDataReader; import com.google.android.exoplayer2.extractor.TrackOutput; import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.metadata.MetadataInputBuffer; @@ -295,7 +295,7 @@ public final class PlayerEmsgHandler implements Handler.Callback { } @Override - public int sampleData(ExtractorInput input, int length, boolean allowEndOfInput) + public int sampleData(SampleDataReader input, int length, boolean allowEndOfInput) throws IOException, InterruptedException { return sampleQueue.sampleData(input, length, allowEndOfInput); } diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/DummyTrackOutput.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/DummyTrackOutput.java index f1aeccacb7..cf32c8b228 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/DummyTrackOutput.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/DummyTrackOutput.java @@ -33,7 +33,7 @@ public final class DummyTrackOutput implements TrackOutput { } @Override - public int sampleData(ExtractorInput input, int length, boolean allowEndOfInput) + public int sampleData(SampleDataReader input, int length, boolean allowEndOfInput) throws IOException, InterruptedException { int bytesSkipped = input.skip(length); if (bytesSkipped == C.RESULT_END_OF_INPUT) { diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ExtractorInput.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ExtractorInput.java index 8e5d6f0448..ea5c0cc1a2 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ExtractorInput.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ExtractorInput.java @@ -63,7 +63,7 @@ import java.io.InputStream; * (regardless of {@code allowEndOfInput}). * */ -public interface ExtractorInput { +public interface ExtractorInput extends SampleDataReader { /** * Reads up to {@code length} bytes from the input and resets the peek position. diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/SampleDataReader.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/SampleDataReader.java new file mode 100644 index 0000000000..6bc7ccab53 --- /dev/null +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/SampleDataReader.java @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.android.exoplayer2.extractor; + +import com.google.android.exoplayer2.C; +import java.io.IOException; + +/** Provides sample data to be consumed by a {@link TrackOutput}. */ +public interface SampleDataReader { + /** + * Reads up to {@code length} bytes of sample data from the input. + * + * @param target A target array into which data should be written. + * @param offset The offset into the target array at which to write. + * @param length The maximum number of bytes to read from the input. + * @return The number of bytes read, or {@link C#RESULT_END_OF_INPUT} if the input has ended. This + * may be less than {@code length} because the end of the input (or available data) was + * reached, the method was interrupted, or the operation was aborted early for another reason. + * @throws IOException If an error occurs reading from the input. + * @throws InterruptedException If the thread has been interrupted. + */ + int read(byte[] target, int offset, int length) throws IOException, InterruptedException; + + /** + * Like {@link #read(byte[], int, int)}, except the sample data is skipped instead of read. + * + * @param length The maximum number of bytes to skip from the input. + * @return The number of bytes skipped, or {@link C#RESULT_END_OF_INPUT} if the input has ended. + * This may be less than {@code length} because the end of the input (or available data) was + * reached, the method was interrupted, or the operation was aborted early for another reason. + * @throws IOException If an error occurs reading from the input. + * @throws InterruptedException If the thread has been interrupted. + */ + int skip(int length) throws IOException, InterruptedException; +} diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/TrackOutput.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/TrackOutput.java index 0d5a168197..70d0df6884 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/TrackOutput.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/TrackOutput.java @@ -112,7 +112,7 @@ public interface TrackOutput { * @throws IOException If an error occurred reading from the input. * @throws InterruptedException If the thread was interrupted. */ - int sampleData(ExtractorInput input, int length, boolean allowEndOfInput) + int sampleData(SampleDataReader input, int length, boolean allowEndOfInput) throws IOException, InterruptedException; /** @@ -127,13 +127,13 @@ public interface TrackOutput { * Called when metadata associated with a sample has been extracted from the stream. * *
The corresponding sample data will have already been passed to the output via calls to - * {@link #sampleData(ExtractorInput, int, boolean)} or {@link #sampleData(ParsableByteArray, + * {@link #sampleData(SampleDataReader, int, boolean)} or {@link #sampleData(ParsableByteArray, * int)}. * * @param timeUs The media timestamp associated with the sample, in microseconds. * @param flags Flags associated with the sample. See {@code C.BUFFER_FLAG_*}. * @param size The size of the sample data, in bytes. - * @param offset The number of bytes that have been passed to {@link #sampleData(ExtractorInput, + * @param offset The number of bytes that have been passed to {@link #sampleData(SampleDataReader, * int, boolean)} or {@link #sampleData(ParsableByteArray, int)} since the last byte belonging * to the sample whose metadata is being passed. * @param encryptionData The encryption data required to decrypt the sample. May be null. 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 2b7e012770..c51f05e098 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 @@ -29,8 +29,8 @@ import com.google.android.exoplayer2.drm.DrmSession; import com.google.android.exoplayer2.drm.DrmSessionManager; import com.google.android.exoplayer2.extractor.DummyTrackOutput; import com.google.android.exoplayer2.extractor.Extractor; -import com.google.android.exoplayer2.extractor.ExtractorInput; import com.google.android.exoplayer2.extractor.ExtractorOutput; +import com.google.android.exoplayer2.extractor.SampleDataReader; import com.google.android.exoplayer2.extractor.SeekMap; import com.google.android.exoplayer2.extractor.TrackOutput; import com.google.android.exoplayer2.metadata.Metadata; @@ -1443,7 +1443,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; } @Override - public int sampleData(ExtractorInput input, int length, boolean allowEndOfInput) + public int sampleData(SampleDataReader input, int length, boolean allowEndOfInput) throws IOException, InterruptedException { ensureBufferCapacity(bufferPosition + length); int numBytesRead = input.read(buffer, bufferPosition, length); diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeTrackOutput.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeTrackOutput.java index 49f544ba46..e889febdb9 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeTrackOutput.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeTrackOutput.java @@ -20,7 +20,7 @@ import static com.google.common.truth.Truth.assertThat; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; -import com.google.android.exoplayer2.extractor.ExtractorInput; +import com.google.android.exoplayer2.extractor.SampleDataReader; import com.google.android.exoplayer2.extractor.TrackOutput; import com.google.android.exoplayer2.testutil.Dumper.Dumpable; import com.google.android.exoplayer2.util.ParsableByteArray; @@ -65,7 +65,7 @@ public final class FakeTrackOutput implements TrackOutput, Dumper.Dumpable { } @Override - public int sampleData(ExtractorInput input, int length, boolean allowEndOfInput) + public int sampleData(SampleDataReader input, int length, boolean allowEndOfInput) throws IOException, InterruptedException { byte[] newData = new byte[length]; int bytesAppended = input.read(newData, 0, length);