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