diff options
| -rw-r--r-- | media/java/android/media/MediaPlayer.java | 37 | ||||
| -rw-r--r-- | media/jni/android_media_MediaPlayer.cpp | 30 |
2 files changed, 54 insertions, 13 deletions
diff --git a/media/java/android/media/MediaPlayer.java b/media/java/android/media/MediaPlayer.java index 63173207ec17..aeb81c12ad6d 100644 --- a/media/java/android/media/MediaPlayer.java +++ b/media/java/android/media/MediaPlayer.java @@ -696,6 +696,13 @@ public class MediaPlayer extends PlayerBase baseRegisterPlayer(sessionId); } + private Parcel createPlayerIIdParcel() { + Parcel parcel = newRequest(); + parcel.writeInt(INVOKE_ID_SET_PLAYER_IID); + parcel.writeInt(mPlayerIId); + return parcel; + } + /* * Update the MediaPlayer SurfaceTexture. * Call after setting a new display surface. @@ -712,6 +719,7 @@ public class MediaPlayer extends PlayerBase private static final int INVOKE_ID_DESELECT_TRACK = 5; private static final int INVOKE_ID_SET_VIDEO_SCALE_MODE = 6; private static final int INVOKE_ID_GET_SELECTED_TRACK = 7; + private static final int INVOKE_ID_SET_PLAYER_IID = 8; /** * Create a request parcel which can be routed to the native media @@ -1309,16 +1317,26 @@ public class MediaPlayer extends PlayerBase * @throws IllegalStateException if it is called in an invalid state */ public void prepare() throws IOException, IllegalStateException { - _prepare(); + Parcel piidParcel = createPlayerIIdParcel(); + try { + int retCode = _prepare(piidParcel); + if (retCode != 0) { + Log.w(TAG, "prepare(): could not set piid " + mPlayerIId); + } + } finally { + piidParcel.recycle(); + } scanInternalSubtitleTracks(); // DrmInfo, if any, has been resolved by now. synchronized (mDrmLock) { mDrmInfoResolved = true; } + } - private native void _prepare() throws IOException, IllegalStateException; + /** Returns the result of sending the {@code piidParcel} to the MediaPlayerService. */ + private native int _prepare(Parcel piidParcel) throws IOException, IllegalStateException; /** * Prepares the player for playback, asynchronously. @@ -1330,7 +1348,20 @@ public class MediaPlayer extends PlayerBase * * @throws IllegalStateException if it is called in an invalid state */ - public native void prepareAsync() throws IllegalStateException; + public void prepareAsync() throws IllegalStateException { + Parcel piidParcel = createPlayerIIdParcel(); + try { + int retCode = _prepareAsync(piidParcel); + if (retCode != 0) { + Log.w(TAG, "prepareAsync(): could not set piid " + mPlayerIId); + } + } finally { + piidParcel.recycle(); + } + } + + /** Returns the result of sending the {@code piidParcel} to the MediaPlayerService. */ + private native int _prepareAsync(Parcel piidParcel) throws IllegalStateException; /** * Starts or resumes playback. If playback had previously been paused, diff --git a/media/jni/android_media_MediaPlayer.cpp b/media/jni/android_media_MediaPlayer.cpp index a548a472fc3a..da920bb63178 100644 --- a/media/jni/android_media_MediaPlayer.cpp +++ b/media/jni/android_media_MediaPlayer.cpp @@ -369,13 +369,13 @@ android_media_MediaPlayer_setVideoSurface(JNIEnv *env, jobject thiz, jobject jsu setVideoSurface(env, thiz, jsurface, true /* mediaPlayerMustBeAlive */); } -static void -android_media_MediaPlayer_prepare(JNIEnv *env, jobject thiz) +static jint +android_media_MediaPlayer_prepare(JNIEnv *env, jobject thiz, jobject piidParcel) { sp<MediaPlayer> mp = getMediaPlayer(env, thiz); - if (mp == NULL ) { + if (mp == nullptr) { jniThrowException(env, "java/lang/IllegalStateException", NULL); - return; + return UNKNOWN_ERROR; } // Handle the case where the display surface was set before the mp was @@ -384,15 +384,20 @@ android_media_MediaPlayer_prepare(JNIEnv *env, jobject thiz) mp->setVideoSurfaceTexture(st); process_media_player_call( env, thiz, mp->prepare(), "java/io/IOException", "Prepare failed." ); + + // update the piid + Parcel *request = parcelForJavaObject(env, piidParcel); + auto reply = std::make_unique<Parcel>(); + return static_cast<jint>(mp->invoke(*request, reply.get())); } -static void -android_media_MediaPlayer_prepareAsync(JNIEnv *env, jobject thiz) +static jint +android_media_MediaPlayer_prepareAsync(JNIEnv *env, jobject thiz, jobject piidParcel) { sp<MediaPlayer> mp = getMediaPlayer(env, thiz); - if (mp == NULL ) { + if (mp == nullptr) { jniThrowException(env, "java/lang/IllegalStateException", NULL); - return; + return UNKNOWN_ERROR; } // Handle the case where the display surface was set before the mp was @@ -401,6 +406,11 @@ android_media_MediaPlayer_prepareAsync(JNIEnv *env, jobject thiz) mp->setVideoSurfaceTexture(st); process_media_player_call( env, thiz, mp->prepareAsync(), "java/io/IOException", "Prepare Async failed." ); + + // update the piid + Parcel *request = parcelForJavaObject(env, piidParcel); + auto reply = std::make_unique<Parcel>(); + return static_cast<jint>(mp->invoke(*request, reply.get())); } static void @@ -1380,8 +1390,8 @@ static const JNINativeMethod gMethods[] = { {"_setDataSource", "(Ljava/io/FileDescriptor;JJ)V", (void *)android_media_MediaPlayer_setDataSourceFD}, {"_setDataSource", "(Landroid/media/MediaDataSource;)V",(void *)android_media_MediaPlayer_setDataSourceCallback }, {"_setVideoSurface", "(Landroid/view/Surface;)V", (void *)android_media_MediaPlayer_setVideoSurface}, - {"_prepare", "()V", (void *)android_media_MediaPlayer_prepare}, - {"prepareAsync", "()V", (void *)android_media_MediaPlayer_prepareAsync}, + {"_prepare", "(Landroid/os/Parcel;)I", (void *)android_media_MediaPlayer_prepare}, + {"_prepareAsync", "(Landroid/os/Parcel;)I", (void *)android_media_MediaPlayer_prepareAsync}, {"_start", "()V", (void *)android_media_MediaPlayer_start}, {"_stop", "()V", (void *)android_media_MediaPlayer_stop}, {"getVideoWidth", "()I", (void *)android_media_MediaPlayer_getVideoWidth}, |