From dd031691b0c9a8c97863d9e0dccec3b1dcb233ff Mon Sep 17 00:00:00 2001 From: andrewlewis Date: Wed, 6 Jul 2016 00:27:28 -0700 Subject: [PATCH] Pass an ExtractorsFactory to ExtractorSampleSource. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=126672854 --- .../demo/UriSampleSourceProvider.java | 3 +- .../exoplayer/ext/flac/FlacPlaybackTest.java | 9 +- .../exoplayer/ext/flac/FlacExtractor.java | 13 ++ .../exoplayer/ext/opus/OpusPlaybackTest.java | 9 +- .../exoplayer/ext/vp9/VpxPlaybackTest.java | 9 +- .../extractor/DefaultExtractorsFactory.java | 151 ++++++++++++++++ .../extractor/ExtractorSampleSource.java | 162 ++---------------- .../extractor/ExtractorsFactory.java | 28 +++ .../exoplayer/extractor/flv/FlvExtractor.java | 13 ++ .../extractor/mkv/MatroskaExtractor.java | 13 ++ .../exoplayer/extractor/mp3/Mp3Extractor.java | 13 ++ .../extractor/mp4/FragmentedMp4Extractor.java | 13 ++ .../exoplayer/extractor/mp4/Mp4Extractor.java | 13 ++ .../exoplayer/extractor/ogg/OggExtractor.java | 13 ++ .../exoplayer/extractor/ts/AdtsExtractor.java | 13 ++ .../exoplayer/extractor/ts/PsExtractor.java | 13 ++ .../exoplayer/extractor/ts/TsExtractor.java | 13 ++ .../exoplayer/extractor/wav/WavExtractor.java | 13 ++ 18 files changed, 356 insertions(+), 158 deletions(-) create mode 100644 library/src/main/java/com/google/android/exoplayer/extractor/DefaultExtractorsFactory.java create mode 100644 library/src/main/java/com/google/android/exoplayer/extractor/ExtractorsFactory.java diff --git a/demo/src/main/java/com/google/android/exoplayer/demo/UriSampleSourceProvider.java b/demo/src/main/java/com/google/android/exoplayer/demo/UriSampleSourceProvider.java index 07af26bd68..b89c4c0fd3 100644 --- a/demo/src/main/java/com/google/android/exoplayer/demo/UriSampleSourceProvider.java +++ b/demo/src/main/java/com/google/android/exoplayer/demo/UriSampleSourceProvider.java @@ -18,6 +18,7 @@ package com.google.android.exoplayer.demo; import com.google.android.exoplayer.SampleSource; import com.google.android.exoplayer.SampleSourceProvider; import com.google.android.exoplayer.dash.DashSampleSource; +import com.google.android.exoplayer.extractor.DefaultExtractorsFactory; import com.google.android.exoplayer.extractor.ExtractorSampleSource; import com.google.android.exoplayer.hls.HlsSampleSource; import com.google.android.exoplayer.smoothstreaming.SmoothStreamingSampleSource; @@ -81,7 +82,7 @@ public final class UriSampleSourceProvider implements SampleSourceProvider { return new HlsSampleSource(uri, dataSourceFactory, bandwidthMeter, handler, eventLogger); case Util.TYPE_OTHER: return new ExtractorSampleSource(uri, dataSourceFactory, bandwidthMeter, - ExtractorSampleSource.newDefaultExtractors(), handler, eventLogger); + new DefaultExtractorsFactory(), handler, eventLogger); default: throw new IllegalStateException("Unsupported type: " + type); } diff --git a/extensions/flac/src/androidTest/java/com/google/android/exoplayer/ext/flac/FlacPlaybackTest.java b/extensions/flac/src/androidTest/java/com/google/android/exoplayer/ext/flac/FlacPlaybackTest.java index 7251e57d70..121a440efb 100644 --- a/extensions/flac/src/androidTest/java/com/google/android/exoplayer/ext/flac/FlacPlaybackTest.java +++ b/extensions/flac/src/androidTest/java/com/google/android/exoplayer/ext/flac/FlacPlaybackTest.java @@ -21,7 +21,6 @@ import com.google.android.exoplayer.ExoPlaybackException; import com.google.android.exoplayer.ExoPlayer; import com.google.android.exoplayer.ExoPlayerFactory; import com.google.android.exoplayer.TrackRenderer; -import com.google.android.exoplayer.extractor.Extractor; import com.google.android.exoplayer.extractor.ExtractorSampleSource; import com.google.android.exoplayer.extractor.mkv.MatroskaExtractor; import com.google.android.exoplayer.upstream.DefaultDataSourceFactory; @@ -79,9 +78,11 @@ public class FlacPlaybackTest extends InstrumentationTestCase { player.addListener(this); ExtractorSampleSource sampleSource = new ExtractorSampleSource( uri, - new DefaultDataSourceFactory(context, "ExoPlayerExtFlacTest"), null, - new Extractor[] {new MatroskaExtractor()}, - null, null); + new DefaultDataSourceFactory(context, "ExoPlayerExtFlacTest"), + null, + new MatroskaExtractor.Factory(), + null, + null); player.setSource(sampleSource); player.setPlayWhenReady(true); Looper.loop(); diff --git a/extensions/flac/src/main/java/com/google/android/exoplayer/ext/flac/FlacExtractor.java b/extensions/flac/src/main/java/com/google/android/exoplayer/ext/flac/FlacExtractor.java index cf1218eaf2..2c81ee5390 100644 --- a/extensions/flac/src/main/java/com/google/android/exoplayer/ext/flac/FlacExtractor.java +++ b/extensions/flac/src/main/java/com/google/android/exoplayer/ext/flac/FlacExtractor.java @@ -20,6 +20,7 @@ import com.google.android.exoplayer.Format; import com.google.android.exoplayer.extractor.Extractor; import com.google.android.exoplayer.extractor.ExtractorInput; import com.google.android.exoplayer.extractor.ExtractorOutput; +import com.google.android.exoplayer.extractor.ExtractorsFactory; import com.google.android.exoplayer.extractor.PositionHolder; import com.google.android.exoplayer.extractor.SeekMap; import com.google.android.exoplayer.extractor.TrackOutput; @@ -36,6 +37,18 @@ import java.util.Arrays; */ public final class FlacExtractor implements Extractor { + /** + * Factory that returns one extractor which is a {@link FlacExtractor}. + */ + public static final class Factory implements ExtractorsFactory { + + @Override + public Extractor[] createExtractors() { + return new Extractor[] {new FlacExtractor()}; + } + + } + /** * FLAC signature: first 4 is the signature word, second 4 is the sizeof STREAMINFO. 0x22 is the * mandatory STREAMINFO. diff --git a/extensions/opus/src/androidTest/java/com/google/android/exoplayer/ext/opus/OpusPlaybackTest.java b/extensions/opus/src/androidTest/java/com/google/android/exoplayer/ext/opus/OpusPlaybackTest.java index 88a350c295..edb9203d6b 100644 --- a/extensions/opus/src/androidTest/java/com/google/android/exoplayer/ext/opus/OpusPlaybackTest.java +++ b/extensions/opus/src/androidTest/java/com/google/android/exoplayer/ext/opus/OpusPlaybackTest.java @@ -21,7 +21,6 @@ import com.google.android.exoplayer.ExoPlaybackException; import com.google.android.exoplayer.ExoPlayer; import com.google.android.exoplayer.ExoPlayerFactory; import com.google.android.exoplayer.TrackRenderer; -import com.google.android.exoplayer.extractor.Extractor; import com.google.android.exoplayer.extractor.ExtractorSampleSource; import com.google.android.exoplayer.extractor.mkv.MatroskaExtractor; import com.google.android.exoplayer.upstream.DefaultDataSourceFactory; @@ -79,9 +78,11 @@ public class OpusPlaybackTest extends InstrumentationTestCase { player.addListener(this); ExtractorSampleSource sampleSource = new ExtractorSampleSource( uri, - new DefaultDataSourceFactory(context, "ExoPlayerExtOpusTest"), null, - new Extractor[] {new MatroskaExtractor()}, - null, null); + new DefaultDataSourceFactory(context, "ExoPlayerExtOpusTest"), + null, + new MatroskaExtractor.Factory(), + null, + null); player.setSource(sampleSource); player.setPlayWhenReady(true); Looper.loop(); diff --git a/extensions/vp9/src/androidTest/java/com/google/android/exoplayer/ext/vp9/VpxPlaybackTest.java b/extensions/vp9/src/androidTest/java/com/google/android/exoplayer/ext/vp9/VpxPlaybackTest.java index d617f13554..a1f614676a 100644 --- a/extensions/vp9/src/androidTest/java/com/google/android/exoplayer/ext/vp9/VpxPlaybackTest.java +++ b/extensions/vp9/src/androidTest/java/com/google/android/exoplayer/ext/vp9/VpxPlaybackTest.java @@ -21,7 +21,6 @@ import com.google.android.exoplayer.ExoPlaybackException; import com.google.android.exoplayer.ExoPlayer; import com.google.android.exoplayer.ExoPlayerFactory; import com.google.android.exoplayer.TrackRenderer; -import com.google.android.exoplayer.extractor.Extractor; import com.google.android.exoplayer.extractor.ExtractorSampleSource; import com.google.android.exoplayer.extractor.mkv.MatroskaExtractor; import com.google.android.exoplayer.upstream.DefaultDataSourceFactory; @@ -95,9 +94,11 @@ public class VpxPlaybackTest extends InstrumentationTestCase { player.addListener(this); ExtractorSampleSource sampleSource = new ExtractorSampleSource( uri, - new DefaultDataSourceFactory(context, "ExoPlayerExtVp9Test"), null, - new Extractor[] {new MatroskaExtractor()}, - null, null); + new DefaultDataSourceFactory(context, "ExoPlayerExtVp9Test"), + null, + new MatroskaExtractor.Factory(), + null, + null); player.sendMessages(new ExoPlayer.ExoPlayerMessage(videoRenderer, LibvpxVideoTrackRenderer.MSG_SET_OUTPUT_BUFFER_RENDERER, new VpxVideoSurfaceView(context))); diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/DefaultExtractorsFactory.java b/library/src/main/java/com/google/android/exoplayer/extractor/DefaultExtractorsFactory.java new file mode 100644 index 0000000000..41716a3a25 --- /dev/null +++ b/library/src/main/java/com/google/android/exoplayer/extractor/DefaultExtractorsFactory.java @@ -0,0 +1,151 @@ +/* + * Copyright (C) 2014 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.exoplayer.extractor; + +import java.util.ArrayList; +import java.util.List; + +/** + * An {@link ExtractorsFactory} that provides an array of extractors for the following formats: + * + * + */ +public final class DefaultExtractorsFactory implements ExtractorsFactory { + + // Lazily initialized default extractor classes in priority order. + private static List> defaultExtractorClasses; + + /** + * Creates a new factory for the default extractors. + */ + public DefaultExtractorsFactory() { + synchronized (DefaultExtractorsFactory.class) { + if (defaultExtractorClasses == null) { + // Lazily initialize defaultExtractorClasses. + List> extractorClasses = new ArrayList<>(); + // We reference extractors using reflection so that they can be deleted cleanly. + // Class.forName is used so that automated tools like proguard can detect the use of + // reflection (see http://proguard.sourceforge.net/FAQ.html#forname). + try { + extractorClasses.add( + Class.forName("com.google.android.exoplayer.extractor.mkv.MatroskaExtractor") + .asSubclass(Extractor.class)); + } catch (ClassNotFoundException e) { + // Extractor not found. + } + try { + extractorClasses.add( + Class.forName("com.google.android.exoplayer.extractor.mp4.FragmentedMp4Extractor") + .asSubclass(Extractor.class)); + } catch (ClassNotFoundException e) { + // Extractor not found. + } + try { + extractorClasses.add( + Class.forName("com.google.android.exoplayer.extractor.mp4.Mp4Extractor") + .asSubclass(Extractor.class)); + } catch (ClassNotFoundException e) { + // Extractor not found. + } + try { + extractorClasses.add( + Class.forName("com.google.android.exoplayer.extractor.mp3.Mp3Extractor") + .asSubclass(Extractor.class)); + } catch (ClassNotFoundException e) { + // Extractor not found. + } + try { + extractorClasses.add( + Class.forName("com.google.android.exoplayer.extractor.ts.AdtsExtractor") + .asSubclass(Extractor.class)); + } catch (ClassNotFoundException e) { + // Extractor not found. + } + try { + extractorClasses.add( + Class.forName("com.google.android.exoplayer.extractor.ts.TsExtractor") + .asSubclass(Extractor.class)); + } catch (ClassNotFoundException e) { + // Extractor not found. + } + try { + extractorClasses.add( + Class.forName("com.google.android.exoplayer.extractor.flv.FlvExtractor") + .asSubclass(Extractor.class)); + } catch (ClassNotFoundException e) { + // Extractor not found. + } + try { + extractorClasses.add( + Class.forName("com.google.android.exoplayer.extractor.ogg.OggExtractor") + .asSubclass(Extractor.class)); + } catch (ClassNotFoundException e) { + // Extractor not found. + } + try { + extractorClasses.add( + Class.forName("com.google.android.exoplayer.extractor.ts.PsExtractor") + .asSubclass(Extractor.class)); + } catch (ClassNotFoundException e) { + // Extractor not found. + } + try { + extractorClasses.add( + Class.forName("com.google.android.exoplayer.extractor.wav.WavExtractor") + .asSubclass(Extractor.class)); + } catch (ClassNotFoundException e) { + // Extractor not found. + } + try { + extractorClasses.add( + Class.forName("com.google.android.exoplayer.ext.flac.FlacExtractor") + .asSubclass(Extractor.class)); + } catch (ClassNotFoundException e) { + // Extractor not found. + } + defaultExtractorClasses = extractorClasses; + } + } + } + + @Override + public Extractor[] createExtractors() { + Extractor[] extractors = new Extractor[defaultExtractorClasses.size()]; + for (int i = 0; i < extractors.length; i++) { + try { + extractors[i] = defaultExtractorClasses.get(i).getConstructor().newInstance(); + } catch (Exception e) { + // Should never happen. + throw new IllegalStateException("Unexpected error creating default extractor", e); + } + } + return extractors; + } + +} 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 33916a2f46..daff651fdd 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 @@ -43,35 +43,19 @@ import android.os.Handler; import java.io.EOFException; import java.io.IOException; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * A {@link SampleSource} that extracts sample data using an {@link Extractor}. * - *

If no {@link Extractor} instances are passed to the constructor, the input stream container - * format will be detected automatically from the following supported formats: + *

If the possible input stream container formats are known, pass a factory that instantiates + * extractors for them to the constructor. Otherwise, pass a {@link DefaultExtractorsFactory} to + * use the default extractors. When reading a new stream, the first {@link Extractor} in the array + * of extractors created by the factory that returns {@code true} from + * {@link Extractor#sniff(ExtractorInput)} will be used to extract samples from the input stream. * - *

    - *
  • MP4, including M4A ({@link com.google.android.exoplayer.extractor.mp4.Mp4Extractor})
  • - *
  • fMP4 ({@link com.google.android.exoplayer.extractor.mp4.FragmentedMp4Extractor})
  • - *
  • Matroska and WebM ({@link com.google.android.exoplayer.extractor.mkv.MatroskaExtractor})
  • - *
  • Ogg Vorbis/FLAC ({@link com.google.android.exoplayer.extractor.ogg.OggExtractor}
  • - *
  • MP3 ({@link com.google.android.exoplayer.extractor.mp3.Mp3Extractor})
  • - *
  • AAC ({@link com.google.android.exoplayer.extractor.ts.AdtsExtractor})
  • - *
  • MPEG TS ({@link com.google.android.exoplayer.extractor.ts.TsExtractor})
  • - *
  • MPEG PS ({@link com.google.android.exoplayer.extractor.ts.PsExtractor})
  • - *
  • FLV ({@link com.google.android.exoplayer.extractor.flv.FlvExtractor})
  • - *
  • WAV ({@link com.google.android.exoplayer.extractor.wav.WavExtractor})
  • - *
  • FLAC (only available if the FLAC extension is built and included)
  • - *
- * - *

Seeking in AAC, MPEG TS and FLV streams is not supported. - * - *

To override the default extractors, pass one or more {@link Extractor} instances to the - * constructor. When reading a new stream, the first {@link Extractor} that returns {@code true} - * from {@link Extractor#sniff(ExtractorInput)} will be used. + *

Note that the built-in extractors for AAC, MPEG TS and FLV streams do not support seeking. */ public final class ExtractorSampleSource implements SampleSource, ExtractorOutput, Loader.Callback, @@ -121,9 +105,6 @@ public final class ExtractorSampleSource implements SampleSource, ExtractorOutpu */ private static final long DEFAULT_LAST_SAMPLE_DURATION_US = 10000; - // Lazily initialized default extractor classes in priority order. - private static List> defaultExtractorClasses; - private final Uri uri; private final int minLoadableRetryCount; private final Handler eventHandler; @@ -158,35 +139,32 @@ public final class ExtractorSampleSource implements SampleSource, ExtractorOutpu * @param uri The {@link Uri} of the media stream. * @param dataSourceFactory A factory for {@link DataSource}s to read the media. * @param bandwidthMeter A {@link BandwidthMeter} to notify of loads performed by the source. - * @param extractors {@link Extractor}s to process the media stream. Where the possible formats - * are known, instantiate and inject only instances of the corresponding {@link Extractor}s. - * Where this is not possible, {@link #newDefaultExtractors()} can be used to construct an - * array of default extractors. + * @param extractorsFactory Factory for {@link Extractor}s to process the media stream. If the + * possible formats are known, pass a factory that instantiates extractors for those formats. + * Otherwise, pass a {@link DefaultExtractorsFactory} to use default extractors. * @param eventListener A listener of events. May be null if delivery of events is not required. */ public ExtractorSampleSource(Uri uri, DataSourceFactory dataSourceFactory, - BandwidthMeter bandwidthMeter, Extractor[] extractors, Handler eventHandler, + BandwidthMeter bandwidthMeter, ExtractorsFactory extractorsFactory, Handler eventHandler, EventListener eventListener) { - this(uri, dataSourceFactory, bandwidthMeter, extractors, MIN_RETRY_COUNT_DEFAULT_FOR_MEDIA, - eventHandler, eventListener); + this(uri, dataSourceFactory, bandwidthMeter, extractorsFactory, + MIN_RETRY_COUNT_DEFAULT_FOR_MEDIA, eventHandler, eventListener); } /** * @param uri The {@link Uri} of the media stream. * @param dataSourceFactory A factory for {@link DataSource}s to read the media. * @param bandwidthMeter A {@link BandwidthMeter} to notify of loads performed by the source. - * @param extractors {@link Extractor}s to process the media stream. Where the possible formats - * are known, instantiate and inject only instances of the corresponding {@link Extractor}s. - * Where this is not possible, {@link #newDefaultExtractors()} can be used to construct an - * array of default extractors. + * @param extractorsFactory Factory for {@link Extractor}s to process the media stream. If the + * possible formats are known, pass a factory that instantiates extractors for those formats. + * Otherwise, pass a {@link DefaultExtractorsFactory} to use default extractors. * @param minLoadableRetryCount The minimum number of times that the sample source will retry * if a loading error occurs. * @param eventListener A listener of events. May be null if delivery of events is not required. */ public ExtractorSampleSource(Uri uri, DataSourceFactory dataSourceFactory, - BandwidthMeter bandwidthMeter, Extractor[] extractors, int minLoadableRetryCount, + BandwidthMeter bandwidthMeter, ExtractorsFactory extractorsFactory, int minLoadableRetryCount, Handler eventHandler, EventListener eventListener) { - Assertions.checkState(extractors != null && extractors.length > 0); this.uri = uri; this.minLoadableRetryCount = minLoadableRetryCount; this.eventListener = eventListener; @@ -194,118 +172,12 @@ public final class ExtractorSampleSource implements SampleSource, ExtractorOutpu dataSource = dataSourceFactory.createDataSource(bandwidthMeter); loadCondition = new ConditionVariable(); loader = new Loader("Loader:ExtractorSampleSource"); - extractorHolder = new ExtractorHolder(extractors, this); + extractorHolder = new ExtractorHolder(extractorsFactory.createExtractors(), this); pendingResetPositionUs = C.UNSET_TIME_US; sampleQueues = new DefaultTrackOutput[0]; length = C.LENGTH_UNBOUNDED; } - /** - * Builds default extractors that can be passed to an {@link ExtractorSampleSource} constructor. - * - * @return An array of default extractors. - */ - public static Extractor[] newDefaultExtractors() { - synchronized (ExtractorSampleSource.class) { - if (defaultExtractorClasses == null) { - // Lazily initialize defaultExtractorClasses. - List> extractorClasses = new ArrayList<>(); - // We reference extractors using reflection so that they can be deleted cleanly. - // Class.forName is used so that automated tools like proguard can detect the use of - // reflection (see http://proguard.sourceforge.net/FAQ.html#forname). - try { - extractorClasses.add( - Class.forName("com.google.android.exoplayer.extractor.mkv.MatroskaExtractor") - .asSubclass(Extractor.class)); - } catch (ClassNotFoundException e) { - // Extractor not found. - } - try { - extractorClasses.add( - Class.forName("com.google.android.exoplayer.extractor.mp4.FragmentedMp4Extractor") - .asSubclass(Extractor.class)); - } catch (ClassNotFoundException e) { - // Extractor not found. - } - try { - extractorClasses.add( - Class.forName("com.google.android.exoplayer.extractor.mp4.Mp4Extractor") - .asSubclass(Extractor.class)); - } catch (ClassNotFoundException e) { - // Extractor not found. - } - try { - extractorClasses.add( - Class.forName("com.google.android.exoplayer.extractor.mp3.Mp3Extractor") - .asSubclass(Extractor.class)); - } catch (ClassNotFoundException e) { - // Extractor not found. - } - try { - extractorClasses.add( - Class.forName("com.google.android.exoplayer.extractor.ts.AdtsExtractor") - .asSubclass(Extractor.class)); - } catch (ClassNotFoundException e) { - // Extractor not found. - } - try { - extractorClasses.add( - Class.forName("com.google.android.exoplayer.extractor.ts.TsExtractor") - .asSubclass(Extractor.class)); - } catch (ClassNotFoundException e) { - // Extractor not found. - } - try { - extractorClasses.add( - Class.forName("com.google.android.exoplayer.extractor.flv.FlvExtractor") - .asSubclass(Extractor.class)); - } catch (ClassNotFoundException e) { - // Extractor not found. - } - try { - extractorClasses.add( - Class.forName("com.google.android.exoplayer.extractor.ogg.OggExtractor") - .asSubclass(Extractor.class)); - } catch (ClassNotFoundException e) { - // Extractor not found. - } - try { - extractorClasses.add( - Class.forName("com.google.android.exoplayer.extractor.ts.PsExtractor") - .asSubclass(Extractor.class)); - } catch (ClassNotFoundException e) { - // Extractor not found. - } - try { - extractorClasses.add( - Class.forName("com.google.android.exoplayer.extractor.wav.WavExtractor") - .asSubclass(Extractor.class)); - } catch (ClassNotFoundException e) { - // Extractor not found. - } - try { - extractorClasses.add( - Class.forName("com.google.android.exoplayer.ext.flac.FlacExtractor") - .asSubclass(Extractor.class)); - } catch (ClassNotFoundException e) { - // Extractor not found. - } - defaultExtractorClasses = extractorClasses; - } - } - - Extractor[] extractors = new Extractor[defaultExtractorClasses.size()]; - for (int i = 0; i < extractors.length; i++) { - try { - extractors[i] = defaultExtractorClasses.get(i).getConstructor().newInstance(); - } catch (Exception e) { - // Should never happen. - throw new IllegalStateException("Unexpected error creating default extractor", e); - } - } - return extractors; - } - // SampleSource implementation. @Override diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/ExtractorsFactory.java b/library/src/main/java/com/google/android/exoplayer/extractor/ExtractorsFactory.java new file mode 100644 index 0000000000..85a1cc38fd --- /dev/null +++ b/library/src/main/java/com/google/android/exoplayer/extractor/ExtractorsFactory.java @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2014 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.exoplayer.extractor; + +/** + * Factory for arrays of {@link Extractor}s. + */ +public interface ExtractorsFactory { + + /** + * Returns an array of new {@link Extractor} instances. + */ + Extractor[] createExtractors(); + +} diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/flv/FlvExtractor.java b/library/src/main/java/com/google/android/exoplayer/extractor/flv/FlvExtractor.java index b5d7f5c16d..843e751432 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/flv/FlvExtractor.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/flv/FlvExtractor.java @@ -18,6 +18,7 @@ package com.google.android.exoplayer.extractor.flv; import com.google.android.exoplayer.extractor.Extractor; import com.google.android.exoplayer.extractor.ExtractorInput; import com.google.android.exoplayer.extractor.ExtractorOutput; +import com.google.android.exoplayer.extractor.ExtractorsFactory; import com.google.android.exoplayer.extractor.PositionHolder; import com.google.android.exoplayer.extractor.SeekMap; import com.google.android.exoplayer.util.ParsableByteArray; @@ -30,6 +31,18 @@ import java.io.IOException; */ public final class FlvExtractor implements Extractor, SeekMap { + /** + * Factory that returns one extractor which is a {@link FlvExtractor}. + */ + public static final class Factory implements ExtractorsFactory { + + @Override + public Extractor[] createExtractors() { + return new Extractor[] {new FlvExtractor()}; + } + + } + // Header sizes. private static final int FLV_HEADER_SIZE = 9; private static final int FLV_TAG_HEADER_SIZE = 11; diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/mkv/MatroskaExtractor.java b/library/src/main/java/com/google/android/exoplayer/extractor/mkv/MatroskaExtractor.java index 3014609a61..66d2030e33 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/mkv/MatroskaExtractor.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/mkv/MatroskaExtractor.java @@ -24,6 +24,7 @@ import com.google.android.exoplayer.extractor.ChunkIndex; import com.google.android.exoplayer.extractor.Extractor; import com.google.android.exoplayer.extractor.ExtractorInput; import com.google.android.exoplayer.extractor.ExtractorOutput; +import com.google.android.exoplayer.extractor.ExtractorsFactory; import com.google.android.exoplayer.extractor.PositionHolder; import com.google.android.exoplayer.extractor.SeekMap; import com.google.android.exoplayer.extractor.TrackOutput; @@ -51,6 +52,18 @@ import java.util.UUID; */ public final class MatroskaExtractor implements Extractor { + /** + * Factory that returns one extractor which is a {@link MatroskaExtractor}. + */ + public static final class Factory implements ExtractorsFactory { + + @Override + public Extractor[] createExtractors() { + return new Extractor[] {new MatroskaExtractor()}; + } + + } + private static final int BLOCK_STATE_START = 0; private static final int BLOCK_STATE_HEADER = 1; private static final int BLOCK_STATE_DATA = 2; diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/mp3/Mp3Extractor.java b/library/src/main/java/com/google/android/exoplayer/extractor/mp3/Mp3Extractor.java index 6d201542e7..0cc6646a61 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/mp3/Mp3Extractor.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/mp3/Mp3Extractor.java @@ -21,6 +21,7 @@ import com.google.android.exoplayer.ParserException; import com.google.android.exoplayer.extractor.Extractor; import com.google.android.exoplayer.extractor.ExtractorInput; import com.google.android.exoplayer.extractor.ExtractorOutput; +import com.google.android.exoplayer.extractor.ExtractorsFactory; import com.google.android.exoplayer.extractor.GaplessInfoHolder; import com.google.android.exoplayer.extractor.PositionHolder; import com.google.android.exoplayer.extractor.SeekMap; @@ -37,6 +38,18 @@ import java.io.IOException; */ public final class Mp3Extractor implements Extractor { + /** + * Factory that returns one extractor which is an {@link Mp3Extractor}. + */ + public static final class Factory implements ExtractorsFactory { + + @Override + public Extractor[] createExtractors() { + return new Extractor[] {new Mp3Extractor()}; + } + + } + /** * The maximum number of bytes to search when synchronizing, before giving up. */ diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/mp4/FragmentedMp4Extractor.java b/library/src/main/java/com/google/android/exoplayer/extractor/mp4/FragmentedMp4Extractor.java index 87ac20a66b..02a4fdce0c 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/mp4/FragmentedMp4Extractor.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/mp4/FragmentedMp4Extractor.java @@ -23,6 +23,7 @@ import com.google.android.exoplayer.extractor.ChunkIndex; import com.google.android.exoplayer.extractor.Extractor; import com.google.android.exoplayer.extractor.ExtractorInput; import com.google.android.exoplayer.extractor.ExtractorOutput; +import com.google.android.exoplayer.extractor.ExtractorsFactory; import com.google.android.exoplayer.extractor.PositionHolder; import com.google.android.exoplayer.extractor.SeekMap; import com.google.android.exoplayer.extractor.TrackOutput; @@ -50,6 +51,18 @@ import java.util.UUID; */ public final class FragmentedMp4Extractor implements Extractor { + /** + * Factory that returns one extractor which is a {@link FragmentedMp4Extractor}. + */ + public static final class Factory implements ExtractorsFactory { + + @Override + public Extractor[] createExtractors() { + return new Extractor[] {new FragmentedMp4Extractor()}; + } + + } + private static final String TAG = "FragmentedMp4Extractor"; private static final int SAMPLE_GROUP_TYPE_seig = Util.getIntegerCodeForString("seig"); diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/mp4/Mp4Extractor.java b/library/src/main/java/com/google/android/exoplayer/extractor/mp4/Mp4Extractor.java index 889e99fdfc..2f9da861fb 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/mp4/Mp4Extractor.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/mp4/Mp4Extractor.java @@ -21,6 +21,7 @@ import com.google.android.exoplayer.ParserException; import com.google.android.exoplayer.extractor.Extractor; import com.google.android.exoplayer.extractor.ExtractorInput; import com.google.android.exoplayer.extractor.ExtractorOutput; +import com.google.android.exoplayer.extractor.ExtractorsFactory; import com.google.android.exoplayer.extractor.GaplessInfoHolder; import com.google.android.exoplayer.extractor.PositionHolder; import com.google.android.exoplayer.extractor.SeekMap; @@ -41,6 +42,18 @@ import java.util.Stack; */ public final class Mp4Extractor implements Extractor, SeekMap { + /** + * Factory that returns one extractor which is an {@link Mp4Extractor}. + */ + public static final class Factory implements ExtractorsFactory { + + @Override + public Extractor[] createExtractors() { + return new Extractor[] {new Mp4Extractor()}; + } + + } + // Parser states. private static final int STATE_AFTER_SEEK = 0; private static final int STATE_READING_ATOM_HEADER = 1; diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/ogg/OggExtractor.java b/library/src/main/java/com/google/android/exoplayer/extractor/ogg/OggExtractor.java index 507b05f5af..7bdbf80fa1 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/ogg/OggExtractor.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/ogg/OggExtractor.java @@ -19,6 +19,7 @@ import com.google.android.exoplayer.ParserException; import com.google.android.exoplayer.extractor.Extractor; import com.google.android.exoplayer.extractor.ExtractorInput; import com.google.android.exoplayer.extractor.ExtractorOutput; +import com.google.android.exoplayer.extractor.ExtractorsFactory; import com.google.android.exoplayer.extractor.PositionHolder; import com.google.android.exoplayer.extractor.TrackOutput; import com.google.android.exoplayer.util.ParsableByteArray; @@ -30,6 +31,18 @@ import java.io.IOException; */ public class OggExtractor implements Extractor { + /** + * Factory that returns one extractor which is an {@link OggExtractor}. + */ + public static final class Factory implements ExtractorsFactory { + + @Override + public Extractor[] createExtractors() { + return new Extractor[] {new OggExtractor()}; + } + + } + private static final int MAX_VERIFICATION_BYTES = 8; private StreamReader streamReader; diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/ts/AdtsExtractor.java b/library/src/main/java/com/google/android/exoplayer/extractor/ts/AdtsExtractor.java index 7a4020d2d2..b030c56173 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/ts/AdtsExtractor.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/ts/AdtsExtractor.java @@ -19,6 +19,7 @@ import com.google.android.exoplayer.C; import com.google.android.exoplayer.extractor.Extractor; import com.google.android.exoplayer.extractor.ExtractorInput; import com.google.android.exoplayer.extractor.ExtractorOutput; +import com.google.android.exoplayer.extractor.ExtractorsFactory; import com.google.android.exoplayer.extractor.PositionHolder; import com.google.android.exoplayer.extractor.SeekMap; import com.google.android.exoplayer.util.ParsableBitArray; @@ -33,6 +34,18 @@ import java.io.IOException; */ public final class AdtsExtractor implements Extractor { + /** + * Factory that returns one extractor which is an {@link AdtsExtractor}. + */ + public static final class Factory implements ExtractorsFactory { + + @Override + public Extractor[] createExtractors() { + return new Extractor[] {new AdtsExtractor()}; + } + + } + private static final int MAX_PACKET_SIZE = 200; private static final int ID3_TAG = Util.getIntegerCodeForString("ID3"); /** diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/ts/PsExtractor.java b/library/src/main/java/com/google/android/exoplayer/extractor/ts/PsExtractor.java index b110a2bf7a..d36a347ce6 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/ts/PsExtractor.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/ts/PsExtractor.java @@ -19,6 +19,7 @@ import com.google.android.exoplayer.C; import com.google.android.exoplayer.extractor.Extractor; import com.google.android.exoplayer.extractor.ExtractorInput; import com.google.android.exoplayer.extractor.ExtractorOutput; +import com.google.android.exoplayer.extractor.ExtractorsFactory; import com.google.android.exoplayer.extractor.PositionHolder; import com.google.android.exoplayer.extractor.SeekMap; import com.google.android.exoplayer.util.ParsableBitArray; @@ -33,6 +34,18 @@ import java.io.IOException; */ public final class PsExtractor implements Extractor { + /** + * Factory that returns one extractor which is a {@link PsExtractor}. + */ + public static final class Factory implements ExtractorsFactory { + + @Override + public Extractor[] createExtractors() { + return new Extractor[] {new PsExtractor()}; + } + + } + private static final int PACK_START_CODE = 0x000001BA; private static final int SYSTEM_HEADER_START_CODE = 0x000001BB; private static final int PACKET_START_CODE_PREFIX = 0x000001; diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/ts/TsExtractor.java b/library/src/main/java/com/google/android/exoplayer/extractor/ts/TsExtractor.java index 87b973355f..0cde7c3696 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/ts/TsExtractor.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/ts/TsExtractor.java @@ -20,6 +20,7 @@ import com.google.android.exoplayer.extractor.DummyTrackOutput; import com.google.android.exoplayer.extractor.Extractor; import com.google.android.exoplayer.extractor.ExtractorInput; import com.google.android.exoplayer.extractor.ExtractorOutput; +import com.google.android.exoplayer.extractor.ExtractorsFactory; import com.google.android.exoplayer.extractor.PositionHolder; import com.google.android.exoplayer.extractor.SeekMap; import com.google.android.exoplayer.util.Assertions; @@ -38,6 +39,18 @@ import java.io.IOException; */ public final class TsExtractor implements Extractor { + /** + * Factory that returns one extractor which is a {@link TsExtractor}. + */ + public static final class Factory implements ExtractorsFactory { + + @Override + public Extractor[] createExtractors() { + return new Extractor[] {new TsExtractor()}; + } + + } + public static final int WORKAROUND_ALLOW_NON_IDR_KEYFRAMES = 1; public static final int WORKAROUND_IGNORE_AAC_STREAM = 2; public static final int WORKAROUND_IGNORE_H264_STREAM = 4; diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/wav/WavExtractor.java b/library/src/main/java/com/google/android/exoplayer/extractor/wav/WavExtractor.java index 902fd1034b..e76749677d 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/wav/WavExtractor.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/wav/WavExtractor.java @@ -21,6 +21,7 @@ import com.google.android.exoplayer.ParserException; import com.google.android.exoplayer.extractor.Extractor; import com.google.android.exoplayer.extractor.ExtractorInput; import com.google.android.exoplayer.extractor.ExtractorOutput; +import com.google.android.exoplayer.extractor.ExtractorsFactory; import com.google.android.exoplayer.extractor.PositionHolder; import com.google.android.exoplayer.extractor.SeekMap; import com.google.android.exoplayer.extractor.TrackOutput; @@ -31,6 +32,18 @@ import java.io.IOException; /** {@link Extractor} to extract samples from a WAV byte stream. */ public final class WavExtractor implements Extractor, SeekMap { + /** + * Factory that returns one extractor which is a {@link WavExtractor}. + */ + public static final class Factory implements ExtractorsFactory { + + @Override + public Extractor[] createExtractors() { + return new Extractor[] {new WavExtractor()}; + } + + } + /** Arbitrary maximum input size of 32KB, which is ~170ms of 16-bit stereo PCM audio at 48KHz. */ private static final int MAX_INPUT_SIZE = 32 * 1024;