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
195680635f39b3098539cbfd120f95fdc4479bab0fWu-cheng Liimport android.hardware.Camera;
205680635f39b3098539cbfd120f95fdc4479bab0fWu-cheng Liimport android.hardware.Camera.CameraInfo;
215680635f39b3098539cbfd120f95fdc4479bab0fWu-cheng Li
22e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong/**
2352bfc243684b2f340da326aaa38e9021e4e3b2e6Scott Main * Retrieves the
24e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong * predefined camcorder profile settings for camcorder applications.
25e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong * These settings are read-only.
26e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong *
2752bfc243684b2f340da326aaa38e9021e4e3b2e6Scott Main * <p>The compressed output from a recording session with a given
2852bfc243684b2f340da326aaa38e9021e4e3b2e6Scott Main * CamcorderProfile contains two tracks: one for audio and one for video.
29e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong *
30e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong * <p>Each profile specifies the following set of parameters:
31e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong * <ul>
32e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong * <li> The file output format
33e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong * <li> Video codec format
34e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong * <li> Video bit rate in bits per second
35e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong * <li> Video frame rate in frames per second
36e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong * <li> Video frame width and height,
37e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong * <li> Audio codec format
38e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong * <li> Audio bit rate in bits per second,
39e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong * <li> Audio sample rate
40e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong * <li> Number of audio channels for recording.
41e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong * </ul>
42e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong */
43e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dongpublic class CamcorderProfile
44e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong{
454af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra    // Do not change these values/ordinals without updating their counterpart
464af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra    // in include/media/MediaProfiles.h!
474af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra
48e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong    /**
494af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra     * Quality level corresponding to the lowest available resolution.
50e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     */
51e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong    public static final int QUALITY_LOW  = 0;
524af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra
534af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra    /**
544af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra     * Quality level corresponding to the highest available resolution.
554af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra     */
56e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong    public static final int QUALITY_HIGH = 1;
57e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong
58e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong    /**
59522632cde516001429549c60bd570c399ffad800Nipun Kwatra     * Quality level corresponding to the qcif (176 x 144) resolution.
604af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra     */
61522632cde516001429549c60bd570c399ffad800Nipun Kwatra    public static final int QUALITY_QCIF = 2;
62522632cde516001429549c60bd570c399ffad800Nipun Kwatra
63522632cde516001429549c60bd570c399ffad800Nipun Kwatra    /**
64522632cde516001429549c60bd570c399ffad800Nipun Kwatra     * Quality level corresponding to the cif (352 x 288) resolution.
65522632cde516001429549c60bd570c399ffad800Nipun Kwatra     */
66522632cde516001429549c60bd570c399ffad800Nipun Kwatra    public static final int QUALITY_CIF = 3;
674af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra
684af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra    /**
694af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra     * Quality level corresponding to the 480p (720 x 480) resolution.
70a00c2939c7263fe421c33364a17e489c7c3a4d1fJames Dong     * Note that the horizontal resolution for 480p can also be other
71a00c2939c7263fe421c33364a17e489c7c3a4d1fJames Dong     * values, such as 640 or 704, instead of 720.
724af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra     */
73522632cde516001429549c60bd570c399ffad800Nipun Kwatra    public static final int QUALITY_480P = 4;
744af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra
754af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra    /**
764af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra     * Quality level corresponding to the 720p (1280 x 720) resolution.
774af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra     */
78522632cde516001429549c60bd570c399ffad800Nipun Kwatra    public static final int QUALITY_720P = 5;
794af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra
804af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra    /**
81a00c2939c7263fe421c33364a17e489c7c3a4d1fJames Dong     * Quality level corresponding to the 1080p (1920 x 1080) resolution.
82a00c2939c7263fe421c33364a17e489c7c3a4d1fJames Dong     * Note that the vertical resolution for 1080p can also be 1088,
83a00c2939c7263fe421c33364a17e489c7c3a4d1fJames Dong     * instead of 1080 (used by some vendors to avoid cropping during
84a00c2939c7263fe421c33364a17e489c7c3a4d1fJames Dong     * video playback).
854af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra     */
86522632cde516001429549c60bd570c399ffad800Nipun Kwatra    public static final int QUALITY_1080P = 6;
874af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra
884af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra    /**
8907b9ae33127212fd9e15f96fa89b7d4cab81e55eJames Dong     * Quality level corresponding to the QVGA (320x240) resolution.
9007b9ae33127212fd9e15f96fa89b7d4cab81e55eJames Dong     */
9107b9ae33127212fd9e15f96fa89b7d4cab81e55eJames Dong    public static final int QUALITY_QVGA = 7;
9207b9ae33127212fd9e15f96fa89b7d4cab81e55eJames Dong
93e414608cb3dae5271104623ec52fe5a04305942aZhijun He    /**
94e414608cb3dae5271104623ec52fe5a04305942aZhijun He     * Quality level corresponding to the 2160p (3840x2160) resolution.
95e414608cb3dae5271104623ec52fe5a04305942aZhijun He     */
96e414608cb3dae5271104623ec52fe5a04305942aZhijun He    public static final int QUALITY_2160P = 8;
97e414608cb3dae5271104623ec52fe5a04305942aZhijun He
9807b9ae33127212fd9e15f96fa89b7d4cab81e55eJames Dong    // Start and end of quality list
9907b9ae33127212fd9e15f96fa89b7d4cab81e55eJames Dong    private static final int QUALITY_LIST_START = QUALITY_LOW;
100e414608cb3dae5271104623ec52fe5a04305942aZhijun He    private static final int QUALITY_LIST_END = QUALITY_2160P;
10107b9ae33127212fd9e15f96fa89b7d4cab81e55eJames Dong
10207b9ae33127212fd9e15f96fa89b7d4cab81e55eJames Dong    /**
1034af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra     * Time lapse quality level corresponding to the lowest available resolution.
1044af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra     */
105522632cde516001429549c60bd570c399ffad800Nipun Kwatra    public static final int QUALITY_TIME_LAPSE_LOW  = 1000;
1064af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra
1074af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra    /**
1084af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra     * Time lapse quality level corresponding to the highest available resolution.
1094af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra     */
110522632cde516001429549c60bd570c399ffad800Nipun Kwatra    public static final int QUALITY_TIME_LAPSE_HIGH = 1001;
111522632cde516001429549c60bd570c399ffad800Nipun Kwatra
112522632cde516001429549c60bd570c399ffad800Nipun Kwatra    /**
113522632cde516001429549c60bd570c399ffad800Nipun Kwatra     * Time lapse quality level corresponding to the qcif (176 x 144) resolution.
114522632cde516001429549c60bd570c399ffad800Nipun Kwatra     */
115522632cde516001429549c60bd570c399ffad800Nipun Kwatra    public static final int QUALITY_TIME_LAPSE_QCIF = 1002;
1164af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra
1174af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra    /**
118522632cde516001429549c60bd570c399ffad800Nipun Kwatra     * Time lapse quality level corresponding to the cif (352 x 288) resolution.
1194af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra     */
120522632cde516001429549c60bd570c399ffad800Nipun Kwatra    public static final int QUALITY_TIME_LAPSE_CIF = 1003;
1214af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra
1224af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra    /**
1234af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra     * Time lapse quality level corresponding to the 480p (720 x 480) resolution.
1244af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra     */
125522632cde516001429549c60bd570c399ffad800Nipun Kwatra    public static final int QUALITY_TIME_LAPSE_480P = 1004;
1264af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra
1274af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra    /**
1284af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra     * Time lapse quality level corresponding to the 720p (1280 x 720) resolution.
1294af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra     */
130522632cde516001429549c60bd570c399ffad800Nipun Kwatra    public static final int QUALITY_TIME_LAPSE_720P = 1005;
1314af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra
1324af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra    /**
1334af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra     * Time lapse quality level corresponding to the 1080p (1920 x 1088) resolution.
1344af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra     */
135522632cde516001429549c60bd570c399ffad800Nipun Kwatra    public static final int QUALITY_TIME_LAPSE_1080P = 1006;
1364af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra
1374af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra    /**
13807b9ae33127212fd9e15f96fa89b7d4cab81e55eJames Dong     * Time lapse quality level corresponding to the QVGA (320 x 240) resolution.
13907b9ae33127212fd9e15f96fa89b7d4cab81e55eJames Dong     */
14007b9ae33127212fd9e15f96fa89b7d4cab81e55eJames Dong    public static final int QUALITY_TIME_LAPSE_QVGA = 1007;
14107b9ae33127212fd9e15f96fa89b7d4cab81e55eJames Dong
142e414608cb3dae5271104623ec52fe5a04305942aZhijun He    /**
143e414608cb3dae5271104623ec52fe5a04305942aZhijun He     * Time lapse quality level corresponding to the 2160p (3840 x 2160) resolution.
144e414608cb3dae5271104623ec52fe5a04305942aZhijun He     */
145e414608cb3dae5271104623ec52fe5a04305942aZhijun He    public static final int QUALITY_TIME_LAPSE_2160P = 1008;
146e414608cb3dae5271104623ec52fe5a04305942aZhijun He
14707b9ae33127212fd9e15f96fa89b7d4cab81e55eJames Dong    // Start and end of timelapse quality list
14807b9ae33127212fd9e15f96fa89b7d4cab81e55eJames Dong    private static final int QUALITY_TIME_LAPSE_LIST_START = QUALITY_TIME_LAPSE_LOW;
149e414608cb3dae5271104623ec52fe5a04305942aZhijun He    private static final int QUALITY_TIME_LAPSE_LIST_END = QUALITY_TIME_LAPSE_2160P;
15007b9ae33127212fd9e15f96fa89b7d4cab81e55eJames Dong
15107b9ae33127212fd9e15f96fa89b7d4cab81e55eJames Dong    /**
152f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He     * High speed ( >= 100fps) quality level corresponding to the lowest available resolution.
1532bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * <p>
1542bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * For all the high speed profiles defined below ((from {@link #QUALITY_HIGH_SPEED_LOW} to
1552bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * {@link #QUALITY_HIGH_SPEED_2160P}), they are similar as normal recording profiles, with just
1562bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * higher output frame rate and bit rate. Therefore, setting these profiles with
1572bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * {@link MediaRecorder#setProfile} without specifying any other encoding parameters will
1582bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * produce high speed videos rather than slow motion videos that have different capture and
1592bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * output (playback) frame rates. To record slow motion videos, the application must set video
1602bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * output (playback) frame rate and bit rate appropriately via
1612bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * {@link MediaRecorder#setVideoFrameRate} and {@link MediaRecorder#setVideoEncodingBitRate}
1622bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * based on the slow motion factor. If the application intends to do the video recording with
1632bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * {@link MediaCodec} encoder, it must set each individual field of {@link MediaFormat}
1642bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * similarly according to this CamcorderProfile.
1652bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * </p>
1662bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     *
1672bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * @see #videoBitRate
1682bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * @see #videoFrameRate
1692bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * @see MediaRecorder
1702bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * @see MediaCodec
1712bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * @see MediaFormat
172f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He     */
173f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He    public static final int QUALITY_HIGH_SPEED_LOW = 2000;
174f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He
175f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He    /**
176f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He     * High speed ( >= 100fps) quality level corresponding to the highest available resolution.
177f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He     */
178f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He    public static final int QUALITY_HIGH_SPEED_HIGH = 2001;
179f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He
180f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He    /**
181f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He     * High speed ( >= 100fps) quality level corresponding to the 480p (720 x 480) resolution.
182f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He     *
183f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He     * Note that the horizontal resolution for 480p can also be other
184f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He     * values, such as 640 or 704, instead of 720.
185f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He     */
186f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He    public static final int QUALITY_HIGH_SPEED_480P = 2002;
187f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He
188f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He    /**
189f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He     * High speed ( >= 100fps) quality level corresponding to the 720p (1280 x 720) resolution.
190f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He     */
191f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He    public static final int QUALITY_HIGH_SPEED_720P = 2003;
192f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He
193f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He    /**
194f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He     * High speed ( >= 100fps) quality level corresponding to the 1080p (1920 x 1080 or 1920x1088)
195f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He     * resolution.
196f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He     */
197f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He    public static final int QUALITY_HIGH_SPEED_1080P = 2004;
198f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He
199b67c3102c9e67b4d199000bbfe9ec656ae5e9ca3Zhijun He    /**
200b67c3102c9e67b4d199000bbfe9ec656ae5e9ca3Zhijun He     * High speed ( >= 100fps) quality level corresponding to the 2160p (3840 x 2160)
201b67c3102c9e67b4d199000bbfe9ec656ae5e9ca3Zhijun He     * resolution.
202b67c3102c9e67b4d199000bbfe9ec656ae5e9ca3Zhijun He     */
203b67c3102c9e67b4d199000bbfe9ec656ae5e9ca3Zhijun He    public static final int QUALITY_HIGH_SPEED_2160P = 2005;
204b67c3102c9e67b4d199000bbfe9ec656ae5e9ca3Zhijun He
205f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He    // Start and end of high speed quality list
206f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He    private static final int QUALITY_HIGH_SPEED_LIST_START = QUALITY_HIGH_SPEED_LOW;
207b67c3102c9e67b4d199000bbfe9ec656ae5e9ca3Zhijun He    private static final int QUALITY_HIGH_SPEED_LIST_END = QUALITY_HIGH_SPEED_2160P;
208f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He
209f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He    /**
210e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong     * Default recording duration in seconds before the session is terminated.
211e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong     * This is useful for applications like MMS has limited file size requirement.
2129b433f0b654d32530b0b48a7a653216ae0bb94d8James Dong     */
213e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong    public int duration;
2149b433f0b654d32530b0b48a7a653216ae0bb94d8James Dong
2159b433f0b654d32530b0b48a7a653216ae0bb94d8James Dong    /**
216e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     * The quality level of the camcorder profile
217e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     */
218e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong    public int quality;
219e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong
220e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong    /**
221e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     * The file output format of the camcorder profile
222e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     * @see android.media.MediaRecorder.OutputFormat
223e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     */
224e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong    public int fileFormat;
225e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong
226e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong    /**
227e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     * The video encoder being used for the video track
228e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     * @see android.media.MediaRecorder.VideoEncoder
229e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     */
230e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong    public int videoCodec;
231e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong
232e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong    /**
233e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     * The target video output bit rate in bits per second
2342bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * <p>
2352bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * This is the target recorded video output bit rate if the application configures the video
2362bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * recording via {@link MediaRecorder#setProfile} without specifying any other
2372bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * {@link MediaRecorder} encoding parameters. For example, for high speed quality profiles (from
2382bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * {@link #QUALITY_HIGH_SPEED_LOW} to {@link #QUALITY_HIGH_SPEED_2160P}), this is the bit rate
2392bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * where the video is recorded with. If the application intends to record slow motion videos
2402bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * with the high speed quality profiles, it must set a different video bit rate that is
2412bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * corresponding to the desired recording output bit rate (i.e., the encoded video bit rate
2422bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * during normal playback) via {@link MediaRecorder#setVideoEncodingBitRate}. For example, if
2432bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * {@link #QUALITY_HIGH_SPEED_720P} advertises 240fps {@link #videoFrameRate} and 64Mbps
2442bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * {@link #videoBitRate} in the high speed CamcorderProfile, and the application intends to
2452bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * record 1/8 factor slow motion recording videos, the application must set 30fps via
2462bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * {@link MediaRecorder#setVideoFrameRate} and 8Mbps ( {@link #videoBitRate} * slow motion
2472bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * factor) via {@link MediaRecorder#setVideoEncodingBitRate}. Failing to do so will result in
2482bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * videos with unexpected frame rate and bit rate, or {@link MediaRecorder} error if the output
2492bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * bit rate exceeds the encoder limit. If the application intends to do the video recording with
2502bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * {@link MediaCodec} encoder, it must set each individual field of {@link MediaFormat}
2512bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * similarly according to this CamcorderProfile.
2522bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * </p>
2532bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     *
2542bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * @see #videoFrameRate
2552bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * @see MediaRecorder
2562bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * @see MediaCodec
2572bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * @see MediaFormat
258e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     */
259e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong    public int videoBitRate;
260e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong
261e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong    /**
2622bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * The target video frame rate in frames per second.
2632bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * <p>
2642bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * This is the target recorded video output frame rate per second if the application configures
2652bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * the video recording via {@link MediaRecorder#setProfile} without specifying any other
2662bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * {@link MediaRecorder} encoding parameters. For example, for high speed quality profiles (from
2672bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * {@link #QUALITY_HIGH_SPEED_LOW} to {@link #QUALITY_HIGH_SPEED_2160P}), this is the frame rate
2682bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * where the video is recorded and played back with. If the application intends to create slow
2692bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * motion use case with the high speed quality profiles, it must set a different video frame
2702bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * rate that is corresponding to the desired output (playback) frame rate via
2712bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * {@link MediaRecorder#setVideoFrameRate}. For example, if {@link #QUALITY_HIGH_SPEED_720P}
2722bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * advertises 240fps {@link #videoFrameRate} in the CamcorderProfile, and the application
2732bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * intends to create 1/8 factor slow motion recording videos, the application must set 30fps via
2742bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * {@link MediaRecorder#setVideoFrameRate}. Failing to do so will result in high speed videos
2752bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * with normal speed playback frame rate (240fps for above example). If the application intends
2762bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * to do the video recording with {@link MediaCodec} encoder, it must set each individual field
2772bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * of {@link MediaFormat} similarly according to this CamcorderProfile.
2782bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * </p>
2792bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     *
2802bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * @see #videoBitRate
2812bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * @see MediaRecorder
2822bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * @see MediaCodec
2832bfdff4a467c64a449c65e5d380ac9453cccfb76Zhijun He     * @see MediaFormat
284e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     */
285e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong    public int videoFrameRate;
286e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong
287e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong    /**
288e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     * The target video frame width in pixels
289e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     */
290e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong    public int videoFrameWidth;
291e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong
292e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong    /**
293e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     * The target video frame height in pixels
294e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     */
295e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong    public int videoFrameHeight;
296e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong
297e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong    /**
298e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     * The audio encoder being used for the audio track.
299e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     * @see android.media.MediaRecorder.AudioEncoder
300e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     */
301e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong    public int audioCodec;
302e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong
303e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong    /**
304e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     * The target audio output bit rate in bits per second
305e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     */
306e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong    public int audioBitRate;
307e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong
308e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong    /**
309e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     * The audio sampling rate used for the audio track
310e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     */
311e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong    public int audioSampleRate;
312e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong
313e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong    /**
314e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     * The number of audio channels used for the audio track
315e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     */
316e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong    public int audioChannels;
317e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong
318e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong    /**
3195680635f39b3098539cbfd120f95fdc4479bab0fWu-cheng Li     * Returns the camcorder profile for the first back-facing camera on the
3205680635f39b3098539cbfd120f95fdc4479bab0fWu-cheng Li     * device at the given quality level. If the device has no back-facing
3215680635f39b3098539cbfd120f95fdc4479bab0fWu-cheng Li     * camera, this returns null.
322e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     * @param quality the target quality level for the camcorder profile
3234af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra     * @see #get(int, int)
324e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong     */
325e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong    public static CamcorderProfile get(int quality) {
3265680635f39b3098539cbfd120f95fdc4479bab0fWu-cheng Li        int numberOfCameras = Camera.getNumberOfCameras();
3275680635f39b3098539cbfd120f95fdc4479bab0fWu-cheng Li        CameraInfo cameraInfo = new CameraInfo();
3285680635f39b3098539cbfd120f95fdc4479bab0fWu-cheng Li        for (int i = 0; i < numberOfCameras; i++) {
3295680635f39b3098539cbfd120f95fdc4479bab0fWu-cheng Li            Camera.getCameraInfo(i, cameraInfo);
3305680635f39b3098539cbfd120f95fdc4479bab0fWu-cheng Li            if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK) {
3315680635f39b3098539cbfd120f95fdc4479bab0fWu-cheng Li                return get(i, quality);
3325680635f39b3098539cbfd120f95fdc4479bab0fWu-cheng Li            }
3335680635f39b3098539cbfd120f95fdc4479bab0fWu-cheng Li        }
3345680635f39b3098539cbfd120f95fdc4479bab0fWu-cheng Li        return null;
33509b9005769f2b717f637131578ce6cfa6bd62bd9Chih-Chung Chang    }
33609b9005769f2b717f637131578ce6cfa6bd62bd9Chih-Chung Chang
33709b9005769f2b717f637131578ce6cfa6bd62bd9Chih-Chung Chang    /**
33809b9005769f2b717f637131578ce6cfa6bd62bd9Chih-Chung Chang     * Returns the camcorder profile for the given camera at the given
33909b9005769f2b717f637131578ce6cfa6bd62bd9Chih-Chung Chang     * quality level.
3404af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra     *
3414af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra     * Quality levels QUALITY_LOW, QUALITY_HIGH are guaranteed to be supported, while
342522632cde516001429549c60bd570c399ffad800Nipun Kwatra     * other levels may or may not be supported. The supported levels can be checked using
343522632cde516001429549c60bd570c399ffad800Nipun Kwatra     * {@link #hasProfile(int, int)}.
3444af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra     * QUALITY_LOW refers to the lowest quality available, while QUALITY_HIGH refers to
3454af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra     * the highest quality available.
346f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He     * QUALITY_LOW/QUALITY_HIGH have to match one of qcif, cif, 480p, 720p, 1080p or 2160p.
347f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He     * E.g. if the device supports 480p, 720p, 1080p and 2160p, then low is 480p and high is
348f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He     * 2160p.
3494af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra     *
350d48a15c3fead59a1aa710a16bb5f923164475918Nipun Kwatra     * The same is true for time lapse quality levels, i.e. QUALITY_TIME_LAPSE_LOW,
351d48a15c3fead59a1aa710a16bb5f923164475918Nipun Kwatra     * QUALITY_TIME_LAPSE_HIGH are guaranteed to be supported and have to match one of
352f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He     * qcif, cif, 480p, 720p, 1080p, or 2160p.
353f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He     *
354f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He     * For high speed quality levels, they may or may not be supported. If a subset of the levels
355f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He     * are supported, QUALITY_HIGH_SPEED_LOW and QUALITY_HIGH_SPEED_HIGH are guaranteed to be
356f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He     * supported and have to match one of 480p, 720p, or 1080p.
357d48a15c3fead59a1aa710a16bb5f923164475918Nipun Kwatra     *
3584af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra     * A camcorder recording session with higher quality level usually has higher output
3594af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra     * bit rate, better video and/or audio recording quality, larger video frame
3604af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra     * resolution and higher audio sampling rate, etc, than those with lower quality
3614af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra     * level.
3624af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra     *
36309b9005769f2b717f637131578ce6cfa6bd62bd9Chih-Chung Chang     * @param cameraId the id for the camera
3644af0dfd6cbc13fa6a89ec1430cbe6f619cd64d8aNipun Kwatra     * @param quality the target quality level for the camcorder profile.
365522632cde516001429549c60bd570c399ffad800Nipun Kwatra     * @see #QUALITY_LOW
366522632cde516001429549c60bd570c399ffad800Nipun Kwatra     * @see #QUALITY_HIGH
367522632cde516001429549c60bd570c399ffad800Nipun Kwatra     * @see #QUALITY_QCIF
368522632cde516001429549c60bd570c399ffad800Nipun Kwatra     * @see #QUALITY_CIF
369522632cde516001429549c60bd570c399ffad800Nipun Kwatra     * @see #QUALITY_480P
370522632cde516001429549c60bd570c399ffad800Nipun Kwatra     * @see #QUALITY_720P
371522632cde516001429549c60bd570c399ffad800Nipun Kwatra     * @see #QUALITY_1080P
372f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He     * @see #QUALITY_2160P
373522632cde516001429549c60bd570c399ffad800Nipun Kwatra     * @see #QUALITY_TIME_LAPSE_LOW
374522632cde516001429549c60bd570c399ffad800Nipun Kwatra     * @see #QUALITY_TIME_LAPSE_HIGH
375522632cde516001429549c60bd570c399ffad800Nipun Kwatra     * @see #QUALITY_TIME_LAPSE_QCIF
376522632cde516001429549c60bd570c399ffad800Nipun Kwatra     * @see #QUALITY_TIME_LAPSE_CIF
377522632cde516001429549c60bd570c399ffad800Nipun Kwatra     * @see #QUALITY_TIME_LAPSE_480P
378522632cde516001429549c60bd570c399ffad800Nipun Kwatra     * @see #QUALITY_TIME_LAPSE_720P
379522632cde516001429549c60bd570c399ffad800Nipun Kwatra     * @see #QUALITY_TIME_LAPSE_1080P
380f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He     * @see #QUALITY_TIME_LAPSE_2160P
381f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He     * @see #QUALITY_HIGH_SPEED_LOW
382f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He     * @see #QUALITY_HIGH_SPEED_HIGH
383f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He     * @see #QUALITY_HIGH_SPEED_480P
384f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He     * @see #QUALITY_HIGH_SPEED_720P
385f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He     * @see #QUALITY_HIGH_SPEED_1080P
386b67c3102c9e67b4d199000bbfe9ec656ae5e9ca3Zhijun He     * @see #QUALITY_HIGH_SPEED_2160P
387f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He    */
38809b9005769f2b717f637131578ce6cfa6bd62bd9Chih-Chung Chang    public static CamcorderProfile get(int cameraId, int quality) {
38907b9ae33127212fd9e15f96fa89b7d4cab81e55eJames Dong        if (!((quality >= QUALITY_LIST_START &&
39007b9ae33127212fd9e15f96fa89b7d4cab81e55eJames Dong               quality <= QUALITY_LIST_END) ||
39107b9ae33127212fd9e15f96fa89b7d4cab81e55eJames Dong              (quality >= QUALITY_TIME_LAPSE_LIST_START &&
392f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He               quality <= QUALITY_TIME_LAPSE_LIST_END) ||
393f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He               (quality >= QUALITY_HIGH_SPEED_LIST_START &&
394f7badff8bbcbd45939c2f60cfcc88c6d3b07c6b2Zhijun He               quality <= QUALITY_HIGH_SPEED_LIST_END))) {
395e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong            String errMessage = "Unsupported quality level: " + quality;
396e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong            throw new IllegalArgumentException(errMessage);
397e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong        }
39809b9005769f2b717f637131578ce6cfa6bd62bd9Chih-Chung Chang        return native_get_camcorder_profile(cameraId, quality);
399e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong    }
400e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong
4019d619542bea7d4c376a5a8b4a55c795a796adef3Nipun Kwatra    /**
4025680635f39b3098539cbfd120f95fdc4479bab0fWu-cheng Li     * Returns true if camcorder profile exists for the first back-facing
4035680635f39b3098539cbfd120f95fdc4479bab0fWu-cheng Li     * camera at the given quality level.
40427a845cf7c965fe149816324e0f4416a8282be8dRuben Brunk     *
40527a845cf7c965fe149816324e0f4416a8282be8dRuben Brunk     * <p>
40627a845cf7c965fe149816324e0f4416a8282be8dRuben Brunk     * When using the Camera 2 API in {@code LEGACY} mode (i.e. when
40727a845cf7c965fe149816324e0f4416a8282be8dRuben Brunk     * {@link android.hardware.camera2.CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL} is set
40827a845cf7c965fe149816324e0f4416a8282be8dRuben Brunk     * to
40927a845cf7c965fe149816324e0f4416a8282be8dRuben Brunk     * {@link android.hardware.camera2.CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY}),
41027a845cf7c965fe149816324e0f4416a8282be8dRuben Brunk     * {@link #hasProfile} may return {@code true} for unsupported resolutions.  To ensure a
41127a845cf7c965fe149816324e0f4416a8282be8dRuben Brunk     * a given resolution is supported in LEGACY mode, the configuration given in
41227a845cf7c965fe149816324e0f4416a8282be8dRuben Brunk     * {@link android.hardware.camera2.CameraCharacteristics#SCALER_STREAM_CONFIGURATION_MAP}
41327a845cf7c965fe149816324e0f4416a8282be8dRuben Brunk     * must contain the the resolution in the supported output sizes.  The recommended way to check
41427a845cf7c965fe149816324e0f4416a8282be8dRuben Brunk     * this is with
41527a845cf7c965fe149816324e0f4416a8282be8dRuben Brunk     * {@link android.hardware.camera2.params.StreamConfigurationMap#getOutputSizes(Class)} with the
41627a845cf7c965fe149816324e0f4416a8282be8dRuben Brunk     * class of the desired recording endpoint, and check that the desired resolution is contained
41727a845cf7c965fe149816324e0f4416a8282be8dRuben Brunk     * in the list returned.
41827a845cf7c965fe149816324e0f4416a8282be8dRuben Brunk     * </p>
41927a845cf7c965fe149816324e0f4416a8282be8dRuben Brunk     * @see android.hardware.camera2.CameraManager
42027a845cf7c965fe149816324e0f4416a8282be8dRuben Brunk     * @see android.hardware.camera2.CameraCharacteristics
42127a845cf7c965fe149816324e0f4416a8282be8dRuben Brunk     *
4229d619542bea7d4c376a5a8b4a55c795a796adef3Nipun Kwatra     * @param quality the target quality level for the camcorder profile
4239d619542bea7d4c376a5a8b4a55c795a796adef3Nipun Kwatra     */
4249d619542bea7d4c376a5a8b4a55c795a796adef3Nipun Kwatra    public static boolean hasProfile(int quality) {
4255680635f39b3098539cbfd120f95fdc4479bab0fWu-cheng Li        int numberOfCameras = Camera.getNumberOfCameras();
4265680635f39b3098539cbfd120f95fdc4479bab0fWu-cheng Li        CameraInfo cameraInfo = new CameraInfo();
4275680635f39b3098539cbfd120f95fdc4479bab0fWu-cheng Li        for (int i = 0; i < numberOfCameras; i++) {
4285680635f39b3098539cbfd120f95fdc4479bab0fWu-cheng Li            Camera.getCameraInfo(i, cameraInfo);
4295680635f39b3098539cbfd120f95fdc4479bab0fWu-cheng Li            if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK) {
4305680635f39b3098539cbfd120f95fdc4479bab0fWu-cheng Li                return hasProfile(i, quality);
4315680635f39b3098539cbfd120f95fdc4479bab0fWu-cheng Li            }
4325680635f39b3098539cbfd120f95fdc4479bab0fWu-cheng Li        }
4335680635f39b3098539cbfd120f95fdc4479bab0fWu-cheng Li        return false;
4349d619542bea7d4c376a5a8b4a55c795a796adef3Nipun Kwatra    }
4359d619542bea7d4c376a5a8b4a55c795a796adef3Nipun Kwatra
4369d619542bea7d4c376a5a8b4a55c795a796adef3Nipun Kwatra    /**
4379d619542bea7d4c376a5a8b4a55c795a796adef3Nipun Kwatra     * Returns true if camcorder profile exists for the given camera at
4389d619542bea7d4c376a5a8b4a55c795a796adef3Nipun Kwatra     * the given quality level.
43927a845cf7c965fe149816324e0f4416a8282be8dRuben Brunk     *
44027a845cf7c965fe149816324e0f4416a8282be8dRuben Brunk     * <p>
44127a845cf7c965fe149816324e0f4416a8282be8dRuben Brunk     * When using the Camera 2 API in LEGACY mode (i.e. when
44227a845cf7c965fe149816324e0f4416a8282be8dRuben Brunk     * {@link android.hardware.camera2.CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL} is set
44327a845cf7c965fe149816324e0f4416a8282be8dRuben Brunk     * to
44427a845cf7c965fe149816324e0f4416a8282be8dRuben Brunk     * {@link android.hardware.camera2.CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY}),
44527a845cf7c965fe149816324e0f4416a8282be8dRuben Brunk     * {@link #hasProfile} may return {@code true} for unsupported resolutions.  To ensure a
44627a845cf7c965fe149816324e0f4416a8282be8dRuben Brunk     * a given resolution is supported in LEGACY mode, the configuration given in
44727a845cf7c965fe149816324e0f4416a8282be8dRuben Brunk     * {@link android.hardware.camera2.CameraCharacteristics#SCALER_STREAM_CONFIGURATION_MAP}
44827a845cf7c965fe149816324e0f4416a8282be8dRuben Brunk     * must contain the the resolution in the supported output sizes.  The recommended way to check
44927a845cf7c965fe149816324e0f4416a8282be8dRuben Brunk     * this is with
45027a845cf7c965fe149816324e0f4416a8282be8dRuben Brunk     * {@link android.hardware.camera2.params.StreamConfigurationMap#getOutputSizes(Class)} with the
45127a845cf7c965fe149816324e0f4416a8282be8dRuben Brunk     * class of the desired recording endpoint, and check that the desired resolution is contained
45227a845cf7c965fe149816324e0f4416a8282be8dRuben Brunk     * in the list returned.
45327a845cf7c965fe149816324e0f4416a8282be8dRuben Brunk     * </p>
45427a845cf7c965fe149816324e0f4416a8282be8dRuben Brunk     * @see android.hardware.camera2.CameraManager
45527a845cf7c965fe149816324e0f4416a8282be8dRuben Brunk     * @see android.hardware.camera2.CameraCharacteristics
45627a845cf7c965fe149816324e0f4416a8282be8dRuben Brunk     *
4579d619542bea7d4c376a5a8b4a55c795a796adef3Nipun Kwatra     * @param cameraId the id for the camera
4589d619542bea7d4c376a5a8b4a55c795a796adef3Nipun Kwatra     * @param quality the target quality level for the camcorder profile
4599d619542bea7d4c376a5a8b4a55c795a796adef3Nipun Kwatra     */
4609d619542bea7d4c376a5a8b4a55c795a796adef3Nipun Kwatra    public static boolean hasProfile(int cameraId, int quality) {
4619d619542bea7d4c376a5a8b4a55c795a796adef3Nipun Kwatra        return native_has_camcorder_profile(cameraId, quality);
4629d619542bea7d4c376a5a8b4a55c795a796adef3Nipun Kwatra    }
4639d619542bea7d4c376a5a8b4a55c795a796adef3Nipun Kwatra
464e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong    static {
465e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong        System.loadLibrary("media_jni");
466e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong        native_init();
467e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong    }
468e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong
469e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong    // Private constructor called by JNI
4709b433f0b654d32530b0b48a7a653216ae0bb94d8James Dong    private CamcorderProfile(int duration,
4719b433f0b654d32530b0b48a7a653216ae0bb94d8James Dong                             int quality,
472e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong                             int fileFormat,
473e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong                             int videoCodec,
474e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong                             int videoBitRate,
475e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong                             int videoFrameRate,
476e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong                             int videoWidth,
477e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong                             int videoHeight,
478e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong                             int audioCodec,
479e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong                             int audioBitRate,
480e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong                             int audioSampleRate,
481e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong                             int audioChannels) {
482e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong
483e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong        this.duration         = duration;
484e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong        this.quality          = quality;
485e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong        this.fileFormat       = fileFormat;
486e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong        this.videoCodec       = videoCodec;
487e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong        this.videoBitRate     = videoBitRate;
488e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong        this.videoFrameRate   = videoFrameRate;
489e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong        this.videoFrameWidth  = videoWidth;
490e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong        this.videoFrameHeight = videoHeight;
491e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong        this.audioCodec       = audioCodec;
492e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong        this.audioBitRate     = audioBitRate;
493e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong        this.audioSampleRate  = audioSampleRate;
494e64d9a236e4704abf53d3b7eea2eb066f23cf402James Dong        this.audioChannels    = audioChannels;
495e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong    }
496e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong
497e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong    // Methods implemented by JNI
498e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong    private static native final void native_init();
49909b9005769f2b717f637131578ce6cfa6bd62bd9Chih-Chung Chang    private static native final CamcorderProfile native_get_camcorder_profile(
50009b9005769f2b717f637131578ce6cfa6bd62bd9Chih-Chung Chang            int cameraId, int quality);
5019d619542bea7d4c376a5a8b4a55c795a796adef3Nipun Kwatra    private static native final boolean native_has_camcorder_profile(
5029d619542bea7d4c376a5a8b4a55c795a796adef3Nipun Kwatra            int cameraId, int quality);
503e7038ace44ed6e6cd27be35b003e6dd0412e936fJames Dong}
504