1 /*
2  * Copyright (C) 2015 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 package com.android.compatibility.common.deviceinfo;
17 
18 import android.app.ActivityManager;
19 import android.app.ActivityManager.MemoryInfo;
20 import android.content.Context;
21 import android.os.Bundle;
22 import android.os.Build;
23 
24 import android.media.CamcorderProfile;
25 import android.media.MediaCodecInfo;
26 import android.media.MediaCodecInfo.CodecCapabilities;
27 import android.media.MediaCodecInfo.CodecProfileLevel;
28 import android.media.MediaCodecInfo.VideoCapabilities;
29 import android.media.MediaCodecList;
30 
31 import com.android.compatibility.common.util.DeviceInfoStore;
32 import com.android.compatibility.common.util.ApiLevelUtil;
33 
34 import java.util.ArrayList;
35 import java.util.List;
36 
37 /**
38  * Media information collector.
39  */
40 public final class MediaDeviceInfo extends DeviceInfo {
41 
42     @Override
collectDeviceInfo(DeviceInfoStore store)43     protected void collectDeviceInfo(DeviceInfoStore store) throws Exception {
44         MediaCodecList allCodecs = new MediaCodecList(MediaCodecList.ALL_CODECS);
45         store.startArray("media_codec_info");
46         for (MediaCodecInfo info : allCodecs.getCodecInfos()) {
47 
48             store.startGroup();
49             store.addResult("name", info.getName());
50             if (ApiLevelUtil.isAtLeast(Build.VERSION_CODES.Q)) {
51                 store.addResult("canonical", info.getCanonicalName());
52             }
53             store.addResult("encoder", info.isEncoder());
54             if (ApiLevelUtil.isAtLeast(Build.VERSION_CODES.Q)) {
55                 store.addResult("alias", info.isAlias());
56                 store.addResult("software", info.isSoftwareOnly());
57                 store.addResult("hardware", info.isHardwareAccelerated());
58                 store.addResult("vendor", info.isVendor());
59             }
60 
61             store.startArray("supported_type");
62             for (String type : info.getSupportedTypes()) {
63                 store.startGroup();
64                 store.addResult("type", type);
65                 CodecCapabilities codecCapabilities = info.getCapabilitiesForType(type);
66                 if (codecCapabilities.profileLevels.length > 0) {
67                     store.startArray("codec_profile_level");
68                     for (CodecProfileLevel profileLevel : codecCapabilities.profileLevels) {
69                         store.startGroup();
70                         store.addResult("level", profileLevel.level);
71                         store.addResult("profile", profileLevel.profile);
72                         store.endGroup();
73                     }
74                     store.endArray(); // codec_profile_level
75                 }
76                 if (codecCapabilities.colorFormats.length > 0) {
77                     store.addArrayResult("codec_color_format", codecCapabilities.colorFormats);
78                 }
79                 store.addResult("supported_secure_playback", codecCapabilities.isFeatureSupported(
80                         CodecCapabilities.FEATURE_SecurePlayback));
81                 VideoCapabilities videoCapabilities = codecCapabilities.getVideoCapabilities();
82                 if (videoCapabilities != null) {
83                     store.startGroup("supported_resolutions");
84                     store.addResult(
85                             "supported_360p_30fps",
86                             videoCapabilities.areSizeAndRateSupported(640, 360, 30));
87                     store.addResult(
88                             "supported_480p_30fps",
89                             videoCapabilities.areSizeAndRateSupported(720, 480, 30));
90                     store.addResult(
91                             "supported_720p_30fps",
92                             videoCapabilities.areSizeAndRateSupported(1280, 720, 30));
93                     store.addResult(
94                             "supported_1080p_30fps",
95                             videoCapabilities.areSizeAndRateSupported(1920, 1080, 30));
96                     // The QHD/WQHD 2560x1440 resolution is used to create YouTube and PlayMovies
97                     // 2k content, so use that resolution to determine if a device supports 2k.
98                     store.addResult(
99                             "supported_2k_30fps",
100                             videoCapabilities.areSizeAndRateSupported(2560, 1440, 30));
101                     store.addResult(
102                             "supported_4k_30fps",
103                             videoCapabilities.areSizeAndRateSupported(3840, 2160, 30));
104                     store.addResult(
105                             "supported_8k_30fps",
106                             videoCapabilities.areSizeAndRateSupported(7680, 4320, 30));
107                     store.addResult(
108                             "supported_360p_60fps",
109                             videoCapabilities.areSizeAndRateSupported(640, 360, 60));
110                     store.addResult(
111                             "supported_480p_60fps",
112                             videoCapabilities.areSizeAndRateSupported(720, 480, 60));
113                     store.addResult(
114                             "supported_720p_60fps",
115                             videoCapabilities.areSizeAndRateSupported(1280, 720, 60));
116                     store.addResult(
117                             "supported_1080p_60fps",
118                             videoCapabilities.areSizeAndRateSupported(1920, 1080, 60));
119                     store.addResult(
120                             "supported_2k_60fps",
121                             videoCapabilities.areSizeAndRateSupported(2560, 1440, 60));
122                     store.addResult(
123                             "supported_4k_60fps",
124                             videoCapabilities.areSizeAndRateSupported(3840, 2160, 60));
125                     store.addResult(
126                             "supported_8k_60fps",
127                             videoCapabilities.areSizeAndRateSupported(7680, 4320, 60));
128                     store.endGroup(); // supported_resolutions
129                 }
130                 store.endGroup();
131             }
132             store.endArray();
133             store.endGroup();
134         }
135 
136         store.endArray(); // media_codec_profile
137     }
138 }
139