| 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 8f32ccb85b000a9c9c511f5d1424cfaffbc902cb..9d49232d82f78dd5b74a9e22d48b821396a943f2 100644
|
| --- a/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java
|
| +++ b/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java
|
| @@ -22,7 +22,6 @@ import java.net.HttpURLConnection;
|
| import java.net.MalformedURLException;
|
| import java.net.URL;
|
| import java.nio.ByteBuffer;
|
| -import java.nio.ByteOrder;
|
| import java.util.ArrayDeque;
|
| import java.util.Arrays;
|
| import java.util.HashMap;
|
| @@ -107,11 +106,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 +125,10 @@ public class MediaDrmBridge {
|
| return mMimeType;
|
| }
|
|
|
| + private HashMap<String, String> optionalParameters() {
|
| + return mOptionalParameters;
|
| + }
|
| +
|
| private long promiseId() {
|
| return mPromiseId;
|
| }
|
| @@ -410,16 +416,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";
|
| @@ -433,12 +443,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));
|
| }
|
|
|
| /**
|
| @@ -456,8 +468,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);
|
| }
|
| }
|
|
|
| @@ -474,14 +487,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 createSessionFromNative(
|
| + 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.");
|
| @@ -490,7 +524,7 @@ public class MediaDrmBridge {
|
|
|
| if (mProvisioningPending) {
|
| assert mMediaCrypto == null;
|
| - savePendingCreateSessionData(initData, mime, promiseId);
|
| + savePendingCreateSessionData(initData, mime, optionalParameters, promiseId);
|
| return;
|
| }
|
|
|
| @@ -514,7 +548,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.");
|
| @@ -531,7 +565,7 @@ public class MediaDrmBridge {
|
| if (newSessionOpened) {
|
| mMediaDrm.closeSession(sessionId);
|
| }
|
| - savePendingCreateSessionData(initData, mime, promiseId);
|
| + savePendingCreateSessionData(initData, mime, optionalParameters, promiseId);
|
| startProvisioning();
|
| }
|
| }
|
| @@ -832,7 +866,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();
|
| @@ -933,15 +967,6 @@ public class MediaDrmBridge {
|
| }
|
| }
|
|
|
| - public static void addKeySystemUuidMapping(String keySystem, UUID uuid) {
|
| - ByteBuffer uuidBuffer = ByteBuffer.allocateDirect(16);
|
| - // MSB (byte) should be positioned at the first element.
|
| - uuidBuffer.order(ByteOrder.BIG_ENDIAN);
|
| - uuidBuffer.putLong(uuid.getMostSignificantBits());
|
| - uuidBuffer.putLong(uuid.getLeastSignificantBits());
|
| - nativeAddKeySystemUuidMapping(keySystem, uuidBuffer);
|
| - }
|
| -
|
| private native void nativeOnMediaCryptoReady(long nativeMediaDrmBridge);
|
|
|
| private native void nativeOnPromiseResolved(long nativeMediaDrmBridge, long promiseId);
|
| @@ -960,6 +985,4 @@ public class MediaDrmBridge {
|
|
|
| private native void nativeOnResetDeviceCredentialsCompleted(
|
| long nativeMediaDrmBridge, boolean success);
|
| -
|
| - private static native void nativeAddKeySystemUuidMapping(String keySystem, ByteBuffer uuid);
|
| }
|
|
|