Chromium Code Reviews| 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(); |