diff options
Diffstat (limited to 'media')
-rw-r--r-- | media/jni/android_media_MediaCodec.cpp | 31 | ||||
-rw-r--r-- | media/jni/android_media_MediaCodec.h | 1 |
2 files changed, 31 insertions, 1 deletions
diff --git a/media/jni/android_media_MediaCodec.cpp b/media/jni/android_media_MediaCodec.cpp index 3ce483d..b2fb2df 100644 --- a/media/jni/android_media_MediaCodec.cpp +++ b/media/jni/android_media_MediaCodec.cpp @@ -112,12 +112,35 @@ void JMediaCodec::registerSelf() { mLooper->registerHandler(this); } -JMediaCodec::~JMediaCodec() { +void JMediaCodec::release() { if (mCodec != NULL) { mCodec->release(); mCodec.clear(); } + if (mLooper != NULL) { + mLooper->unregisterHandler(id()); + mLooper->stop(); + mLooper.clear(); + } +} + +JMediaCodec::~JMediaCodec() { + if (mCodec != NULL || mLooper != NULL) { + /* MediaCodec and looper should have been released explicitly already + * in setMediaCodec() (see comments in setMediaCodec()). + * + * Otherwise JMediaCodec::~JMediaCodec() might be called from within the + * message handler, doing release() there risks deadlock as MediaCodec:: + * release() post synchronous message to the same looper. + * + * Print a warning and try to proceed with releasing. + */ + ALOGW("try to release MediaCodec from JMediaCodec::~JMediaCodec()..."); + release(); + ALOGW("done releasing MediaCodec from JMediaCodec::~JMediaCodec()."); + } + JNIEnv *env = AndroidRuntime::getJNIEnv(); env->DeleteWeakGlobalRef(mObject); @@ -432,6 +455,12 @@ static sp<JMediaCodec> setMediaCodec( codec->incStrong(thiz); } if (old != NULL) { + /* release MediaCodec and stop the looper now before decStrong. + * otherwise JMediaCodec::~JMediaCodec() could be called from within + * its message handler, doing release() from there will deadlock + * (as MediaCodec::release() post synchronous message to the same looper) + */ + old->release(); old->decStrong(thiz); } env->SetLongField(thiz, gFields.context, (jlong)codec.get()); diff --git a/media/jni/android_media_MediaCodec.h b/media/jni/android_media_MediaCodec.h index 53254c9..2f2ea96 100644 --- a/media/jni/android_media_MediaCodec.h +++ b/media/jni/android_media_MediaCodec.h @@ -42,6 +42,7 @@ struct JMediaCodec : public AHandler { status_t initCheck() const; void registerSelf(); + void release(); status_t configure( const sp<AMessage> &format, |