diff --git a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.java b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.java index db68fb3e89..6b311f2db0 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.java @@ -21,7 +21,6 @@ import android.media.MediaCodecInfo.CodecProfileLevel; import android.media.MediaCodecList; import android.text.TextUtils; import android.util.Pair; -import android.util.SparseIntArray; import androidx.annotation.CheckResult; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; @@ -35,7 +34,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.checkerframework.checker.nullness.qual.EnsuresNonNull; @@ -67,26 +65,16 @@ public final class MediaCodecUtil { // Codecs to constant mappings. // AVC. - private static final SparseIntArray AVC_PROFILE_NUMBER_TO_CONST; - private static final SparseIntArray AVC_LEVEL_NUMBER_TO_CONST; private static final String CODEC_ID_AVC1 = "avc1"; private static final String CODEC_ID_AVC2 = "avc2"; // VP9 - private static final SparseIntArray VP9_PROFILE_NUMBER_TO_CONST; - private static final SparseIntArray VP9_LEVEL_NUMBER_TO_CONST; private static final String CODEC_ID_VP09 = "vp09"; // HEVC. - private static final Map HEVC_CODEC_STRING_TO_PROFILE_LEVEL; private static final String CODEC_ID_HEV1 = "hev1"; private static final String CODEC_ID_HVC1 = "hvc1"; - // Dolby Vision. - private static final Map DOLBY_VISION_STRING_TO_PROFILE; - private static final Map DOLBY_VISION_STRING_TO_LEVEL; // AV1. - private static final SparseIntArray AV1_LEVEL_NUMBER_TO_CONST; private static final String CODEC_ID_AV01 = "av01"; // MP4A AAC. - private static final SparseIntArray MP4A_AUDIO_OBJECT_TYPE_TO_PROFILE; private static final String CODEC_ID_MP4A = "mp4a"; // Lazily initialized. @@ -689,13 +677,13 @@ public final class MediaCodecUtil { return null; } @Nullable String profileString = matcher.group(1); - @Nullable Integer profile = DOLBY_VISION_STRING_TO_PROFILE.get(profileString); + @Nullable Integer profile = dolbyVisionStringToProfile(profileString); if (profile == null) { Log.w(TAG, "Unknown Dolby Vision profile string: " + profileString); return null; } String levelString = parts[2]; - @Nullable Integer level = DOLBY_VISION_STRING_TO_LEVEL.get(levelString); + @Nullable Integer level = dolbyVisionStringToLevel(levelString); if (level == null) { Log.w(TAG, "Unknown Dolby Vision level string: " + levelString); return null; @@ -727,7 +715,7 @@ public final class MediaCodecUtil { return null; } @Nullable String levelString = parts[3]; - @Nullable Integer level = HEVC_CODEC_STRING_TO_PROFILE_LEVEL.get(levelString); + @Nullable Integer level = hevcCodecStringToProfileLevel(levelString); if (level == null) { Log.w(TAG, "Unknown HEVC level string: " + levelString); return null; @@ -763,12 +751,12 @@ public final class MediaCodecUtil { return null; } - int profile = AVC_PROFILE_NUMBER_TO_CONST.get(profileInteger, -1); + int profile = avcProfileNumberToConst(profileInteger); if (profile == -1) { Log.w(TAG, "Unknown AVC profile: " + profileInteger); return null; } - int level = AVC_LEVEL_NUMBER_TO_CONST.get(levelInteger, -1); + int level = avcLevelNumberToConst(levelInteger); if (level == -1) { Log.w(TAG, "Unknown AVC level: " + levelInteger); return null; @@ -792,12 +780,12 @@ public final class MediaCodecUtil { return null; } - int profile = VP9_PROFILE_NUMBER_TO_CONST.get(profileInteger, -1); + int profile = vp9ProfileNumberToConst(profileInteger); if (profile == -1) { Log.w(TAG, "Unknown VP9 profile: " + profileInteger); return null; } - int level = VP9_LEVEL_NUMBER_TO_CONST.get(levelInteger, -1); + int level = vp9LevelNumberToConst(levelInteger); if (level == -1) { Log.w(TAG, "Unknown VP9 level: " + levelInteger); return null; @@ -844,7 +832,7 @@ public final class MediaCodecUtil { profile = CodecProfileLevel.AV1ProfileMain10; } - int level = AV1_LEVEL_NUMBER_TO_CONST.get(levelInteger, -1); + int level = av1LevelNumberToConst(levelInteger); if (level == -1) { Log.w(TAG, "Unknown AV1 level: " + levelInteger); return null; @@ -905,7 +893,7 @@ public final class MediaCodecUtil { if (MimeTypes.AUDIO_AAC.equals(mimeType)) { // For MPEG-4 audio this is followed by an audio object type indication as a decimal number. int audioObjectTypeIndication = Integer.parseInt(parts[2]); - int profile = MP4A_AUDIO_OBJECT_TYPE_TO_PROFILE.get(audioObjectTypeIndication, -1); + int profile = mp4aAudioObjectTypeToProfile(audioObjectTypeIndication); if (profile != -1) { // Level is set to zero in AAC decoder CodecProfileLevels. return new Pair<>(profile, 0); @@ -1075,150 +1063,325 @@ public final class MediaCodecUtil { && secure == other.secure && tunneling == other.tunneling; } - } - static { - AVC_PROFILE_NUMBER_TO_CONST = new SparseIntArray(); - AVC_PROFILE_NUMBER_TO_CONST.put(66, CodecProfileLevel.AVCProfileBaseline); - AVC_PROFILE_NUMBER_TO_CONST.put(77, CodecProfileLevel.AVCProfileMain); - AVC_PROFILE_NUMBER_TO_CONST.put(88, CodecProfileLevel.AVCProfileExtended); - AVC_PROFILE_NUMBER_TO_CONST.put(100, CodecProfileLevel.AVCProfileHigh); - AVC_PROFILE_NUMBER_TO_CONST.put(110, CodecProfileLevel.AVCProfileHigh10); - AVC_PROFILE_NUMBER_TO_CONST.put(122, CodecProfileLevel.AVCProfileHigh422); - AVC_PROFILE_NUMBER_TO_CONST.put(244, CodecProfileLevel.AVCProfileHigh444); + private static int avcProfileNumberToConst(int profileNumber) { + switch (profileNumber) { + case 66: + return CodecProfileLevel.AVCProfileBaseline; + case 77: + return CodecProfileLevel.AVCProfileMain; + case 88: + return CodecProfileLevel.AVCProfileExtended; + case 100: + return CodecProfileLevel.AVCProfileHigh; + case 110: + return CodecProfileLevel.AVCProfileHigh10; + case 122: + return CodecProfileLevel.AVCProfileHigh422; + case 244: + return CodecProfileLevel.AVCProfileHigh444; + default: + return -1; + } + } - AVC_LEVEL_NUMBER_TO_CONST = new SparseIntArray(); - AVC_LEVEL_NUMBER_TO_CONST.put(10, CodecProfileLevel.AVCLevel1); + private static int avcLevelNumberToConst(int levelNumber) { // TODO: Find int for CodecProfileLevel.AVCLevel1b. - AVC_LEVEL_NUMBER_TO_CONST.put(11, CodecProfileLevel.AVCLevel11); - AVC_LEVEL_NUMBER_TO_CONST.put(12, CodecProfileLevel.AVCLevel12); - AVC_LEVEL_NUMBER_TO_CONST.put(13, CodecProfileLevel.AVCLevel13); - AVC_LEVEL_NUMBER_TO_CONST.put(20, CodecProfileLevel.AVCLevel2); - AVC_LEVEL_NUMBER_TO_CONST.put(21, CodecProfileLevel.AVCLevel21); - AVC_LEVEL_NUMBER_TO_CONST.put(22, CodecProfileLevel.AVCLevel22); - AVC_LEVEL_NUMBER_TO_CONST.put(30, CodecProfileLevel.AVCLevel3); - AVC_LEVEL_NUMBER_TO_CONST.put(31, CodecProfileLevel.AVCLevel31); - AVC_LEVEL_NUMBER_TO_CONST.put(32, CodecProfileLevel.AVCLevel32); - AVC_LEVEL_NUMBER_TO_CONST.put(40, CodecProfileLevel.AVCLevel4); - AVC_LEVEL_NUMBER_TO_CONST.put(41, CodecProfileLevel.AVCLevel41); - AVC_LEVEL_NUMBER_TO_CONST.put(42, CodecProfileLevel.AVCLevel42); - AVC_LEVEL_NUMBER_TO_CONST.put(50, CodecProfileLevel.AVCLevel5); - AVC_LEVEL_NUMBER_TO_CONST.put(51, CodecProfileLevel.AVCLevel51); - AVC_LEVEL_NUMBER_TO_CONST.put(52, CodecProfileLevel.AVCLevel52); + switch (levelNumber) { + case 10: + return CodecProfileLevel.AVCLevel1; + case 11: + return CodecProfileLevel.AVCLevel11; + case 12: + return CodecProfileLevel.AVCLevel12; + case 13: + return CodecProfileLevel.AVCLevel13; + case 20: + return CodecProfileLevel.AVCLevel2; + case 21: + return CodecProfileLevel.AVCLevel21; + case 22: + return CodecProfileLevel.AVCLevel22; + case 30: + return CodecProfileLevel.AVCLevel3; + case 31: + return CodecProfileLevel.AVCLevel31; + case 32: + return CodecProfileLevel.AVCLevel32; + case 40: + return CodecProfileLevel.AVCLevel4; + case 41: + return CodecProfileLevel.AVCLevel41; + case 42: + return CodecProfileLevel.AVCLevel42; + case 50: + return CodecProfileLevel.AVCLevel5; + case 51: + return CodecProfileLevel.AVCLevel51; + case 52: + return CodecProfileLevel.AVCLevel52; + default: + return -1; + } + } - VP9_PROFILE_NUMBER_TO_CONST = new SparseIntArray(); - VP9_PROFILE_NUMBER_TO_CONST.put(0, CodecProfileLevel.VP9Profile0); - VP9_PROFILE_NUMBER_TO_CONST.put(1, CodecProfileLevel.VP9Profile1); - VP9_PROFILE_NUMBER_TO_CONST.put(2, CodecProfileLevel.VP9Profile2); - VP9_PROFILE_NUMBER_TO_CONST.put(3, CodecProfileLevel.VP9Profile3); - VP9_LEVEL_NUMBER_TO_CONST = new SparseIntArray(); - VP9_LEVEL_NUMBER_TO_CONST.put(10, CodecProfileLevel.VP9Level1); - VP9_LEVEL_NUMBER_TO_CONST.put(11, CodecProfileLevel.VP9Level11); - VP9_LEVEL_NUMBER_TO_CONST.put(20, CodecProfileLevel.VP9Level2); - VP9_LEVEL_NUMBER_TO_CONST.put(21, CodecProfileLevel.VP9Level21); - VP9_LEVEL_NUMBER_TO_CONST.put(30, CodecProfileLevel.VP9Level3); - VP9_LEVEL_NUMBER_TO_CONST.put(31, CodecProfileLevel.VP9Level31); - VP9_LEVEL_NUMBER_TO_CONST.put(40, CodecProfileLevel.VP9Level4); - VP9_LEVEL_NUMBER_TO_CONST.put(41, CodecProfileLevel.VP9Level41); - VP9_LEVEL_NUMBER_TO_CONST.put(50, CodecProfileLevel.VP9Level5); - VP9_LEVEL_NUMBER_TO_CONST.put(51, CodecProfileLevel.VP9Level51); - VP9_LEVEL_NUMBER_TO_CONST.put(60, CodecProfileLevel.VP9Level6); - VP9_LEVEL_NUMBER_TO_CONST.put(61, CodecProfileLevel.VP9Level61); - VP9_LEVEL_NUMBER_TO_CONST.put(62, CodecProfileLevel.VP9Level62); + private static int vp9ProfileNumberToConst(int profileNumber) { + switch (profileNumber) { + case 0: + return CodecProfileLevel.VP9Profile0; + case 1: + return CodecProfileLevel.VP9Profile1; + case 2: + return CodecProfileLevel.VP9Profile2; + case 3: + return CodecProfileLevel.VP9Profile3; + default: + return -1; + } + } - HEVC_CODEC_STRING_TO_PROFILE_LEVEL = new HashMap<>(); - HEVC_CODEC_STRING_TO_PROFILE_LEVEL.put("L30", CodecProfileLevel.HEVCMainTierLevel1); - HEVC_CODEC_STRING_TO_PROFILE_LEVEL.put("L60", CodecProfileLevel.HEVCMainTierLevel2); - HEVC_CODEC_STRING_TO_PROFILE_LEVEL.put("L63", CodecProfileLevel.HEVCMainTierLevel21); - HEVC_CODEC_STRING_TO_PROFILE_LEVEL.put("L90", CodecProfileLevel.HEVCMainTierLevel3); - HEVC_CODEC_STRING_TO_PROFILE_LEVEL.put("L93", CodecProfileLevel.HEVCMainTierLevel31); - HEVC_CODEC_STRING_TO_PROFILE_LEVEL.put("L120", CodecProfileLevel.HEVCMainTierLevel4); - HEVC_CODEC_STRING_TO_PROFILE_LEVEL.put("L123", CodecProfileLevel.HEVCMainTierLevel41); - HEVC_CODEC_STRING_TO_PROFILE_LEVEL.put("L150", CodecProfileLevel.HEVCMainTierLevel5); - HEVC_CODEC_STRING_TO_PROFILE_LEVEL.put("L153", CodecProfileLevel.HEVCMainTierLevel51); - HEVC_CODEC_STRING_TO_PROFILE_LEVEL.put("L156", CodecProfileLevel.HEVCMainTierLevel52); - HEVC_CODEC_STRING_TO_PROFILE_LEVEL.put("L180", CodecProfileLevel.HEVCMainTierLevel6); - HEVC_CODEC_STRING_TO_PROFILE_LEVEL.put("L183", CodecProfileLevel.HEVCMainTierLevel61); - HEVC_CODEC_STRING_TO_PROFILE_LEVEL.put("L186", CodecProfileLevel.HEVCMainTierLevel62); + private static int vp9LevelNumberToConst(int levelNumber) { + switch (levelNumber) { + case 10: + return CodecProfileLevel.VP9Level1; + case 11: + return CodecProfileLevel.VP9Level11; + case 20: + return CodecProfileLevel.VP9Level2; + case 21: + return CodecProfileLevel.VP9Level21; + case 30: + return CodecProfileLevel.VP9Level3; + case 31: + return CodecProfileLevel.VP9Level31; + case 40: + return CodecProfileLevel.VP9Level4; + case 41: + return CodecProfileLevel.VP9Level41; + case 50: + return CodecProfileLevel.VP9Level5; + case 51: + return CodecProfileLevel.VP9Level51; + case 60: + return CodecProfileLevel.VP9Level6; + case 61: + return CodecProfileLevel.VP9Level61; + case 62: + return CodecProfileLevel.VP9Level62; + default: + return -1; + } + } - HEVC_CODEC_STRING_TO_PROFILE_LEVEL.put("H30", CodecProfileLevel.HEVCHighTierLevel1); - HEVC_CODEC_STRING_TO_PROFILE_LEVEL.put("H60", CodecProfileLevel.HEVCHighTierLevel2); - HEVC_CODEC_STRING_TO_PROFILE_LEVEL.put("H63", CodecProfileLevel.HEVCHighTierLevel21); - HEVC_CODEC_STRING_TO_PROFILE_LEVEL.put("H90", CodecProfileLevel.HEVCHighTierLevel3); - HEVC_CODEC_STRING_TO_PROFILE_LEVEL.put("H93", CodecProfileLevel.HEVCHighTierLevel31); - HEVC_CODEC_STRING_TO_PROFILE_LEVEL.put("H120", CodecProfileLevel.HEVCHighTierLevel4); - HEVC_CODEC_STRING_TO_PROFILE_LEVEL.put("H123", CodecProfileLevel.HEVCHighTierLevel41); - HEVC_CODEC_STRING_TO_PROFILE_LEVEL.put("H150", CodecProfileLevel.HEVCHighTierLevel5); - HEVC_CODEC_STRING_TO_PROFILE_LEVEL.put("H153", CodecProfileLevel.HEVCHighTierLevel51); - HEVC_CODEC_STRING_TO_PROFILE_LEVEL.put("H156", CodecProfileLevel.HEVCHighTierLevel52); - HEVC_CODEC_STRING_TO_PROFILE_LEVEL.put("H180", CodecProfileLevel.HEVCHighTierLevel6); - HEVC_CODEC_STRING_TO_PROFILE_LEVEL.put("H183", CodecProfileLevel.HEVCHighTierLevel61); - HEVC_CODEC_STRING_TO_PROFILE_LEVEL.put("H186", CodecProfileLevel.HEVCHighTierLevel62); + @Nullable + private static Integer hevcCodecStringToProfileLevel(@Nullable String codecString) { + if (codecString == null) { + return null; + } + switch (codecString) { + case "L30": + return CodecProfileLevel.HEVCMainTierLevel1; + case "L60": + return CodecProfileLevel.HEVCMainTierLevel2; + case "L63": + return CodecProfileLevel.HEVCMainTierLevel21; + case "L90": + return CodecProfileLevel.HEVCMainTierLevel3; + case "L93": + return CodecProfileLevel.HEVCMainTierLevel31; + case "L120": + return CodecProfileLevel.HEVCMainTierLevel4; + case "L123": + return CodecProfileLevel.HEVCMainTierLevel41; + case "L150": + return CodecProfileLevel.HEVCMainTierLevel5; + case "L153": + return CodecProfileLevel.HEVCMainTierLevel51; + case "L156": + return CodecProfileLevel.HEVCMainTierLevel52; + case "L180": + return CodecProfileLevel.HEVCMainTierLevel6; + case "L183": + return CodecProfileLevel.HEVCMainTierLevel61; + case "L186": + return CodecProfileLevel.HEVCMainTierLevel62; + case "H30": + return CodecProfileLevel.HEVCHighTierLevel1; + case "H60": + return CodecProfileLevel.HEVCHighTierLevel2; + case "H63": + return CodecProfileLevel.HEVCHighTierLevel21; + case "H90": + return CodecProfileLevel.HEVCHighTierLevel3; + case "H93": + return CodecProfileLevel.HEVCHighTierLevel31; + case "H120": + return CodecProfileLevel.HEVCHighTierLevel4; + case "H123": + return CodecProfileLevel.HEVCHighTierLevel41; + case "H150": + return CodecProfileLevel.HEVCHighTierLevel5; + case "H153": + return CodecProfileLevel.HEVCHighTierLevel51; + case "H156": + return CodecProfileLevel.HEVCHighTierLevel52; + case "H180": + return CodecProfileLevel.HEVCHighTierLevel6; + case "H183": + return CodecProfileLevel.HEVCHighTierLevel61; + case "H186": + return CodecProfileLevel.HEVCHighTierLevel62; + default: + return null; + } + } - DOLBY_VISION_STRING_TO_PROFILE = new HashMap<>(); - DOLBY_VISION_STRING_TO_PROFILE.put("00", CodecProfileLevel.DolbyVisionProfileDvavPer); - DOLBY_VISION_STRING_TO_PROFILE.put("01", CodecProfileLevel.DolbyVisionProfileDvavPen); - DOLBY_VISION_STRING_TO_PROFILE.put("02", CodecProfileLevel.DolbyVisionProfileDvheDer); - DOLBY_VISION_STRING_TO_PROFILE.put("03", CodecProfileLevel.DolbyVisionProfileDvheDen); - DOLBY_VISION_STRING_TO_PROFILE.put("04", CodecProfileLevel.DolbyVisionProfileDvheDtr); - DOLBY_VISION_STRING_TO_PROFILE.put("05", CodecProfileLevel.DolbyVisionProfileDvheStn); - DOLBY_VISION_STRING_TO_PROFILE.put("06", CodecProfileLevel.DolbyVisionProfileDvheDth); - DOLBY_VISION_STRING_TO_PROFILE.put("07", CodecProfileLevel.DolbyVisionProfileDvheDtb); - DOLBY_VISION_STRING_TO_PROFILE.put("08", CodecProfileLevel.DolbyVisionProfileDvheSt); - DOLBY_VISION_STRING_TO_PROFILE.put("09", CodecProfileLevel.DolbyVisionProfileDvavSe); + @Nullable + private static Integer dolbyVisionStringToProfile(@Nullable String profileString) { + if (profileString == null) { + return null; + } + switch (profileString) { + case "00": + return CodecProfileLevel.DolbyVisionProfileDvavPer; + case "01": + return CodecProfileLevel.DolbyVisionProfileDvavPen; + case "02": + return CodecProfileLevel.DolbyVisionProfileDvheDer; + case "03": + return CodecProfileLevel.DolbyVisionProfileDvheDen; + case "04": + return CodecProfileLevel.DolbyVisionProfileDvheDtr; + case "05": + return CodecProfileLevel.DolbyVisionProfileDvheStn; + case "06": + return CodecProfileLevel.DolbyVisionProfileDvheDth; + case "07": + return CodecProfileLevel.DolbyVisionProfileDvheDtb; + case "08": + return CodecProfileLevel.DolbyVisionProfileDvheSt; + case "09": + return CodecProfileLevel.DolbyVisionProfileDvavSe; + default: + return null; + } + } - DOLBY_VISION_STRING_TO_LEVEL = new HashMap<>(); - DOLBY_VISION_STRING_TO_LEVEL.put("01", CodecProfileLevel.DolbyVisionLevelHd24); - DOLBY_VISION_STRING_TO_LEVEL.put("02", CodecProfileLevel.DolbyVisionLevelHd30); - DOLBY_VISION_STRING_TO_LEVEL.put("03", CodecProfileLevel.DolbyVisionLevelFhd24); - DOLBY_VISION_STRING_TO_LEVEL.put("04", CodecProfileLevel.DolbyVisionLevelFhd30); - DOLBY_VISION_STRING_TO_LEVEL.put("05", CodecProfileLevel.DolbyVisionLevelFhd60); - DOLBY_VISION_STRING_TO_LEVEL.put("06", CodecProfileLevel.DolbyVisionLevelUhd24); - DOLBY_VISION_STRING_TO_LEVEL.put("07", CodecProfileLevel.DolbyVisionLevelUhd30); - DOLBY_VISION_STRING_TO_LEVEL.put("08", CodecProfileLevel.DolbyVisionLevelUhd48); - DOLBY_VISION_STRING_TO_LEVEL.put("09", CodecProfileLevel.DolbyVisionLevelUhd60); + @Nullable + private static Integer dolbyVisionStringToLevel(@Nullable String levelString) { + if (levelString == null) { + return null; + } + switch (levelString) { + case "01": + return CodecProfileLevel.DolbyVisionLevelHd24; + case "02": + return CodecProfileLevel.DolbyVisionLevelHd30; + case "03": + return CodecProfileLevel.DolbyVisionLevelFhd24; + case "04": + return CodecProfileLevel.DolbyVisionLevelFhd30; + case "05": + return CodecProfileLevel.DolbyVisionLevelFhd60; + case "06": + return CodecProfileLevel.DolbyVisionLevelUhd24; + case "07": + return CodecProfileLevel.DolbyVisionLevelUhd30; + case "08": + return CodecProfileLevel.DolbyVisionLevelUhd48; + case "09": + return CodecProfileLevel.DolbyVisionLevelUhd60; + default: + return null; + } + } + private static int av1LevelNumberToConst(int levelNumber) { // See https://aomediacodec.github.io/av1-spec/av1-spec.pdf Annex A: Profiles and levels for // more information on mapping AV1 codec strings to levels. - AV1_LEVEL_NUMBER_TO_CONST = new SparseIntArray(); - AV1_LEVEL_NUMBER_TO_CONST.put(0, CodecProfileLevel.AV1Level2); - AV1_LEVEL_NUMBER_TO_CONST.put(1, CodecProfileLevel.AV1Level21); - AV1_LEVEL_NUMBER_TO_CONST.put(2, CodecProfileLevel.AV1Level22); - AV1_LEVEL_NUMBER_TO_CONST.put(3, CodecProfileLevel.AV1Level23); - AV1_LEVEL_NUMBER_TO_CONST.put(4, CodecProfileLevel.AV1Level3); - AV1_LEVEL_NUMBER_TO_CONST.put(5, CodecProfileLevel.AV1Level31); - AV1_LEVEL_NUMBER_TO_CONST.put(6, CodecProfileLevel.AV1Level32); - AV1_LEVEL_NUMBER_TO_CONST.put(7, CodecProfileLevel.AV1Level33); - AV1_LEVEL_NUMBER_TO_CONST.put(8, CodecProfileLevel.AV1Level4); - AV1_LEVEL_NUMBER_TO_CONST.put(9, CodecProfileLevel.AV1Level41); - AV1_LEVEL_NUMBER_TO_CONST.put(10, CodecProfileLevel.AV1Level42); - AV1_LEVEL_NUMBER_TO_CONST.put(11, CodecProfileLevel.AV1Level43); - AV1_LEVEL_NUMBER_TO_CONST.put(12, CodecProfileLevel.AV1Level5); - AV1_LEVEL_NUMBER_TO_CONST.put(13, CodecProfileLevel.AV1Level51); - AV1_LEVEL_NUMBER_TO_CONST.put(14, CodecProfileLevel.AV1Level52); - AV1_LEVEL_NUMBER_TO_CONST.put(15, CodecProfileLevel.AV1Level53); - AV1_LEVEL_NUMBER_TO_CONST.put(16, CodecProfileLevel.AV1Level6); - AV1_LEVEL_NUMBER_TO_CONST.put(17, CodecProfileLevel.AV1Level61); - AV1_LEVEL_NUMBER_TO_CONST.put(18, CodecProfileLevel.AV1Level62); - AV1_LEVEL_NUMBER_TO_CONST.put(19, CodecProfileLevel.AV1Level63); - AV1_LEVEL_NUMBER_TO_CONST.put(20, CodecProfileLevel.AV1Level7); - AV1_LEVEL_NUMBER_TO_CONST.put(21, CodecProfileLevel.AV1Level71); - AV1_LEVEL_NUMBER_TO_CONST.put(22, CodecProfileLevel.AV1Level72); - AV1_LEVEL_NUMBER_TO_CONST.put(23, CodecProfileLevel.AV1Level73); + switch (levelNumber) { + case 0: + return CodecProfileLevel.AV1Level2; + case 1: + return CodecProfileLevel.AV1Level21; + case 2: + return CodecProfileLevel.AV1Level22; + case 3: + return CodecProfileLevel.AV1Level23; + case 4: + return CodecProfileLevel.AV1Level3; + case 5: + return CodecProfileLevel.AV1Level31; + case 6: + return CodecProfileLevel.AV1Level32; + case 7: + return CodecProfileLevel.AV1Level33; + case 8: + return CodecProfileLevel.AV1Level4; + case 9: + return CodecProfileLevel.AV1Level41; + case 10: + return CodecProfileLevel.AV1Level42; + case 11: + return CodecProfileLevel.AV1Level43; + case 12: + return CodecProfileLevel.AV1Level5; + case 13: + return CodecProfileLevel.AV1Level51; + case 14: + return CodecProfileLevel.AV1Level52; + case 15: + return CodecProfileLevel.AV1Level53; + case 16: + return CodecProfileLevel.AV1Level6; + case 17: + return CodecProfileLevel.AV1Level61; + case 18: + return CodecProfileLevel.AV1Level62; + case 19: + return CodecProfileLevel.AV1Level63; + case 20: + return CodecProfileLevel.AV1Level7; + case 21: + return CodecProfileLevel.AV1Level71; + case 22: + return CodecProfileLevel.AV1Level72; + case 23: + return CodecProfileLevel.AV1Level73; + default: + return -1; + } + } - MP4A_AUDIO_OBJECT_TYPE_TO_PROFILE = new SparseIntArray(); - MP4A_AUDIO_OBJECT_TYPE_TO_PROFILE.put(1, CodecProfileLevel.AACObjectMain); - MP4A_AUDIO_OBJECT_TYPE_TO_PROFILE.put(2, CodecProfileLevel.AACObjectLC); - MP4A_AUDIO_OBJECT_TYPE_TO_PROFILE.put(3, CodecProfileLevel.AACObjectSSR); - MP4A_AUDIO_OBJECT_TYPE_TO_PROFILE.put(4, CodecProfileLevel.AACObjectLTP); - MP4A_AUDIO_OBJECT_TYPE_TO_PROFILE.put(5, CodecProfileLevel.AACObjectHE); - MP4A_AUDIO_OBJECT_TYPE_TO_PROFILE.put(6, CodecProfileLevel.AACObjectScalable); - MP4A_AUDIO_OBJECT_TYPE_TO_PROFILE.put(17, CodecProfileLevel.AACObjectERLC); - MP4A_AUDIO_OBJECT_TYPE_TO_PROFILE.put(20, CodecProfileLevel.AACObjectERScalable); - MP4A_AUDIO_OBJECT_TYPE_TO_PROFILE.put(23, CodecProfileLevel.AACObjectLD); - MP4A_AUDIO_OBJECT_TYPE_TO_PROFILE.put(29, CodecProfileLevel.AACObjectHE_PS); - MP4A_AUDIO_OBJECT_TYPE_TO_PROFILE.put(39, CodecProfileLevel.AACObjectELD); - MP4A_AUDIO_OBJECT_TYPE_TO_PROFILE.put(42, CodecProfileLevel.AACObjectXHE); + private static int mp4aAudioObjectTypeToProfile(int profileNumber) { + switch (profileNumber) { + case 1: + return CodecProfileLevel.AACObjectMain; + case 2: + return CodecProfileLevel.AACObjectLC; + case 3: + return CodecProfileLevel.AACObjectSSR; + case 4: + return CodecProfileLevel.AACObjectLTP; + case 5: + return CodecProfileLevel.AACObjectHE; + case 6: + return CodecProfileLevel.AACObjectScalable; + case 17: + return CodecProfileLevel.AACObjectERLC; + case 20: + return CodecProfileLevel.AACObjectERScalable; + case 23: + return CodecProfileLevel.AACObjectLD; + case 29: + return CodecProfileLevel.AACObjectHE_PS; + case 39: + return CodecProfileLevel.AACObjectELD; + case 42: + return CodecProfileLevel.AACObjectXHE; + default: + return -1; + } } }