diff --git a/media/jni/android_media_MediaCodec.cpp b/media/jni/android_media_MediaCodec.cpp index a03b24cbbcf65..f970b598d6f87 100644 --- a/media/jni/android_media_MediaCodec.cpp +++ b/media/jni/android_media_MediaCodec.cpp @@ -233,10 +233,12 @@ void JMediaCodec::release() { } void JMediaCodec::releaseAsync() { - if (mCodec != NULL) { - mCodec->releaseAsync(); - } - mInitStatus = NO_INIT; + std::call_once(mAsyncReleaseFlag, [this] { + if (mCodec != NULL) { + mCodec->releaseAsync(new AMessage(kWhatAsyncReleaseComplete, this)); + } + mInitStatus = NO_INIT; + }); } JMediaCodec::~JMediaCodec() { @@ -1084,6 +1086,12 @@ void JMediaCodec::onMessageReceived(const sp &msg) { handleFrameRenderedNotification(msg); break; } + case kWhatAsyncReleaseComplete: + { + mCodec.clear(); + mLooper->stop(); + break; + } default: TRESPASS(); } diff --git a/media/jni/android_media_MediaCodec.h b/media/jni/android_media_MediaCodec.h index 5c34341a86a15..a58f9a74b5635 100644 --- a/media/jni/android_media_MediaCodec.h +++ b/media/jni/android_media_MediaCodec.h @@ -173,6 +173,7 @@ private: enum { kWhatCallbackNotify, kWhatFrameRendered, + kWhatAsyncReleaseComplete, }; jclass mClass; @@ -185,6 +186,7 @@ private: bool mGraphicOutput{false}; bool mHasCryptoOrDescrambler{false}; std::once_flag mReleaseFlag; + std::once_flag mAsyncReleaseFlag; sp mCallbackNotification; sp mOnFrameRenderedNotification;