From caddb5f593a49d20b544706df66bc53da3f6174b Mon Sep 17 00:00:00 2001 From: Robert Shih Date: Tue, 4 Dec 2018 17:01:00 -0800 Subject: [PATCH] MediaPlayer2: per-source native drm prepare/release Bug: 119675660 Test: MediaPlayer2DrmTest Change-Id: If8fe320bfe9a9194e7db3a4bb4cfb26071b8e996 --- media/java/android/media/MediaPlayer2.java | 16 ++++++++++------ media/jni/android_media_MediaPlayer2.cpp | 12 ++++++------ 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/media/java/android/media/MediaPlayer2.java b/media/java/android/media/MediaPlayer2.java index a10b2123a70cc..4b99a130d7fa3 100644 --- a/media/java/android/media/MediaPlayer2.java +++ b/media/java/android/media/MediaPlayer2.java @@ -3501,7 +3501,7 @@ public class MediaPlayer2 implements AutoCloseable } } - private native void native_releaseDrm(); + private native void native_releaseDrm(long mSrcId); /** * A key request/response exchange occurs between the app and a license server @@ -3821,7 +3821,8 @@ public class MediaPlayer2 implements AutoCloseable } } - private native void native_prepareDrm(@NonNull byte[] uuid, @NonNull byte[] drmSessionId); + private native void native_prepareDrm( + long srcId, @NonNull byte[] uuid, @NonNull byte[] drmSessionId); // Instantiated from the native side @SuppressWarnings("unused") @@ -4064,6 +4065,7 @@ public class MediaPlayer2 implements AutoCloseable static final int PROVISION_TIMEOUT_MS = 60000; final DataSourceDesc mDSD; + final long mSrcId; //--- guarded by |this| start MediaDrm mDrmObj; @@ -4075,8 +4077,9 @@ public class MediaPlayer2 implements AutoCloseable Future mProvisionResult; //--- guarded by |this| end - DrmHandle(DataSourceDesc dsd) { + DrmHandle(DataSourceDesc dsd, long srcId) { mDSD = dsd; + mSrcId = srcId; } void prepare(UUID uuid) throws UnsupportedSchemeException, @@ -4186,7 +4189,8 @@ public class MediaPlayer2 implements AutoCloseable // Sending it down to native/mediaserver to create the crypto object // This call could simply fail due to bad player state, e.g., after play(). - MediaPlayer2.this.native_prepareDrm(getByteArrayFromUUID(uuid), mDrmSessionId); + final MediaPlayer2 mp2 = MediaPlayer2.this; + mp2.native_prepareDrm(mSrcId, getByteArrayFromUUID(uuid), mDrmSessionId); Log.v(TAG, "prepareDrm_openSessionStep: native_prepareDrm/Crypto succeeded"); } catch (Exception e) { //ResourceBusyException, NotProvisionedException @@ -4367,7 +4371,7 @@ public class MediaPlayer2 implements AutoCloseable // exception if we're in a non-stopped/prepared state. // for cleaning native/mediaserver crypto object - native_releaseDrm(); + native_releaseDrm(mSrcId); // for cleaning client-side MediaDrm object; only called if above has succeeded cleanDrmObj(); @@ -4573,7 +4577,7 @@ public class MediaPlayer2 implements AutoCloseable SourceInfo(DataSourceDesc dsd) { this.mDSD = dsd; - mDrmHandle = new DrmHandle(dsd); + mDrmHandle = new DrmHandle(dsd, mId); } void close() { diff --git a/media/jni/android_media_MediaPlayer2.cpp b/media/jni/android_media_MediaPlayer2.cpp index 456749279696b..8b6009e749cec 100644 --- a/media/jni/android_media_MediaPlayer2.cpp +++ b/media/jni/android_media_MediaPlayer2.cpp @@ -1192,7 +1192,7 @@ static Vector JByteArrayToVector(JNIEnv *env, jbyteArray const &byteArr } static void android_media_MediaPlayer2_prepareDrm(JNIEnv *env, jobject thiz, - jbyteArray uuidObj, jbyteArray drmSessionIdObj) + jlong srcId, jbyteArray uuidObj, jbyteArray drmSessionIdObj) { sp mp = getMediaPlayer(env, thiz); if (mp == NULL) { @@ -1225,7 +1225,7 @@ static void android_media_MediaPlayer2_prepareDrm(JNIEnv *env, jobject thiz, return; } - status_t err = mp->prepareDrm(uuid.array(), drmSessionId); + status_t err = mp->prepareDrm(srcId, uuid.array(), drmSessionId); if (err != OK) { if (err == INVALID_OPERATION) { jniThrowException( @@ -1243,7 +1243,7 @@ static void android_media_MediaPlayer2_prepareDrm(JNIEnv *env, jobject thiz, } } -static void android_media_MediaPlayer2_releaseDrm(JNIEnv *env, jobject thiz) +static void android_media_MediaPlayer2_releaseDrm(JNIEnv *env, jobject thiz, jlong srcId) { sp mp = getMediaPlayer(env, thiz); if (mp == NULL ) { @@ -1251,7 +1251,7 @@ static void android_media_MediaPlayer2_releaseDrm(JNIEnv *env, jobject thiz) return; } - status_t err = mp->releaseDrm(); + status_t err = mp->releaseDrm(srcId); if (err != OK) { if (err == INVALID_OPERATION) { jniThrowException( @@ -1425,8 +1425,8 @@ static const JNINativeMethod gMethods[] = { {"native_setAuxEffectSendLevel", "(F)V", (void *)android_media_MediaPlayer2_setAuxEffectSendLevel}, {"native_attachAuxEffect", "(I)V", (void *)android_media_MediaPlayer2_attachAuxEffect}, // Modular DRM - { "native_prepareDrm", "([B[B)V", (void *)android_media_MediaPlayer2_prepareDrm }, - { "native_releaseDrm", "()V", (void *)android_media_MediaPlayer2_releaseDrm }, + { "native_prepareDrm", "(J[B[B)V", (void *)android_media_MediaPlayer2_prepareDrm }, + { "native_releaseDrm", "(J)V", (void *)android_media_MediaPlayer2_releaseDrm }, // AudioRouting {"native_setPreferredDevice", "(Landroid/media/AudioDeviceInfo;)Z", (void *)android_media_MediaPlayer2_setPreferredDevice},