From 1ca5378cda8f888003d2e45809111efe14d8c3c8 Mon Sep 17 00:00:00 2001 From: olly Date: Tue, 22 Mar 2016 03:53:00 -0700 Subject: [PATCH] Track input/output cleanup. - Remove special DefaultTrackOutput.sampleData method, and have SingleSampleMediaChunk use the regular one instead. - Make DummyTrackOutput behave correctly is allowEndOfInput is false. - Simplify progress tracking in ExtractorSampleSource. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=117808659 --- .../chunk/SingleSampleMediaChunk.java | 10 +++++++-- .../extractor/DefaultTrackOutput.java | 21 ------------------- .../exoplayer/extractor/DummyTrackOutput.java | 11 +++++++++- .../extractor/ExtractorSampleSource.java | 13 +++++------- 4 files changed, 23 insertions(+), 32 deletions(-) diff --git a/library/src/main/java/com/google/android/exoplayer/chunk/SingleSampleMediaChunk.java b/library/src/main/java/com/google/android/exoplayer/chunk/SingleSampleMediaChunk.java index 847cf8d133..9095946039 100644 --- a/library/src/main/java/com/google/android/exoplayer/chunk/SingleSampleMediaChunk.java +++ b/library/src/main/java/com/google/android/exoplayer/chunk/SingleSampleMediaChunk.java @@ -18,6 +18,8 @@ package com.google.android.exoplayer.chunk; import com.google.android.exoplayer.C; import com.google.android.exoplayer.Format; import com.google.android.exoplayer.drm.DrmInitData; +import com.google.android.exoplayer.extractor.DefaultExtractorInput; +import com.google.android.exoplayer.extractor.ExtractorInput; import com.google.android.exoplayer.upstream.DataSource; import com.google.android.exoplayer.upstream.DataSpec; import com.google.android.exoplayer.util.Util; @@ -90,12 +92,16 @@ public final class SingleSampleMediaChunk extends BaseMediaChunk { DataSpec loadDataSpec = Util.getRemainderDataSpec(dataSpec, bytesLoaded); try { // Create and open the input. - dataSource.open(loadDataSpec); + long length = dataSource.open(loadDataSpec); + if (length != C.LENGTH_UNBOUNDED) { + length += bytesLoaded; + } + ExtractorInput extractorInput = new DefaultExtractorInput(dataSource, bytesLoaded, length); // Load the sample data. int result = 0; while (result != C.RESULT_END_OF_INPUT) { bytesLoaded += result; - result = getOutput().sampleData(dataSource, Integer.MAX_VALUE, true); + result = getOutput().sampleData(extractorInput, Integer.MAX_VALUE, true); } int sampleSize = bytesLoaded; getOutput().sampleMetadata(startTimeUs, C.SAMPLE_FLAG_SYNC, sampleSize, 0, null); diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/DefaultTrackOutput.java b/library/src/main/java/com/google/android/exoplayer/extractor/DefaultTrackOutput.java index 029b308458..9e1e9f2cad 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/DefaultTrackOutput.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/DefaultTrackOutput.java @@ -15,14 +15,11 @@ */ package com.google.android.exoplayer.extractor; -import com.google.android.exoplayer.C; import com.google.android.exoplayer.Format; import com.google.android.exoplayer.SampleHolder; import com.google.android.exoplayer.upstream.Allocator; -import com.google.android.exoplayer.upstream.DataSource; import com.google.android.exoplayer.util.ParsableByteArray; -import java.io.EOFException; import java.io.IOException; /** @@ -225,24 +222,6 @@ public class DefaultTrackOutput implements TrackOutput { return true; } - // Called by the loading thread. - - /** - * Invoked to write sample data to the output. - * - * @param dataSource A {@link DataSource} from which to read the sample data. - * @param length The maximum length to read from the input. - * @param allowEndOfInput True if encountering the end of the input having read no data is - * allowed, and should result in {@link C#RESULT_END_OF_INPUT} being returned. False if it - * should be considered an error, causing an {@link EOFException} to be thrown. - * @return The number of bytes appended. - * @throws IOException If an error occurred reading from the input. - */ - public int sampleData(DataSource dataSource, int length, boolean allowEndOfInput) - throws IOException { - return rollingBuffer.appendData(dataSource, length, allowEndOfInput); - } - // TrackOutput implementation. Called by the loading thread. @Override diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/DummyTrackOutput.java b/library/src/main/java/com/google/android/exoplayer/extractor/DummyTrackOutput.java index 4b3ef66342..39e13c50de 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/DummyTrackOutput.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/DummyTrackOutput.java @@ -15,9 +15,11 @@ */ package com.google.android.exoplayer.extractor; +import com.google.android.exoplayer.C; import com.google.android.exoplayer.Format; import com.google.android.exoplayer.util.ParsableByteArray; +import java.io.EOFException; import java.io.IOException; /** @@ -33,7 +35,14 @@ public final class DummyTrackOutput implements TrackOutput { @Override public int sampleData(ExtractorInput input, int length, boolean allowEndOfInput) throws IOException, InterruptedException { - return input.skip(length); + int bytesSkipped = input.skip(length); + if (bytesSkipped == C.RESULT_END_OF_INPUT) { + if (allowEndOfInput) { + return C.RESULT_END_OF_INPUT; + } + throw new EOFException(); + } + return bytesSkipped; } @Override diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/ExtractorSampleSource.java b/library/src/main/java/com/google/android/exoplayer/extractor/ExtractorSampleSource.java index 197e8f33bf..c816192464 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/ExtractorSampleSource.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/ExtractorSampleSource.java @@ -219,14 +219,11 @@ public final class ExtractorSampleSource implements SampleSource, ExtractorOutpu private Loader loader; private ExtractingLoadable loadable; private IOException currentLoadableException; - // TODO: Set this back to 0 in the correct place (some place indicative of making progress). private int currentLoadableExceptionCount; private long currentLoadableExceptionTimestamp; + private boolean currentLoadableExtractedSamples; private boolean loadingFinished; - private int extractedSampleCount; - private int extractedSampleCountAtStartOfLoad; - /** * @param uri The {@link Uri} of the media stream. * @param dataSource A data source to read the media stream. @@ -550,7 +547,7 @@ public final class ExtractorSampleSource implements SampleSource, ExtractorOutpu @Override public void onLoadError(Loadable ignored, IOException e) { currentLoadableException = e; - currentLoadableExceptionCount = extractedSampleCount > extractedSampleCountAtStartOfLoad ? 1 + currentLoadableExceptionCount = currentLoadableExtractedSamples ? 1 : currentLoadableExceptionCount + 1; currentLoadableExceptionTimestamp = SystemClock.elapsedRealtime(); notifyLoadError(e); @@ -635,7 +632,7 @@ public final class ExtractorSampleSource implements SampleSource, ExtractorOutpu // We're playing a seekable on-demand stream. Resume the current loadable, which will // request data starting from the point it left off. } - extractedSampleCountAtStartOfLoad = extractedSampleCount; + currentLoadableExtractedSamples = false; loader.startLoading(loadable, this); } return; @@ -659,7 +656,7 @@ public final class ExtractorSampleSource implements SampleSource, ExtractorOutpu loadable = createLoadableFromPositionUs(pendingResetPositionUs); pendingResetPositionUs = NO_RESET_PENDING; } - extractedSampleCountAtStartOfLoad = extractedSampleCount; + currentLoadableExtractedSamples = false; loader.startLoading(loadable, this); } @@ -765,7 +762,7 @@ public final class ExtractorSampleSource implements SampleSource, ExtractorOutpu @Override public void sampleMetadata(long timeUs, int flags, int size, int offset, byte[] encryptionKey) { super.sampleMetadata(timeUs, flags, size, offset, encryptionKey); - extractedSampleCount++; + currentLoadableExtractedSamples = true; } }