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