From 43ef913815ec84d04877a698614a31e129cd97e3 Mon Sep 17 00:00:00 2001 From: James Dong Date: Fri, 12 Aug 2011 11:33:27 -0700 Subject: [PATCH] If release has been called before finalize, do not expect MediaPlayer still exists o also, we should releae the surface object when release is called, not wait until finalize is called. related-to-bug: 5157956 Change-Id: I0233ad61d8349c3e3800de68b752b9548ece1742 --- media/jni/android_media_MediaPlayer.cpp | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/media/jni/android_media_MediaPlayer.cpp b/media/jni/android_media_MediaPlayer.cpp index 13ed152c6486b..354f2c94933ab 100644 --- a/media/jni/android_media_MediaPlayer.cpp +++ b/media/jni/android_media_MediaPlayer.cpp @@ -189,6 +189,7 @@ android_media_MediaPlayer_setDataSourceAndHeaders( if (tmp == NULL) { // Out of memory return; } + LOGV("setDataSource: path %s", tmp); String8 pathStr(tmp); env->ReleaseStringUTFChars(path, tmp); @@ -201,7 +202,6 @@ android_media_MediaPlayer_setDataSourceAndHeaders( return; } - LOGV("setDataSource: path %s", pathStr); status_t opStatus = mp->setDataSource( pathStr, @@ -243,11 +243,13 @@ getVideoSurfaceTexture(JNIEnv* env, jobject thiz) { } static void -android_media_MediaPlayer_setVideoSurface(JNIEnv *env, jobject thiz, jobject jsurface) +setVideoSurface(JNIEnv *env, jobject thiz, jobject jsurface, jboolean mediaPlayerMustBeAlive) { sp mp = getMediaPlayer(env, thiz); - if (mp == NULL ) { - jniThrowException(env, "java/lang/IllegalStateException", NULL); + if (mp == NULL) { + if (mediaPlayerMustBeAlive) { + jniThrowException(env, "java/lang/IllegalStateException", NULL); + } return; } @@ -270,6 +272,12 @@ android_media_MediaPlayer_setVideoSurface(JNIEnv *env, jobject thiz, jobject jsu mp->setVideoSurfaceTexture(new_st); } +static void +android_media_MediaPlayer_setVideoSurface(JNIEnv *env, jobject thiz, jobject jsurface) +{ + setVideoSurface(env, thiz, jsurface, true /* mediaPlayerMustBeAlive */); +} + static void android_media_MediaPlayer_prepare(JNIEnv *env, jobject thiz) { @@ -615,6 +623,7 @@ static void android_media_MediaPlayer_release(JNIEnv *env, jobject thiz) { LOGV("release"); + setVideoSurface(env, thiz, NULL, false /* mediaPlayerMustBeAlive */); sp mp = setMediaPlayer(env, thiz, 0); if (mp != NULL) { // this prevents native callbacks after the object is released @@ -627,7 +636,6 @@ static void android_media_MediaPlayer_native_finalize(JNIEnv *env, jobject thiz) { LOGV("native_finalize"); - android_media_MediaPlayer_setVideoSurface(env, thiz, NULL); android_media_MediaPlayer_release(env, thiz); }