From f91ea9039dae92793fc62caa4080d4a58a947771 Mon Sep 17 00:00:00 2001 From: Oliver Woodman Date: Tue, 27 Oct 2015 18:20:53 +0000 Subject: [PATCH] Read AC-3 and HEVC signaled by private registration_descriptor. Issue: #898 --- .../exoplayer/extractor/ts/TsExtractor.java | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) 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 5b553838ec..1960eaf9db 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 @@ -22,6 +22,7 @@ import com.google.android.exoplayer.extractor.PositionHolder; import com.google.android.exoplayer.extractor.SeekMap; import com.google.android.exoplayer.util.ParsableBitArray; import com.google.android.exoplayer.util.ParsableByteArray; +import com.google.android.exoplayer.util.Util; import android.util.Log; import android.util.SparseArray; @@ -50,6 +51,9 @@ public final class TsExtractor implements Extractor { private static final int TS_STREAM_TYPE_ID3 = 0x15; private static final int TS_STREAM_TYPE_EIA608 = 0x100; // 0xFF + 1 + private static final long AC3_FORMAT_IDENTIFIER = Util.getIntegerCodeForString("AC-3"); + private static final long HEVC_FORMAT_IDENTIFIER = Util.getIntegerCodeForString("HEVC"); + private final PtsTimestampAdjuster ptsTimestampAdjuster; private final ParsableByteArray tsPacketBuffer; private final ParsableBitArray tsScratch; @@ -283,8 +287,21 @@ public final class TsExtractor implements Extractor { pmtScratch.skipBits(4); // reserved int esInfoLength = pmtScratch.readBits(12); - // Skip the descriptors. - data.skipBytes(esInfoLength); + int descriptorPosition = data.getPosition(); + if (streamType == 0x06) { + int descriptorTag = data.readUnsignedByte(); + if (descriptorTag == 0x05) { // registration_descriptor + data.skipBytes(1); // descriptor_length + long formatIdentifier = data.readUnsignedInt(); + if (formatIdentifier == AC3_FORMAT_IDENTIFIER) { + streamType = TS_STREAM_TYPE_ATSC_AC3; + } else if (formatIdentifier == HEVC_FORMAT_IDENTIFIER) { + streamType = TS_STREAM_TYPE_H265; + } + // Ignore additional_identification_info. + } + } + data.setPosition(descriptorPosition + esInfoLength); entriesSize -= esInfoLength + 5; if (streamTypes.get(streamType)) {