Basic test of MediaCodecInfo.CodecCapabilities

Verifies that the device can play a few of the video formats
reported by MediaCodecInfo.CodecCapabilities

Bug: 10071083
Change-Id: I76589fa2ebd90800907348c8dbb0bc189e45226c
(cherry picked from commit 307efe6b574fc2ba3a048150463488887f094027)
diff --git a/tests/tests/media/src/android/media/cts/MediaCodecCapabilitiesTest.java b/tests/tests/media/src/android/media/cts/MediaCodecCapabilitiesTest.java
new file mode 100644
index 0000000..4f8fb62
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/MediaCodecCapabilitiesTest.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.media.cts;
+
+import android.media.MediaCodecInfo;
+import android.media.MediaCodecInfo.CodecCapabilities;
+import android.media.MediaCodecInfo.CodecProfileLevel;
+import android.media.MediaCodecList;
+import android.media.MediaPlayer;
+
+import android.util.Log;
+
+/**
+ * Basic sanity test of data returned by MediaCodeCapabilities.
+ */
+public class MediaCodecCapabilitiesTest extends MediaPlayerTestBase {
+
+    private static final String TAG = "MediaCodecCapabilitiesTest";
+    private static final String AVC_MIME = "video/avc";
+    private static final int PLAY_TIME_MS = 30000;
+
+    public void testAvcBaseline1() throws Exception {
+        if (!supports(AVC_MIME, CodecProfileLevel.AVCProfileBaseline,
+                CodecProfileLevel.AVCLevel1)) {
+            throw new RuntimeException("AVCLevel1 support is required by CDD");
+        }
+        // We don't have a test stream, but at least we're testing
+        // that supports() returns true for something.
+    }
+
+    public void testAvcBaseline12() throws Exception {
+        if (!supports(AVC_MIME, CodecProfileLevel.AVCProfileBaseline,
+                CodecProfileLevel.AVCLevel12)) {
+            Log.i(TAG, "AvcBaseline12 not supported");
+            return;  // TODO: Can we make this mandatory?
+        }
+        playVideoWithRetries("http://redirector.c.youtube.com/videoplayback?id=271de9756065677e"
+                + "&itag=160&source=youtube&user=android-device-test"
+                + "&sparams=ip,ipbits,expire,id,itag,source,user"
+                + "&ip=0.0.0.0&ipbits=0&expire=999999999999999999"
+                + "&signature=341692D20FACCAE25B90EA2C131EA6ADCD8E2384."
+                + "9EB08C174BE401AAD20FB85EE4DBA51A2882BB60"
+                + "&key=test_key1", 256, 144, PLAY_TIME_MS);
+    }
+
+    public void testAvcBaseline30() throws Exception {
+        if (!supports(AVC_MIME, CodecProfileLevel.AVCProfileBaseline,
+                CodecProfileLevel.AVCLevel3)) {
+            Log.i(TAG, "AvcBaseline30 not supported");
+            return;
+        }
+        playVideoWithRetries("http://redirector.c.youtube.com/videoplayback?id=271de9756065677e"
+                + "&itag=18&source=youtube&user=android-device-test"
+                + "&sparams=ip,ipbits,expire,id,itag,source,user"
+                + "&ip=0.0.0.0&ipbits=0&expire=999999999999999999"
+                + "&signature=8701A45F6422229D46ABB25A22E2C00C94024606."
+                + "08BCDF16C3F744C49D4C8A8AD1C38B3DC1810918"
+                + "&key=test_key1", 640, 360, PLAY_TIME_MS);
+    }
+
+    public void testAvcHigh31() throws Exception {
+        if (!supports(AVC_MIME, CodecProfileLevel.AVCProfileHigh,
+                CodecProfileLevel.AVCLevel31)) {
+            Log.i(TAG, "AvcHigh31 not supported");
+            return;
+        }
+        playVideoWithRetries("http://redirector.c.youtube.com/videoplayback?id=271de9756065677e"
+                + "&itag=22&source=youtube&user=android-device-test"
+                + "&sparams=ip,ipbits,expire,id,itag,source,user"
+                + "&ip=0.0.0.0&ipbits=0&expire=999999999999999999"
+                + "&signature=42969CA8F7FFAE432B7135BC811F96F7C4172C3F."
+                + "1A8A92EA714C1B7C98A05DDF2DE90854CDD7638B"
+                + "&key=test_key1", 1280, 720, PLAY_TIME_MS);
+
+    }
+
+    public void testAvcHigh40() throws Exception {
+        if (!supports(AVC_MIME, CodecProfileLevel.AVCProfileHigh,
+                CodecProfileLevel.AVCLevel4)) {
+            Log.i(TAG, "AvcHigh40 not supported");
+            return;
+        }
+        playVideoWithRetries("http://redirector.c.youtube.com/videoplayback?id=271de9756065677e"
+                + "&itag=37&source=youtube&user=android-device-test"
+                + "&sparams=ip,ipbits,expire,id,itag,source,user"
+                + "&ip=0.0.0.0&ipbits=0&expire=999999999999999999"
+                + "&signature=7C3BBFB2F493E1BC396B6D31DDAF2E1367624487."
+                + "64197F3BB46039669E912297DCD68D1FB2811D9F"
+                + "&key=test_key1", 1920, 1080, PLAY_TIME_MS);
+    }
+
+    private boolean supports(String mimeType, int profile, int level) {
+        int numCodecs = MediaCodecList.getCodecCount();
+        for (int i = 0; i < numCodecs; i++) {
+            MediaCodecInfo codecInfo = MediaCodecList.getCodecInfoAt(i);
+            if (codecInfo.isEncoder()) {
+                continue;
+            }
+
+            CodecCapabilities capabilities = codecInfo.getCapabilitiesForType(mimeType);
+            for (CodecProfileLevel profileLevel : capabilities.profileLevels) {
+                if (profileLevel.profile == profile
+                        && profileLevel.level >= level) {
+                    return true;
+                }
+            }
+        }
+
+        return false;
+    }
+
+}