MediaPlayer/Modular DRM/CTS for AOSP: Using new ClearKey content with proper PSSH

Bug: 34559906
Bug: 63444201
Test: Manual
Change-Id: I005921525ed84db987e1fd7e922dbe537df7d1e8
diff --git a/tests/tests/media/src/android/media/cts/MediaPlayerDrmTest.java b/tests/tests/media/src/android/media/cts/MediaPlayerDrmTest.java
index cb0feba..8264508 100644
--- a/tests/tests/media/src/android/media/cts/MediaPlayerDrmTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaPlayerDrmTest.java
@@ -121,13 +121,11 @@
     // Assets
 
     private static final Uri CENC_AUDIO_URL = Uri.parse(
-            "http://yt-dash-mse-test.commondatastorage.googleapis.com" +
-            "/media/car_cenc-20120827-8c.mp4");
+            "http://storage.googleapis.com/wvmedia/cenc/clearkey/car_cenc-20120827-8c-pssh.mp4");
     private static final Uri CENC_AUDIO_URL_DOWNLOADED = getUriFromFile("car_cenc-20120827-8c.mp4");
 
     private static final Uri CENC_VIDEO_URL = Uri.parse(
-            "http://yt-dash-mse-test.commondatastorage.googleapis.com" +
-            "/media/car_cenc-20120827-88.mp4");
+            "http://storage.googleapis.com/wvmedia/cenc/clearkey/car_cenc-20120827-88-pssh.mp4");
     private static final Uri CENC_VIDEO_URL_DOWNLOADED = getUriFromFile("car_cenc-20120827-88.mp4");
 
 
diff --git a/tests/tests/media/src/android/media/cts/MediaPlayerDrmTestBase.java b/tests/tests/media/src/android/media/cts/MediaPlayerDrmTestBase.java
index 8eb82da..94e75eb 100644
--- a/tests/tests/media/src/android/media/cts/MediaPlayerDrmTestBase.java
+++ b/tests/tests/media/src/android/media/cts/MediaPlayerDrmTestBase.java
@@ -52,6 +52,7 @@
 import java.net.HttpURLConnection;
 import java.net.URL;
 import java.nio.charset.Charset;
+import java.nio.ByteBuffer;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -739,6 +740,32 @@
         handlerThread.quit();
     }
 
+    // Converts a BMFF PSSH initData to a raw cenc initData
+    protected byte[] makeCencPSSH(UUID uuid, byte[] bmffPsshData) {
+        byte[] pssh_header = new byte[] { (byte)'p', (byte)'s', (byte)'s', (byte)'h' };
+        byte[] pssh_version = new byte[] { 1, 0, 0, 0 };
+        int boxSizeByteCount = 4;
+        int uuidByteCount = 16;
+        int dataSizeByteCount = 4;
+        // Per "W3C cenc Initialization Data Format" document:
+        // box size + 'pssh' + version + uuid + payload + size of data
+        int boxSize = boxSizeByteCount + pssh_header.length + pssh_version.length +
+            uuidByteCount + bmffPsshData.length + dataSizeByteCount;
+        int dataSize = 0;
+
+        // the default write is big-endian, i.e., network byte order
+        ByteBuffer rawPssh = ByteBuffer.allocate(boxSize);
+        rawPssh.putInt(boxSize);
+        rawPssh.put(pssh_header);
+        rawPssh.put(pssh_version);
+        rawPssh.putLong(uuid.getMostSignificantBits());
+        rawPssh.putLong(uuid.getLeastSignificantBits());
+        rawPssh.put(bmffPsshData);
+        rawPssh.putInt(dataSize);
+
+        return rawPssh.array();
+    }
+
     /*
      * Sets up the DRM for the first DRM scheme from the supported list.
      *
@@ -773,11 +800,14 @@
                     mMediaPlayer.prepareDrm(drmScheme);
                 }
 
-                initData = drmInfo.getPssh().get(drmScheme);
+                byte[] psshData = drmInfo.getPssh().get(drmScheme);
                 // diverging from GTS
-                if (initData == null) {
+                if (psshData == null) {
                     initData = CLEARKEY_PSSH;
                     Log.d(TAG, "setupDrm: CLEARKEY scheme not found in PSSH. Using default data.");
+                } else {
+                    // Can skip conversion if ClearKey adds support for BMFF initData (b/64863112)
+                    initData = makeCencPSSH(CLEARKEY_SCHEME_UUID, psshData);
                 }
                 Log.d(TAG, "setupDrm: initData[" + drmScheme + "]: " + Arrays.toString(initData));