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
This commit is contained in:
James Dong
2011-08-12 11:33:27 -07:00
parent 6e97ed2127
commit 43ef913815

View File

@ -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<MediaPlayer> 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<MediaPlayer> 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);
}