i自然 v1.5.2版本的 MD5 值为:4186de3133535afd3ad8a76e7e4d0eff

以下内容为反编译后的 MediaInfo.java 源代码,内容仅作参考


package com.serenegiant.utils;

import android.media.MediaCodecInfo;
import android.media.MediaCodecList;
import android.text.TextUtils;
import com.serenegiant.media.MediaCodecHelper;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import org.json.JSONException;
import org.json.JSONObject;

public final class MediaInfo {
    private static final List<MediaCodecInfo> sCodecList = new ArrayList();
    private static final HashMap<String, HashMap<MediaCodecInfo, MediaCodecInfo.CodecCapabilities>> sCapabilities = new HashMap<>();

    public static JSONObject get() throws JSONException {
        JSONObject jSONObject = new JSONObject();
        try {
            jSONObject.put("VIDEO", getVideo());
        } catch (Exception e) {
            jSONObject.put("VIDEO", e.getMessage());
        }
        try {
            jSONObject.put("AUDIO", getAudio());
        } catch (Exception e2) {
            jSONObject.put("AUDIO", e2.getMessage());
        }
        return jSONObject;
    }

    private static final JSONObject getVideo() throws JSONException {
        int i;
        int i2;
        int length;
        JSONObject jSONObject = new JSONObject();
        int codecCount = getCodecCount();
        int i3 = 0;
        while (i3 < codecCount) {
            MediaCodecInfo codecInfoAt = getCodecInfoAt(i3);
            JSONObject jSONObject2 = new JSONObject();
            String[] supportedTypes = codecInfoAt.getSupportedTypes();
            int length2 = supportedTypes.length;
            boolean z = false;
            int i4 = 0;
            while (i4 < length2) {
                if (supportedTypes[i4].startsWith("video/")) {
                    jSONObject2.put(Integer.toString(i4), supportedTypes[i4]);
                    Thread.currentThread().setPriority(10);
                    try {
                        MediaCodecInfo.CodecCapabilities codecCapabilities = getCodecCapabilities(codecInfoAt, supportedTypes[i4]);
                        try {
                            int[] iArr = codecCapabilities.colorFormats;
                            int length3 = iArr != null ? iArr.length : 0;
                            if (length3 > 0) {
                                JSONObject jSONObject3 = new JSONObject();
                                int i5 = 0;
                                while (i5 < length3) {
                                    i = codecCount;
                                    i2 = length2;
                                    try {
                                        Object[] objArr = new Object[1];
                                        try {
                                            objArr[0] = Integer.valueOf(i5);
                                            jSONObject3.put(String.format("COLOR_FORMAT(%d)", objArr), getColorFormatName(iArr[i5]));
                                            i5++;
                                            codecCount = i;
                                            length2 = i2;
                                        } catch (Exception e) {
                                            e = e;
                                            jSONObject2.put("COLOR_FORMATS", e.getMessage());
                                            MediaCodecInfo.CodecProfileLevel[] codecProfileLevelArr = codecCapabilities.profileLevels;
                                            if (codecProfileLevelArr != null) {
                                            }
                                            if (length > 0) {
                                            }
                                            z = true;
                                            i4++;
                                            codecCount = i;
                                            length2 = i2;
                                        }
                                    } catch (Exception e2) {
                                        e = e2;
                                        jSONObject2.put("COLOR_FORMATS", e.getMessage());
                                        MediaCodecInfo.CodecProfileLevel[] codecProfileLevelArr2 = codecCapabilities.profileLevels;
                                        if (codecProfileLevelArr2 != null) {
                                        }
                                        if (length > 0) {
                                        }
                                        z = true;
                                        i4++;
                                        codecCount = i;
                                        length2 = i2;
                                    }
                                }
                                i = codecCount;
                                i2 = length2;
                                jSONObject2.put("COLOR_FORMATS", jSONObject3);
                            } else {
                                i = codecCount;
                                i2 = length2;
                            }
                        } catch (Exception e3) {
                            e = e3;
                            i = codecCount;
                            i2 = length2;
                        }
                        try {
                            MediaCodecInfo.CodecProfileLevel[] codecProfileLevelArr22 = codecCapabilities.profileLevels;
                            length = codecProfileLevelArr22 != null ? codecProfileLevelArr22.length : 0;
                            if (length > 0) {
                                JSONObject jSONObject4 = new JSONObject();
                                for (int i6 = 0; i6 < length; i6++) {
                                    jSONObject4.put(Integer.toString(i6), getProfileLevelString(supportedTypes[i4], codecProfileLevelArr22[i6]));
                                }
                                jSONObject2.put("PROFILES", jSONObject4);
                            }
                        } catch (Exception e4) {
                            jSONObject2.put("PROFILES", e4.getMessage());
                        }
                        z = true;
                    } finally {
                        Thread.currentThread().setPriority(5);
                    }
                } else {
                    i = codecCount;
                    i2 = length2;
                }
                i4++;
                codecCount = i;
                length2 = i2;
            }
            int i7 = codecCount;
            if (z) {
                jSONObject.put(codecInfoAt.getName(), jSONObject2);
            }
            i3++;
            codecCount = i7;
        }
        return jSONObject;
    }

    private static final JSONObject getAudio() throws JSONException {
        JSONObject jSONObject = new JSONObject();
        int codecCount = getCodecCount();
        for (int i = 0; i < codecCount; i++) {
            MediaCodecInfo codecInfoAt = getCodecInfoAt(i);
            JSONObject jSONObject2 = new JSONObject();
            String[] supportedTypes = codecInfoAt.getSupportedTypes();
            int length = supportedTypes.length;
            boolean z = false;
            for (int i2 = 0; i2 < length; i2++) {
                if (supportedTypes[i2].startsWith("audio/")) {
                    jSONObject2.put(Integer.toString(i2), supportedTypes[i2]);
                    z = true;
                }
            }
            if (z) {
                jSONObject.put(codecInfoAt.getName(), jSONObject2);
            }
        }
        return jSONObject;
    }

    public static final String getColorFormatName(int i) {
        switch (i) {
            case 1:
                return "COLOR_FormatMonochrome";
            case 2:
                return "COLOR_Format8bitRGB332";
            case 3:
                return "COLOR_Format12bitRGB444";
            case 4:
                return "COLOR_Format16bitARGB4444";
            case 5:
                return "COLOR_Format16bitARGB1555";
            case 6:
                return "COLOR_Format16bitRGB565";
            case 7:
                return "COLOR_Format16bitBGR565";
            case 8:
                return "COLOR_Format18bitRGB666";
            case 9:
                return "COLOR_Format18bitARGB1665";
            case 10:
                return "COLOR_Format19bitARGB1666";
            case 11:
                return "COLOR_Format24bitRGB888";
            case 12:
                return "COLOR_Format24bitBGR888";
            case 13:
                return "COLOR_Format24bitARGB1887";
            case 14:
                return "COLOR_Format25bitARGB1888";
            case 15:
                return "COLOR_Format32bitBGRA8888";
            case 16:
                return "COLOR_Format32bitARGB8888";
            case 17:
                return "COLOR_FormatYUV411Planar";
            case 18:
                return "COLOR_FormatYUV411PackedPlanar";
            case 19:
                return "COLOR_FormatYUV420Planar";
            case 20:
                return "COLOR_FormatYUV420PackedPlanar";
            case 21:
                return "COLOR_FormatYUV420SemiPlanar";
            case 22:
                return "COLOR_FormatYUV422Planar";
            case 23:
                return "COLOR_FormatYUV422PackedPlanar";
            case 24:
                return "COLOR_FormatYUV422SemiPlanar";
            case 25:
                return "COLOR_FormatYCbYCr";
            case 26:
                return "COLOR_FormatYCrYCb";
            case 27:
                return "COLOR_FormatCbYCrY";
            case 28:
                return "COLOR_FormatCrYCbY";
            case 29:
                return "COLOR_FormatYUV444Interleaved";
            case 30:
                return "COLOR_FormatRawBayer8bit";
            case 31:
                return "COLOR_FormatRawBayer10bit";
            case 32:
                return "COLOR_FormatRawBayer8bitcompressed";
            case 33:
                return "COLOR_FormatL2";
            case 34:
                return "COLOR_FormatL4";
            case 35:
                return "COLOR_FormatL8";
            case 36:
                return "COLOR_FormatL16";
            case 37:
                return "COLOR_FormatL24";
            case 38:
                return "COLOR_FormatL32";
            case 39:
                return "COLOR_FormatYUV420PackedSemiPlanar";
            case 40:
                return "COLOR_FormatYUV422PackedSemiPlanar";
            case 41:
                return "COLOR_Format18BitBGR666";
            case 42:
                return "COLOR_Format24BitARGB6666";
            case 43:
                return "COLOR_Format24BitABGR6666";
            default:
                switch (i) {
                    case MediaCodecHelper.OMX_COLOR_FormatKhronosExtensions:
                        return "OMX_COLOR_FormatKhronosExtensions";
                    case MediaCodecHelper.OMX_TI_COLOR_FormatYUV420PackedSemiPlanar:
                        return "COLOR_TI_FormatYUV420PackedSemiPlanar";
                    case MediaCodecHelper.OMX_COLOR_FormatAndroidOpaque:
                        return "COLOR_FormatSurface_COLOR_FormatAndroidOpaque";
                    case 2135033992:
                        return "COLOR_FormatYUV420Flexible";
                    case MediaCodecHelper.OMX_QCOM_COLOR_FormatYVU420SemiPlanar:
                        return "COLOR_QCOM_FormatYUV420SemiPlanar";
                    case MediaCodecHelper.OMX_SEC_COLOR_FormatNV12Tiled:
                        return "OMX_SEC_COLOR_FormatNV12Tiled";
                    default:
                        switch (i) {
                            case MediaCodecHelper.OMX_QCOM_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka:
                                return "OMX_QCOM_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka";
                            case MediaCodecHelper.OMX_QCOM_COLOR_FormatYUV420PackedSemiPlanar32m:
                                return "OMX_QCOM_COLOR_FormatYUV420PackedSemiPlanar32m";
                            default:
                                return String.format(Locale.getDefault(), "COLOR_Format_Unknown(%d)", Integer.valueOf(i));
                        }
                }
        }
    }

    public static String getProfileLevelString(String str, MediaCodecInfo.CodecProfileLevel codecProfileLevel) {
        String str2;
        String str3;
        String str4;
        String str5;
        if (TextUtils.isEmpty(str)) {
            return "mime type is null";
        }
        if (str.equalsIgnoreCase("video/avc")) {
            int i = codecProfileLevel.profile;
            if (i == 1) {
                str5 = "AVCProfileBaseline";
            } else if (i == 2) {
                str5 = "AVCProfileMain";
            } else if (i == 4) {
                str5 = "AVCProfileExtended";
            } else if (i == 8) {
                str5 = "AVCProfileHigh";
            } else if (i == 16) {
                str5 = "AVCProfileHigh10";
            } else if (i == 32) {
                str5 = "AVCProfileHigh422";
            } else if (i != 64) {
                str5 = "unknown profile " + codecProfileLevel.profile;
            } else {
                str5 = "AVCProfileHigh444";
            }
            int i2 = codecProfileLevel.level;
            if (i2 == 1) {
                return str5 + ".AVCLevel1";
            }
            if (i2 == 2) {
                return str5 + ".AVCLevel1b";
            }
            switch (i2) {
                case 4:
                    return str5 + ".AVCLevel11";
                case 8:
                    return str5 + ".AVCLevel12";
                case 16:
                    return str5 + ".AVCLevel13";
                case 32:
                    return str5 + ".AVCLevel2";
                case 64:
                    return str5 + ".AVCLevel21";
                case 128:
                    return str5 + ".AVCLevel22";
                case 256:
                    return str5 + ".AVCLevel3";
                case 512:
                    return str5 + ".AVCLevel31";
                case 1024:
                    return str5 + ".AVCLevel32";
                case 2048:
                    return str5 + ".AVCLevel4";
                case 4096:
                    return str5 + ".AVCLevel41";
                case 8192:
                    return str5 + ".AVCLevel42";
                case 16384:
                    return str5 + ".AVCLevel5";
                case 32768:
                    return str5 + ".AVCLevel51";
                default:
                    return str5 + ".unknown level " + codecProfileLevel.level;
            }
        }
        if (str.equalsIgnoreCase("video/h263")) {
            int i3 = codecProfileLevel.profile;
            if (i3 == 1) {
                str4 = "H263ProfileBaseline";
            } else if (i3 == 2) {
                str4 = "H263ProfileH320Coding";
            } else if (i3 == 4) {
                str4 = "H263ProfileBackwardCompatible";
            } else if (i3 == 8) {
                str4 = "H263ProfileISWV2";
            } else if (i3 == 16) {
                str4 = "H263ProfileISWV3";
            } else if (i3 == 32) {
                str4 = "H263ProfileHighCompression";
            } else if (i3 == 64) {
                str4 = "H263ProfileInternet";
            } else if (i3 == 128) {
                str4 = "H263ProfileInterlace";
            } else if (i3 != 256) {
                str4 = "unknown profile " + codecProfileLevel.profile;
            } else {
                str4 = "H263ProfileHighLatency";
            }
            int i4 = codecProfileLevel.level;
            if (i4 == 1) {
                return str4 + ".H263Level10";
            }
            if (i4 == 2) {
                return str4 + ".H263Level20";
            }
            if (i4 == 4) {
                return str4 + ".H263Level30";
            }
            if (i4 == 8) {
                return str4 + ".H263Level40";
            }
            if (i4 == 16) {
                return str4 + ".H263Level45";
            }
            if (i4 == 32) {
                return str4 + ".H263Level50";
            }
            if (i4 == 64) {
                return str4 + ".H263Level60";
            }
            if (i4 == 128) {
                return str4 + ".H263Level70";
            }
            return str4 + ".unknown level " + codecProfileLevel.level;
        }
        if (str.equalsIgnoreCase("video/mpeg4")) {
            int i5 = codecProfileLevel.profile;
            if (i5 == 1) {
                str3 = "MPEG4ProfileSimple";
            } else if (i5 != 2) {
                switch (i5) {
                    case 4:
                        str3 = "MPEG4ProfileCore";
                        break;
                    case 8:
                        str3 = "MPEG4ProfileMain";
                        break;
                    case 16:
                        str3 = "MPEG4ProfileNbit";
                        break;
                    case 32:
                        str3 = "MPEG4ProfileScalableTexture";
                        break;
                    case 64:
                        str3 = "MPEG4ProfileSimpleFace";
                        break;
                    case 128:
                        str3 = "MPEG4ProfileSimpleFBA";
                        break;
                    case 256:
                        str3 = "MPEG4ProfileBasicAnimated";
                        break;
                    case 512:
                        str3 = "MPEG4ProfileHybrid";
                        break;
                    case 1024:
                        str3 = "MPEG4ProfileAdvancedRealTime";
                        break;
                    case 2048:
                        str3 = "MPEG4ProfileCoreScalable";
                        break;
                    case 4096:
                        str3 = "MPEG4ProfileAdvancedCoding";
                        break;
                    case 8192:
                        str3 = "MPEG4ProfileAdvancedCore";
                        break;
                    case 16384:
                        str3 = "MPEG4ProfileAdvancedScalable";
                        break;
                    case 32768:
                        str3 = "MPEG4ProfileAdvancedSimple";
                        break;
                    default:
                        str3 = "unknown profile " + codecProfileLevel.profile;
                        break;
                }
            } else {
                str3 = "MPEG4ProfileSimpleScalable";
            }
            int i6 = codecProfileLevel.level;
            if (i6 == 1) {
                return str3 + ".MPEG4Level0";
            }
            if (i6 == 2) {
                return str3 + ".MPEG4Level0b";
            }
            if (i6 == 4) {
                return str3 + ".MPEG4Level1";
            }
            if (i6 == 8) {
                return str3 + ".MPEG4Level2";
            }
            if (i6 == 16) {
                return str3 + ".MPEG4Level3";
            }
            if (i6 == 32) {
                return str3 + ".MPEG4Level4";
            }
            if (i6 == 64) {
                return str3 + ".MPEG4Level4a";
            }
            if (i6 == 128) {
                return str3 + ".MPEG4Level5";
            }
            return str3 + ".unknown level " + codecProfileLevel.level;
        }
        if (str.equalsIgnoreCase("ausio/aac")) {
            int i7 = codecProfileLevel.level;
            if (i7 == 17) {
                return "AACObjectERLC";
            }
            if (i7 == 23) {
                return "AACObjectLD";
            }
            if (i7 == 29) {
                return "AACObjectHE_PS";
            }
            if (i7 == 39) {
                return "AACObjectELD";
            }
            switch (i7) {
                case 1:
                    return "AACObjectMain";
                case 2:
                    return "AACObjectLC";
                case 3:
                    return "AACObjectSSR";
                case 4:
                    return "AACObjectLTP";
                case 5:
                    return "AACObjectHE";
                case 6:
                    return "AACObjectScalable";
                default:
                    return "profile:unknown " + codecProfileLevel.profile;
            }
        }
        if (str.equalsIgnoreCase("video/vp8")) {
            if (codecProfileLevel.profile != 1) {
                str2 = "unknown profile " + codecProfileLevel.profile;
            } else {
                str2 = "VP8ProfileMain";
            }
            int i8 = codecProfileLevel.level;
            if (i8 == 1) {
                return str2 + ".VP8Level_Version0";
            }
            if (i8 == 2) {
                return str2 + ".VP8Level_Version1";
            }
            if (i8 == 4) {
                return str2 + ".VP8Level_Version2";
            }
            if (i8 == 8) {
                return str2 + ".VP8Level_Version3";
            }
            return str2 + ".unknown level" + codecProfileLevel.level;
        }
        return "unknown profile " + codecProfileLevel.profile;
    }

    private static final void updateCodecs() {
        if (sCodecList.size() == 0) {
            int codecCount = MediaCodecList.getCodecCount();
            for (int i = 0; i < codecCount; i++) {
                sCodecList.add(MediaCodecList.getCodecInfoAt(i));
            }
        }
    }

    public static final int getCodecCount() {
        updateCodecs();
        return sCodecList.size();
    }

    public static final List<MediaCodecInfo> getCodecs() {
        updateCodecs();
        return sCodecList;
    }

    public static final MediaCodecInfo getCodecInfoAt(int i) {
        updateCodecs();
        return sCodecList.get(i);
    }

    public static MediaCodecInfo.CodecCapabilities getCodecCapabilities(MediaCodecInfo mediaCodecInfo, String str) {
        HashMap<String, HashMap<MediaCodecInfo, MediaCodecInfo.CodecCapabilities>> hashMap = sCapabilities;
        HashMap<MediaCodecInfo, MediaCodecInfo.CodecCapabilities> hashMap2 = hashMap.get(str);
        if (hashMap2 == null) {
            hashMap2 = new HashMap<>();
            hashMap.put(str, hashMap2);
        }
        MediaCodecInfo.CodecCapabilities codecCapabilities = hashMap2.get(mediaCodecInfo);
        if (codecCapabilities != null) {
            return codecCapabilities;
        }
        Thread.currentThread().setPriority(10);
        try {
            MediaCodecInfo.CodecCapabilities capabilitiesForType = mediaCodecInfo.getCapabilitiesForType(str);
            hashMap2.put(mediaCodecInfo, capabilitiesForType);
            return capabilitiesForType;
        } finally {
            Thread.currentThread().setPriority(5);
        }
    }
}