1e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong/*
2e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong * Copyright (C) 2010 The Android Open Source Project
3e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong *
4e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong * Licensed under the Apache License, Version 2.0 (the "License");
5e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong * you may not use this file except in compliance with the License.
6e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong * You may obtain a copy of the License at
7e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong *
8e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong *      http://www.apache.org/licenses/LICENSE-2.0
9e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong *
10e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong * Unless required by applicable law or agreed to in writing, software
11e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong * distributed under the License is distributed on an "AS IS" BASIS,
12e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong * See the License for the specific language governing permissions and
14e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong * limitations under the License.
15e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong */
16e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong
17e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dongpackage android.media;
18e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong
19e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong/**
20e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong * The CamcorderProfile class is used to retrieve the
21e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong * predefined camcorder profile settings for camcorder applications.
22e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong * These settings are read-only.
23e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong *
24e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong * The compressed output from a recording session with a given
25e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong * CamcorderProfile contains two tracks: one for auido and one for video.
26e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong *
27e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong * <p>Each profile specifies the following set of parameters:
28e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong * <ul>
29e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong * <li> The file output format
30e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong * <li> Video codec format
31e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong * <li> Video bit rate in bits per second
32e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong * <li> Video frame rate in frames per second
33e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong * <li> Video frame width and height,
34e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong * <li> Audio codec format
35e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong * <li> Audio bit rate in bits per second,
36e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong * <li> Audio sample rate
37e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong * <li> Number of audio channels for recording.
38e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong * </ul>
39e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong */
40e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dongpublic class CamcorderProfile
41e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong{
42e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong    /**
43e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong     * The output from camcorder recording sessions can have different quality levels.
44e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     *
45e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong     * Currently, we define two quality levels: high quality and low quality.
46e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong     * A camcorder recording session with high quality level usually has higher output bit
47e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong     * rate, better video and/or audio recording quality, larger video frame
48e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong     * resolution and higher audio sampling rate, etc, than those with low quality
49e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong     * level.
50e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong     *
51e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong     * Do not change these values/ordinals without updating their counterpart
52e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong     * in include/media/MediaProfiles.h!
53e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     */
54e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong    public static final int QUALITY_LOW  = 0;
55e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong    public static final int QUALITY_HIGH = 1;
56e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong
57e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong    /**
58e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong     * Default recording duration in seconds before the session is terminated.
59e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong     * This is useful for applications like MMS has limited file size requirement.
609b433f0b654d32530b0b48a7a653216ae0bb94d8James Dong     */
61e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong    public int duration;
629b433f0b654d32530b0b48a7a653216ae0bb94d8James Dong
639b433f0b654d32530b0b48a7a653216ae0bb94d8James Dong    /**
64e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     * The quality level of the camcorder profile
65e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     */
66e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong    public int quality;
67e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong
68e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong    /**
69e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     * The file output format of the camcorder profile
70e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     * @see android.media.MediaRecorder.OutputFormat
71e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     */
72e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong    public int fileFormat;
73e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong
74e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong    /**
75e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     * The video encoder being used for the video track
76e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     * @see android.media.MediaRecorder.VideoEncoder
77e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     */
78e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong    public int videoCodec;
79e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong
80e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong    /**
81e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     * The target video output bit rate in bits per second
82e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     */
83e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong    public int videoBitRate;
84e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong
85e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong    /**
86e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     * The target video frame rate in frames per second
87e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     */
88e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong    public int videoFrameRate;
89e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong
90e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong    /**
91e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     * The target video frame width in pixels
92e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     */
93e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong    public int videoFrameWidth;
94e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong
95e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong    /**
96e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     * The target video frame height in pixels
97e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     */
98e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong    public int videoFrameHeight;
99e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong
100e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong    /**
101e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     * The audio encoder being used for the audio track.
102e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     * @see android.media.MediaRecorder.AudioEncoder
103e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     */
104e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong    public int audioCodec;
105e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong
106e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong    /**
107e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     * The target audio output bit rate in bits per second
108e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     */
109e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong    public int audioBitRate;
110e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong
111e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong    /**
112e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     * The audio sampling rate used for the audio track
113e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     */
114e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong    public int audioSampleRate;
115e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong
116e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong    /**
117e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     * The number of audio channels used for the audio track
118e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     */
119e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong    public int audioChannels;
120e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong
121e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong    /**
122e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong     * Returns the camcorder profile for the given quality level.
123e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     * @param quality the target quality level for the camcorder profile
124e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     */
125e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong    public static CamcorderProfile get(int quality) {
126e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong        if (quality < QUALITY_LOW || quality > QUALITY_HIGH) {
127e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong            String errMessage = "Unsupported quality level: " + quality;
128e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong            throw new IllegalArgumentException(errMessage);
129e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong        }
130e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong        return native_get_camcorder_profile(quality);
131e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong    }
132e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong
133e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong    static {
134e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong        System.loadLibrary("media_jni");
135e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong        native_init();
136e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong    }
137e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong
138e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong    // Private constructor called by JNI
1399b433f0b654d32530b0b48a7a653216ae0bb94d8James Dong    private CamcorderProfile(int duration,
1409b433f0b654d32530b0b48a7a653216ae0bb94d8James Dong                             int quality,
141e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong                             int fileFormat,
142e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong                             int videoCodec,
143e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong                             int videoBitRate,
144e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong                             int videoFrameRate,
145e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong                             int videoWidth,
146e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong                             int videoHeight,
147e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong                             int audioCodec,
148e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong                             int audioBitRate,
149e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong                             int audioSampleRate,
150e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong                             int audioChannels) {
151e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong
152e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong        this.duration         = duration;
153e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong        this.quality          = quality;
154e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong        this.fileFormat       = fileFormat;
155e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong        this.videoCodec       = videoCodec;
156e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong        this.videoBitRate     = videoBitRate;
157e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong        this.videoFrameRate   = videoFrameRate;
158e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong        this.videoFrameWidth  = videoWidth;
159e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong        this.videoFrameHeight = videoHeight;
160e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong        this.audioCodec       = audioCodec;
161e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong        this.audioBitRate     = audioBitRate;
162e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong        this.audioSampleRate  = audioSampleRate;
163e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong        this.audioChannels    = audioChannels;
164e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong    }
165e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong
166e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong    // Methods implemented by JNI
167e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong    private static native final void native_init();
168e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong    private static native final CamcorderProfile native_get_camcorder_profile(int quality);
169e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong}
170