• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2020 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 package android.mediav2.cts;
18 
19 import static android.media.MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Flexible;
20 import static android.media.MediaCodecInfo.CodecCapabilities.COLOR_FormatYUVP010;
21 import static android.media.MediaCodecInfo.CodecProfileLevel.*;
22 import static android.media.codec.Flags.apvSupport;
23 
24 import static com.android.media.editing.flags.Flags.muxerMp4EnableApv;
25 import static com.android.media.extractor.flags.Flags.extractorMp4EnableApv;
26 
27 import static org.junit.Assert.assertEquals;
28 import static org.junit.Assert.assertFalse;
29 import static org.junit.Assert.assertNotNull;
30 import static org.junit.Assert.assertTrue;
31 
32 import android.media.MediaCodec;
33 import android.media.MediaCodecInfo;
34 import android.media.MediaFormat;
35 import android.mediav2.common.cts.EncoderConfigParams;
36 import android.mediav2.common.cts.EncoderProfileLevelTestBase;
37 import android.mediav2.common.cts.OutputManager;
38 import android.util.Log;
39 
40 import com.android.compatibility.common.util.ApiTest;
41 import com.android.compatibility.common.util.CddTest;
42 
43 import org.junit.Assume;
44 import org.junit.Test;
45 import org.junit.runner.RunWith;
46 import org.junit.runners.Parameterized;
47 
48 import java.io.IOException;
49 import java.util.ArrayList;
50 import java.util.Collection;
51 import java.util.HashMap;
52 import java.util.List;
53 import java.util.Objects;
54 
55 /**
56  * EncoderProfileLevelTest validates the profile, level information advertised by the component
57  * in its codec capabilities. The test sets profile and level keys in media format and uses it
58  * during encoder configuration. Upon successful configuration, frames are queued for encoding
59  * (byte buffer mode) and the encoded output (bitstream) is expected to contain the same profile
60  * that was used during configure. The level shall be at least the input configured level.
61  * <p>
62  * NOTE: The test configures level information basing on standard guidelines, not arbitrarily so
63  * encoders are expected to maintain at least the input configured level
64  * <p>
65  * The test parses the bitstream (csd or frame header) and determines profile and level
66  * information. This serves as reference for further validation. The test checks if the output
67  * format returned by component contains same profile and level information as the bitstream. The
68  * output of encoder is muxed and is extracted. The extracted format is expected to contain same
69  * profile and level information as the bitstream.
70  * <p>
71  * As per cdd, if a device contains an encoder capable of encoding a profile/level combination
72  * then it should contain a decoder capable of decoding the same profile/level combination. This
73  * is verified.
74  * <p>
75  * If device implementations support encoding in a media type, then as per cdd they are expected to
76  * handle certain profile and level configurations. This is verified.
77  */
78 @RunWith(Parameterized.class)
79 public class EncoderProfileLevelTest extends EncoderProfileLevelTestBase {
80     private static final String LOG_TAG = EncoderProfileLevelTest.class.getSimpleName();
81     private static final HashMap<String, CddRequirements> CDD_REQUIREMENTS_MAP = new HashMap<>();
82 
83     private static class CddRequirements {
84         private int[] mProfiles;
85         private int mLevel;
86         private int mHeight;
87         private int mWidth;
88 
CddRequirements(int[] profiles, int level, int width, int height)89         CddRequirements(int[] profiles, int level, int width, int height) {
90             mProfiles = profiles;
91             mLevel = level;
92             mWidth = width;
93             mHeight = height;
94         }
95 
CddRequirements(int[] profiles)96         CddRequirements(int[] profiles) {
97             this(profiles, -1 /* level */, -1 /* width */, -1 /* height */);
98         }
99 
CddRequirements(int[] profiles, int level)100         CddRequirements(int[] profiles, int level) {
101             this(profiles, level, -1 /* width */, -1 /* height */);
102         }
103 
getProfiles()104         public int[] getProfiles() {
105             return mProfiles;
106         }
107 
getLevel()108         public int getLevel() {
109             return mLevel;
110         }
111 
getWidth()112         public int getWidth() {
113             return mWidth;
114         }
115 
getHeight()116         public int getHeight() {
117             return mHeight;
118         }
119     }
EncoderProfileLevelTest(String encoder, String mediaType, EncoderConfigParams[] encCfgParams, @SuppressWarnings("unused") String testLabel, String allTestParams)120     public EncoderProfileLevelTest(String encoder, String mediaType,
121             EncoderConfigParams[] encCfgParams, @SuppressWarnings("unused") String testLabel,
122             String allTestParams) {
123         super(encoder, mediaType, encCfgParams, allTestParams);
124     }
125 
prepareTestArgs(Object[] arg, int[] profiles, int colorFormat)126     private static List<Object[]> prepareTestArgs(Object[] arg, int[] profiles, int colorFormat) {
127         List<Object[]> argsList = new ArrayList<>();
128         final int[] maxBFrames = {0, 2};
129         final String mediaType = (String) arg[0];
130         boolean isVideo = mediaType.startsWith("video/");
131         final int br = (int) arg[1];
132         final int param1 = (int) arg[2];
133         final int param2 = (int) arg[3];
134         final int fps = (int) arg[4];
135         final int level = (int) arg[5];
136         boolean[] boolStates = {false, true};
137         if (isVideo) {
138             for (int maxBframe : maxBFrames) {
139                 if (maxBframe != 0) {
140                     if (!mediaType.equals(MediaFormat.MIMETYPE_VIDEO_AVC)
141                             && !mediaType.equals(MediaFormat.MIMETYPE_VIDEO_HEVC)) {
142                         continue;
143                     }
144                 }
145                 // test each resolution in both landscape and portrait orientation
146                 for (boolean rotate : boolStates) {
147                     int width, height;
148                     if (rotate) {
149                         width = param2;
150                         height = param1;
151                     } else {
152                         width = param1;
153                         height = param2;
154                     }
155 
156                     // H.263 doesn't support portait mode, so skip cases where width is smaller
157                     // than height.
158                     if (mediaType.equals(MediaFormat.MIMETYPE_VIDEO_H263) && width <= height) {
159                         continue;
160                     }
161 
162                     Object[] testArgs = new Object[3];
163                     testArgs[0] = arg[0];
164                     testArgs[1] = getVideoEncoderCfgParams(mediaType, br, width, height, fps,
165                             colorFormat, maxBframe, profiles, level);
166                     testArgs[2] = String.format("%dkbps_%dx%d_%dfps_%s_%d_%d-bframes", br / 1000,
167                             width, height, fps, colorFormatToString(colorFormat, -1),
168                             level, maxBframe);
169                     argsList.add(testArgs);
170                 }
171             }
172         } else {
173             Object[] testArgs = new Object[3];
174             testArgs[0] = arg[0];
175             testArgs[1] = getAudioEncoderCfgParams(mediaType, br, param1, param2, profiles);
176             testArgs[2] = String.format("%dkbps_%dkHz_%dch", br / 1000, param1 / 1000, param2);
177             argsList.add(testArgs);
178         }
179         return argsList;
180     }
181 
getVideoEncoderCfgParams(String mediaType, int bitRate, int width, int height, int frameRate, int colorFormat, int maxBframe, int[] profiles, int level)182     private static EncoderConfigParams[] getVideoEncoderCfgParams(String mediaType, int bitRate,
183             int width, int height, int frameRate, int colorFormat, int maxBframe, int[] profiles,
184             int level) {
185         ArrayList<EncoderConfigParams> cfgParams = new ArrayList<>();
186         for (int profile : profiles) {
187             if (maxBframe != 0) {
188                 if (mediaType.equals(MediaFormat.MIMETYPE_VIDEO_AVC) && (
189                         profile == AVCProfileBaseline
190                                 || profile == AVCProfileConstrainedBaseline)) {
191                     continue;
192                 }
193             }
194             cfgParams.add(new EncoderConfigParams.Builder(mediaType)
195                     .setBitRate(bitRate)
196                     .setWidth(width)
197                     .setHeight(height)
198                     .setFrameRate(frameRate)
199                     .setMaxBFrames(maxBframe)
200                     .setProfile(profile)
201                     .setLevel(level)
202                     .setColorFormat(colorFormat)
203                     .build());
204         }
205         return cfgParams.toArray(new EncoderConfigParams[0]);
206     }
207 
getAudioEncoderCfgParams(String mediaType, int bitRate, int sampleRate, int channelCount, int[] profiles)208     private static EncoderConfigParams[] getAudioEncoderCfgParams(String mediaType, int bitRate,
209             int sampleRate, int channelCount, int[] profiles) {
210         EncoderConfigParams[] cfgParams = new EncoderConfigParams[profiles.length];
211         for (int i = 0; i < profiles.length; i++) {
212             cfgParams[i] = new EncoderConfigParams.Builder(mediaType)
213                     .setBitRate(bitRate)
214                     .setSampleRate(sampleRate)
215                     .setChannelCount(channelCount)
216                     .setProfile(profiles[i])
217                     .build();
218         }
219         return cfgParams;
220     }
221 
222     @Parameterized.Parameters(name = "{index}_{0}_{1}_{3}")
input()223     public static Collection<Object[]> input() {
224         final boolean isEncoder = true;
225         final boolean needAudio = true;
226         final boolean needVideo = true;
227         final Object[][] exhaustiveArgsList = new Object[][]{
228                 // Audio - CodecMediaType, bit-rate, sample rate, channel count, level
229                 {MediaFormat.MIMETYPE_AUDIO_AAC, 64000, 48000, 1, -1, -1},
230                 {MediaFormat.MIMETYPE_AUDIO_AAC, 128000, 48000, 2, -1, -1},
231                 // Video - CodecMediaType, bit-rate, width, height, frame-rate, level
232 
233                 // ITU-T H.264
234                 // Table A-6 – Maximum frame rates (frames per second) for some example frame sizes
235                 {MediaFormat.MIMETYPE_VIDEO_AVC, 64000, 176, 144, 15, AVCLevel1},
236                 {MediaFormat.MIMETYPE_VIDEO_AVC, 128000, 176, 144, 15, AVCLevel1b},
237                 {MediaFormat.MIMETYPE_VIDEO_AVC, 192000, 352, 288, 7, AVCLevel11},
238                 {MediaFormat.MIMETYPE_VIDEO_AVC, 384000, 352, 288, 15, AVCLevel12},
239                 {MediaFormat.MIMETYPE_VIDEO_AVC, 512000, 352, 288, 30, AVCLevel13},
240                 {MediaFormat.MIMETYPE_VIDEO_AVC, 832000, 352, 288, 30, AVCLevel2},
241                 {MediaFormat.MIMETYPE_VIDEO_AVC, 1000000, 352, 576, 25, AVCLevel21},
242                 {MediaFormat.MIMETYPE_VIDEO_AVC, 1500000, 720, 576, 12, AVCLevel22},
243                 {MediaFormat.MIMETYPE_VIDEO_AVC, 2000000, 720, 576, 25, AVCLevel3},
244                 {MediaFormat.MIMETYPE_VIDEO_AVC, 3000000, 1280, 720, 30, AVCLevel31},
245                 {MediaFormat.MIMETYPE_VIDEO_AVC, 6000000, 1280, 1024, 42, AVCLevel32},
246                 {MediaFormat.MIMETYPE_VIDEO_AVC, 10000000, 2048, 1024, 30, AVCLevel4},
247                 {MediaFormat.MIMETYPE_VIDEO_AVC, 25000000, 2048, 1024, 30, AVCLevel41},
248                 {MediaFormat.MIMETYPE_VIDEO_AVC, 50000000, 2048, 1088, 60, AVCLevel42},
249                 {MediaFormat.MIMETYPE_VIDEO_AVC, 60000000, 3680, 1526, 26, AVCLevel5},
250                 {MediaFormat.MIMETYPE_VIDEO_AVC, 80000000, 4096, 2304, 26, AVCLevel51},
251                 {MediaFormat.MIMETYPE_VIDEO_AVC, 120000000, 4096, 2304, 56, AVCLevel52},
252                 {MediaFormat.MIMETYPE_VIDEO_AVC, 240000000, 8192, 4320, 30, AVCLevel6},
253                 {MediaFormat.MIMETYPE_VIDEO_AVC, 480000000, 8192, 4320, 60, AVCLevel61},
254                 {MediaFormat.MIMETYPE_VIDEO_AVC, 800000000, 8192, 4320, 120, AVCLevel62},
255 
256                 // The entries below have width being twice that of the widths and height being
257                 // half of the heights in Table A-6
258                 // Since AVC specification has level limits in terms MacroBlocks and not in terms
259                 // of pixels, the height is floored to multiple of 16 to fit within the level being
260                 // tested
261                 {MediaFormat.MIMETYPE_VIDEO_AVC, 64000, 352, 64, 15, AVCLevel1},
262                 {MediaFormat.MIMETYPE_VIDEO_AVC, 128000, 352, 64, 15, AVCLevel1b},
263                 {MediaFormat.MIMETYPE_VIDEO_AVC, 192000, 704, 144, 7, AVCLevel11},
264                 {MediaFormat.MIMETYPE_VIDEO_AVC, 384000, 704, 144, 15, AVCLevel12},
265                 {MediaFormat.MIMETYPE_VIDEO_AVC, 512000, 704, 144, 30, AVCLevel13},
266                 {MediaFormat.MIMETYPE_VIDEO_AVC, 832000, 704, 144, 30, AVCLevel2},
267                 {MediaFormat.MIMETYPE_VIDEO_AVC, 1000000, 704, 288, 25, AVCLevel21},
268                 {MediaFormat.MIMETYPE_VIDEO_AVC, 1500000, 1440, 288, 12, AVCLevel22},
269                 {MediaFormat.MIMETYPE_VIDEO_AVC, 2000000, 1440, 288, 25, AVCLevel3},
270                 {MediaFormat.MIMETYPE_VIDEO_AVC, 3000000, 2560, 352, 30, AVCLevel31},
271                 {MediaFormat.MIMETYPE_VIDEO_AVC, 6000000, 2560, 512, 42, AVCLevel32},
272                 {MediaFormat.MIMETYPE_VIDEO_AVC, 10000000, 4096, 512, 30, AVCLevel4},
273                 {MediaFormat.MIMETYPE_VIDEO_AVC, 25000000, 4096, 512, 30, AVCLevel41},
274                 {MediaFormat.MIMETYPE_VIDEO_AVC, 50000000, 4096, 544, 60, AVCLevel42},
275                 {MediaFormat.MIMETYPE_VIDEO_AVC, 60000000, 7360, 752, 26, AVCLevel5},
276                 {MediaFormat.MIMETYPE_VIDEO_AVC, 80000000, 8192, 1152, 26, AVCLevel51},
277                 {MediaFormat.MIMETYPE_VIDEO_AVC, 120000000, 8192, 1152, 56, AVCLevel52},
278                 {MediaFormat.MIMETYPE_VIDEO_AVC, 240000000, 16384, 2160, 30, AVCLevel6},
279                 {MediaFormat.MIMETYPE_VIDEO_AVC, 480000000, 16384, 2160, 60, AVCLevel61},
280                 {MediaFormat.MIMETYPE_VIDEO_AVC, 800000000, 16384, 2160, 120, AVCLevel62},
281 
282                 // Resolutions listed in CDD Section 5.2
283                 {MediaFormat.MIMETYPE_VIDEO_AVC, 384000, 320, 240, 20, AVCLevel12},
284                 {MediaFormat.MIMETYPE_VIDEO_AVC, 2000000, 720, 480, 30, AVCLevel3},
285                 {MediaFormat.MIMETYPE_VIDEO_AVC, 4000000, 1280, 720, 30, AVCLevel31},
286                 {MediaFormat.MIMETYPE_VIDEO_AVC, 10000000, 1920, 1088, 30, AVCLevel4},
287 
288                 // Clips at Maximum frame rates and bitrates
289                 {MediaFormat.MIMETYPE_VIDEO_AVC, 64000, 128, 96, 30, AVCLevel1},
290                 {MediaFormat.MIMETYPE_VIDEO_AVC, 128000, 128, 96, 30, AVCLevel1b},
291                 {MediaFormat.MIMETYPE_VIDEO_AVC, 192000, 128, 96, 62, AVCLevel11},
292                 {MediaFormat.MIMETYPE_VIDEO_AVC, 384000, 128, 96, 125, AVCLevel12},
293                 {MediaFormat.MIMETYPE_VIDEO_AVC, 768000, 128, 96, 172, AVCLevel13},
294                 {MediaFormat.MIMETYPE_VIDEO_AVC, 2000000, 128, 96, 172, AVCLevel2},
295                 // Following entry covers level 2.1 and 2.2
296                 {MediaFormat.MIMETYPE_VIDEO_AVC, 4000000, 176, 144, 172, AVCLevel21},
297                 {MediaFormat.MIMETYPE_VIDEO_AVC, 10000000, 176, 144, 172, AVCLevel3},
298                 {MediaFormat.MIMETYPE_VIDEO_AVC, 14000000, 352, 288, 172, AVCLevel31},
299                 {MediaFormat.MIMETYPE_VIDEO_AVC, 20000000, 640, 480, 172, AVCLevel32},
300                 {MediaFormat.MIMETYPE_VIDEO_AVC, 20000000, 720, 480, 172, AVCLevel4},
301                 {MediaFormat.MIMETYPE_VIDEO_AVC, 50000000, 720, 480, 172, AVCLevel41},
302                 {MediaFormat.MIMETYPE_VIDEO_AVC, 50000000, 800, 600, 172, AVCLevel42},
303                 {MediaFormat.MIMETYPE_VIDEO_AVC, 135000000, 1024, 768, 172, AVCLevel5},
304                 {MediaFormat.MIMETYPE_VIDEO_AVC, 240000000, 1408, 960, 172, AVCLevel51},
305                 {MediaFormat.MIMETYPE_VIDEO_AVC, 240000000, 2048, 1088, 172, AVCLevel52},
306                 {MediaFormat.MIMETYPE_VIDEO_AVC, 240000000, 2048, 1526, 300, AVCLevel6},
307                 {MediaFormat.MIMETYPE_VIDEO_AVC, 480000000, 3680, 1536, 300, AVCLevel61},
308                 {MediaFormat.MIMETYPE_VIDEO_AVC, 800000000, 4096, 2304, 300, AVCLevel62},
309 
310                 {MediaFormat.MIMETYPE_VIDEO_MPEG2, 4000000, 352, 288, 30, MPEG2LevelLL},
311                 {MediaFormat.MIMETYPE_VIDEO_MPEG2, 15000000, 720, 480, 30, MPEG2LevelML},
312                 {MediaFormat.MIMETYPE_VIDEO_MPEG2, 60000000, 1440, 1088, 30, MPEG2LevelH14},
313                 {MediaFormat.MIMETYPE_VIDEO_MPEG2, 80000000, 1920, 1088, 30, MPEG2LevelHL},
314                 {MediaFormat.MIMETYPE_VIDEO_MPEG2, 80000000, 1920, 1088, 60, MPEG2LevelHP},
315 
316                 // Resolutions listed in https://www.webmproject.org/vp9/levels/
317                 {MediaFormat.MIMETYPE_VIDEO_VP9, 200000, 256, 144, 15, VP9Level1},
318                 {MediaFormat.MIMETYPE_VIDEO_VP9, 512000, 384, 192, 30, VP9Level11},
319                 {MediaFormat.MIMETYPE_VIDEO_VP9, 1000000, 480, 256, 30, VP9Level2},
320                 {MediaFormat.MIMETYPE_VIDEO_VP9, 1500000, 640, 384, 30, VP9Level21},
321                 {MediaFormat.MIMETYPE_VIDEO_VP9, 1600000, 1080, 512, 30, VP9Level3},
322                 {MediaFormat.MIMETYPE_VIDEO_VP9, 4000000, 1280, 768, 30, VP9Level31},
323                 {MediaFormat.MIMETYPE_VIDEO_VP9, 5000000, 2048, 1088, 30, VP9Level4},
324                 {MediaFormat.MIMETYPE_VIDEO_VP9, 16000000, 2048, 1088, 60, VP9Level41},
325                 {MediaFormat.MIMETYPE_VIDEO_VP9, 20000000, 4096, 2176, 30, VP9Level5},
326                 {MediaFormat.MIMETYPE_VIDEO_VP9, 80000000, 4096, 2176, 60, VP9Level51},
327                 {MediaFormat.MIMETYPE_VIDEO_VP9, 160000000, 4096, 2176, 120, VP9Level52},
328                 {MediaFormat.MIMETYPE_VIDEO_VP9, 180000000, 8192, 4352, 30, VP9Level6},
329                 {MediaFormat.MIMETYPE_VIDEO_VP9, 240000000, 8192, 4352, 60, VP9Level61},
330                 {MediaFormat.MIMETYPE_VIDEO_VP9, 480000000, 8192, 4352, 120, VP9Level62},
331 
332                 // The entries below have width being twice that of the widths and height being
333                 // half of the heights in https://www.webmproject.org/vp9/levels/
334                 // Some of the cases where max dimension is limited by specification, width is
335                 // clipped.
336                 {MediaFormat.MIMETYPE_VIDEO_VP9, 200000, 512, 72, 15, VP9Level1},
337                 {MediaFormat.MIMETYPE_VIDEO_VP9, 512000, 768, 96, 30, VP9Level11},
338                 {MediaFormat.MIMETYPE_VIDEO_VP9, 1000000, 960, 128, 30, VP9Level2},
339                 {MediaFormat.MIMETYPE_VIDEO_VP9, 1500000, 1280, 192, 30, VP9Level21},
340                 {MediaFormat.MIMETYPE_VIDEO_VP9, 1600000, 2048, 256, 30, VP9Level3},
341                 {MediaFormat.MIMETYPE_VIDEO_VP9, 4000000, 2560, 384, 30, VP9Level31},
342                 {MediaFormat.MIMETYPE_VIDEO_VP9, 5000000, 4096, 544, 30, VP9Level4},
343                 {MediaFormat.MIMETYPE_VIDEO_VP9, 16000000, 4096, 544, 60, VP9Level41},
344                 {MediaFormat.MIMETYPE_VIDEO_VP9, 20000000, 8192, 1088, 30, VP9Level5},
345                 {MediaFormat.MIMETYPE_VIDEO_VP9, 80000000, 8192, 1088, 60, VP9Level51},
346                 {MediaFormat.MIMETYPE_VIDEO_VP9, 160000000, 8192, 1088, 120, VP9Level52},
347                 {MediaFormat.MIMETYPE_VIDEO_VP9, 180000000, 16384, 2176, 30, VP9Level6},
348                 {MediaFormat.MIMETYPE_VIDEO_VP9, 240000000, 16384, 2176, 60, VP9Level61},
349                 {MediaFormat.MIMETYPE_VIDEO_VP9, 480000000, 16384, 2176, 120, VP9Level62},
350 
351                 // Resolutions listed in CDD Section 5.2
352                 {MediaFormat.MIMETYPE_VIDEO_VP9, 1600000, 720, 480, 30, VP9Level3},
353                 {MediaFormat.MIMETYPE_VIDEO_VP9, 4000000, 1280, 720, 30, VP9Level31},
354                 {MediaFormat.MIMETYPE_VIDEO_VP9, 5000000, 1920, 1080, 30, VP9Level4},
355                 {MediaFormat.MIMETYPE_VIDEO_VP9, 20000000, 3840, 2160, 30, VP9Level5},
356 
357                 // ITU-T H.263
358                 // Table X.2/H.263 − Levels of operation
359                 // This also includes 176x144 which is the CDD
360                 {MediaFormat.MIMETYPE_VIDEO_H263, 64000, 176, 144, 15, H263Level10},
361                 {MediaFormat.MIMETYPE_VIDEO_H263, 128000, 176, 144, 15, H263Level45},
362                 {MediaFormat.MIMETYPE_VIDEO_H263, 128000, 352, 288, 15, H263Level20},
363                 {MediaFormat.MIMETYPE_VIDEO_H263, 384000, 352, 288, 30, H263Level30},
364                 {MediaFormat.MIMETYPE_VIDEO_H263, 2048000, 352, 288, 30, H263Level40},
365                 {MediaFormat.MIMETYPE_VIDEO_H263, 4096000, 352, 240, 60, H263Level50},
366                 {MediaFormat.MIMETYPE_VIDEO_H263, 8192000, 720, 240, 60, H263Level60},
367                 {MediaFormat.MIMETYPE_VIDEO_H263, 16384000, 720, 576, 50, H263Level70},
368 
369                 // From ITU-T H.265
370                 // Table A.11 – Maximum picture rates (pictures per second) at level 1 to 4.1 for
371                 // some example picture sizes when MinCbSizeY is equal to 64
372                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 128000, 176, 144, 15, HEVCMainTierLevel1},
373                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 512000, 352, 288, 30, HEVCMainTierLevel2},
374                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 1000000, 640, 360, 30, HEVCMainTierLevel21},
375                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 1600000, 960, 540, 30, HEVCMainTierLevel3},
376                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 4000000, 1280, 720, 33, HEVCMainTierLevel31},
377                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 6000000, 2048, 1080, 30, HEVCMainTierLevel4},
378                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 16000000, 2048, 1080, 30, HEVCHighTierLevel4},
379                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 20000000, 2048, 1080, 60, HEVCMainTierLevel41},
380                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 30000000, 2048, 1080, 60, HEVCHighTierLevel41},
381 
382                 // From ITU-T H.265
383                 // Table A.12 – Maximum picture rates (pictures per second) at level 5 to 6.2 for
384                 // some example picture sizes when MinCbSizeY is equal to 64
385                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 20000000, 4096, 2160, 30, HEVCMainTierLevel5},
386                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 50000000, 4096, 2160, 30, HEVCHighTierLevel5},
387                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 40000000, 4096, 2160, 60, HEVCMainTierLevel51},
388                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 80000000, 4096, 2160, 60, HEVCHighTierLevel51},
389                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 50000000, 4096, 2160, 120, HEVCMainTierLevel52},
390                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 100000000, 4096, 2160, 120, HEVCHighTierLevel52},
391                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 50000000, 8192, 4320, 30, HEVCMainTierLevel6},
392                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 80000000, 8192, 4320, 30, HEVCHighTierLevel6},
393                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 100000000, 8192, 4320, 60, HEVCMainTierLevel61},
394                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 240000000, 8192, 4320, 60, HEVCHighTierLevel61},
395                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 200000000, 8192, 4320, 120, HEVCMainTierLevel62},
396                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 360000000, 8192, 4320, 120, HEVCHighTierLevel62},
397 
398                 // The entries below have width being twice that of the widths and height being
399                 // half of the heights in Table A.11 and A.12
400                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 128000, 352, 72, 15, HEVCMainTierLevel1},
401                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 512000, 704, 144, 30, HEVCMainTierLevel2},
402                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 1000000, 1280, 180, 30, HEVCMainTierLevel21},
403                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 1600000, 1920, 270, 30, HEVCMainTierLevel3},
404                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 4000000, 2560, 360, 33, HEVCMainTierLevel31},
405                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 6000000, 4096, 540, 30, HEVCMainTierLevel4},
406                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 16000000, 4096, 540, 30, HEVCHighTierLevel4},
407                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 20000000, 4096, 540, 60, HEVCMainTierLevel41},
408                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 30000000, 4096, 540, 60, HEVCHighTierLevel41},
409                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 20000000, 8192, 1080, 30, HEVCMainTierLevel5},
410                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 50000000, 8192, 1080, 30, HEVCHighTierLevel5},
411                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 40000000, 8192, 1080, 60, HEVCMainTierLevel51},
412                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 80000000, 8192, 1080, 60, HEVCHighTierLevel51},
413                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 50000000, 8192, 1080, 120, HEVCMainTierLevel52},
414                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 100000000, 8192, 1080, 120, HEVCHighTierLevel52},
415                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 50000000, 16384, 2160, 30, HEVCMainTierLevel6},
416                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 80000000, 16384, 2160, 30, HEVCHighTierLevel6},
417                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 100000000, 16384, 2160, 60, HEVCMainTierLevel61},
418                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 240000000, 16384, 2160, 60, HEVCHighTierLevel61},
419                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 200000000, 16384, 2160, 120, HEVCMainTierLevel62},
420                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 360000000, 16384, 2160, 120, HEVCHighTierLevel62},
421 
422                 // Resolutions listed in CDD Section 5.2
423                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 1000000, 512, 512, 30, HEVCMainTierLevel3},
424                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 1600000, 720, 480, 30, HEVCMainTierLevel3},
425                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 4000000, 1280, 720, 30, HEVCMainTierLevel31},
426                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 5000000, 1920, 1080, 30, HEVCMainTierLevel4},
427                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 20000000, 3840, 2160, 30, HEVCMainTierLevel5},
428 
429                 // Clips at Maximum frame rates and bitrates
430                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 128000, 128, 96, 33, HEVCMainTierLevel1},
431                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 1500000, 128, 96, 225, HEVCMainTierLevel2},
432                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 3000000, 128, 96, 300, HEVCMainTierLevel21},
433                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 6000000, 176, 144, 300, HEVCMainTierLevel3},
434                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 10000000, 352, 240, 300, HEVCMainTierLevel31},
435                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 12000000, 352, 576, 300, HEVCMainTierLevel4},
436                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 30000000, 352, 576, 300, HEVCHighTierLevel4},
437                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 20000000, 720, 576, 300, HEVCMainTierLevel41},
438                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 50000000, 720, 576, 300, HEVCHighTierLevel41},
439                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 25000000, 1024, 768, 300, HEVCMainTierLevel5},
440                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 100000000, 1024, 768, 300, HEVCHighTierLevel5},
441                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 40000000, 1408, 1152, 300, HEVCMainTierLevel51},
442                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 160000000, 1408, 1152, 300, HEVCHighTierLevel51},
443                 // Following two entries cover Level 5.2 and Level 6.0
444                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 60000000, 2048, 1526, 300, HEVCMainTierLevel52},
445                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 240000000, 2048, 1526, 300, HEVCHighTierLevel52},
446                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 120000000, 3672, 1536, 300, HEVCMainTierLevel61},
447                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 480000000, 3672, 1536, 300, HEVCHighTierLevel61},
448                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 240000000, 4096, 3072, 300, HEVCMainTierLevel62},
449                 {MediaFormat.MIMETYPE_VIDEO_HEVC, 800000000, 4096, 3072, 300, HEVCHighTierLevel62},
450 
451                 // Resolutions listed in https://aomedia.org/av1/specification/annex-a/#levels
452                 {MediaFormat.MIMETYPE_VIDEO_AV1, 1500000, 426, 240, 30, AV1Level2},
453                 {MediaFormat.MIMETYPE_VIDEO_AV1, 3000000, 640, 360, 30, AV1Level21},
454                 {MediaFormat.MIMETYPE_VIDEO_AV1, 6000000, 854, 480, 30, AV1Level3},
455                 {MediaFormat.MIMETYPE_VIDEO_AV1, 10000000, 1280, 720, 30, AV1Level31},
456                 {MediaFormat.MIMETYPE_VIDEO_AV1, 12000000, 1920, 1080, 30, AV1Level4},
457                 {MediaFormat.MIMETYPE_VIDEO_AV1, 20000000, 1920, 1080, 60, AV1Level41},
458                 {MediaFormat.MIMETYPE_VIDEO_AV1, 30000000, 3840, 2160, 30, AV1Level5},
459                 {MediaFormat.MIMETYPE_VIDEO_AV1, 40000000, 3840, 2160, 60, AV1Level51},
460                 {MediaFormat.MIMETYPE_VIDEO_AV1, 60000000, 3840, 2160, 120, AV1Level52},
461                 {MediaFormat.MIMETYPE_VIDEO_AV1, 60000000, 7680, 4320, 30, AV1Level6},
462                 {MediaFormat.MIMETYPE_VIDEO_AV1, 100000000, 7680, 4320, 60, AV1Level61},
463                 {MediaFormat.MIMETYPE_VIDEO_AV1, 160000000, 7680, 4320, 120, AV1Level62},
464 
465                 // The entries below have width being twice that of the widths and height being
466                 // half of the heights in https://aomedia.org/av1/specification/annex-a/#levels
467                 {MediaFormat.MIMETYPE_VIDEO_AV1, 1500000, 852, 120, 30, AV1Level2},
468                 {MediaFormat.MIMETYPE_VIDEO_AV1, 3000000, 1280, 180, 30, AV1Level21},
469                 {MediaFormat.MIMETYPE_VIDEO_AV1, 6000000, 1708, 240, 30, AV1Level3},
470                 {MediaFormat.MIMETYPE_VIDEO_AV1, 10000000, 2560, 360, 30, AV1Level31},
471                 {MediaFormat.MIMETYPE_VIDEO_AV1, 12000000, 3840, 540, 30, AV1Level4},
472                 {MediaFormat.MIMETYPE_VIDEO_AV1, 20000000, 3840, 540, 60, AV1Level41},
473                 {MediaFormat.MIMETYPE_VIDEO_AV1, 30000000, 7680, 1080, 30, AV1Level5},
474                 {MediaFormat.MIMETYPE_VIDEO_AV1, 40000000, 7680, 1080, 60, AV1Level51},
475                 {MediaFormat.MIMETYPE_VIDEO_AV1, 60000000, 7680, 1080, 120, AV1Level52},
476                 {MediaFormat.MIMETYPE_VIDEO_AV1, 60000000, 15360, 2160, 30, AV1Level6},
477                 {MediaFormat.MIMETYPE_VIDEO_AV1, 100000000, 15360, 2160, 60, AV1Level61},
478                 {MediaFormat.MIMETYPE_VIDEO_AV1, 160000000, 15360, 2160, 120, AV1Level62},
479 
480                 // Resolutions listed in CDD Section 5.2
481                 {MediaFormat.MIMETYPE_VIDEO_AV1, 5000000, 720, 480, 30, AV1Level3},
482                 {MediaFormat.MIMETYPE_VIDEO_AV1, 8000000, 1280, 720, 30, AV1Level31},
483                 {MediaFormat.MIMETYPE_VIDEO_AV1, 16000000, 1920, 1080, 30, AV1Level4},
484                 {MediaFormat.MIMETYPE_VIDEO_AV1, 50000000, 3840, 2160, 30, AV1Level5},
485         };
486         final List<Object[]> argsList = new ArrayList<>();
487         for (Object[] arg : exhaustiveArgsList) {
488             final String mediaType = (String) arg[0];
489             argsList.addAll(prepareTestArgs(arg,
490                     Objects.requireNonNull(PROFILE_SDR_MAP.get(mediaType)),
491                     COLOR_FormatYUV420Flexible));
492             // P010 support was added in Android T, hence limit the following tests to Android
493             // T and above
494             if (IS_AT_LEAST_T && PROFILE_HLG_MAP.get(mediaType) != null) {
495                 argsList.addAll(prepareTestArgs(arg,
496                         Objects.requireNonNull(PROFILE_HLG_MAP.get(mediaType)),
497                         COLOR_FormatYUVP010));
498             }
499         }
500         final Object[][] mpeg4SimpleProfileArgsList = new Object[][]{
501                 {MediaFormat.MIMETYPE_VIDEO_MPEG4, 64000, 176, 144, 15, MPEG4Level0},
502                 {MediaFormat.MIMETYPE_VIDEO_MPEG4, 128000, 176, 144, 15, MPEG4Level0b},
503                 {MediaFormat.MIMETYPE_VIDEO_MPEG4, 64000, 128, 96, 30, MPEG4Level1},
504                 {MediaFormat.MIMETYPE_VIDEO_MPEG4, 128000, 352, 288, 15, MPEG4Level2},
505                 {MediaFormat.MIMETYPE_VIDEO_MPEG4, 384000, 352, 288, 30, MPEG4Level3},
506                 {MediaFormat.MIMETYPE_VIDEO_MPEG4, 4000000, 640, 480, 30, MPEG4Level4a},
507                 {MediaFormat.MIMETYPE_VIDEO_MPEG4, 8000000, 720, 576, 24, MPEG4Level5},
508                 {MediaFormat.MIMETYPE_VIDEO_MPEG4, 12000000, 1280, 720, 30, MPEG4Level6},
509         };
510         for (Object[] arg : mpeg4SimpleProfileArgsList) {
511             argsList.addAll(prepareTestArgs(arg, new int[]{MPEG4ProfileSimple},
512                     COLOR_FormatYUV420Flexible));
513         }
514         final Object[][] mpeg4AdvSimpleProfileArgsList = new Object[][]{
515                 {MediaFormat.MIMETYPE_VIDEO_MPEG4, 128000, 176, 144, 30, MPEG4Level1},
516                 {MediaFormat.MIMETYPE_VIDEO_MPEG4, 384000, 352, 288, 15, MPEG4Level2},
517                 {MediaFormat.MIMETYPE_VIDEO_MPEG4, 768000, 352, 288, 30, MPEG4Level3},
518                 {MediaFormat.MIMETYPE_VIDEO_MPEG4, 1500000, 352, 288, 30, MPEG4Level3b},
519                 {MediaFormat.MIMETYPE_VIDEO_MPEG4, 3000000, 704, 576, 15, MPEG4Level4},
520                 {MediaFormat.MIMETYPE_VIDEO_MPEG4, 8000000, 720, 576, 30, MPEG4Level5},
521         };
522         for (Object[] arg : mpeg4AdvSimpleProfileArgsList) {
523             argsList.addAll(prepareTestArgs(arg, new int[]{MPEG4ProfileAdvancedSimple},
524                     COLOR_FormatYUV420Flexible));
525         }
526         if (IS_AT_LEAST_B && apvSupport() && muxerMp4EnableApv() && extractorMp4EnableApv()) {
527             final Object[][] apvProfileArgsList = new Object[][]{
528                     {MediaFormat.MIMETYPE_VIDEO_APV, 7000000, 352, 288, 30, APVLevel1Band0},
529                     {MediaFormat.MIMETYPE_VIDEO_APV, 11000000, 352, 288, 30, APVLevel1Band1},
530                     {MediaFormat.MIMETYPE_VIDEO_APV, 14000000, 352, 288, 30, APVLevel1Band2},
531                     {MediaFormat.MIMETYPE_VIDEO_APV, 21000000, 352, 288, 30, APVLevel1Band3},
532                     {MediaFormat.MIMETYPE_VIDEO_APV, 14000000, 704, 576, 15, APVLevel11Band0},
533                     {MediaFormat.MIMETYPE_VIDEO_APV, 21000000, 704, 576, 15, APVLevel11Band1},
534                     {MediaFormat.MIMETYPE_VIDEO_APV, 28000000, 704, 576, 15, APVLevel11Band2},
535                     {MediaFormat.MIMETYPE_VIDEO_APV, 42000000, 704, 576, 15, APVLevel11Band3},
536                     {MediaFormat.MIMETYPE_VIDEO_APV, 36000000, 640, 360, 30, APVLevel2Band0},
537                     {MediaFormat.MIMETYPE_VIDEO_APV, 53000000, 640, 360, 30, APVLevel2Band1},
538                     {MediaFormat.MIMETYPE_VIDEO_APV, 71000000, 640, 360, 30, APVLevel2Band2},
539                     {MediaFormat.MIMETYPE_VIDEO_APV, 106000000, 640, 360, 30, APVLevel2Band3},
540                     {MediaFormat.MIMETYPE_VIDEO_APV, 71000000, 1280, 720, 30, APVLevel21Band0},
541                     {MediaFormat.MIMETYPE_VIDEO_APV, 106000000, 1280, 720, 30, APVLevel21Band1},
542                     {MediaFormat.MIMETYPE_VIDEO_APV, 141000000, 1280, 720, 30, APVLevel21Band2},
543                     {MediaFormat.MIMETYPE_VIDEO_APV, 212000000, 1280, 720, 30, APVLevel21Band3},
544                     {MediaFormat.MIMETYPE_VIDEO_APV, 101000000, 1920, 1080, 30, APVLevel3Band0},
545                     {MediaFormat.MIMETYPE_VIDEO_APV, 151000000, 1920, 1080, 30, APVLevel3Band1},
546                     {MediaFormat.MIMETYPE_VIDEO_APV, 201000000, 1920, 1080, 30, APVLevel3Band2},
547                     {MediaFormat.MIMETYPE_VIDEO_APV, 301000000, 1920, 1080, 30, APVLevel3Band3},
548                     {MediaFormat.MIMETYPE_VIDEO_APV, 201000000, 1408, 1152, 60, APVLevel31Band0},
549                     {MediaFormat.MIMETYPE_VIDEO_APV, 301000000, 1408, 1152, 60, APVLevel31Band1},
550                     {MediaFormat.MIMETYPE_VIDEO_APV, 401000000, 1408, 1152, 60, APVLevel31Band2},
551                     {MediaFormat.MIMETYPE_VIDEO_APV, 602000000, 1408, 1152, 60, APVLevel31Band3},
552                     {MediaFormat.MIMETYPE_VIDEO_APV, 401000000, 4096, 2160, 30, APVLevel4Band0},
553                     {MediaFormat.MIMETYPE_VIDEO_APV, 602000000, 4096, 2160, 30, APVLevel4Band1},
554                     {MediaFormat.MIMETYPE_VIDEO_APV, 780000000, 4096, 2160, 30, APVLevel4Band2},
555                     {MediaFormat.MIMETYPE_VIDEO_APV, 1170000000, 4096, 2160, 30, APVLevel4Band3},
556                     {MediaFormat.MIMETYPE_VIDEO_APV, 780000000, 3840, 2160, 60, APVLevel41Band0},
557                     {MediaFormat.MIMETYPE_VIDEO_APV, 1170000000, 3840, 2160, 60, APVLevel41Band1},
558                     {MediaFormat.MIMETYPE_VIDEO_APV, 1560000000, 3840, 2160, 60, APVLevel41Band2},
559                     {MediaFormat.MIMETYPE_VIDEO_APV, 1560000000, 8192, 4320, 30, APVLevel5Band0},
560             };
561             for (Object[] arg : apvProfileArgsList) {
562                 argsList.addAll(prepareTestArgs(arg, new int[]{APVProfile422_10},
563                         COLOR_FormatYUVP010));
564             }
565         }
566         return prepareParamList(argsList, isEncoder, needAudio, needVideo, false);
567     }
568 
569     static {
570         // Following lists profiles, level, maxWidth and maxHeight mandated by the CDD.
571         // CodecMediaType, profiles, level, maxWidth, maxHeight
CDD_REQUIREMENTS_MAP.put(MediaFormat.MIMETYPE_AUDIO_AAC, new CddRequirements(new int[]{AACObjectLC, AACObjectHE, AACObjectELD}))572         CDD_REQUIREMENTS_MAP.put(MediaFormat.MIMETYPE_AUDIO_AAC,
573                 new CddRequirements(new int[]{AACObjectLC, AACObjectHE, AACObjectELD}));
CDD_REQUIREMENTS_MAP.put(MediaFormat.MIMETYPE_VIDEO_H263, new CddRequirements(new int[]{H263ProfileBaseline}, H263Level45))574         CDD_REQUIREMENTS_MAP.put(MediaFormat.MIMETYPE_VIDEO_H263,
575                 new CddRequirements(new int[]{H263ProfileBaseline}, H263Level45));
CDD_REQUIREMENTS_MAP.put(MediaFormat.MIMETYPE_VIDEO_AVC, new CddRequirements(new int[]{AVCProfileBaseline}, AVCLevel3))576         CDD_REQUIREMENTS_MAP.put(MediaFormat.MIMETYPE_VIDEO_AVC,
577                 new CddRequirements(new int[]{AVCProfileBaseline}, AVCLevel3));
CDD_REQUIREMENTS_MAP.put(MediaFormat.MIMETYPE_VIDEO_HEVC, new CddRequirements(new int[]{HEVCProfileMain}, HEVCMainTierLevel3, 512, 512))578         CDD_REQUIREMENTS_MAP.put(MediaFormat.MIMETYPE_VIDEO_HEVC,
579                 new CddRequirements(new int[]{HEVCProfileMain}, HEVCMainTierLevel3, 512, 512));
CDD_REQUIREMENTS_MAP.put(MediaFormat.MIMETYPE_VIDEO_VP9, new CddRequirements(new int[]{VP9Profile0}, VP9Level3))580         CDD_REQUIREMENTS_MAP.put(MediaFormat.MIMETYPE_VIDEO_VP9,
581                 new CddRequirements(new int[]{VP9Profile0}, VP9Level3));
582         if (IS_AT_LEAST_U) {
CDD_REQUIREMENTS_MAP.put(MediaFormat.MIMETYPE_VIDEO_AV1, new CddRequirements(new int[]{AV1ProfileMain8, AV1ProfileMain10}))583             CDD_REQUIREMENTS_MAP.put(MediaFormat.MIMETYPE_VIDEO_AV1,
584                     new CddRequirements(new int[]{AV1ProfileMain8, AV1ProfileMain10}));
585         }
586     }
587 
checkIfTrackFormatIsOk(MediaFormat trackFormat)588     void checkIfTrackFormatIsOk(MediaFormat trackFormat) {
589         assertEquals("Input media type and extracted media type are not identical " + mTestEnv
590                         + mTestConfig, mActiveEncCfg.mMediaType,
591                 trackFormat.getString(MediaFormat.KEY_MIME));
592         if (mIsVideo) {
593             assertEquals("Input width and extracted width are not same " + mTestEnv + mTestConfig,
594                     mActiveEncCfg.mWidth, getWidth(trackFormat));
595             assertEquals("Input height and extracted height are not same " + mTestEnv + mTestConfig,
596                     mActiveEncCfg.mHeight, getHeight(trackFormat));
597         } else {
598             int expSampleRate = mActiveEncCfg.mProfile != AACObjectHE ? mActiveEncCfg.mSampleRate
599                     : mActiveEncCfg.mSampleRate / 2;
600             int expChCount = mActiveEncCfg.mProfile != AACObjectHE_PS ? mActiveEncCfg.mChannelCount
601                     : mActiveEncCfg.mChannelCount / 2;
602             assertEquals("Input sample rate and extracted sample rate are not same " + mTestEnv
603                             + mTestConfig, expSampleRate,
604                     trackFormat.getInteger(MediaFormat.KEY_SAMPLE_RATE));
605             assertEquals("Input channe count and extracted channel count are not same " + mTestEnv
606                             + mTestConfig, expChCount,
607                     trackFormat.getInteger(MediaFormat.KEY_CHANNEL_COUNT));
608         }
609     }
610 
shallSupportProfileAndLevel(EncoderConfigParams cfg)611     private boolean shallSupportProfileAndLevel(EncoderConfigParams cfg) {
612         CddRequirements requirement =
613                 Objects.requireNonNull(CDD_REQUIREMENTS_MAP.get(cfg.mMediaType));
614         int[] profileCdd = requirement.getProfiles();
615         int levelCdd = requirement.getLevel();
616         int widthCdd = requirement.getWidth();
617         int heightCdd = requirement.getHeight();
618 
619         // Check if CDD doesn't require support beyond certain resolutions.
620         if (widthCdd != -1 && mActiveEncCfg.mWidth > widthCdd) {
621             return false;
622         }
623         if (heightCdd != -1 && mActiveEncCfg.mHeight > heightCdd) {
624             return false;
625         }
626 
627         for (int cddProfile : profileCdd) {
628             if (cfg.mProfile == cddProfile) {
629                 if (!cfg.mIsAudio) {
630                     if (cfg.mLevel <= levelCdd) {
631                         if (cfg.mMediaType.equalsIgnoreCase(MediaFormat.MIMETYPE_VIDEO_H263)
632                                 && cfg.mLevel != MediaCodecInfo.CodecProfileLevel.H263Level45
633                                 && cfg.mLevel > MediaCodecInfo.CodecProfileLevel.H263Level10) {
634                             continue;
635                         }
636                     } else {
637                         continue;
638                     }
639                 }
640                 return true;
641             }
642         }
643         return false;
644     }
645 
646     /**
647      * Check description of class {@link EncoderProfileLevelTest}
648      */
649     @CddTest(requirements = {"2.2.2/5.1/H-0-3", "2.2.2/5.1/H-0-4", "2.2.2/5.1/H-0-5", "5/C-0-3",
650             "5.2.1/C-1-1", "5.2.2/C-1-1", "5.2.4/C-1-2", "5.2.5/C-1-1", "5.2.6/C-1-1"})
651     @ApiTest(apis = {"android.media.MediaFormat#KEY_PROFILE",
652             "android.media.MediaFormat#KEY_AAC_PROFILE",
653             "android.media.MediaFormat#KEY_LEVEL"})
654     @Test(timeout = PER_TEST_TIMEOUT_LARGE_TEST_MS)
testValidateProfileLevel()655     public void testValidateProfileLevel() throws IOException, InterruptedException {
656         int minLevel = getMinLevel(mMediaType, mEncCfgParams[0].mWidth, mEncCfgParams[0].mHeight,
657                 mEncCfgParams[0].mFrameRate, mEncCfgParams[0].mBitRate, mEncCfgParams[0].mProfile);
658         boolean validateMinLevel = true;
659         // MPEG4 and AV1 have independent checks on width and height and because of that,
660         // level limits that are passed to landscape resolution in the test table, do not
661         // match the minimum level computed later. For such cases, disable the minLevel check.
662         if ((mMediaType.equals(MediaFormat.MIMETYPE_VIDEO_MPEG4)
663                 || mMediaType.equals(MediaFormat.MIMETYPE_VIDEO_AV1))
664                 && (mEncCfgParams[0].mWidth < mEncCfgParams[0].mHeight)) {
665             validateMinLevel = false;
666         }
667         if (validateMinLevel) {
668             assertEquals("Calculated minimum acceptable level does not match the entry in test "
669                     + "table " + mTestConfig, mEncCfgParams[0].mLevel, minLevel);
670         }
671 
672         if (mIsVideo && mEncCfgParams[0].mInputBitDepth != 8) {
673             Assume.assumeTrue(mCodecName + " doesn't support " + colorFormatToString(
674                             mEncCfgParams[0].mColorFormat, mEncCfgParams[0].mInputBitDepth),
675                     hasSupportForColorFormat(mCodecName, mMediaType,
676                             mEncCfgParams[0].mColorFormat));
677         }
678 
679         boolean cddSupportedMediaType = CDD_REQUIREMENTS_MAP.get(mMediaType) != null;
680         {
681             mActiveRawRes = EncoderInput.getRawResource(mEncCfgParams[0]);
682             assertNotNull("no raw resource found for testing config : "
683                     + mEncCfgParams[0] + mTestConfig + mTestEnv, mActiveRawRes);
684             setUpSource(mActiveRawRes.mFileName);
685             mSaveToMem = true;
686             mMuxOutput = true;
687             mOutputBuff = new OutputManager();
688             mCodec = MediaCodec.createByCodecName(mCodecName);
689             MediaCodecInfo.CodecCapabilities codecCapabilities =
690                     mCodec.getCodecInfo().getCapabilitiesForType(mMediaType);
691             int configsTested = 0;
692             for (EncoderConfigParams cfg : mEncCfgParams) {
693                 mActiveEncCfg = cfg;
694                 MediaFormat format = cfg.getFormat();
695                 if (!codecCapabilities.isFormatSupported(format)) {
696                     if (cddSupportedMediaType) {
697                         if (shallSupportProfileAndLevel(cfg)) {
698                             ArrayList<MediaFormat> formats = new ArrayList<>();
699                             formats.add(format);
700                             assertFalse("No components present on the device supports cdd "
701                                     + "required encode format:- " + format + mTestConfig + mTestEnv,
702                                     selectCodecs(mMediaType, formats, null, true).isEmpty());
703                         }
704                         Log.d(LOG_TAG, mCodecName + " doesn't support format: " + format);
705                     }
706                     continue;
707                 }
708 
709                 mOutputBuff.reset();
710                 configureCodec(format, false, true, true);
711                 mCodec.start();
712                 doWork(5);
713                 queueEOS();
714                 waitForAllOutputs();
715                 mCodec.reset();
716 
717                 MediaFormat trackFormat = validateProfileAndLevel();
718 
719                 deleteMuxedFile();
720 
721                 // validate extracted format for mandatory keys
722                 if (trackFormat != null) checkIfTrackFormatIsOk(trackFormat);
723 
724                 // Verify if device has an equivalent decoder for the current format
725                 ArrayList<MediaFormat> formatList = new ArrayList<>();
726                 if (mProfileLevel != null && mProfileLevel.second != -1
727                         && cfg.mLevel != mProfileLevel.second) {
728                     format.setInteger(MediaFormat.KEY_LEVEL, mProfileLevel.second);
729                 }
730                 formatList.add(format);
731                 assertTrue("Device advertises support for encoding " + format + " but cannot"
732                                 + " decode it. \n" + mTestConfig + mTestEnv,
733                         selectCodecs(mMediaType, formatList, null, false).size() > 0);
734                 configsTested++;
735             }
736             mCodec.release();
737             Assume.assumeTrue("skipping test, formats not supported by component",
738                     configsTested > 0);
739         }
740     }
741 }
742