115a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root/*
215a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Copyright (C) 2009 The Android Open Source Project
315a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root *
415a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Licensed under the Apache License, Version 2.0 (the "License");
515a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * you may not use this file except in compliance with the License.
615a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * You may obtain a copy of the License at
715a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root *
815a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root *      http://www.apache.org/licenses/LICENSE-2.0
915a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root *
1015a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Unless required by applicable law or agreed to in writing, software
1115a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * distributed under the License is distributed on an "AS IS" BASIS,
1215a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1315a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * See the License for the specific language governing permissions and
1415a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * limitations under the License.
1515a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root */
1615a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root
171619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Laupackage com.android.mediaframeworktest;
181619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau
191619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lauimport android.media.MediaRecorder;
201b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dongimport android.media.EncoderCapabilities;
211b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dongimport android.media.EncoderCapabilities.VideoEncoderCap;
221b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dongimport android.media.EncoderCapabilities.AudioEncoderCap;
231b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dongimport android.media.DecoderCapabilities;
241b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dongimport android.media.DecoderCapabilities.VideoDecoder;
251b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dongimport android.media.DecoderCapabilities.AudioDecoder;
261b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong
271619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lauimport android.os.SystemProperties;
281b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dongimport java.util.List;
291619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lauimport java.util.HashMap;
301619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau
311b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dongpublic class MediaProfileReader
321b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong{
331b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong    private static final List<VideoDecoder> videoDecoders = DecoderCapabilities.getVideoDecoders();
341b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong    private static final List<AudioDecoder> audioDecoders = DecoderCapabilities.getAudioDecoders();
351b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong    private static final List<VideoEncoderCap> videoEncoders = EncoderCapabilities.getVideoEncoders();
361b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong    private static final List<AudioEncoderCap> audioEncoders = EncoderCapabilities.getAudioEncoders();
37620a4240366f13c3359c6825c92e831563cc11b6James Dong    private static final HashMap<Integer, String> videoEncoderMap = new HashMap<Integer, String>();
38620a4240366f13c3359c6825c92e831563cc11b6James Dong    private static final HashMap<Integer, String> audioEncoderMap = new HashMap<Integer, String>();
391619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau
401b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong    static {
41620a4240366f13c3359c6825c92e831563cc11b6James Dong        initAudioEncoderMap();
42620a4240366f13c3359c6825c92e831563cc11b6James Dong        initVideoEncoderMap();
431b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong    };
441619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau
451b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong    public static List<VideoEncoderCap> getVideoEncoders() {
461b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        return videoEncoders;
471619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau    }
481619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau
491b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong    public static List<AudioEncoderCap> getAudioEncoders() {
501b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        return audioEncoders;
511619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau    }
521619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau
531619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau    public static String getDeviceType() {
541619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau        // push all the property into one big table
551619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau        String s;
561619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau        s = SystemProperties.get("ro.product.name");
571619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau        return s;
581619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau    }
591619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau
60dc1af5befaa21e92c41dd6e173b2d6fb859cdd23Yu Shan Emily Lau    public static boolean getWMAEnable() {
611b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        for (AudioDecoder decoder: audioDecoders) {
621b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong            if (decoder == AudioDecoder.AUDIO_DECODER_WMA) {
631b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong                return true;
641b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong            }
65dc1af5befaa21e92c41dd6e173b2d6fb859cdd23Yu Shan Emily Lau        }
661b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        return false;
67dc1af5befaa21e92c41dd6e173b2d6fb859cdd23Yu Shan Emily Lau    }
68dc1af5befaa21e92c41dd6e173b2d6fb859cdd23Yu Shan Emily Lau
69dc1af5befaa21e92c41dd6e173b2d6fb859cdd23Yu Shan Emily Lau    public static boolean getWMVEnable(){
701b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        for (VideoDecoder decoder: videoDecoders) {
711b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong            if (decoder == VideoDecoder.VIDEO_DECODER_WMV) {
721b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong                return true;
731b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong            }
74dc1af5befaa21e92c41dd6e173b2d6fb859cdd23Yu Shan Emily Lau        }
751b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        return false;
76dc1af5befaa21e92c41dd6e173b2d6fb859cdd23Yu Shan Emily Lau    }
77dc1af5befaa21e92c41dd6e173b2d6fb859cdd23Yu Shan Emily Lau
781b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong    public static String getVideoCodecName(int videoEncoder) {
791b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        if (videoEncoder != MediaRecorder.VideoEncoder.H263 &&
801b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong            videoEncoder != MediaRecorder.VideoEncoder.H264 &&
811b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong            videoEncoder != MediaRecorder.VideoEncoder.MPEG_4_SP) {
821b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong            throw new IllegalArgumentException("Unsupported video encoder " + videoEncoder);
831619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau        }
84620a4240366f13c3359c6825c92e831563cc11b6James Dong        return videoEncoderMap.get(videoEncoder);
851619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau    }
861619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau
871b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong    public static String getAudioCodecName(int audioEncoder) {
881b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        if (audioEncoder != MediaRecorder.AudioEncoder.AMR_NB &&
891b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong            audioEncoder != MediaRecorder.AudioEncoder.AMR_WB &&
901b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong            audioEncoder != MediaRecorder.AudioEncoder.AAC &&
91e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            audioEncoder != MediaRecorder.AudioEncoder.HE_AAC &&
92e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang            audioEncoder != MediaRecorder.AudioEncoder.AAC_ELD) {
931b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong            throw new IllegalArgumentException("Unsupported audio encodeer " + audioEncoder);
941619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau        }
95620a4240366f13c3359c6825c92e831563cc11b6James Dong        return audioEncoderMap.get(audioEncoder);
961619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau    }
971619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau
98b05a600352dcd4517c62c7503edf9eea22359280James Dong    public static int getMinFrameRateForCodec(int codec) {
99b05a600352dcd4517c62c7503edf9eea22359280James Dong        return getMinOrMaxFrameRateForCodec(codec, false);
100b05a600352dcd4517c62c7503edf9eea22359280James Dong    }
101b05a600352dcd4517c62c7503edf9eea22359280James Dong
102b05a600352dcd4517c62c7503edf9eea22359280James Dong    public static int getMaxFrameRateForCodec(int codec) {
103b05a600352dcd4517c62c7503edf9eea22359280James Dong        return getMinOrMaxFrameRateForCodec(codec, true);
104b05a600352dcd4517c62c7503edf9eea22359280James Dong    }
105b05a600352dcd4517c62c7503edf9eea22359280James Dong
106b05a600352dcd4517c62c7503edf9eea22359280James Dong    private static int getMinOrMaxFrameRateForCodec(int codec, boolean max) {
107b05a600352dcd4517c62c7503edf9eea22359280James Dong        for (VideoEncoderCap cap: videoEncoders) {
108b05a600352dcd4517c62c7503edf9eea22359280James Dong            if (cap.mCodec == codec) {
109b05a600352dcd4517c62c7503edf9eea22359280James Dong                if (max) return cap.mMaxFrameRate;
110b05a600352dcd4517c62c7503edf9eea22359280James Dong                else return cap.mMinFrameRate;
111b05a600352dcd4517c62c7503edf9eea22359280James Dong            }
112b05a600352dcd4517c62c7503edf9eea22359280James Dong        }
113b05a600352dcd4517c62c7503edf9eea22359280James Dong        // Should never reach here
114b05a600352dcd4517c62c7503edf9eea22359280James Dong        throw new IllegalArgumentException("Unsupported video codec " + codec);
115b05a600352dcd4517c62c7503edf9eea22359280James Dong    }
116b05a600352dcd4517c62c7503edf9eea22359280James Dong
1171b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong    private MediaProfileReader() {} // Don't call me
1181b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong
119620a4240366f13c3359c6825c92e831563cc11b6James Dong    private static void initVideoEncoderMap() {
1201b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        // video encoders
121620a4240366f13c3359c6825c92e831563cc11b6James Dong        videoEncoderMap.put(MediaRecorder.VideoEncoder.H263, "h263");
122620a4240366f13c3359c6825c92e831563cc11b6James Dong        videoEncoderMap.put(MediaRecorder.VideoEncoder.H264, "h264");
123620a4240366f13c3359c6825c92e831563cc11b6James Dong        videoEncoderMap.put(MediaRecorder.VideoEncoder.MPEG_4_SP, "m4v");
124620a4240366f13c3359c6825c92e831563cc11b6James Dong    }
1251b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong
126620a4240366f13c3359c6825c92e831563cc11b6James Dong    private static void initAudioEncoderMap() {
1271b7babd2cce5bb10adac7b061cf7ba065d480edbJames Dong        // audio encoders
128620a4240366f13c3359c6825c92e831563cc11b6James Dong        audioEncoderMap.put(MediaRecorder.AudioEncoder.AMR_NB, "amrnb");
129620a4240366f13c3359c6825c92e831563cc11b6James Dong        audioEncoderMap.put(MediaRecorder.AudioEncoder.AMR_WB, "amrwb");
130620a4240366f13c3359c6825c92e831563cc11b6James Dong        audioEncoderMap.put(MediaRecorder.AudioEncoder.AAC, "aac");
131ec3f31f6215cb380bba5ab36c9e4c21b13f046a1Dave Burke        audioEncoderMap.put(MediaRecorder.AudioEncoder.HE_AAC, "heaac");
132e996c419e6c9beff09b2bb8d6d5777313a0cf29fChong Zhang        audioEncoderMap.put(MediaRecorder.AudioEncoder.AAC_ELD, "aaceld");
1331619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau    }
1341619367ab823150fa8856d419abe02ceb75886f1Yu Shan Emily Lau}
135