Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(943)

Unified Diff: media/base/android/java/src/org/chromium/media/MediaDrmBridge.java

Issue 1427183002: Move MediaDrmBridge provision communication to native side. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Bound network context into callback function instead of using factory Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 95f67803d65f6567c55056fae001e6588ba21c66..531e6cdab0ae258439264ad0e58298363154470c 100644
--- a/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java
+++ b/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java
@@ -7,19 +7,12 @@ package org.chromium.media;
import android.annotation.TargetApi;
import android.media.MediaCrypto;
import android.media.MediaDrm;
-import android.os.AsyncTask;
import android.os.Build;
import org.chromium.base.Log;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace;
-import java.io.BufferedInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.net.HttpURLConnection;
-import java.net.MalformedURLException;
-import java.net.URL;
import java.nio.ByteBuffer;
import java.util.ArrayDeque;
import java.util.ArrayList;
@@ -57,7 +50,7 @@ public class MediaDrmBridge {
// calls. Indirect calls should not call release() again to avoid
// duplication (even though it doesn't hurt to call release() twice).
- private static final String TAG = "cr.media";
+ private static final String TAG = "cr_media";
private static final String SECURITY_LEVEL = "securityLevel";
private static final String SERVER_CERTIFICATE = "serviceCertificate";
private static final String PRIVACY_MODE = "privacyMode";
@@ -413,9 +406,7 @@ public class MediaDrmBridge {
@CalledByNative
private void resetDeviceCredentials() {
mResetDeviceCredentialsPending = true;
- MediaDrm.ProvisionRequest request = mMediaDrm.getProvisionRequest();
- PostRequestTask postTask = new PostRequestTask(request.getData());
- postTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, request.getDefaultUrl());
+ startProvisioning();
}
/**
@@ -740,13 +731,20 @@ public class MediaDrmBridge {
}
private void startProvisioning() {
+ if (mProvisioningPending) {
+ Log.d(TAG, "startProvisioning: another provisioning is in progress, returning");
+ return;
+ }
+
Log.d(TAG, "startProvisioning");
- assert mMediaDrm != null;
- assert !mProvisioningPending;
mProvisioningPending = true;
+ assert mMediaDrm != null;
MediaDrm.ProvisionRequest request = mMediaDrm.getProvisionRequest();
- PostRequestTask postTask = new PostRequestTask(request.getData());
- postTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, request.getDefaultUrl());
+
+ if (isNativeMediaDrmBridgeValid()) {
+ nativeOnStartProvisioning(
+ mNativeMediaDrmBridge, request.getDefaultUrl(), request.getData());
+ }
}
/**
@@ -754,8 +752,9 @@ public class MediaDrmBridge {
*
* @param response Response data from the provision server.
*/
- private void onProvisionResponse(byte[] response) {
- Log.d(TAG, "onProvisionResponse()");
+ @CalledByNative
+ private void processProvisionResponse(boolean success, byte[] response) {
+ Log.d(TAG, "processProvisionResponse()");
assert mProvisioningPending;
mProvisioningPending = false;
@@ -764,7 +763,9 @@ public class MediaDrmBridge {
return;
}
- boolean success = provideProvisionResponse(response);
+ if (success) {
+ success = provideProvisionResponse(response);
xhwang 2015/11/13 05:15:42 nit: usually we don't change the input parameter.
Tima Vaisburd 2015/11/13 21:04:44 Done.
+ }
if (mResetDeviceCredentialsPending) {
onResetDeviceCredentialsCompleted(success);
@@ -777,7 +778,7 @@ public class MediaDrmBridge {
}
/**
- * Provide the provisioning response to MediaDrm.
+ * Provides the provision response to MediaDrm.
*
* @returns false if the response is invalid or on error, true otherwise.
*/
@@ -966,81 +967,13 @@ public class MediaDrmBridge {
}
}
- private class PostRequestTask extends AsyncTask<String, Void, Void> {
- private static final String TAG = "PostRequestTask";
-
- private byte[] mDrmRequest;
- private byte[] mResponseBody;
-
- public PostRequestTask(byte[] drmRequest) {
- mDrmRequest = drmRequest;
- }
-
- @Override
- protected Void doInBackground(String... urls) {
- mResponseBody = postRequest(urls[0], mDrmRequest);
- if (mResponseBody != null) {
- Log.d(TAG, "response length=%d", mResponseBody.length);
- }
- return null;
- }
-
- private byte[] postRequest(String url, byte[] drmRequest) {
- HttpURLConnection urlConnection = null;
- try {
- URL request = new URL(url + "&signedRequest=" + new String(drmRequest));
- urlConnection = (HttpURLConnection) request.openConnection();
- urlConnection.setDoOutput(true);
- urlConnection.setDoInput(true);
- urlConnection.setUseCaches(false);
- urlConnection.setRequestMethod("POST");
- urlConnection.setRequestProperty("User-Agent", "Widevine CDM v1.0");
- urlConnection.setRequestProperty("Content-Type", "application/json");
-
- int responseCode = urlConnection.getResponseCode();
- if (responseCode == 200) {
- BufferedInputStream bis =
- new BufferedInputStream(urlConnection.getInputStream());
- ByteArrayOutputStream bos = new ByteArrayOutputStream();
- int read = 0;
- int bufferSize = 512;
- byte[] buffer = new byte[bufferSize];
- try {
- while (true) {
- read = bis.read(buffer);
- if (read == -1) break;
- bos.write(buffer, 0, read);
- }
- } finally {
- bis.close();
- }
- return bos.toByteArray();
- } else {
- Log.d(TAG, "Server returned HTTP error code %d", responseCode);
- return null;
- }
- } catch (MalformedURLException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } catch (IllegalStateException e) {
- e.printStackTrace();
- } finally {
- if (urlConnection != null) urlConnection.disconnect();
- }
- return null;
- }
-
- @Override
- protected void onPostExecute(Void v) {
- onProvisionResponse(mResponseBody);
- }
- }
-
// Native functions. At the native side, must post the task immediately to
// avoid reentrancy issues.
private native void nativeOnMediaCryptoReady(long nativeMediaDrmBridge);
+ private native void nativeOnStartProvisioning(
+ long nativeMediaDrmBridge, String defaultUrl, byte[] requestData);
+
private native void nativeOnPromiseResolved(long nativeMediaDrmBridge, long promiseId);
private native void nativeOnPromiseResolvedWithSession(
long nativeMediaDrmBridge, long promiseId, byte[] sessionId);

Powered by Google App Engine
This is Rietveld 408576698