1/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17
18package android.media.videoeditor;
19
20import android.media.videoeditor.VideoEditorProfile;
21import android.util.Pair;
22import java.lang.System;
23/**
24 * This class defines all properties of a media file such as supported height,
25 * aspect ratio, bitrate for export function.
26 * {@hide}
27 */
28public class MediaProperties {
29    /**
30     *  Supported heights
31     */
32    public static final int HEIGHT_144 = 144;
33    public static final int HEIGHT_288 = 288;
34    public static final int HEIGHT_360 = 360;
35    public static final int HEIGHT_480 = 480;
36    public static final int HEIGHT_720 = 720;
37    public static final int HEIGHT_1080 = 1080;
38
39    /**
40     *  Supported aspect ratios
41     */
42    public static final int ASPECT_RATIO_UNDEFINED = 0;
43    public static final int ASPECT_RATIO_3_2 = 1;
44    public static final int ASPECT_RATIO_16_9 = 2;
45    public static final int ASPECT_RATIO_4_3 = 3;
46    public static final int ASPECT_RATIO_5_3 = 4;
47    public static final int ASPECT_RATIO_11_9 = 5;
48
49    /**
50     *  The array of supported aspect ratios
51     */
52    private static final int[] ASPECT_RATIOS = new int[] {
53        ASPECT_RATIO_3_2,
54        ASPECT_RATIO_16_9,
55        ASPECT_RATIO_4_3,
56        ASPECT_RATIO_5_3,
57        ASPECT_RATIO_11_9
58    };
59
60    /**
61     *  Supported resolutions for specific aspect ratios
62     */
63    @SuppressWarnings({"unchecked"})
64    private static final Pair<Integer, Integer>[] ASPECT_RATIO_3_2_RESOLUTIONS =
65        new Pair[] {
66        new Pair<Integer, Integer>(720, HEIGHT_480),
67        new Pair<Integer, Integer>(1080, HEIGHT_720)
68    };
69
70    @SuppressWarnings({"unchecked"})
71    private static final Pair<Integer, Integer>[] ASPECT_RATIO_4_3_RESOLUTIONS =
72        new Pair[] {
73        new Pair<Integer, Integer>(640, HEIGHT_480),
74        new Pair<Integer, Integer>(960, HEIGHT_720)
75    };
76
77    @SuppressWarnings({"unchecked"})
78    private static final Pair<Integer, Integer>[] ASPECT_RATIO_5_3_RESOLUTIONS =
79        new Pair[] {
80        new Pair<Integer, Integer>(800, HEIGHT_480)
81    };
82
83    @SuppressWarnings({"unchecked"})
84    private static final Pair<Integer, Integer>[] ASPECT_RATIO_11_9_RESOLUTIONS =
85        new Pair[] {
86        new Pair<Integer, Integer>(176, HEIGHT_144),
87        new Pair<Integer, Integer>(352, HEIGHT_288)
88    };
89
90    @SuppressWarnings({"unchecked"})
91    private static final Pair<Integer, Integer>[] ASPECT_RATIO_16_9_RESOLUTIONS =
92        new Pair[] {
93        new Pair<Integer, Integer>(848, HEIGHT_480),
94        new Pair<Integer, Integer>(1280, HEIGHT_720),
95        new Pair<Integer, Integer>(1920, HEIGHT_1080),
96    };
97
98    /**
99     *  Bitrate values (in bits per second)
100     */
101    public static final int BITRATE_28K = 28000;
102    public static final int BITRATE_40K = 40000;
103    public static final int BITRATE_64K = 64000;
104    public static final int BITRATE_96K = 96000;
105    public static final int BITRATE_128K = 128000;
106    public static final int BITRATE_192K = 192000;
107    public static final int BITRATE_256K = 256000;
108    public static final int BITRATE_384K = 384000;
109    public static final int BITRATE_512K = 512000;
110    public static final int BITRATE_800K = 800000;
111    public static final int BITRATE_2M = 2000000;
112    public static final int BITRATE_5M = 5000000;
113    public static final int BITRATE_8M = 8000000;
114
115    /**
116     *  The array of supported bitrates
117     */
118    private static final int[] SUPPORTED_BITRATES = new int[] {
119        BITRATE_28K,
120        BITRATE_40K,
121        BITRATE_64K,
122        BITRATE_96K,
123        BITRATE_128K,
124        BITRATE_192K,
125        BITRATE_256K,
126        BITRATE_384K,
127        BITRATE_512K,
128        BITRATE_800K,
129        BITRATE_2M,
130        BITRATE_5M,
131        BITRATE_8M
132    };
133
134    /**
135     *  Video codec types
136     */
137    public static final int VCODEC_H263 = 1;
138    public static final int VCODEC_H264 = 2;
139    public static final int VCODEC_MPEG4 = 3;
140
141    /**
142     *  The array of supported video codecs
143     */
144    private static final int[] SUPPORTED_VCODECS = new int[] {
145        VCODEC_H264,
146        VCODEC_H263,
147        VCODEC_MPEG4,
148    };
149
150    /**
151     *  The H264 profile, the values are same as the one in OMX_Video.h
152     */
153    public final class H264Profile {
154        public static final int H264ProfileBaseline = 0x01; /**< Baseline profile */
155        public static final int H264ProfileMain     = 0x02; /**< Main profile */
156        public static final int H264ProfileExtended = 0x04; /**< Extended profile */
157        public static final int H264ProfileHigh     = 0x08; /**< High profile */
158        public static final int H264ProfileHigh10   = 0x10; /**< High 10 profile */
159        public static final int H264ProfileHigh422  = 0x20; /**< High 4:2:2 profile */
160        public static final int H264ProfileHigh444  = 0x40; /**< High 4:4:4 profile */
161        public static final int H264ProfileUnknown  = 0x7FFFFFFF;
162   }
163    /**
164     *  The H264 level, the values are same as the one in OMX_Video.h
165     */
166    public final class H264Level {
167        public static final int H264Level1   = 0x01; /**< Level 1 */
168        public static final int H264Level1b  = 0x02; /**< Level 1b */
169        public static final int H264Level11  = 0x04; /**< Level 1.1 */
170        public static final int H264Level12  = 0x08; /**< Level 1.2 */
171        public static final int H264Level13  = 0x10; /**< Level 1.3 */
172        public static final int H264Level2   = 0x20; /**< Level 2 */
173        public static final int H264Level21  = 0x40; /**< Level 2.1 */
174        public static final int H264Level22  = 0x80; /**< Level 2.2 */
175        public static final int H264Level3   = 0x100; /**< Level 3 */
176        public static final int H264Level31  = 0x200; /**< Level 3.1 */
177        public static final int H264Level32  = 0x400; /**< Level 3.2 */
178        public static final int H264Level4   = 0x800; /**< Level 4 */
179        public static final int H264Level41  = 0x1000; /**< Level 4.1 */
180        public static final int H264Level42  = 0x2000; /**< Level 4.2 */
181        public static final int H264Level5   = 0x4000; /**< Level 5 */
182        public static final int H264Level51  = 0x8000; /**< Level 5.1 */
183        public static final int H264LevelUnknown = 0x7FFFFFFF;
184    }
185    /**
186     *  The H263 profile, the values are same as the one in OMX_Video.h
187     */
188    public final class H263Profile {
189        public static final int H263ProfileBaseline            = 0x01;
190        public static final int H263ProfileH320Coding          = 0x02;
191        public static final int H263ProfileBackwardCompatible  = 0x04;
192        public static final int H263ProfileISWV2               = 0x08;
193        public static final int H263ProfileISWV3               = 0x10;
194        public static final int H263ProfileHighCompression     = 0x20;
195        public static final int H263ProfileInternet            = 0x40;
196        public static final int H263ProfileInterlace           = 0x80;
197        public static final int H263ProfileHighLatency       = 0x100;
198        public static final int H263ProfileUnknown          = 0x7FFFFFFF;
199    }
200    /**
201     *  The H263 level, the values are same as the one in OMX_Video.h
202     */
203    public final class H263Level {
204        public static final int H263Level10  = 0x01;
205        public static final int H263Level20  = 0x02;
206        public static final int H263Level30  = 0x04;
207        public static final int H263Level40  = 0x08;
208        public static final int H263Level45  = 0x10;
209        public static final int H263Level50  = 0x20;
210        public static final int H263Level60  = 0x40;
211        public static final int H263Level70  = 0x80;
212        public static final int H263LevelUnknown = 0x7FFFFFFF;
213    }
214    /**
215     *  The mpeg4 profile, the values are same as the one in OMX_Video.h
216     */
217    public final class MPEG4Profile {
218        public static final int MPEG4ProfileSimple           = 0x01;
219        public static final int MPEG4ProfileSimpleScalable   = 0x02;
220        public static final int MPEG4ProfileCore             = 0x04;
221        public static final int MPEG4ProfileMain             = 0x08;
222        public static final int MPEG4ProfileNbit             = 0x10;
223        public static final int MPEG4ProfileScalableTexture  = 0x20;
224        public static final int MPEG4ProfileSimpleFace       = 0x40;
225        public static final int MPEG4ProfileSimpleFBA        = 0x80;
226        public static final int MPEG4ProfileBasicAnimated    = 0x100;
227        public static final int MPEG4ProfileHybrid           = 0x200;
228        public static final int MPEG4ProfileAdvancedRealTime = 0x400;
229        public static final int MPEG4ProfileCoreScalable     = 0x800;
230        public static final int MPEG4ProfileAdvancedCoding   = 0x1000;
231        public static final int MPEG4ProfileAdvancedCore     = 0x2000;
232        public static final int MPEG4ProfileAdvancedScalable = 0x4000;
233        public static final int MPEG4ProfileAdvancedSimple   = 0x8000;
234        public static final int MPEG4ProfileUnknown          = 0x7FFFFFFF;
235    }
236    /**
237     *  The mpeg4 level, the values are same as the one in OMX_Video.h
238     */
239    public final class MPEG4Level {
240        public static final int MPEG4Level0  = 0x01; /**< Level 0 */
241        public static final int MPEG4Level0b = 0x02; /**< Level 0b */
242        public static final int MPEG4Level1  = 0x04; /**< Level 1 */
243        public static final int MPEG4Level2  = 0x08; /**< Level 2 */
244        public static final int MPEG4Level3  = 0x10; /**< Level 3 */
245        public static final int MPEG4Level4  = 0x20; /**< Level 4 */
246        public static final int MPEG4Level4a = 0x40; /**< Level 4a */
247        public static final int MPEG4Level5  = 0x80; /**< Level 5 */
248        public static final int MPEG4LevelUnknown = 0x7FFFFFFF;
249    }
250    /**
251     *  Audio codec types
252     */
253    public static final int ACODEC_NO_AUDIO = 0;
254    public static final int ACODEC_AMRNB = 1;
255    public static final int ACODEC_AAC_LC = 2;
256    public static final int ACODEC_AAC_PLUS = 3;
257    public static final int ACODEC_ENHANCED_AAC_PLUS = 4;
258    public static final int ACODEC_MP3 = 5;
259    public static final int ACODEC_EVRC = 6;
260    // 7 value is used for PCM
261    public static final int ACODEC_AMRWB = 8;
262    public static final int ACODEC_OGG = 9;
263
264    /**
265     *  The array of supported audio codecs
266     */
267    private static final int[] SUPPORTED_ACODECS = new int[] {
268        ACODEC_AAC_LC,
269        ACODEC_AMRNB,
270        ACODEC_AMRWB
271    };
272
273    /**
274     *  Samples per frame for each audio codec
275     */
276    public static final int SAMPLES_PER_FRAME_AAC = 1024;
277    public static final int SAMPLES_PER_FRAME_MP3 = 1152;
278    public static final int SAMPLES_PER_FRAME_AMRNB = 160;
279    public static final int SAMPLES_PER_FRAME_AMRWB = 320;
280
281    public static final int DEFAULT_SAMPLING_FREQUENCY = 32000;
282    public static final int DEFAULT_CHANNEL_COUNT = 2;
283
284    /**
285     *  File format types
286     */
287    public static final int FILE_3GP = 0;
288    public static final int FILE_MP4 = 1;
289    public static final int FILE_AMR = 2;
290    public static final int FILE_MP3 = 3;
291    // 4 is for PCM
292    public static final int FILE_JPEG = 5;
293    // 6 is for BMP
294    // 7 is for GIF
295    public static final int FILE_PNG = 8;
296    // 9 is for ARGB8888
297    public static final int FILE_M4V = 10;
298    public static final int FILE_UNSUPPORTED = 255;
299
300    /**
301     * Undefined video codec profiles
302     */
303    public static final int UNDEFINED_VIDEO_PROFILE = 255;
304
305    /**
306     * The array of the supported file formats
307     */
308    private static final int[] SUPPORTED_VIDEO_FILE_FORMATS = new int[] {
309        FILE_3GP,
310        FILE_MP4,
311        FILE_M4V
312    };
313
314    /**
315     * The maximum count of audio tracks supported
316     */
317    public static final int AUDIO_MAX_TRACK_COUNT = 1;
318
319    /** The maximum volume supported (100 means that no amplification is
320     * supported, i.e. attenuation only)
321     */
322    public static final int AUDIO_MAX_VOLUME_PERCENT = 100;
323
324    /**
325     * This class cannot be instantiated
326     */
327    private MediaProperties() {
328    }
329
330    /**
331     * @return The array of supported aspect ratios
332     */
333    public static int[] getAllSupportedAspectRatios() {
334        return ASPECT_RATIOS;
335    }
336
337    /**
338     * Get the supported resolutions for the specified aspect ratio.
339     *
340     * @param aspectRatio The aspect ratio for which the resolutions are
341     *        requested
342     * @return The array of width and height pairs
343     */
344    public static Pair<Integer, Integer>[] getSupportedResolutions(int aspectRatio) {
345        final Pair<Integer, Integer>[] resolutions;
346        switch (aspectRatio) {
347            case ASPECT_RATIO_3_2: {
348                resolutions = ASPECT_RATIO_3_2_RESOLUTIONS;
349                break;
350            }
351
352            case ASPECT_RATIO_4_3: {
353                resolutions = ASPECT_RATIO_4_3_RESOLUTIONS;
354                break;
355            }
356
357            case ASPECT_RATIO_5_3: {
358                resolutions = ASPECT_RATIO_5_3_RESOLUTIONS;
359                break;
360            }
361
362            case ASPECT_RATIO_11_9: {
363                resolutions = ASPECT_RATIO_11_9_RESOLUTIONS;
364                break;
365            }
366
367            case ASPECT_RATIO_16_9: {
368                resolutions = ASPECT_RATIO_16_9_RESOLUTIONS;
369                break;
370            }
371
372            default: {
373                throw new IllegalArgumentException("Unknown aspect ratio: " + aspectRatio);
374            }
375        }
376
377        /** Check the platform specific maximum export resolution */
378        VideoEditorProfile veProfile = VideoEditorProfile.get();
379        if (veProfile == null) {
380            throw new RuntimeException("Can't get the video editor profile");
381        }
382        final int maxWidth = veProfile.maxOutputVideoFrameWidth;
383        final int maxHeight = veProfile.maxOutputVideoFrameHeight;
384        Pair<Integer, Integer>[] tmpResolutions = new Pair[resolutions.length];
385        int numSupportedResolution = 0;
386        int i = 0;
387
388        /** Get supported resolution list */
389        for (i = 0; i < resolutions.length; i++) {
390            if ((resolutions[i].first <= maxWidth) &&
391                (resolutions[i].second <= maxHeight)) {
392                tmpResolutions[numSupportedResolution] = resolutions[i];
393                numSupportedResolution++;
394            }
395        }
396        final Pair<Integer, Integer>[] supportedResolutions =
397            new Pair[numSupportedResolution];
398        System.arraycopy(tmpResolutions, 0,
399            supportedResolutions, 0, numSupportedResolution);
400
401        return supportedResolutions;
402    }
403
404    /**
405     * @return The array of supported video codecs
406     */
407    public static int[] getSupportedVideoCodecs() {
408        return SUPPORTED_VCODECS;
409    }
410
411    /**
412     * @return The array of supported audio codecs
413     */
414    public static int[] getSupportedAudioCodecs() {
415        return SUPPORTED_ACODECS;
416    }
417
418    /**
419     * @return The array of supported file formats
420     */
421    public static int[] getSupportedVideoFileFormat() {
422        return SUPPORTED_VIDEO_FILE_FORMATS;
423    }
424
425    /**
426     * @return The array of supported video bitrates
427     */
428    public static int[] getSupportedVideoBitrates() {
429        return SUPPORTED_BITRATES;
430    }
431
432    /**
433     * @return The maximum value for the audio volume
434     */
435    public static int getSupportedMaxVolume() {
436        return MediaProperties.AUDIO_MAX_VOLUME_PERCENT;
437    }
438
439    /**
440     * @return The maximum number of audio tracks supported
441     */
442    public static int getSupportedAudioTrackCount() {
443        return MediaProperties.AUDIO_MAX_TRACK_COUNT;
444    }
445}
446