From 6528aef2bb48f165f5a519e590104f60055fefe1 Mon Sep 17 00:00:00 2001 From: aquilescanta Date: Fri, 26 Aug 2016 06:00:31 -0700 Subject: [PATCH] Add automatic E-AC-3 detection to the Ac3Reader This is done through the bitstream id field and allows removing the isEac3 parameter from the constructor. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=131393477 --- .../exoplayer2/extractor/ts/Ac3Extractor.java | 2 +- .../android/exoplayer2/extractor/ts/Ac3Reader.java | 12 ++++++------ .../android/exoplayer2/extractor/ts/PsExtractor.java | 2 +- .../android/exoplayer2/extractor/ts/TsExtractor.java | 4 +--- 4 files changed, 9 insertions(+), 11 deletions(-) diff --git a/library/src/main/java/com/google/android/exoplayer2/extractor/ts/Ac3Extractor.java b/library/src/main/java/com/google/android/exoplayer2/extractor/ts/Ac3Extractor.java index 2bb2c93a0d..8d67be4434 100644 --- a/library/src/main/java/com/google/android/exoplayer2/extractor/ts/Ac3Extractor.java +++ b/library/src/main/java/com/google/android/exoplayer2/extractor/ts/Ac3Extractor.java @@ -114,7 +114,7 @@ public final class Ac3Extractor implements Extractor { @Override public void init(ExtractorOutput output) { - reader = new Ac3Reader(output.track(0), false); // TODO: Add support for embedded ID3. + reader = new Ac3Reader(output.track(0)); // TODO: Add support for embedded ID3. output.endTracks(); output.seekMap(new SeekMap.Unseekable(C.TIME_UNSET)); } diff --git a/library/src/main/java/com/google/android/exoplayer2/extractor/ts/Ac3Reader.java b/library/src/main/java/com/google/android/exoplayer2/extractor/ts/Ac3Reader.java index b64c56ab07..569f4e16df 100644 --- a/library/src/main/java/com/google/android/exoplayer2/extractor/ts/Ac3Reader.java +++ b/library/src/main/java/com/google/android/exoplayer2/extractor/ts/Ac3Reader.java @@ -33,7 +33,6 @@ import com.google.android.exoplayer2.util.ParsableByteArray; private static final int HEADER_SIZE = 8; - private final boolean isEac3; private final ParsableBitArray headerScratchBits; private final ParsableByteArray headerScratchBytes; @@ -47,21 +46,18 @@ import com.google.android.exoplayer2.util.ParsableByteArray; private long sampleDurationUs; private Format format; private int sampleSize; + private boolean isEac3; // Used when reading the samples. private long timeUs; - // TODO: Remove the isEac3 parameter by reading the BSID field. /** * Constructs a new reader for (E-)AC-3 elementary streams. * * @param output Track output for extracted samples. - * @param isEac3 Whether the stream is E-AC-3 (ETSI TS 102 366 Annex E). Specify {@code false} to - * decode sample headers as AC-3. */ - public Ac3Reader(TrackOutput output, boolean isEac3) { + public Ac3Reader(TrackOutput output) { super(output); - this.isEac3 = isEac3; headerScratchBits = new ParsableBitArray(new byte[HEADER_SIZE]); headerScratchBytes = new ParsableByteArray(headerScratchBits.data); state = STATE_FINDING_SYNC; @@ -163,6 +159,10 @@ import com.google.android.exoplayer2.util.ParsableByteArray; */ private void parseHeader() { if (format == null) { + // We read ahead to distinguish between AC-3 and E-AC-3. + headerScratchBits.skipBits(40); + isEac3 = headerScratchBits.readBits(5) == 16; + headerScratchBits.setPosition(headerScratchBits.getPosition() - 45); format = isEac3 ? Ac3Util.parseEac3SyncframeFormat(headerScratchBits, null, null, null) : Ac3Util.parseAc3SyncframeFormat(headerScratchBits, null, null, null); output.format(format); diff --git a/library/src/main/java/com/google/android/exoplayer2/extractor/ts/PsExtractor.java b/library/src/main/java/com/google/android/exoplayer2/extractor/ts/PsExtractor.java index 85df619ca9..849dc90cf2 100644 --- a/library/src/main/java/com/google/android/exoplayer2/extractor/ts/PsExtractor.java +++ b/library/src/main/java/com/google/android/exoplayer2/extractor/ts/PsExtractor.java @@ -189,7 +189,7 @@ public final class PsExtractor implements Extractor { // Private stream, used for AC3 audio. // NOTE: This may need further parsing to determine if its DTS, but that's likely only // valid for DVDs. - elementaryStreamReader = new Ac3Reader(output.track(streamId), false); + elementaryStreamReader = new Ac3Reader(output.track(streamId)); foundAudioTrack = true; } else if (!foundAudioTrack && (streamId & AUDIO_STREAM_MASK) == AUDIO_STREAM) { elementaryStreamReader = new MpegAudioReader(output.track(streamId)); diff --git a/library/src/main/java/com/google/android/exoplayer2/extractor/ts/TsExtractor.java b/library/src/main/java/com/google/android/exoplayer2/extractor/ts/TsExtractor.java index f17e7fc3b0..2a80ec8d21 100644 --- a/library/src/main/java/com/google/android/exoplayer2/extractor/ts/TsExtractor.java +++ b/library/src/main/java/com/google/android/exoplayer2/extractor/ts/TsExtractor.java @@ -406,10 +406,8 @@ public final class TsExtractor implements Extractor { : new AdtsReader(output.track(trackId), new DummyTrackOutput()); break; case TS_STREAM_TYPE_AC3: - pesPayloadReader = new Ac3Reader(output.track(trackId), false); - break; case TS_STREAM_TYPE_E_AC3: - pesPayloadReader = new Ac3Reader(output.track(trackId), true); + pesPayloadReader = new Ac3Reader(output.track(trackId)); break; case TS_STREAM_TYPE_DTS: case TS_STREAM_TYPE_HDMV_DTS: