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