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 Dong
22c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong/**
23c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong * The EncoderCapabilities class is used to retrieve the
24c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong * capabilities for different video and audio
25c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong * encoders supported on a specific Android platform.
26c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong * {@hide}
27c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong */
28c371194e4e0651c328f1870a90bbfd4e217c747bJames Dongpublic class EncoderCapabilities
29c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong{
30c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    private static final String TAG = "EncoderCapabilities";
31c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong
32c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    /**
33c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     * The VideoEncoderCap class represents a video encoder's
34c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     * supported parameter range in:
35c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     *
36c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     * <ul>
37c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     * <li>Resolution: the frame size (width/height) in pixels;
38c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     * <li>Bit rate: the compressed output bit rate in bits per second;
39c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     * <li>Frame rate: the output number of frames per second.
40c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     * </ul>
41c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     *
42c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     */
43c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    static public class VideoEncoderCap {
44c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        // These are not modifiable externally, thus are public accessible
45c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        public final int mCodec;                                 // @see android.media.MediaRecorder.VideoEncoder
46c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        public final int mMinBitRate, mMaxBitRate;               // min and max bit rate (bps)
47c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        public final int mMinFrameRate, mMaxFrameRate;           // min and max frame rate (fps)
48c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        public final int mMinFrameWidth, mMaxFrameWidth;         // min and max frame width (pixel)
49c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        public final int mMinFrameHeight, mMaxFrameHeight;       // minn and max frame height (pixel)
50c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong
51c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        // Private constructor called by JNI
52c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        private VideoEncoderCap(int codec,
53c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong                                int minBitRate, int maxBitRate,
54c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong                                int minFrameRate, int maxFrameRate,
55c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong                                int minFrameWidth, int maxFrameWidth,
56c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong                                int minFrameHeight, int maxFrameHeight) {
57c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong            mCodec = codec;
58c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong            mMinBitRate = minBitRate;
59c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong            mMaxBitRate = maxBitRate;
60c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong            mMinFrameRate = minFrameRate;
61c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong            mMaxFrameRate = maxFrameRate;
62c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong            mMinFrameWidth = minFrameWidth;
63c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong            mMaxFrameWidth = maxFrameWidth;
64c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong            mMinFrameHeight = minFrameHeight;
65c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong            mMaxFrameHeight = maxFrameHeight;
66c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        }
67c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    };
68c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong
69c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    /**
70c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     * The AudioEncoderCap class represents an audio encoder's
71c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     * parameter range in:
72c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     *
73c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     * <ul>
74c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     * <li>Bit rate: the compressed output bit rate in bits per second;
75c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     * <li>Sample rate: the sampling rate used for recording the audio in samples per second;
76c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     * <li>Number of channels: the number of channels the audio is recorded.
77c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     * </ul>
78c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     *
79c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     */
80c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    static public class AudioEncoderCap {
81c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        // These are not modifiable externally, thus are public accessible
82c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        public final int mCodec;                         // @see android.media.MediaRecorder.AudioEncoder
83c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        public final int mMinChannels, mMaxChannels;     // min and max number of channels
84c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        public final int mMinSampleRate, mMaxSampleRate; // min and max sample rate (hz)
85c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        public final int mMinBitRate, mMaxBitRate;       // min and max bit rate (bps)
86c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong
87c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        // Private constructor called by JNI
88c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        private AudioEncoderCap(int codec,
89c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong                                int minBitRate, int maxBitRate,
90c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong                                int minSampleRate, int maxSampleRate,
91c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong                                int minChannels, int maxChannels) {
92c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong           mCodec = codec;
93c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong           mMinBitRate = minBitRate;
94c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong           mMaxBitRate = maxBitRate;
95c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong           mMinSampleRate = minSampleRate;
96c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong           mMaxSampleRate = maxSampleRate;
97c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong           mMinChannels = minChannels;
98c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong           mMaxChannels = maxChannels;
99c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong       }
100c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    };
101c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong
102c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    static {
103c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        System.loadLibrary("media_jni");
104c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        native_init();
105c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    }
106c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong
107c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    /**
108c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     * Returns the array of supported output file formats.
109c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     * @see android.media.MediaRecorder.OutputFormat
110c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     */
111c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    public static int[] getOutputFileFormats() {
112c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        int nFormats = native_get_num_file_formats();
113c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        if (nFormats == 0) return null;
114c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong
115c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        int[] formats = new int[nFormats];
116c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        for (int i = 0; i < nFormats; ++i) {
117c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong            formats[i] = native_get_file_format(i);
118c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        }
119c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        return formats;
120c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    }
121c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong
122c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    /**
123c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     * Returns the capabilities of the supported video encoders.
124c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     * @see android.media.EncoderCapabilities.VideoEncoderCap
125c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     */
126c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    public static List<VideoEncoderCap> getVideoEncoders() {
127c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        int nEncoders = native_get_num_video_encoders();
128c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        if (nEncoders == 0) return null;
129c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong
130c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        List<VideoEncoderCap> encoderList = new ArrayList<VideoEncoderCap>();
131c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        for (int i = 0; i < nEncoders; ++i) {
132c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong            encoderList.add(native_get_video_encoder_cap(i));
133c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        }
134c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        return encoderList;
135c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    }
136c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong
137c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    /**
138c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     * Returns the capabilities of the supported audio encoders.
139c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     * @see android.media.EncoderCapabilities.AudioEncoderCap
140c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong     */
141c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    public static List<AudioEncoderCap> getAudioEncoders() {
142c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        int nEncoders = native_get_num_audio_encoders();
143c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        if (nEncoders == 0) return null;
144c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong
145c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        List<AudioEncoderCap> encoderList = new ArrayList<AudioEncoderCap>();
146c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        for (int i = 0; i < nEncoders; ++i) {
147c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong            encoderList.add(native_get_audio_encoder_cap(i));
148c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        }
149c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        return encoderList;
150c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    }
151c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong
152c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong
153c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    private EncoderCapabilities() {}  // Don't call me
154c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong
155c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    // Implemented by JNI
156c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    private static native final void native_init();
157c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    private static native final int native_get_num_file_formats();
158c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    private static native final int native_get_file_format(int index);
159c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    private static native final int native_get_num_video_encoders();
160c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    private static native final VideoEncoderCap native_get_video_encoder_cap(int index);
161c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    private static native final int native_get_num_audio_encoders();
162c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    private static native final AudioEncoderCap native_get_audio_encoder_cap(int index);
163c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong}
164