Replacing static arrays with switch statements in MediaCodecUtil.

PiperOrigin-RevId: 322537851
This commit is contained in:
samrobinson 2020-07-22 10:56:13 +01:00 committed by Oliver Woodman
parent 433734dce7
commit 78260e2021

View File

@ -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<String, Integer> 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<String, Integer> DOLBY_VISION_STRING_TO_PROFILE;
private static final Map<String, Integer> 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;
}
}
}