Merge "MediaPlayer2: per-source native drm prepare/release"

This commit is contained in:
Robert Shih
2018-12-05 19:37:02 +00:00
committed by Android (Google) Code Review
2 changed files with 16 additions and 12 deletions

View File

@@ -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() {

View File

@@ -1192,7 +1192,7 @@ static Vector<uint8_t> 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<MediaPlayer2> 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<MediaPlayer2> 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},