From 0b946ac3178cb0d4435930690b47eda3e79edd56 Mon Sep 17 00:00:00 2001 From: andrewlewis Date: Mon, 2 Mar 2020 08:38:59 +0000 Subject: [PATCH] Move max encoded audio rates to format utils PiperOrigin-RevId: 298290511 --- .../android/exoplayer2/audio/AacUtil.java | 22 +++++++++++++ .../android/exoplayer2/audio/Ac3Util.java | 7 +++++ .../android/exoplayer2/audio/Ac4Util.java | 3 ++ .../android/exoplayer2/audio/DtsUtil.java | 9 ++++++ .../exoplayer2/audio/MpegAudioUtil.java | 6 ++++ .../exoplayer2/audio/DefaultAudioSink.java | 31 +++++++------------ 6 files changed, 59 insertions(+), 19 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/audio/AacUtil.java b/library/common/src/main/java/com/google/android/exoplayer2/audio/AacUtil.java index 09a1125e07..024f848ea2 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/audio/AacUtil.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/audio/AacUtil.java @@ -61,6 +61,28 @@ public final class AacUtil { */ public static final int AAC_LD_AUDIO_SAMPLE_COUNT = 512; + // Maximum bitrates for AAC profiles from the Fraunhofer FDK AAC encoder documentation: + // https://cs.android.com/android/platform/superproject/+/android-9.0.0_r8:external/aac/libAACenc/include/aacenc_lib.h;l=718 + /** Maximum rate for an AAC LC audio stream, in bytes per second. */ + public static final int AAC_LC_MAX_RATE_BYTES_PER_SECOND = 800 * 1000 / 8; + /** Maximum rate for an AAC HE V1 audio stream, in bytes per second. */ + public static final int AAC_HE_V1_MAX_RATE_BYTES_PER_SECOND = 128 * 1000 / 8; + /** Maximum rate for an AAC HE V2 audio stream, in bytes per second. */ + public static final int AAC_HE_V2_MAX_RATE_BYTES_PER_SECOND = 56 * 1000 / 8; + /** + * Maximum rate for an AAC XHE audio stream, in bytes per second. + * + *

Fraunhofer documentation says "500 kbit/s and above" for stereo, so we use a rate generously + * above the 500 kbit/s level. + */ + public static final int AAC_XHE_MAX_RATE_BYTES_PER_SECOND = 2048 * 1000 / 8; + /** + * Maximum rate for an AAC ELD audio stream, in bytes per second. + * + *

Fraunhofer documentation shows AAC-ELD as useful for up to ~ 64 kbit/s so we use this value. + */ + public static final int AAC_ELD_MAX_RATE_BYTES_PER_SECOND = 64 * 1000 / 8; + private static final int AUDIO_SPECIFIC_CONFIG_FREQUENCY_INDEX_ARBITRARY = 0xF; private static final int[] AUDIO_SPECIFIC_CONFIG_SAMPLING_RATE_TABLE = new int[] { diff --git a/library/common/src/main/java/com/google/android/exoplayer2/audio/Ac3Util.java b/library/common/src/main/java/com/google/android/exoplayer2/audio/Ac3Util.java index 5f009309d2..d4042a99b1 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/audio/Ac3Util.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/audio/Ac3Util.java @@ -99,6 +99,13 @@ public final class Ac3Util { } + /** Maximum rate for an AC-3 audio stream, in bytes per second. */ + public static final int AC3_MAX_RATE_BYTES_PER_SECOND = 640 * 1000 / 8; + /** Maximum rate for an E-AC-3 audio stream, in bytes per second. */ + public static final int E_AC3_MAX_RATE_BYTES_PER_SECOND = 6144 * 1000 / 8; + /** Maximum rate for a TrueHD audio stream, in bytes per second. */ + public static final int TRUEHD_MAX_RATE_BYTES_PER_SECOND = 24500 * 1000 / 8; + /** * The number of samples to store in each output chunk when rechunking TrueHD streams. The number * of samples extracted from the container corresponding to one syncframe must be an integer diff --git a/library/common/src/main/java/com/google/android/exoplayer2/audio/Ac4Util.java b/library/common/src/main/java/com/google/android/exoplayer2/audio/Ac4Util.java index 5e0c660133..2e4367f4e2 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/audio/Ac4Util.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/audio/Ac4Util.java @@ -54,6 +54,9 @@ public final class Ac4Util { public static final int AC40_SYNCWORD = 0xAC40; public static final int AC41_SYNCWORD = 0xAC41; + /** Maximum rate for an AC-4 audio stream, in bytes per second. */ + public static final int MAX_RATE_BYTES_PER_SECOND = 2688 * 1000 / 8; + /** The channel count of AC-4 stream. */ // TODO: Parse AC-4 stream channel count. private static final int CHANNEL_COUNT_2 = 2; diff --git a/library/common/src/main/java/com/google/android/exoplayer2/audio/DtsUtil.java b/library/common/src/main/java/com/google/android/exoplayer2/audio/DtsUtil.java index dbf96ff173..8640c46e1a 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/audio/DtsUtil.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/audio/DtsUtil.java @@ -28,6 +28,15 @@ import java.util.Arrays; */ public final class DtsUtil { + /** + * Maximum rate for a DTS audio stream, in bytes per second. + * + *

DTS allows an 'open' bitrate, but we assume the maximum listed value: 1536 kbit/s. + */ + public static final int DTS_MAX_RATE_BYTES_PER_SECOND = 1536 * 1000 / 8; + /** Maximum rate for a DTS-HD audio stream, in bytes per second. */ + public static final int DTS_HD_MAX_RATE_BYTES_PER_SECOND = 18000 * 1000 / 8; + private static final int SYNC_VALUE_BE = 0x7FFE8001; private static final int SYNC_VALUE_14B_BE = 0x1FFFE800; private static final int SYNC_VALUE_LE = 0xFE7F0180; diff --git a/library/common/src/main/java/com/google/android/exoplayer2/audio/MpegAudioUtil.java b/library/common/src/main/java/com/google/android/exoplayer2/audio/MpegAudioUtil.java index 6c72a16e06..d09443daf0 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/audio/MpegAudioUtil.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/audio/MpegAudioUtil.java @@ -209,6 +209,12 @@ public final class MpegAudioUtil { */ public static final int MAX_FRAME_SIZE_BYTES = 4096; + /** + * Maximum rate for an MPEG audio stream corresponding to MPEG-1 layer III (320 kbit/s), in bytes + * per second. + */ + public static final int MAX_RATE_BYTES_PER_SECOND = 320 * 1000 / 8; + private static final String[] MIME_TYPE_BY_LAYER = new String[] {MimeTypes.AUDIO_MPEG_L1, MimeTypes.AUDIO_MPEG_L2, MimeTypes.AUDIO_MPEG}; private static final int[] SAMPLING_RATE_V1 = {44100, 48000, 32000}; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java index 9c1bce35d9..a4702f8242 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java @@ -1208,37 +1208,30 @@ public final class DefaultAudioSink implements AudioSink { private static int getMaximumEncodedRateBytesPerSecond(@C.Encoding int encoding) { switch (encoding) { case C.ENCODING_MP3: - // Maximum bitrate for MPEG-1 layer III: 320 kbit/s. - return 320 * 1000 / 8; + return MpegAudioUtil.MAX_RATE_BYTES_PER_SECOND; case C.ENCODING_AAC_LC: - // Maximum bitrates for AAC profiles from the Fraunhofer FDK AAC encoder documentation: - // https://cs.android.com/android/platform/superproject/+/android-9.0.0_r8:external/aac/libAACenc/include/aacenc_lib.h;l=718 - return 800 * 1000 / 8; + return AacUtil.AAC_LC_MAX_RATE_BYTES_PER_SECOND; case C.ENCODING_AAC_HE_V1: - return 128 * 1000 / 8; + return AacUtil.AAC_HE_V1_MAX_RATE_BYTES_PER_SECOND; case C.ENCODING_AAC_HE_V2: - return 56 * 1000 / 8; + return AacUtil.AAC_HE_V2_MAX_RATE_BYTES_PER_SECOND; case C.ENCODING_AAC_XHE: - // Fraunhofer documentation says "500 kbit/s and above" for stereo, so we use a rate - // generously above the 500 kbit/s level. - return 2048 * 1000 / 8; + return AacUtil.AAC_XHE_MAX_RATE_BYTES_PER_SECOND; case C.ENCODING_AAC_ELD: - // Fraunhofer documentation shows AAC-ELD as useful for up to ~ 64 kbit/s. - return 64 * 1000 / 8; + return AacUtil.AAC_ELD_MAX_RATE_BYTES_PER_SECOND; case C.ENCODING_AC3: - return 640 * 1000 / 8; + return Ac3Util.AC3_MAX_RATE_BYTES_PER_SECOND; case C.ENCODING_E_AC3: case C.ENCODING_E_AC3_JOC: - return 6144 * 1000 / 8; + return Ac3Util.E_AC3_MAX_RATE_BYTES_PER_SECOND; case C.ENCODING_AC4: - return 2688 * 1000 / 8; + return Ac4Util.MAX_RATE_BYTES_PER_SECOND; case C.ENCODING_DTS: - // DTS allows an 'open' bitrate, but we assume the maximum listed value: 1536 kbit/s. - return 1536 * 1000 / 8; + return DtsUtil.DTS_MAX_RATE_BYTES_PER_SECOND; case C.ENCODING_DTS_HD: - return 18000 * 1000 / 8; + return DtsUtil.DTS_HD_MAX_RATE_BYTES_PER_SECOND; case C.ENCODING_DOLBY_TRUEHD: - return 24500 * 1000 / 8; + return Ac3Util.TRUEHD_MAX_RATE_BYTES_PER_SECOND; case C.ENCODING_PCM_16BIT: case C.ENCODING_PCM_16BIT_BIG_ENDIAN: case C.ENCODING_PCM_24BIT: