Index: media/base/android/java/src/org/chromium/media/MediaDrmBridge.java |
diff --git a/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java b/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java |
index ea97ca0e4452d2b9ccc9c093b061ef9fbd8cba7f..16398d2360d1f445aa658cff2be3759dd616284e 100644 |
--- a/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java |
+++ b/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java |
@@ -107,11 +107,14 @@ public class MediaDrmBridge { |
private static class PendingCreateSessionData { |
private final byte[] mInitData; |
private final String mMimeType; |
+ private final String[] mAdditionalData; |
private final long mPromiseId; |
- private PendingCreateSessionData(byte[] initData, String mimeType, long promiseId) { |
+ private PendingCreateSessionData(byte[] initData, String mimeType, String[] additionalData, |
+ long promiseId) { |
mInitData = initData; |
mMimeType = mimeType; |
+ mAdditionalData = additionalData; |
mPromiseId = promiseId; |
} |
@@ -123,6 +126,10 @@ public class MediaDrmBridge { |
return mMimeType; |
} |
+ private String[] additionalData() { |
+ return mAdditionalData; |
+ } |
+ |
private long promiseId() { |
return mPromiseId; |
} |
@@ -390,16 +397,20 @@ public class MediaDrmBridge { |
* @param sessionId ID of session on which we need to get the key request. |
* @param data Data needed to get the key request. |
* @param mime Mime type to get the key request. |
+ * @param optionalParameters Optional parameters to pass to the DRM plugin. |
* |
* @return the key request. |
*/ |
- private MediaDrm.KeyRequest getKeyRequest(byte[] sessionId, byte[] data, String mime) |
+ private MediaDrm.KeyRequest getKeyRequest(byte[] sessionId, byte[] data, String mime, |
+ HashMap<String, String> optionalParameters) |
throws android.media.NotProvisionedException { |
assert mMediaDrm != null; |
assert mMediaCrypto != null; |
assert !mProvisioningPending; |
- HashMap<String, String> optionalParameters = new HashMap<String, String>(); |
+ if (optionalParameters == null) { |
+ optionalParameters = new HashMap<String, String>(); |
+ } |
MediaDrm.KeyRequest request = mMediaDrm.getKeyRequest( |
sessionId, data, mime, MediaDrm.KEY_TYPE_STREAMING, optionalParameters); |
String result = (request != null) ? "successed" : "failed"; |
@@ -413,12 +424,14 @@ public class MediaDrmBridge { |
* |
* @param initData Data needed to generate the key request. |
* @param mime Mime type. |
+ * @param additionalData Additional data, as even-length array of (key, value) pairs. |
* @param promiseId Promise ID for the createSession() call. |
*/ |
- private void savePendingCreateSessionData(byte[] initData, String mime, long promiseId) { |
+ private void savePendingCreateSessionData(byte[] initData, String mime, String[] additionalData, |
+ long promiseId) { |
Log.d(TAG, "savePendingCreateSessionData()"); |
mPendingCreateSessionDataQueue.offer( |
- new PendingCreateSessionData(initData, mime, promiseId)); |
+ new PendingCreateSessionData(initData, mime, additionalData, promiseId)); |
} |
/** |
@@ -436,8 +449,9 @@ public class MediaDrmBridge { |
PendingCreateSessionData pendingData = mPendingCreateSessionDataQueue.poll(); |
byte[] initData = pendingData.initData(); |
String mime = pendingData.mimeType(); |
+ String[] additionalData = pendingData.additionalData(); |
long promiseId = pendingData.promiseId(); |
- createSession(initData, mime, promiseId); |
+ createSession(initData, mime, additionalData, promiseId); |
} |
} |
@@ -458,10 +472,12 @@ public class MediaDrmBridge { |
* |
* @param initData Data needed to generate the key request. |
* @param mime Mime type. |
+ * @param additionalData Additional data, as even-length array of (key, value) pairs. |
* @param promiseId Promise ID for this call. |
*/ |
@CalledByNative |
- private void createSession(byte[] initData, String mime, long promiseId) { |
+ private void createSession(byte[] initData, String mime, String[] additionalData, |
+ long promiseId) { |
Log.d(TAG, "createSession()"); |
if (mMediaDrm == null) { |
Log.e(TAG, "createSession() called when MediaDrm is null."); |
@@ -470,7 +486,7 @@ public class MediaDrmBridge { |
if (mProvisioningPending) { |
assert mMediaCrypto == null; |
- savePendingCreateSessionData(initData, mime, promiseId); |
+ savePendingCreateSessionData(initData, mime, additionalData, promiseId); |
return; |
} |
@@ -493,8 +509,19 @@ public class MediaDrmBridge { |
newSessionOpened = true; |
assert !sessionExists(sessionId); |
+ HashMap<String, String> optionalData = new HashMap<String, String>(); |
+ if (additionalData != null) { |
+ if (additionalData.length % 2 != 0) { |
+ throw new IllegalArgumentException( |
+ "Additional data array doesn't have equal keys/values"); |
+ } |
+ for (int i = 0; i < additionalData.length; i += 2) { |
+ optionalData.put(additionalData[i], additionalData[i + 1]); |
xhwang
2015/03/23 04:59:47
hmm, can we just store addtionalData as HashMap<St
gunsch
2015/04/09 01:36:39
Mostly so: the hard part is the native->Java bound
|
+ } |
+ } |
+ |
MediaDrm.KeyRequest request = null; |
- request = getKeyRequest(sessionId, initData, mime); |
+ request = getKeyRequest(sessionId, initData, mime, optionalData); |
if (request == null) { |
mMediaDrm.closeSession(sessionId); |
onPromiseRejected(promiseId, "Generate request failed."); |
@@ -511,7 +538,7 @@ public class MediaDrmBridge { |
if (newSessionOpened) { |
mMediaDrm.closeSession(sessionId); |
} |
- savePendingCreateSessionData(initData, mime, promiseId); |
+ savePendingCreateSessionData(initData, mime, additionalData, promiseId); |
startProvisioning(); |
} |
} |
@@ -771,7 +798,7 @@ public class MediaDrmBridge { |
String mime = mSessionIds.get(ByteBuffer.wrap(sessionId)); |
MediaDrm.KeyRequest request = null; |
try { |
- request = getKeyRequest(sessionId, data, mime); |
+ request = getKeyRequest(sessionId, data, mime, null); |
} catch (android.media.NotProvisionedException e) { |
Log.e(TAG, "Device not provisioned", e); |
startProvisioning(); |