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