diff options
| -rw-r--r-- | media/jni/android_media_MediaCodec.cpp | 16 | ||||
| -rw-r--r-- | media/jni/android_media_MediaCodec.h | 2 |
2 files changed, 14 insertions, 4 deletions
diff --git a/media/jni/android_media_MediaCodec.cpp b/media/jni/android_media_MediaCodec.cpp index a03b24cbbcf6..f970b598d6f8 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<AMessage> &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 5c34341a86a1..a58f9a74b563 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<AMessage> mCallbackNotification; sp<AMessage> mOnFrameRenderedNotification; |