> 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;