Commit f0a72c49 by olly Committed by Oliver Woodman

Fix playback of DASH/VP9/SegmentList DASH content

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=154077149
parent 8e8a6a29
...@@ -64,11 +64,25 @@ public final class DefaultExtractorsFactory implements ExtractorsFactory { ...@@ -64,11 +64,25 @@ public final class DefaultExtractorsFactory implements ExtractorsFactory {
FLAC_EXTRACTOR_CONSTRUCTOR = flacExtractorConstructor; FLAC_EXTRACTOR_CONSTRUCTOR = flacExtractorConstructor;
} }
private @MatroskaExtractor.Flags int matroskaFlags;
private @FragmentedMp4Extractor.Flags int fragmentedMp4Flags; private @FragmentedMp4Extractor.Flags int fragmentedMp4Flags;
private @Mp3Extractor.Flags int mp3Flags; private @Mp3Extractor.Flags int mp3Flags;
private @DefaultTsPayloadReaderFactory.Flags int tsFlags; private @DefaultTsPayloadReaderFactory.Flags int tsFlags;
/** /**
* Sets flags for {@link MatroskaExtractor} instances created by the factory.
*
* @see MatroskaExtractor#MatroskaExtractor(int)
* @param flags The flags to use.
* @return The factory, for convenience.
*/
public synchronized DefaultExtractorsFactory setMatroskaExtractorFlags(
@MatroskaExtractor.Flags int flags) {
this.matroskaFlags = flags;
return this;
}
/**
* Sets flags for {@link FragmentedMp4Extractor} instances created by the factory. * Sets flags for {@link FragmentedMp4Extractor} instances created by the factory.
* *
* @see FragmentedMp4Extractor#FragmentedMp4Extractor(int) * @see FragmentedMp4Extractor#FragmentedMp4Extractor(int)
...@@ -110,7 +124,7 @@ public final class DefaultExtractorsFactory implements ExtractorsFactory { ...@@ -110,7 +124,7 @@ public final class DefaultExtractorsFactory implements ExtractorsFactory {
@Override @Override
public synchronized Extractor[] createExtractors() { public synchronized Extractor[] createExtractors() {
Extractor[] extractors = new Extractor[FLAC_EXTRACTOR_CONSTRUCTOR == null ? 11 : 12]; Extractor[] extractors = new Extractor[FLAC_EXTRACTOR_CONSTRUCTOR == null ? 11 : 12];
extractors[0] = new MatroskaExtractor(); extractors[0] = new MatroskaExtractor(matroskaFlags);
extractors[1] = new FragmentedMp4Extractor(fragmentedMp4Flags); extractors[1] = new FragmentedMp4Extractor(fragmentedMp4Flags);
extractors[2] = new Mp4Extractor(); extractors[2] = new Mp4Extractor();
extractors[3] = new Mp3Extractor(mp3Flags); extractors[3] = new Mp3Extractor(mp3Flags);
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
*/ */
package com.google.android.exoplayer2.extractor.mkv; package com.google.android.exoplayer2.extractor.mkv;
import android.support.annotation.IntDef;
import android.util.SparseArray; import android.util.SparseArray;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
...@@ -38,6 +39,8 @@ import com.google.android.exoplayer2.util.Util; ...@@ -38,6 +39,8 @@ import com.google.android.exoplayer2.util.Util;
import com.google.android.exoplayer2.video.AvcConfig; import com.google.android.exoplayer2.video.AvcConfig;
import com.google.android.exoplayer2.video.HevcConfig; import com.google.android.exoplayer2.video.HevcConfig;
import java.io.IOException; import java.io.IOException;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.ByteOrder; import java.nio.ByteOrder;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -64,6 +67,22 @@ public final class MatroskaExtractor implements Extractor { ...@@ -64,6 +67,22 @@ public final class MatroskaExtractor implements Extractor {
}; };
/**
* Flags controlling the behavior of the extractor.
*/
@Retention(RetentionPolicy.SOURCE)
@IntDef(flag = true, value = {FLAG_DISABLE_SEEK_FOR_CUES})
public @interface Flags {}
/**
* Flag to disable seeking for cues.
* <p>
* Normally (i.e. when this flag is not set) the extractor will seek to the cues element if its
* position is specified in the seek head and if it's after the first cluster. Setting this flag
* disables seeking to the cues element. If the cues element is after the first cluster then the
* media is treated as being unseekable.
*/
public static final int FLAG_DISABLE_SEEK_FOR_CUES = 1;
private static final int UNSET_ENTRY_ID = -1; private static final int UNSET_ENTRY_ID = -1;
private static final int BLOCK_STATE_START = 0; private static final int BLOCK_STATE_START = 0;
...@@ -222,6 +241,7 @@ public final class MatroskaExtractor implements Extractor { ...@@ -222,6 +241,7 @@ public final class MatroskaExtractor implements Extractor {
private final EbmlReader reader; private final EbmlReader reader;
private final VarintReader varintReader; private final VarintReader varintReader;
private final SparseArray<Track> tracks; private final SparseArray<Track> tracks;
private final boolean seekForCuesEnabled;
// Temporary arrays. // Temporary arrays.
private final ParsableByteArray nalStartCode; private final ParsableByteArray nalStartCode;
...@@ -289,12 +309,17 @@ public final class MatroskaExtractor implements Extractor { ...@@ -289,12 +309,17 @@ public final class MatroskaExtractor implements Extractor {
private ExtractorOutput extractorOutput; private ExtractorOutput extractorOutput;
public MatroskaExtractor() { public MatroskaExtractor() {
this(new DefaultEbmlReader()); this(0);
}
public MatroskaExtractor(@Flags int flags) {
this(new DefaultEbmlReader(), flags);
} }
/* package */ MatroskaExtractor(EbmlReader reader) { /* package */ MatroskaExtractor(EbmlReader reader, @Flags int flags) {
this.reader = reader; this.reader = reader;
this.reader.init(new InnerEbmlReaderOutput()); this.reader.init(new InnerEbmlReaderOutput());
seekForCuesEnabled = (flags & FLAG_DISABLE_SEEK_FOR_CUES) == 0;
varintReader = new VarintReader(); varintReader = new VarintReader();
tracks = new SparseArray<>(); tracks = new SparseArray<>();
scratch = new ParsableByteArray(4); scratch = new ParsableByteArray(4);
...@@ -448,7 +473,7 @@ public final class MatroskaExtractor implements Extractor { ...@@ -448,7 +473,7 @@ public final class MatroskaExtractor implements Extractor {
case ID_CLUSTER: case ID_CLUSTER:
if (!sentSeekMap) { if (!sentSeekMap) {
// We need to build cues before parsing the cluster. // We need to build cues before parsing the cluster.
if (cuesContentPosition != C.POSITION_UNSET) { if (seekForCuesEnabled && cuesContentPosition != C.POSITION_UNSET) {
// We know where the Cues element is located. Seek to request it. // We know where the Cues element is located. Seek to request it.
seekForCues = true; seekForCues = true;
} else { } else {
......
...@@ -393,7 +393,7 @@ public class DefaultDashChunkSource implements DashChunkSource { ...@@ -393,7 +393,7 @@ public class DefaultDashChunkSource implements DashChunkSource {
if (MimeTypes.APPLICATION_RAWCC.equals(containerMimeType)) { if (MimeTypes.APPLICATION_RAWCC.equals(containerMimeType)) {
extractor = new RawCcExtractor(representation.format); extractor = new RawCcExtractor(representation.format);
} else if (mimeTypeIsWebm(containerMimeType)) { } else if (mimeTypeIsWebm(containerMimeType)) {
extractor = new MatroskaExtractor(); extractor = new MatroskaExtractor(MatroskaExtractor.FLAG_DISABLE_SEEK_FOR_CUES);
} else { } else {
int flags = 0; int flags = 0;
if (enableEventMessageTrack) { if (enableEventMessageTrack) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment