EncoderCapabilities.java revision c371194e4e0651c328f1870a90bbfd4e217c747b
1c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong/*
2c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong * Copyright (C) 2010 The Android Open Source Project
3c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong *
4c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong * Licensed under the Apache License, Version 2.0 (the "License");
5c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong * you may not use this file except in compliance with the License.
6c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong * You may obtain a copy of the License at
7c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong *
8c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong *      http://www.apache.org/licenses/LICENSE-2.0
9c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong *
10c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong * Unless required by applicable law or agreed to in writing, software
11c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong * distributed under the License is distributed on an "AS IS" BASIS,
12c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong * See the License for the specific language governing permissions and
14c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong * limitations under the License.
15c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong */
16c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong
17c371194e4e0651c328f1870a90bbfd4e217c747bJames Dongpackage android.media;
18c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong
19c371194e4e0651c328f1870a90bbfd4e217c747bJames Dongimport java.util.List;
20c371194e4e0651c328f1870a90bbfd4e217c747bJames Dongimport java.util.ArrayList;
21c371194e4e0651c328f1870a90bbfd4e217c747bJames Dongimport android.util.Log;
22c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong
23c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong/**
24c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong * The EncoderCapabilities class is used to retrieve the
25c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong * capabilities for different video and audio
26c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong * encoders supported on a specific Android platform.
27c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong * {@hide}
28c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong */
29c371194e4e0651c328f1870a90bbfd4e217c747bJames Dongpublic class EncoderCapabilities
30c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong{
31c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    private static final String TAG = "EncoderCapabilities";
32c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong
33c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    /**
34c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     * The VideoEncoderCap class represents a video encoder's
35c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     * supported parameter range in:
36c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     *
37c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     * <ul>
38c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     * <li>Resolution: the frame size (width/height) in pixels;
39c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     * <li>Bit rate: the compressed output bit rate in bits per second;
40c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     * <li>Frame rate: the output number of frames per second.
41c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     * </ul>
42c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     *
43c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     */
44c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    static public class VideoEncoderCap {
45c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        // These are not modifiable externally, thus are public accessible
46c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        public final int mCodec;                                 // @see android.media.MediaRecorder.VideoEncoder
47c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        public final int mMinBitRate, mMaxBitRate;               // min and max bit rate (bps)
48c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        public final int mMinFrameRate, mMaxFrameRate;           // min and max frame rate (fps)
49c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        public final int mMinFrameWidth, mMaxFrameWidth;         // min and max frame width (pixel)
50c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        public final int mMinFrameHeight, mMaxFrameHeight;       // minn and max frame height (pixel)
51c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong
52c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        // Private constructor called by JNI
53c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        private VideoEncoderCap(int codec,
54c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong                                int minBitRate, int maxBitRate,
55c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong                                int minFrameRate, int maxFrameRate,
56c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong                                int minFrameWidth, int maxFrameWidth,
57c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong                                int minFrameHeight, int maxFrameHeight) {
58c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong            mCodec = codec;
59c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong            mMinBitRate = minBitRate;
60c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong            mMaxBitRate = maxBitRate;
61c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong            mMinFrameRate = minFrameRate;
62c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong            mMaxFrameRate = maxFrameRate;
63c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong            mMinFrameWidth = minFrameWidth;
64c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong            mMaxFrameWidth = maxFrameWidth;
65c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong            mMinFrameHeight = minFrameHeight;
66c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong            mMaxFrameHeight = maxFrameHeight;
67c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        }
68c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    };
69c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong
70c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    /**
71c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     * The AudioEncoderCap class represents an audio encoder's
72c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     * parameter range in:
73c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     *
74c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     * <ul>
75c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     * <li>Bit rate: the compressed output bit rate in bits per second;
76c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     * <li>Sample rate: the sampling rate used for recording the audio in samples per second;
77c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     * <li>Number of channels: the number of channels the audio is recorded.
78c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     * </ul>
79c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     *
80c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     */
81c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    static public class AudioEncoderCap {
82c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        // These are not modifiable externally, thus are public accessible
83c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        public final int mCodec;                         // @see android.media.MediaRecorder.AudioEncoder
84c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        public final int mMinChannels, mMaxChannels;     // min and max number of channels
85c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        public final int mMinSampleRate, mMaxSampleRate; // min and max sample rate (hz)
86c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        public final int mMinBitRate, mMaxBitRate;       // min and max bit rate (bps)
87c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong
88c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        // Private constructor called by JNI
89c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        private AudioEncoderCap(int codec,
90c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong                                int minBitRate, int maxBitRate,
91c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong                                int minSampleRate, int maxSampleRate,
92c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong                                int minChannels, int maxChannels) {
93c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong           mCodec = codec;
94c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong           mMinBitRate = minBitRate;
95c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong           mMaxBitRate = maxBitRate;
96c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong           mMinSampleRate = minSampleRate;
97c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong           mMaxSampleRate = maxSampleRate;
98c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong           mMinChannels = minChannels;
99c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong           mMaxChannels = maxChannels;
100c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong       }
101c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    };
102c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong
103c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    static {
104c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        System.loadLibrary("media_jni");
105c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        native_init();
106c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    }
107c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong
108c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    /**
109c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     * Returns the array of supported output file formats.
110c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     * @see android.media.MediaRecorder.OutputFormat
111c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     */
112c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    public static int[] getOutputFileFormats() {
113c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        int nFormats = native_get_num_file_formats();
114c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        if (nFormats == 0) return null;
115c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong
116c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        int[] formats = new int[nFormats];
117c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        for (int i = 0; i < nFormats; ++i) {
118c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong            formats[i] = native_get_file_format(i);
119c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        }
120c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        return formats;
121c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    }
122c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong
123c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    /**
124c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     * Returns the capabilities of the supported video encoders.
125c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     * @see android.media.EncoderCapabilities.VideoEncoderCap
126c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     */
127c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    public static List<VideoEncoderCap> getVideoEncoders() {
128c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        int nEncoders = native_get_num_video_encoders();
129c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        if (nEncoders == 0) return null;
130c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong
131c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        List<VideoEncoderCap> encoderList = new ArrayList<VideoEncoderCap>();
132c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        for (int i = 0; i < nEncoders; ++i) {
133c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong            encoderList.add(native_get_video_encoder_cap(i));
134c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        }
135c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        return encoderList;
136c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    }
137c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong
138c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    /**
139c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     * Returns the capabilities of the supported audio encoders.
140c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     * @see android.media.EncoderCapabilities.AudioEncoderCap
141c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     */
142c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    public static List<AudioEncoderCap> getAudioEncoders() {
143c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        int nEncoders = native_get_num_audio_encoders();
144c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        if (nEncoders == 0) return null;
145c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong
146c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        List<AudioEncoderCap> encoderList = new ArrayList<AudioEncoderCap>();
147c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        for (int i = 0; i < nEncoders; ++i) {
148c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong            encoderList.add(native_get_audio_encoder_cap(i));
149c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        }
150c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        return encoderList;
151c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    }
152c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong
153c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong
154c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    private EncoderCapabilities() {}  // Don't call me
155c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong
156c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    // Implemented by JNI
157c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    private static native final void native_init();
158c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    private static native final int native_get_num_file_formats();
159c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    private static native final int native_get_file_format(int index);
160c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    private static native final int native_get_num_video_encoders();
161c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    private static native final VideoEncoderCap native_get_video_encoder_cap(int index);
162c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    private static native final int native_get_num_audio_encoders();
163c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    private static native final AudioEncoderCap native_get_audio_encoder_cap(int index);
164c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong}
165