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));