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 17 package android.media.cts; 18 19 import android.media.cts.R; 20 21 import android.content.Context; 22 import android.content.res.AssetFileDescriptor; 23 import android.content.res.Resources; 24 import android.media.MediaCodec; 25 import android.media.MediaCodecInfo.VideoCapabilities; 26 import android.media.MediaExtractor; 27 import android.media.MediaFormat; 28 import android.util.Log; 29 import android.util.Pair; 30 import android.view.Surface; 31 32 import com.android.compatibility.common.util.DeviceReportLog; 33 import com.android.compatibility.common.util.MediaPerfUtils; 34 import com.android.compatibility.common.util.MediaUtils; 35 import com.android.compatibility.common.util.ResultType; 36 import com.android.compatibility.common.util.ResultUnit; 37 38 import java.nio.ByteBuffer; 39 import java.util.Arrays; 40 import java.util.LinkedList; 41 42 public class VideoDecoderPerfTest extends MediaPlayerTestBase { 43 private static final String TAG = "VideoDecoderPerfTest"; 44 private static final String REPORT_LOG_NAME = "CtsMediaTestCases"; 45 private static final int TOTAL_FRAMES = 30000; 46 private static final int MIN_FRAMES = 3000; 47 private static final int MAX_TIME_MS = 120000; // 2 minutes 48 private static final int MAX_TEST_TIMEOUT_MS = 300000; // 5 minutes 49 private static final int MIN_TEST_MS = 10000; // 10 seconds 50 private static final int NUMBER_OF_REPEATS = 2; 51 52 private static final String AVC = MediaFormat.MIMETYPE_VIDEO_AVC; 53 private static final String H263 = MediaFormat.MIMETYPE_VIDEO_H263; 54 private static final String HEVC = MediaFormat.MIMETYPE_VIDEO_HEVC; 55 private static final String MPEG2 = MediaFormat.MIMETYPE_VIDEO_MPEG2; 56 private static final String MPEG4 = MediaFormat.MIMETYPE_VIDEO_MPEG4; 57 private static final String VP8 = MediaFormat.MIMETYPE_VIDEO_VP8; 58 private static final String VP9 = MediaFormat.MIMETYPE_VIDEO_VP9; 59 60 private static final boolean GOOG = true; 61 private static final boolean OTHER = false; 62 63 private static final int MAX_SIZE_SAMPLES_IN_MEMORY_BYTES = 12 << 20; // 12MB 64 // each sample contains the buffer and the PTS offset from the frame index 65 LinkedList<Pair<ByteBuffer, Double>> mSamplesInMemory = new LinkedList<Pair<ByteBuffer, Double>>(); 66 private MediaFormat mDecInputFormat; 67 private MediaFormat mDecOutputFormat; 68 private int mBitrate; 69 70 private Resources mResources; 71 72 @Override 73 protected void setUp() throws Exception { 74 super.setUp(); 75 mResources = mContext.getResources(); 76 } 77 78 @Override 79 protected void tearDown() throws Exception { 80 super.tearDown(); 81 } 82 83 private void decode(String name, int resourceId, MediaFormat format) throws Exception { 84 int width = format.getInteger(MediaFormat.KEY_WIDTH); 85 int height = format.getInteger(MediaFormat.KEY_HEIGHT); 86 String mime = format.getString(MediaFormat.KEY_MIME); 87 88 // Ensure we can finish this test within the test timeout. Allow 25% slack (4/5). 89 long maxTimeMs = Math.min( 90 MAX_TEST_TIMEOUT_MS * 4 / 5 / NUMBER_OF_REPEATS, MAX_TIME_MS); 91 double measuredFps[] = new double[NUMBER_OF_REPEATS]; 92 93 for (int i = 0; i < NUMBER_OF_REPEATS; ++i) { 94 // Decode to Surface. 95 Log.d(TAG, "round #" + i + ": " + name + " for " + maxTimeMs + " msecs to surface"); 96 Surface s = getActivity().getSurfaceHolder().getSurface(); 97 // only verify the result for decode to surface case. 98 measuredFps[i] = doDecode(name, resourceId, width, height, s, i, maxTimeMs); 99 100 // We don't test decoding to buffer. 101 // Log.d(TAG, "round #" + i + " decode to buffer"); 102 // doDecode(name, video, width, height, null, i, maxTimeMs); 103 } 104 105 String error = 106 MediaPerfUtils.verifyAchievableFrameRates(name, mime, width, height, measuredFps); 107 assertNull(error, error); 108 mSamplesInMemory.clear(); 109 } 110 111 private double doDecode( 112 String name, int video, int w, int h, Surface surface, int round, long maxTimeMs) 113 throws Exception { 114 AssetFileDescriptor testFd = mResources.openRawResourceFd(video); 115 MediaExtractor extractor = new MediaExtractor(); 116 extractor.setDataSource(testFd.getFileDescriptor(), testFd.getStartOffset(), 117 testFd.getLength()); 118 extractor.selectTrack(0); 119 int trackIndex = extractor.getSampleTrackIndex(); 120 MediaFormat format = extractor.getTrackFormat(trackIndex); 121 String mime = format.getString(MediaFormat.KEY_MIME); 122 123 // use frame rate to calculate PTS offset used for PTS scaling 124 double frameRate = 0.; // default - 0 is used for using zero PTS offset 125 if (format.containsKey(MediaFormat.KEY_FRAME_RATE)) { 126 frameRate = format.getInteger(MediaFormat.KEY_FRAME_RATE); 127 } else if (!mime.equals(MediaFormat.MIMETYPE_VIDEO_VP8) 128 && !mime.equals(MediaFormat.MIMETYPE_VIDEO_VP9)) { 129 fail("need framerate info for video file"); 130 } 131 132 ByteBuffer[] codecInputBuffers; 133 ByteBuffer[] codecOutputBuffers; 134 135 if (mSamplesInMemory.size() == 0) { 136 int totalMemory = 0; 137 ByteBuffer tmpBuf = ByteBuffer.allocate(w * h * 3 / 2); 138 int sampleSize = 0; 139 int index = 0; 140 long firstPTS = 0; 141 double presentationOffset = 0.; 142 while ((sampleSize = extractor.readSampleData(tmpBuf, 0 /* offset */)) > 0) { 143 if (totalMemory + sampleSize > MAX_SIZE_SAMPLES_IN_MEMORY_BYTES) { 144 break; 145 } 146 if (mSamplesInMemory.size() == 0) { 147 firstPTS = extractor.getSampleTime(); 148 } 149 ByteBuffer copied = ByteBuffer.allocate(sampleSize); 150 copied.put(tmpBuf); 151 if (frameRate > 0.) { 152 // presentation offset is an offset from the frame index 153 presentationOffset = 154 (extractor.getSampleTime() - firstPTS) * frameRate / 1e6 - index; 155 } 156 mSamplesInMemory.addLast(Pair.create(copied, presentationOffset)); 157 totalMemory += sampleSize; 158 ++index; 159 extractor.advance(); 160 } 161 Log.d(TAG, mSamplesInMemory.size() + " samples in memory for " + 162 (totalMemory / 1024) + " KB."); 163 // bitrate normalized to 30fps 164 mBitrate = (int)Math.round(totalMemory * 30. * 8. / mSamplesInMemory.size()); 165 } 166 format.setInteger(MediaFormat.KEY_BIT_RATE, mBitrate); 167 168 int sampleIndex = 0; 169 170 extractor.release(); 171 testFd.close(); 172 173 MediaCodec codec = MediaCodec.createByCodecName(name); 174 VideoCapabilities cap = codec.getCodecInfo().getCapabilitiesForType(mime).getVideoCapabilities(); 175 frameRate = cap.getSupportedFrameRatesFor(w, h).getUpper(); 176 codec.configure(format, surface, null /* crypto */, 0 /* flags */); 177 codec.start(); 178 codecInputBuffers = codec.getInputBuffers(); 179 codecOutputBuffers = codec.getOutputBuffers(); 180 mDecInputFormat = codec.getInputFormat(); 181 182 // start decode loop 183 MediaCodec.BufferInfo info = new MediaCodec.BufferInfo(); 184 185 final long kTimeOutUs = 1000; // 1ms timeout 186 double[] frameTimeUsDiff = new double[TOTAL_FRAMES - 1]; 187 long lastOutputTimeUs = 0; 188 boolean sawInputEOS = false; 189 boolean sawOutputEOS = false; 190 int inputNum = 0; 191 int outputNum = 0; 192 long start = System.currentTimeMillis(); 193 while (!sawOutputEOS) { 194 // handle input 195 if (!sawInputEOS) { 196 int inputBufIndex = codec.dequeueInputBuffer(kTimeOutUs); 197 198 if (inputBufIndex >= 0) { 199 ByteBuffer dstBuf = codecInputBuffers[inputBufIndex]; 200 // sample contains the buffer and the PTS offset normalized to frame index 201 Pair<ByteBuffer, Double> sample = 202 mSamplesInMemory.get(sampleIndex++ % mSamplesInMemory.size()); 203 sample.first.rewind(); 204 int sampleSize = sample.first.remaining(); 205 dstBuf.put(sample.first); 206 // use max supported framerate to compute pts 207 long presentationTimeUs = (long)((inputNum + sample.second) * 1e6 / frameRate); 208 209 long elapsed = System.currentTimeMillis() - start; 210 sawInputEOS = ((++inputNum == TOTAL_FRAMES) 211 || (elapsed > maxTimeMs) 212 || (elapsed > MIN_TEST_MS && outputNum > MIN_FRAMES)); 213 if (sawInputEOS) { 214 Log.d(TAG, "saw input EOS (stop at sample)."); 215 } 216 codec.queueInputBuffer( 217 inputBufIndex, 218 0 /* offset */, 219 sampleSize, 220 presentationTimeUs, 221 sawInputEOS ? MediaCodec.BUFFER_FLAG_END_OF_STREAM : 0); 222 } else { 223 assertEquals( 224 "codec.dequeueInputBuffer() unrecognized return value: " + inputBufIndex, 225 MediaCodec.INFO_TRY_AGAIN_LATER, inputBufIndex); 226 } 227 } 228 229 // handle output 230 int outputBufIndex = codec.dequeueOutputBuffer(info, kTimeOutUs); 231 232 if (outputBufIndex >= 0) { 233 if (info.size > 0) { // Disregard 0-sized buffers at the end. 234 long nowUs = (System.nanoTime() + 500) / 1000; 235 if (outputNum > 1) { 236 frameTimeUsDiff[outputNum - 1] = nowUs - lastOutputTimeUs; 237 } 238 lastOutputTimeUs = nowUs; 239 outputNum++; 240 } 241 codec.releaseOutputBuffer(outputBufIndex, false /* render */); 242 if ((info.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) { 243 Log.d(TAG, "saw output EOS."); 244 sawOutputEOS = true; 245 } 246 } else if (outputBufIndex == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) { 247 codecOutputBuffers = codec.getOutputBuffers(); 248 Log.d(TAG, "output buffers have changed."); 249 } else if (outputBufIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) { 250 mDecOutputFormat = codec.getOutputFormat(); 251 int width = mDecOutputFormat.getInteger(MediaFormat.KEY_WIDTH); 252 int height = mDecOutputFormat.getInteger(MediaFormat.KEY_HEIGHT); 253 Log.d(TAG, "output resolution " + width + "x" + height); 254 } else { 255 assertEquals( 256 "codec.dequeueOutputBuffer() unrecognized return index: " 257 + outputBufIndex, 258 MediaCodec.INFO_TRY_AGAIN_LATER, outputBufIndex); 259 } 260 } 261 long finish = System.currentTimeMillis(); 262 int validDataNum = outputNum - 1; 263 frameTimeUsDiff = Arrays.copyOf(frameTimeUsDiff, validDataNum); 264 codec.stop(); 265 codec.release(); 266 267 Log.d(TAG, "input num " + inputNum + " vs output num " + outputNum); 268 269 DeviceReportLog log = new DeviceReportLog(REPORT_LOG_NAME, "video_decoder_performance"); 270 String message = MediaPerfUtils.addPerformanceHeadersToLog( 271 log, "decoder stats: decodeTo=" + ((surface == null) ? "buffer" : "surface"), 272 round, name, format, mDecInputFormat, mDecOutputFormat); 273 log.addValue("video_res", video, ResultType.NEUTRAL, ResultUnit.NONE); 274 log.addValue("decode_to", surface == null ? "buffer" : "surface", 275 ResultType.NEUTRAL, ResultUnit.NONE); 276 277 double fps = outputNum / ((finish - start) / 1000.0); 278 log.addValue("average_fps", fps, ResultType.HIGHER_BETTER, ResultUnit.FPS); 279 280 MediaUtils.Stats stats = new MediaUtils.Stats(frameTimeUsDiff); 281 fps = MediaPerfUtils.addPerformanceStatsToLog(log, stats, message); 282 log.submit(getInstrumentation()); 283 return fps; 284 } 285 286 private MediaFormat[] getVideoTrackFormats(int... resources) throws Exception { 287 MediaFormat[] formats = new MediaFormat[resources.length]; 288 for (int i = 0; i < resources.length; ++i) { 289 formats[i] = MediaUtils.getTrackFormatForResource(mContext, resources[i], "video/"); 290 } 291 return formats; 292 } 293 294 private void count(int[] resources, int numGoog, int numOther) throws Exception { 295 MediaFormat[] formats = getVideoTrackFormats(resources); 296 MediaUtils.verifyNumCodecs(numGoog, false /* isEncoder */, true /* isGoog */, formats); 297 MediaUtils.verifyNumCodecs(numOther, false /* isEncoder */, false /* isGoog */, formats); 298 } 299 300 private void perf(int[] resources, boolean isGoog, int ix) throws Exception { 301 MediaFormat[] formats = getVideoTrackFormats(resources); 302 String[] decoders = MediaUtils.getDecoderNames(isGoog, formats); 303 String kind = isGoog ? "Google" : "non-Google"; 304 if (decoders.length == 0) { 305 MediaUtils.skipTest("No " + kind + " decoders for " + Arrays.toString(formats)); 306 return; 307 } else if (ix >= decoders.length) { 308 Log.i(TAG, "No more " + kind + " decoders for " + Arrays.toString(formats)); 309 return; 310 } 311 312 String decoderName = decoders[ix]; 313 314 // Decode/measure the first supported video resource 315 for (int i = 0; i < resources.length; ++i) { 316 if (MediaUtils.supports(decoderName, formats[i])) { 317 decode(decoderName, resources[i], formats[i]); 318 break; 319 } 320 } 321 } 322 323 // Poor man's Parametrized test as this test must still run on CTSv1 runner. 324 325 // The count tests are to ensure this Cts test covers all decoders. Add further 326 // tests and change the count if there can be more decoders. 327 328 // AVC tests 329 330 private static final int[] sAvcMedia0320x0240 = { 331 R.raw.bbb_s1_320x240_mp4_h264_mp2_800kbps_30fps_aac_lc_5ch_240kbps_44100hz, 332 }; 333 334 public void testAvcCount0320x0240() throws Exception { count(sAvcMedia0320x0240, 1, 4); } 335 public void testAvcGoog0Perf0320x0240() throws Exception { perf(sAvcMedia0320x0240, GOOG, 0); } 336 public void testAvcOther0Perf0320x0240() throws Exception { perf(sAvcMedia0320x0240, OTHER, 0); } 337 public void testAvcOther1Perf0320x0240() throws Exception { perf(sAvcMedia0320x0240, OTHER, 1); } 338 public void testAvcOther2Perf0320x0240() throws Exception { perf(sAvcMedia0320x0240, OTHER, 2); } 339 public void testAvcOther3Perf0320x0240() throws Exception { perf(sAvcMedia0320x0240, OTHER, 3); } 340 341 private static final int[] sAvcMedia0720x0480 = { 342 R.raw.bbb_s1_720x480_mp4_h264_mp3_2mbps_30fps_aac_lc_5ch_320kbps_48000hz, 343 }; 344 345 public void testAvcCount0720x0480() throws Exception { count(sAvcMedia0720x0480, 1, 4); } 346 public void testAvcGoog0Perf0720x0480() throws Exception { perf(sAvcMedia0720x0480, GOOG, 0); } 347 public void testAvcOther0Perf0720x0480() throws Exception { perf(sAvcMedia0720x0480, OTHER, 0); } 348 public void testAvcOther1Perf0720x0480() throws Exception { perf(sAvcMedia0720x0480, OTHER, 1); } 349 public void testAvcOther2Perf0720x0480() throws Exception { perf(sAvcMedia0720x0480, OTHER, 2); } 350 public void testAvcOther3Perf0720x0480() throws Exception { perf(sAvcMedia0720x0480, OTHER, 3); } 351 352 // prefer highest effective bitrate, then high profile 353 private static final int[] sAvcMedia1280x0720 = { 354 R.raw.bbb_s4_1280x720_mp4_h264_mp31_8mbps_30fps_aac_he_mono_40kbps_44100hz, 355 R.raw.bbb_s3_1280x720_mp4_h264_hp32_8mbps_60fps_aac_he_v2_stereo_48kbps_48000hz, 356 R.raw.bbb_s3_1280x720_mp4_h264_mp32_8mbps_60fps_aac_he_v2_6ch_144kbps_44100hz, 357 }; 358 359 public void testAvcCount1280x0720() throws Exception { count(sAvcMedia1280x0720, 1, 4); } 360 public void testAvcGoog0Perf1280x0720() throws Exception { perf(sAvcMedia1280x0720, GOOG, 0); } 361 public void testAvcOther0Perf1280x0720() throws Exception { perf(sAvcMedia1280x0720, OTHER, 0); } 362 public void testAvcOther1Perf1280x0720() throws Exception { perf(sAvcMedia1280x0720, OTHER, 1); } 363 public void testAvcOther2Perf1280x0720() throws Exception { perf(sAvcMedia1280x0720, OTHER, 2); } 364 public void testAvcOther3Perf1280x0720() throws Exception { perf(sAvcMedia1280x0720, OTHER, 3); } 365 366 // prefer highest effective bitrate, then high profile 367 private static final int[] sAvcMedia1920x1080 = { 368 R.raw.bbb_s4_1920x1080_wide_mp4_h264_hp4_20mbps_30fps_aac_lc_6ch_384kbps_44100hz, 369 R.raw.bbb_s4_1920x1080_wide_mp4_h264_mp4_20mbps_30fps_aac_he_5ch_200kbps_44100hz, 370 R.raw.bbb_s2_1920x1080_mp4_h264_hp42_20mbps_60fps_aac_lc_6ch_384kbps_48000hz, 371 R.raw.bbb_s2_1920x1080_mp4_h264_mp42_20mbps_60fps_aac_he_v2_5ch_160kbps_48000hz, 372 }; 373 374 public void testAvcCount1920x1080() throws Exception { count(sAvcMedia1920x1080, 1, 4); } 375 public void testAvcGoog0Perf1920x1080() throws Exception { perf(sAvcMedia1920x1080, GOOG, 0); } 376 public void testAvcOther0Perf1920x1080() throws Exception { perf(sAvcMedia1920x1080, OTHER, 0); } 377 public void testAvcOther1Perf1920x1080() throws Exception { perf(sAvcMedia1920x1080, OTHER, 1); } 378 public void testAvcOther2Perf1920x1080() throws Exception { perf(sAvcMedia1920x1080, OTHER, 2); } 379 public void testAvcOther3Perf1920x1080() throws Exception { perf(sAvcMedia1920x1080, OTHER, 3); } 380 381 // H263 tests 382 383 private static final int[] sH263Media0176x0144 = { 384 R.raw.video_176x144_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz, 385 }; 386 387 public void testH263Count0176x0144() throws Exception { count(sH263Media0176x0144, 1, 2); } 388 public void testH263Goog0Perf0176x0144() throws Exception { perf(sH263Media0176x0144, GOOG, 0); } 389 public void testH263Other0Perf0176x0144() throws Exception { perf(sH263Media0176x0144, OTHER, 0); } 390 public void testH263Other1Perf0176x0144() throws Exception { perf(sH263Media0176x0144, OTHER, 1); } 391 392 private static final int[] sH263Media0352x0288 = { 393 R.raw.video_352x288_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz, 394 }; 395 396 public void testH263Count0352x0288() throws Exception { count(sH263Media0352x0288, 1, 2); } 397 public void testH263Goog0Perf0352x0288() throws Exception { perf(sH263Media0352x0288, GOOG, 0); } 398 public void testH263Other0Perf0352x0288() throws Exception { perf(sH263Media0352x0288, OTHER, 0); } 399 public void testH263Other1Perf0352x0288() throws Exception { perf(sH263Media0352x0288, OTHER, 1); } 400 401 // No media for H263 704x576 402 403 // No media for H263 1408x1152 404 405 // HEVC tests 406 407 private static final int[] sHevcMedia0352x0288 = { 408 R.raw.bbb_s1_352x288_mp4_hevc_mp2_600kbps_30fps_aac_he_stereo_96kbps_48000hz, 409 }; 410 411 public void testHevcCount0352x0288() throws Exception { count(sHevcMedia0352x0288, 1, 4); } 412 public void testHevcGoog0Perf0352x0288() throws Exception { perf(sHevcMedia0352x0288, GOOG, 0); } 413 public void testHevcOther0Perf0352x0288() throws Exception { perf(sHevcMedia0352x0288, OTHER, 0); } 414 public void testHevcOther1Perf0352x0288() throws Exception { perf(sHevcMedia0352x0288, OTHER, 1); } 415 public void testHevcOther2Perf0352x0288() throws Exception { perf(sHevcMedia0352x0288, OTHER, 2); } 416 public void testHevcOther3Perf0352x0288() throws Exception { perf(sHevcMedia0352x0288, OTHER, 3); } 417 418 private static final int[] sHevcMedia0640x0360 = { 419 R.raw.bbb_s1_640x360_mp4_hevc_mp21_1600kbps_30fps_aac_he_6ch_288kbps_44100hz, 420 }; 421 422 public void testHevcCount0640x0360() throws Exception { count(sHevcMedia0640x0360, 1, 4); } 423 public void testHevcGoog0Perf0640x0360() throws Exception { perf(sHevcMedia0640x0360, GOOG, 0); } 424 public void testHevcOther0Perf0640x0360() throws Exception { perf(sHevcMedia0640x0360, OTHER, 0); } 425 public void testHevcOther1Perf0640x0360() throws Exception { perf(sHevcMedia0640x0360, OTHER, 1); } 426 public void testHevcOther2Perf0640x0360() throws Exception { perf(sHevcMedia0640x0360, OTHER, 2); } 427 public void testHevcOther3Perf0640x0360() throws Exception { perf(sHevcMedia0640x0360, OTHER, 3); } 428 429 private static final int[] sHevcMedia0720x0480 = { 430 R.raw.bbb_s1_720x480_mp4_hevc_mp3_1600kbps_30fps_aac_he_6ch_240kbps_48000hz, 431 }; 432 433 public void testHevcCount0720x0480() throws Exception { count(sHevcMedia0720x0480, 1, 4); } 434 public void testHevcGoog0Perf0720x0480() throws Exception { perf(sHevcMedia0720x0480, GOOG, 0); } 435 public void testHevcOther0Perf0720x0480() throws Exception { perf(sHevcMedia0720x0480, OTHER, 0); } 436 public void testHevcOther1Perf0720x0480() throws Exception { perf(sHevcMedia0720x0480, OTHER, 1); } 437 public void testHevcOther2Perf0720x0480() throws Exception { perf(sHevcMedia0720x0480, OTHER, 2); } 438 public void testHevcOther3Perf0720x0480() throws Exception { perf(sHevcMedia0720x0480, OTHER, 3); } 439 440 private static final int[] sHevcMedia1280x0720 = { 441 R.raw.bbb_s4_1280x720_mp4_hevc_mp31_4mbps_30fps_aac_he_stereo_80kbps_32000hz, 442 }; 443 444 public void testHevcCount1280x0720() throws Exception { count(sHevcMedia1280x0720, 1, 4); } 445 public void testHevcGoog0Perf1280x0720() throws Exception { perf(sHevcMedia1280x0720, GOOG, 0); } 446 public void testHevcOther0Perf1280x0720() throws Exception { perf(sHevcMedia1280x0720, OTHER, 0); } 447 public void testHevcOther1Perf1280x0720() throws Exception { perf(sHevcMedia1280x0720, OTHER, 1); } 448 public void testHevcOther2Perf1280x0720() throws Exception { perf(sHevcMedia1280x0720, OTHER, 2); } 449 public void testHevcOther3Perf1280x0720() throws Exception { perf(sHevcMedia1280x0720, OTHER, 3); } 450 451 private static final int[] sHevcMedia1920x1080 = { 452 R.raw.bbb_s2_1920x1080_mp4_hevc_mp41_10mbps_60fps_aac_lc_6ch_384kbps_22050hz, 453 }; 454 455 public void testHevcCount1920x1080() throws Exception { count(sHevcMedia1920x1080, 1, 4); } 456 public void testHevcGoog0Perf1920x1080() throws Exception { perf(sHevcMedia1920x1080, GOOG, 0); } 457 public void testHevcOther0Perf1920x1080() throws Exception { perf(sHevcMedia1920x1080, OTHER, 0); } 458 public void testHevcOther1Perf1920x1080() throws Exception { perf(sHevcMedia1920x1080, OTHER, 1); } 459 public void testHevcOther2Perf1920x1080() throws Exception { perf(sHevcMedia1920x1080, OTHER, 2); } 460 public void testHevcOther3Perf1920x1080() throws Exception { perf(sHevcMedia1920x1080, OTHER, 3); } 461 462 // prefer highest effective bitrate 463 private static final int[] sHevcMedia3840x2160 = { 464 R.raw.bbb_s4_3840x2160_mp4_hevc_mp5_20mbps_30fps_aac_lc_6ch_384kbps_24000hz, 465 R.raw.bbb_s2_3840x2160_mp4_hevc_mp51_20mbps_60fps_aac_lc_6ch_384kbps_32000hz, 466 }; 467 468 public void testHevcCount3840x2160() throws Exception { count(sHevcMedia3840x2160, 1, 4); } 469 public void testHevcGoog0Perf3840x2160() throws Exception { perf(sHevcMedia3840x2160, GOOG, 0); } 470 public void testHevcOther0Perf3840x2160() throws Exception { perf(sHevcMedia3840x2160, OTHER, 0); } 471 public void testHevcOther1Perf3840x2160() throws Exception { perf(sHevcMedia3840x2160, OTHER, 1); } 472 public void testHevcOther2Perf3840x2160() throws Exception { perf(sHevcMedia3840x2160, OTHER, 2); } 473 public void testHevcOther3Perf3840x2160() throws Exception { perf(sHevcMedia3840x2160, OTHER, 3); } 474 475 // MPEG2 tests 476 477 // No media for MPEG2 176x144 478 479 // No media for MPEG2 352x288 480 481 // No media for MPEG2 640x480 482 483 // No media for MPEG2 1280x720 484 485 // No media for MPEG2 1920x1080 486 487 // MPEG4 tests 488 489 private static final int[] sMpeg4Media0176x0144 = { 490 R.raw.video_176x144_mp4_mpeg4_300kbps_25fps_aac_stereo_128kbps_44100hz, 491 }; 492 493 public void testMpeg4Count0176x0144() throws Exception { count(sMpeg4Media0176x0144, 1, 4); } 494 public void testMpeg4Goog0Perf0176x0144() throws Exception { perf(sMpeg4Media0176x0144, GOOG, 0); } 495 public void testMpeg4Other0Perf0176x0144() throws Exception { perf(sMpeg4Media0176x0144, OTHER, 0); } 496 public void testMpeg4Other1Perf0176x0144() throws Exception { perf(sMpeg4Media0176x0144, OTHER, 1); } 497 public void testMpeg4Other2Perf0176x0144() throws Exception { perf(sMpeg4Media0176x0144, OTHER, 2); } 498 public void testMpeg4Other3Perf0176x0144() throws Exception { perf(sMpeg4Media0176x0144, OTHER, 3); } 499 500 private static final int[] sMpeg4Media0480x0360 = { 501 R.raw.video_480x360_mp4_mpeg4_860kbps_25fps_aac_stereo_128kbps_44100hz, 502 }; 503 504 public void testMpeg4Count0480x0360() throws Exception { count(sMpeg4Media0480x0360, 1, 4); } 505 public void testMpeg4Goog0Perf0480x0360() throws Exception { perf(sMpeg4Media0480x0360, GOOG, 0); } 506 public void testMpeg4Other0Perf0480x0360() throws Exception { perf(sMpeg4Media0480x0360, OTHER, 0); } 507 public void testMpeg4Other1Perf0480x0360() throws Exception { perf(sMpeg4Media0480x0360, OTHER, 1); } 508 public void testMpeg4Other2Perf0480x0360() throws Exception { perf(sMpeg4Media0480x0360, OTHER, 2); } 509 public void testMpeg4Other3Perf0480x0360() throws Exception { perf(sMpeg4Media0480x0360, OTHER, 3); } 510 511 // No media for MPEG4 640x480 512 513 private static final int[] sMpeg4Media1280x0720 = { 514 R.raw.video_1280x720_mp4_mpeg4_1000kbps_25fps_aac_stereo_128kbps_44100hz, 515 }; 516 517 public void testMpeg4Count1280x0720() throws Exception { count(sMpeg4Media1280x0720, 1, 4); } 518 public void testMpeg4Goog0Perf1280x0720() throws Exception { perf(sMpeg4Media1280x0720, GOOG, 0); } 519 public void testMpeg4Other0Perf1280x0720() throws Exception { perf(sMpeg4Media1280x0720, OTHER, 0); } 520 public void testMpeg4Other1Perf1280x0720() throws Exception { perf(sMpeg4Media1280x0720, OTHER, 1); } 521 public void testMpeg4Other2Perf1280x0720() throws Exception { perf(sMpeg4Media1280x0720, OTHER, 2); } 522 public void testMpeg4Other3Perf1280x0720() throws Exception { perf(sMpeg4Media1280x0720, OTHER, 3); } 523 524 // VP8 tests 525 526 private static final int[] sVp8Media0320x0180 = { 527 R.raw.bbb_s1_320x180_webm_vp8_800kbps_30fps_opus_5ch_320kbps_48000hz, 528 }; 529 530 public void testVp8Count0320x0180() throws Exception { count(sVp8Media0320x0180, 1, 2); } 531 public void testVp8Goog0Perf0320x0180() throws Exception { perf(sVp8Media0320x0180, GOOG, 0); } 532 public void testVp8Other0Perf0320x0180() throws Exception { perf(sVp8Media0320x0180, OTHER, 0); } 533 public void testVp8Other1Perf0320x0180() throws Exception { perf(sVp8Media0320x0180, OTHER, 1); } 534 535 private static final int[] sVp8Media0640x0360 = { 536 R.raw.bbb_s1_640x360_webm_vp8_2mbps_30fps_vorbis_5ch_320kbps_48000hz, 537 }; 538 539 public void testVp8Count0640x0360() throws Exception { count(sVp8Media0640x0360, 1, 2); } 540 public void testVp8Goog0Perf0640x0360() throws Exception { perf(sVp8Media0640x0360, GOOG, 0); } 541 public void testVp8Other0Perf0640x0360() throws Exception { perf(sVp8Media0640x0360, OTHER, 0); } 542 public void testVp8Other1Perf0640x0360() throws Exception { perf(sVp8Media0640x0360, OTHER, 1); } 543 544 // prefer highest effective bitrate 545 private static final int[] sVp8Media1280x0720 = { 546 R.raw.bbb_s4_1280x720_webm_vp8_8mbps_30fps_opus_mono_64kbps_48000hz, 547 R.raw.bbb_s3_1280x720_webm_vp8_8mbps_60fps_opus_6ch_384kbps_48000hz, 548 }; 549 550 public void testVp8Count1280x0720() throws Exception { count(sVp8Media1280x0720, 1, 2); } 551 public void testVp8Goog0Perf1280x0720() throws Exception { perf(sVp8Media1280x0720, GOOG, 0); } 552 public void testVp8Other0Perf1280x0720() throws Exception { perf(sVp8Media1280x0720, OTHER, 0); } 553 public void testVp8Other1Perf1280x0720() throws Exception { perf(sVp8Media1280x0720, OTHER, 1); } 554 555 // prefer highest effective bitrate 556 private static final int[] sVp8Media1920x1080 = { 557 R.raw.bbb_s4_1920x1080_wide_webm_vp8_20mbps_30fps_vorbis_6ch_384kbps_44100hz, 558 R.raw.bbb_s2_1920x1080_webm_vp8_20mbps_60fps_vorbis_6ch_384kbps_48000hz, 559 }; 560 561 public void testVp8Count1920x1080() throws Exception { count(sVp8Media1920x1080, 1, 2); } 562 public void testVp8Goog0Perf1920x1080() throws Exception { perf(sVp8Media1920x1080, GOOG, 0); } 563 public void testVp8Other0Perf1920x1080() throws Exception { perf(sVp8Media1920x1080, OTHER, 0); } 564 public void testVp8Other1Perf1920x1080() throws Exception { perf(sVp8Media1920x1080, OTHER, 1); } 565 566 // VP9 tests 567 568 private static final int[] sVp9Media0320x0180 = { 569 R.raw.bbb_s1_320x180_webm_vp9_0p11_600kbps_30fps_vorbis_mono_64kbps_48000hz, 570 }; 571 572 public void testVp9Count0320x0180() throws Exception { count(sVp9Media0320x0180, 1, 4); } 573 public void testVp9Goog0Perf0320x0180() throws Exception { perf(sVp9Media0320x0180, GOOG, 0); } 574 public void testVp9Other0Perf0320x0180() throws Exception { perf(sVp9Media0320x0180, OTHER, 0); } 575 public void testVp9Other1Perf0320x0180() throws Exception { perf(sVp9Media0320x0180, OTHER, 1); } 576 public void testVp9Other2Perf0320x0180() throws Exception { perf(sVp9Media0320x0180, OTHER, 2); } 577 public void testVp9Other3Perf0320x0180() throws Exception { perf(sVp9Media0320x0180, OTHER, 3); } 578 579 private static final int[] sVp9Media0640x0360 = { 580 R.raw.bbb_s1_640x360_webm_vp9_0p21_1600kbps_30fps_vorbis_stereo_128kbps_48000hz, 581 }; 582 583 public void testVp9Count0640x0360() throws Exception { count(sVp9Media0640x0360, 1, 4); } 584 public void testVp9Goog0Perf0640x0360() throws Exception { perf(sVp9Media0640x0360, GOOG, 0); } 585 public void testVp9Other0Perf0640x0360() throws Exception { perf(sVp9Media0640x0360, OTHER, 0); } 586 public void testVp9Other1Perf0640x0360() throws Exception { perf(sVp9Media0640x0360, OTHER, 1); } 587 public void testVp9Other2Perf0640x0360() throws Exception { perf(sVp9Media0640x0360, OTHER, 2); } 588 public void testVp9Other3Perf0640x0360() throws Exception { perf(sVp9Media0640x0360, OTHER, 3); } 589 590 private static final int[] sVp9Media1280x0720 = { 591 R.raw.bbb_s4_1280x720_webm_vp9_0p31_4mbps_30fps_opus_stereo_128kbps_48000hz, 592 }; 593 594 public void testVp9Count1280x0720() throws Exception { count(sVp9Media1280x0720, 1, 4); } 595 public void testVp9Goog0Perf1280x0720() throws Exception { perf(sVp9Media1280x0720, GOOG, 0); } 596 public void testVp9Other0Perf1280x0720() throws Exception { perf(sVp9Media1280x0720, OTHER, 0); } 597 public void testVp9Other1Perf1280x0720() throws Exception { perf(sVp9Media1280x0720, OTHER, 1); } 598 public void testVp9Other2Perf1280x0720() throws Exception { perf(sVp9Media1280x0720, OTHER, 2); } 599 public void testVp9Other3Perf1280x0720() throws Exception { perf(sVp9Media1280x0720, OTHER, 3); } 600 601 private static final int[] sVp9Media1920x1080 = { 602 R.raw.bbb_s2_1920x1080_webm_vp9_0p41_10mbps_60fps_vorbis_6ch_384kbps_22050hz, 603 }; 604 605 public void testVp9Count1920x1080() throws Exception { count(sVp9Media1920x1080, 1, 4); } 606 public void testVp9Goog0Perf1920x1080() throws Exception { perf(sVp9Media1920x1080, GOOG, 0); } 607 public void testVp9Other0Perf1920x1080() throws Exception { perf(sVp9Media1920x1080, OTHER, 0); } 608 public void testVp9Other1Perf1920x1080() throws Exception { perf(sVp9Media1920x1080, OTHER, 1); } 609 public void testVp9Other2Perf1920x1080() throws Exception { perf(sVp9Media1920x1080, OTHER, 2); } 610 public void testVp9Other3Perf1920x1080() throws Exception { perf(sVp9Media1920x1080, OTHER, 3); } 611 612 // prefer highest effective bitrate 613 private static final int[] sVp9Media3840x2160 = { 614 R.raw.bbb_s4_3840x2160_webm_vp9_0p5_20mbps_30fps_vorbis_6ch_384kbps_24000hz, 615 R.raw.bbb_s2_3840x2160_webm_vp9_0p51_20mbps_60fps_vorbis_6ch_384kbps_32000hz, 616 }; 617 618 public void testVp9Count3840x2160() throws Exception { count(sVp9Media3840x2160, 1, 4); } 619 public void testVp9Goog0Perf3840x2160() throws Exception { perf(sVp9Media3840x2160, GOOG, 0); } 620 public void testVp9Other0Perf3840x2160() throws Exception { perf(sVp9Media3840x2160, OTHER, 0); } 621 public void testVp9Other1Perf3840x2160() throws Exception { perf(sVp9Media3840x2160, OTHER, 1); } 622 public void testVp9Other2Perf3840x2160() throws Exception { perf(sVp9Media3840x2160, OTHER, 2); } 623 public void testVp9Other3Perf3840x2160() throws Exception { perf(sVp9Media3840x2160, OTHER, 3); } 624 } 625 626