From 72daef7a4c3ae5a9375f7d064d88bbc9f6f96da6 Mon Sep 17 00:00:00 2001 From: aquilescanta Date: Thu, 3 Aug 2017 08:17:26 -0700 Subject: [PATCH] Don't read GaSpecificConfig unless required ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=164125579 --- .../exoplayer2/extractor/ts/LatmReader.java | 2 +- .../util/CodecSpecificDataUtil.java | 70 ++++++++++--------- 2 files changed, 38 insertions(+), 34 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/extractor/ts/LatmReader.java b/library/core/src/main/java/com/google/android/exoplayer2/extractor/ts/LatmReader.java index d21943eae8..d06c6f0cb4 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/extractor/ts/LatmReader.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/extractor/ts/LatmReader.java @@ -256,7 +256,7 @@ public final class LatmReader implements ElementaryStreamReader { private int parseAudioSpecificConfig(ParsableBitArray data) throws ParserException { int bitsLeft = data.bitsLeft(); - Pair config = CodecSpecificDataUtil.parseAacAudioSpecificConfig(data); + Pair config = CodecSpecificDataUtil.parseAacAudioSpecificConfig(data, true); sampleRateHz = config.first; channelCount = config.second; return bitsLeft - data.bitsLeft(); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/util/CodecSpecificDataUtil.java b/library/core/src/main/java/com/google/android/exoplayer2/util/CodecSpecificDataUtil.java index c9884abe78..0514d9dbdc 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/util/CodecSpecificDataUtil.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/util/CodecSpecificDataUtil.java @@ -90,7 +90,7 @@ public final class CodecSpecificDataUtil { */ public static Pair parseAacAudioSpecificConfig(byte[] audioSpecificConfig) throws ParserException { - return parseAacAudioSpecificConfig(new ParsableBitArray(audioSpecificConfig)); + return parseAacAudioSpecificConfig(new ParsableBitArray(audioSpecificConfig), false); } /** @@ -98,11 +98,13 @@ public final class CodecSpecificDataUtil { * * @param bitArray A {@link ParsableBitArray} containing the AudioSpecificConfig to parse. The * position is advanced to the end of the AudioSpecificConfig. + * @param forceReadToEnd Whether the entire AudioSpecificConfig should be read. Required for + * knowing the length of the configuration payload. * @return A pair consisting of the sample rate in Hz and the channel count. * @throws ParserException If the AudioSpecificConfig cannot be parsed as it's not supported. */ - public static Pair parseAacAudioSpecificConfig(ParsableBitArray bitArray) - throws ParserException { + public static Pair parseAacAudioSpecificConfig(ParsableBitArray bitArray, + boolean forceReadToEnd) throws ParserException { int audioObjectType = getAacAudioObjectType(bitArray); int sampleRate = getAacSamplingFrequency(bitArray); int channelConfiguration = bitArray.readBits(4); @@ -120,36 +122,38 @@ public final class CodecSpecificDataUtil { } } - switch (audioObjectType) { - case 1: - case 2: - case 3: - case 4: - case 6: - case 7: - case 17: - case 19: - case 20: - case 21: - case 22: - case 23: - parseGaSpecificConfig(bitArray, audioObjectType, channelConfiguration); - break; - default: - throw new ParserException("Unsupported audio object type: " + audioObjectType); - } - switch (audioObjectType) { - case 17: - case 19: - case 20: - case 21: - case 22: - case 23: - int epConfig = bitArray.readBits(2); - if (epConfig == 2 || epConfig == 3) { - throw new ParserException("Unsupported epConfig: " + epConfig); - } - break; + if (forceReadToEnd) { + switch (audioObjectType) { + case 1: + case 2: + case 3: + case 4: + case 6: + case 7: + case 17: + case 19: + case 20: + case 21: + case 22: + case 23: + parseGaSpecificConfig(bitArray, audioObjectType, channelConfiguration); + break; + default: + throw new ParserException("Unsupported audio object type: " + audioObjectType); + } + switch (audioObjectType) { + case 17: + case 19: + case 20: + case 21: + case 22: + case 23: + int epConfig = bitArray.readBits(2); + if (epConfig == 2 || epConfig == 3) { + throw new ParserException("Unsupported epConfig: " + epConfig); + } + break; + } } // For supported containers, bits_to_decode() is always 0. int channelCount = AUDIO_SPECIFIC_CONFIG_CHANNEL_COUNT_TABLE[channelConfiguration];