Merge "Hook up events and new exceptions in the MediaDrm API test" into jb-mr2-dev

This commit is contained in:
Jeff Tinker
2013-05-01 22:02:10 +00:00
committed by Android (Google) Code Review
3 changed files with 196 additions and 78 deletions

View File

@@ -1,6 +1,8 @@
package com.widevine.test;
import android.media.MediaDrm;
import android.media.NotProvisionedException;
import android.media.DeniedByServerException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ClientProtocolException;
@@ -26,27 +28,69 @@ public class KeyRequester {
}
public void doTransact(MediaDrm drm, byte[] sessionId) {
MediaDrm.KeyRequest drmRequest;
drmRequest = drm.getKeyRequest(sessionId, mPssh, "video/avc",
MediaDrm.KEY_TYPE_STREAMING, null);
PostRequestTask postTask = new PostRequestTask(drmRequest.getData());
postTask.execute(mServerUrl);
// wait for post task to complete
byte[] responseBody;
long startTime = System.currentTimeMillis();
boolean retryTransaction;
do {
responseBody = postTask.getResponseBody();
} while (responseBody == null && System.currentTimeMillis() - startTime < 5000);
retryTransaction = false;
if (responseBody == null) {
Log.d(TAG, "No response from license server!");
} else {
byte[] drmResponse = parseResponseBody(responseBody);
MediaDrm.KeyRequest drmRequest = null;
boolean retryRequest;
do {
retryRequest = false;
drm.provideKeyResponse(sessionId, drmResponse);
}
try {
drmRequest = drm.getKeyRequest(sessionId, mPssh, "video/avc",
MediaDrm.KEY_TYPE_STREAMING, null);
} catch (NotProvisionedException e) {
Log.i(TAG, "Invalid certificate, reprovisioning");
ProvisionRequester provisionRequester = new ProvisionRequester();
provisionRequester.doTransact(drm);
retryRequest = true;
}
} while (retryRequest);
if (drmRequest == null) {
Log.e(TAG, "Failed to get key request");
return;
}
PostRequestTask postTask = new PostRequestTask(drmRequest.getData());
postTask.execute(mServerUrl);
// wait for post task to complete
byte[] responseBody;
long startTime = System.currentTimeMillis();
do {
responseBody = postTask.getResponseBody();
if (responseBody == null) {
sleep(100);
} else {
break;
}
} while (System.currentTimeMillis() - startTime < 5000);
if (responseBody == null) {
Log.e(TAG, "No response from license server!");
} else {
byte[] drmResponse = parseResponseBody(responseBody);
if (drmResponse == null) {
Log.e(TAG, "No response body in response");
} else {
try {
drm.provideKeyResponse(sessionId, drmResponse);
} catch (NotProvisionedException e) {
Log.i(TAG, "Key response invalidated the certificate, reprovisioning");
ProvisionRequester provisionRequester = new ProvisionRequester();
provisionRequester.doTransact(drm);
retryTransaction = true;
} catch (DeniedByServerException e) {
// informational, the event handler will take care of provisioning
Log.e(TAG, "Server rejected the key request");
}
}
}
} while (retryTransaction);
}
private class PostRequestTask extends AsyncTask<String, Void, Void> {
@@ -133,5 +177,12 @@ public class KeyRequester {
return Arrays.copyOfRange(responseBody, drmMessageOffset + 4, responseBody.length);
}
private void sleep(int msec) {
try {
Thread.sleep(msec);
} catch (InterruptedException e) {
}
}
}

View File

@@ -6,8 +6,10 @@ package com.widevine.test;
import android.app.TabActivity;
import android.os.Bundle;
import android.os.Looper;
import android.media.MediaDrm;
import android.media.MediaDrmException;
import android.media.NotProvisionedException;
import android.media.MediaCrypto;
import android.media.MediaCodec;
import android.media.MediaCryptoException;
@@ -53,7 +55,6 @@ public class MediaDrmAPITest extends TabActivity {
mTestFailed = false;
testWidevineSchemeSupported();
testProvisioning();
testProperties();
testQueryKeyStatus();
testClearContentNoKeys();
@@ -66,6 +67,93 @@ public class MediaDrmAPITest extends TabActivity {
}
}
private MediaDrm mDrm;
private Looper mLooper;
private Object mLock = new Object();
private MediaDrm startDrm() {
new Thread() {
@Override
public void run() {
// Set up a looper to handle events
Looper.prepare();
// Save the looper so that we can terminate this thread
// after we are done with it.
mLooper = Looper.myLooper();
try {
mDrm = new MediaDrm(kWidevineScheme);
} catch (MediaDrmException e) {
Log.e(TAG, "Failed to create MediaDrm: " + e.getMessage());
e.printStackTrace();
return;
}
synchronized(mLock) {
mDrm.setOnEventListener(new MediaDrm.OnEventListener() {
@Override
public void onEvent(MediaDrm md, byte[] sessionId, int event,
int extra, byte[] data) {
if (event == MediaDrm.EVENT_PROVISION_REQUIRED) {
Log.i(TAG, "Provisioning is required");
} else if (event == MediaDrm.EVENT_KEY_REQUIRED) {
Log.i(TAG, "MediaDrm event: Key required");
} else if (event == MediaDrm.EVENT_KEY_EXPIRED) {
Log.i(TAG, "MediaDrm event: Key expired");
} else if (event == MediaDrm.EVENT_VENDOR_DEFINED) {
Log.i(TAG, "MediaDrm event: Vendor defined: " + event);
}
}
});
mLock.notify();
}
Looper.loop(); // Blocks forever until Looper.quit() is called.
}
}.start();
// wait for mDrm to be created
synchronized(mLock) {
try {
mLock.wait(1000);
} catch (Exception e) {
}
}
if (mDrm == null) {
Log.e(TAG, "Failed to create drm");
}
return mDrm;
}
private void stopDrm(MediaDrm drm) {
if (drm != mDrm) {
Log.e(TAG, "invalid drm specified in stopDrm");
}
mLooper.quit();
}
private byte[] openSession(MediaDrm drm) {
byte[] sessionId = null;
boolean retryOpen;
do {
try {
retryOpen = false;
sessionId = drm.openSession();
} catch (NotProvisionedException e) {
Log.i(TAG, "Missing certificate, provisioning");
ProvisionRequester provisionRequester = new ProvisionRequester();
provisionRequester.doTransact(drm);
retryOpen = true;
}
} while (retryOpen);
return sessionId;
}
private void testWidevineSchemeSupported() {
if (!MediaDrm.isCryptoSchemeSupported(kWidevineScheme)) {
Log.e(TAG, "testWidevineSchemeSupported failed");
@@ -74,15 +162,7 @@ public class MediaDrmAPITest extends TabActivity {
}
private void testProperties() {
MediaDrm drm = null;
try {
drm = new MediaDrm(kWidevineScheme);
} catch (MediaDrmException e) {
Log.e(TAG, "test failed due to exception: " + e.getMessage());
e.printStackTrace();
finish();
}
MediaDrm drm = startDrm();
Log.i(TAG, "vendor: " + drm.getPropertyString(MediaDrm.PROPERTY_VENDOR));
Log.i(TAG, "version: " + drm.getPropertyString(MediaDrm.PROPERTY_VERSION));
Log.i(TAG, "description: " + drm.getPropertyString(MediaDrm.PROPERTY_DESCRIPTION));
@@ -92,35 +172,13 @@ public class MediaDrmAPITest extends TabActivity {
// widevine-specific properties
Log.i(TAG, "security level: " + drm.getPropertyString("securityLevel"));
Log.i(TAG, "system ID: " + drm.getPropertyString("systemId"));
}
private void testProvisioning() {
MediaDrm drm = null;
try {
drm = new MediaDrm(kWidevineScheme);
} catch (MediaDrmException e) {
Log.e(TAG, "test failed due to exception: " + e.getMessage());
e.printStackTrace();
finish();
}
ProvisionRequester provisionRequester = new ProvisionRequester();
provisionRequester.doTransact(drm);
stopDrm(drm);
}
private void testQueryKeyStatus() {
MediaDrm drm = null;
try {
drm = new MediaDrm(kWidevineScheme);
} catch (MediaDrmException e) {
Log.e(TAG, "test failed due to exception: " + e.getMessage());
e.printStackTrace();
finish();
}
byte[] sessionId = drm.openSession();
KeyRequester keyRequester = new KeyRequester(kPssh, kKeyServerUrl + ":" + kPort + kClientAuth);
keyRequester.doTransact(drm, sessionId);
MediaDrm drm = startDrm();
byte[] sessionId = openSession(drm);
getKeys(drm, sessionId);
Log.i(TAG, "Query Key Status:");
HashMap<String, String> keyStatus = drm.queryKeyStatus(sessionId);
@@ -131,37 +189,29 @@ public class MediaDrmAPITest extends TabActivity {
}
drm.closeSession(sessionId);
stopDrm(drm);
}
private void getKeys(MediaDrm drm, byte[] sessionId) {
KeyRequester keyRequester = new KeyRequester(kPssh, kKeyServerUrl + ":" + kPort + kClientAuth);
keyRequester.doTransact(drm, sessionId);
}
private void testEncryptedContent() {
MediaDrm drm = null;
try {
drm = new MediaDrm(kWidevineScheme);
} catch (MediaDrmException e) {
Log.e(TAG, "test failed due to exception: " + e.getMessage());
e.printStackTrace();
finish();
}
byte[] sessionId = drm.openSession();
KeyRequester keyRequester = new KeyRequester(kPssh, kKeyServerUrl + ":" + kPort + kClientAuth);
keyRequester.doTransact(drm, sessionId);
MediaDrm drm = startDrm();
byte[] sessionId = openSession(drm);
getKeys(drm, sessionId);
testDecrypt(sessionId);
drm.closeSession(sessionId);
stopDrm(drm);
}
private void testClearContentNoKeys() {
MediaDrm drm = null;
try {
drm = new MediaDrm(kWidevineScheme);
} catch (MediaDrmException e) {
Log.e(TAG, "test failed due to exception: " + e.getMessage());
e.printStackTrace();
finish();
}
byte[] sessionId = drm.openSession();
MediaDrm drm = startDrm();
byte[] sessionId = openSession(drm);
testClear(sessionId);
drm.closeSession(sessionId);
stopDrm(drm);
}
private byte[] getTestModeSessionId(byte[] sessionId) {
@@ -178,7 +228,7 @@ public class MediaDrmAPITest extends TabActivity {
private void sleep(int msec) {
try {
Thread.sleep(10);
Thread.sleep(msec);
} catch (InterruptedException e) {
}
}

View File

@@ -1,6 +1,7 @@
package com.widevine.test;
import android.media.MediaDrm;
import android.media.DeniedByServerException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ClientProtocolException;
@@ -33,12 +34,21 @@ public class ProvisionRequester {
long startTime = System.currentTimeMillis();
do {
responseBody = postTask.getResponseBody();
} while (responseBody == null && System.currentTimeMillis() - startTime < 5000);
if (responseBody == null) {
sleep(100);
} else {
break;
}
} while (System.currentTimeMillis() - startTime < 5000);
if (responseBody == null) {
Log.d(TAG, "No response from provisioning server!");
Log.e(TAG, "No response from provisioning server!");
} else {
drm.provideProvisionResponse(responseBody);
try {
drm.provideProvisionResponse(responseBody);
} catch (DeniedByServerException e) {
Log.e(TAG, "Server denied provisioning request");
}
}
}
@@ -95,5 +105,12 @@ public class ProvisionRequester {
return null;
}
}
private void sleep(int msec) {
try {
Thread.sleep(msec);
} catch (InterruptedException e) {
}
}
}