summaryrefslogtreecommitdiffstats
path: root/mobile/android/exoplayer2/src/main/java/org/mozilla/thirdparty/com/google/android/exoplayer2/source/chunk/ContainerMediaChunk.java
diff options
context:
space:
mode:
Diffstat (limited to 'mobile/android/exoplayer2/src/main/java/org/mozilla/thirdparty/com/google/android/exoplayer2/source/chunk/ContainerMediaChunk.java')
-rw-r--r--mobile/android/exoplayer2/src/main/java/org/mozilla/thirdparty/com/google/android/exoplayer2/source/chunk/ContainerMediaChunk.java157
1 files changed, 157 insertions, 0 deletions
diff --git a/mobile/android/exoplayer2/src/main/java/org/mozilla/thirdparty/com/google/android/exoplayer2/source/chunk/ContainerMediaChunk.java b/mobile/android/exoplayer2/src/main/java/org/mozilla/thirdparty/com/google/android/exoplayer2/source/chunk/ContainerMediaChunk.java
new file mode 100644
index 0000000000..98865e8b0e
--- /dev/null
+++ b/mobile/android/exoplayer2/src/main/java/org/mozilla/thirdparty/com/google/android/exoplayer2/source/chunk/ContainerMediaChunk.java
@@ -0,0 +1,157 @@
+/*
+ * 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 org.mozilla.thirdparty.com.google.android.exoplayer2.source.chunk;
+
+import org.mozilla.thirdparty.com.google.android.exoplayer2.C;
+import org.mozilla.thirdparty.com.google.android.exoplayer2.Format;
+import org.mozilla.thirdparty.com.google.android.exoplayer2.extractor.DefaultExtractorInput;
+import org.mozilla.thirdparty.com.google.android.exoplayer2.extractor.Extractor;
+import org.mozilla.thirdparty.com.google.android.exoplayer2.extractor.ExtractorInput;
+import org.mozilla.thirdparty.com.google.android.exoplayer2.extractor.PositionHolder;
+import org.mozilla.thirdparty.com.google.android.exoplayer2.source.chunk.ChunkExtractorWrapper.TrackOutputProvider;
+import org.mozilla.thirdparty.com.google.android.exoplayer2.upstream.DataSource;
+import org.mozilla.thirdparty.com.google.android.exoplayer2.upstream.DataSpec;
+import org.mozilla.thirdparty.com.google.android.exoplayer2.util.Assertions;
+import org.mozilla.thirdparty.com.google.android.exoplayer2.util.Util;
+import java.io.IOException;
+
+/**
+ * A {@link BaseMediaChunk} that uses an {@link Extractor} to decode sample data.
+ */
+public class ContainerMediaChunk extends BaseMediaChunk {
+
+ private static final PositionHolder DUMMY_POSITION_HOLDER = new PositionHolder();
+
+ private final int chunkCount;
+ private final long sampleOffsetUs;
+ private final ChunkExtractorWrapper extractorWrapper;
+
+ private long nextLoadPosition;
+ private volatile boolean loadCanceled;
+ private boolean loadCompleted;
+
+ /**
+ * @param dataSource The source from which the data should be loaded.
+ * @param dataSpec Defines the data to be loaded.
+ * @param trackFormat See {@link #trackFormat}.
+ * @param trackSelectionReason See {@link #trackSelectionReason}.
+ * @param trackSelectionData See {@link #trackSelectionData}.
+ * @param startTimeUs The start time of the media contained by the chunk, in microseconds.
+ * @param endTimeUs The end time of the media contained by the chunk, in microseconds.
+ * @param clippedStartTimeUs The time in the chunk from which output will begin, or {@link
+ * C#TIME_UNSET} to output from the start of the chunk.
+ * @param clippedEndTimeUs The time in the chunk from which output will end, or {@link
+ * C#TIME_UNSET} to output to the end of the chunk.
+ * @param chunkIndex The index of the chunk, or {@link C#INDEX_UNSET} if it is not known.
+ * @param chunkCount The number of chunks in the underlying media that are spanned by this
+ * instance. Normally equal to one, but may be larger if multiple chunks as defined by the
+ * underlying media are being merged into a single load.
+ * @param sampleOffsetUs An offset to add to the sample timestamps parsed by the extractor.
+ * @param extractorWrapper A wrapped extractor to use for parsing the data.
+ */
+ public ContainerMediaChunk(
+ DataSource dataSource,
+ DataSpec dataSpec,
+ Format trackFormat,
+ int trackSelectionReason,
+ Object trackSelectionData,
+ long startTimeUs,
+ long endTimeUs,
+ long clippedStartTimeUs,
+ long clippedEndTimeUs,
+ long chunkIndex,
+ int chunkCount,
+ long sampleOffsetUs,
+ ChunkExtractorWrapper extractorWrapper) {
+ super(
+ dataSource,
+ dataSpec,
+ trackFormat,
+ trackSelectionReason,
+ trackSelectionData,
+ startTimeUs,
+ endTimeUs,
+ clippedStartTimeUs,
+ clippedEndTimeUs,
+ chunkIndex);
+ this.chunkCount = chunkCount;
+ this.sampleOffsetUs = sampleOffsetUs;
+ this.extractorWrapper = extractorWrapper;
+ }
+
+ @Override
+ public long getNextChunkIndex() {
+ return chunkIndex + chunkCount;
+ }
+
+ @Override
+ public boolean isLoadCompleted() {
+ return loadCompleted;
+ }
+
+ // Loadable implementation.
+
+ @Override
+ public final void cancelLoad() {
+ loadCanceled = true;
+ }
+
+ @SuppressWarnings("NonAtomicVolatileUpdate")
+ @Override
+ public final void load() throws IOException, InterruptedException {
+ if (nextLoadPosition == 0) {
+ // Configure the output and set it as the target for the extractor wrapper.
+ BaseMediaChunkOutput output = getOutput();
+ output.setSampleOffsetUs(sampleOffsetUs);
+ extractorWrapper.init(
+ getTrackOutputProvider(output),
+ clippedStartTimeUs == C.TIME_UNSET ? C.TIME_UNSET : (clippedStartTimeUs - sampleOffsetUs),
+ clippedEndTimeUs == C.TIME_UNSET ? C.TIME_UNSET : (clippedEndTimeUs - sampleOffsetUs));
+ }
+ try {
+ // Create and open the input.
+ DataSpec loadDataSpec = dataSpec.subrange(nextLoadPosition);
+ ExtractorInput input =
+ new DefaultExtractorInput(
+ dataSource, loadDataSpec.absoluteStreamPosition, dataSource.open(loadDataSpec));
+ // Load and decode the sample data.
+ try {
+ Extractor extractor = extractorWrapper.extractor;
+ int result = Extractor.RESULT_CONTINUE;
+ while (result == Extractor.RESULT_CONTINUE && !loadCanceled) {
+ result = extractor.read(input, DUMMY_POSITION_HOLDER);
+ }
+ Assertions.checkState(result != Extractor.RESULT_SEEK);
+ } finally {
+ nextLoadPosition = input.getPosition() - dataSpec.absoluteStreamPosition;
+ }
+ } finally {
+ Util.closeQuietly(dataSource);
+ }
+ loadCompleted = true;
+ }
+
+ /**
+ * Returns the {@link TrackOutputProvider} to be used by the wrapped extractor.
+ *
+ * @param baseMediaChunkOutput The {@link BaseMediaChunkOutput} most recently passed to {@link
+ * #init(BaseMediaChunkOutput)}.
+ * @return A {@link TrackOutputProvider} to be used by the wrapped extractor.
+ */
+ protected TrackOutputProvider getTrackOutputProvider(BaseMediaChunkOutput baseMediaChunkOutput) {
+ return baseMediaChunkOutput;
+ }
+}