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 2c5adf3846b12b306d3216d897de187735c537b9..7489797b7aea885892cf99fc9af6711cc2166465 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 HashMap<String, String> mOptionalParameters; |
private final long mPromiseId; |
- private PendingCreateSessionData(byte[] initData, String mimeType, long promiseId) { |
+ private PendingCreateSessionData(byte[] initData, String mimeType, |
+ HashMap<String, String> optionalParameters, long promiseId) { |
mInitData = initData; |
mMimeType = mimeType; |
+ mOptionalParameters = optionalParameters; |
mPromiseId = promiseId; |
} |
@@ -123,6 +126,10 @@ public class MediaDrmBridge { |
return mMimeType; |
} |
+ private HashMap<String, String> optionalParameters() { |
+ return mOptionalParameters; |
+ } |
+ |
private long promiseId() { |
return mPromiseId; |
} |
@@ -405,16 +412,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"; |
@@ -428,12 +439,14 @@ public class MediaDrmBridge { |
* |
* @param initData Data needed to generate the key request. |
* @param mime Mime type. |
+ * @param optionalParameters Optional parameters to pass to the DRM plugin. |
* @param promiseId Promise ID for the createSession() call. |
*/ |
- private void savePendingCreateSessionData(byte[] initData, String mime, long promiseId) { |
+ private void savePendingCreateSessionData(byte[] initData, String mime, |
+ HashMap<String, String> optionalParameters, long promiseId) { |
Log.d(TAG, "savePendingCreateSessionData()"); |
mPendingCreateSessionDataQueue.offer( |
- new PendingCreateSessionData(initData, mime, promiseId)); |
+ new PendingCreateSessionData(initData, mime, optionalParameters, promiseId)); |
} |
/** |
@@ -451,8 +464,9 @@ public class MediaDrmBridge { |
PendingCreateSessionData pendingData = mPendingCreateSessionDataQueue.poll(); |
byte[] initData = pendingData.initData(); |
String mime = pendingData.mimeType(); |
+ HashMap<String, String> optionalParameters = pendingData.optionalParameters(); |
long promiseId = pendingData.promiseId(); |
- createSession(initData, mime, promiseId); |
+ createSession(initData, mime, optionalParameters, promiseId); |
} |
} |
@@ -469,14 +483,35 @@ public class MediaDrmBridge { |
} |
/** |
+ * createSession interface to be called from native using primitive types. |
+ * @see createSession(byte[], String, HashMap<String, String>, long) |
+ */ |
+ @CalledByNative |
+ private void createSession(byte[] initData, String mime, String[] optionalParamsArray, |
+ long promiseId) { |
+ HashMap<String, String> optionalParameters = new HashMap<String, String>(); |
+ if (optionalParamsArray != null) { |
+ if (optionalParamsArray.length % 2 != 0) { |
+ throw new IllegalArgumentException( |
+ "Additional data array doesn't have equal keys/values"); |
+ } |
+ for (int i = 0; i < optionalParamsArray.length; i += 2) { |
+ optionalParameters.put(optionalParamsArray[i], optionalParamsArray[i + 1]); |
+ } |
+ } |
+ createSession(initData, mime, optionalParameters, promiseId); |
+ } |
+ |
+ /** |
* Create a session, and generate a request with |initData| and |mime|. |
* |
* @param initData Data needed to generate the key request. |
* @param mime Mime type. |
+ * @param optionalParameters Additional data to pass to getKeyRequest. |
* @param promiseId Promise ID for this call. |
*/ |
- @CalledByNative |
- private void createSession(byte[] initData, String mime, long promiseId) { |
+ private void createSession(byte[] initData, String mime, |
+ HashMap<String, String> optionalParameters, long promiseId) { |
Log.d(TAG, "createSession()"); |
if (mMediaDrm == null) { |
Log.e(TAG, "createSession() called when MediaDrm is null."); |
@@ -485,7 +520,7 @@ public class MediaDrmBridge { |
if (mProvisioningPending) { |
assert mMediaCrypto == null; |
- savePendingCreateSessionData(initData, mime, promiseId); |
+ savePendingCreateSessionData(initData, mime, optionalParameters, promiseId); |
return; |
} |
@@ -509,7 +544,7 @@ public class MediaDrmBridge { |
assert !sessionExists(sessionId); |
MediaDrm.KeyRequest request = null; |
- request = getKeyRequest(sessionId, initData, mime); |
+ request = getKeyRequest(sessionId, initData, mime, optionalParameters); |
if (request == null) { |
mMediaDrm.closeSession(sessionId); |
onPromiseRejected(promiseId, "Generate request failed."); |
@@ -526,7 +561,7 @@ public class MediaDrmBridge { |
if (newSessionOpened) { |
mMediaDrm.closeSession(sessionId); |
} |
- savePendingCreateSessionData(initData, mime, promiseId); |
+ savePendingCreateSessionData(initData, mime, optionalParameters, promiseId); |
startProvisioning(); |
} |
} |
@@ -822,7 +857,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(); |