diff options
author | Henry Fang <quxiangfang@google.com> | 2021-01-11 12:27:49 -0800 |
---|---|---|
committer | Henry Fang <quxiangfang@google.com> | 2021-01-28 18:42:50 +0000 |
commit | 64cd9d3cf91b5f6b629c598285e635bcb6a56c7b (patch) | |
tree | 5d2954116619a1e95c961dc4eb006c20b9850962 /media/jni | |
parent | 48a1062811a6a1e66d20fdf169afd02fc7b9722e (diff) |
Fix race condition in linearblock release between TIS and MediaCodec
Bug: 177247275
Test: Manual
Change-Id: I13f924adc3586607eb3a60d184e7786536c7b788
Merged-In: I13f924adc3586607eb3a60d184e7786536c7b788
Diffstat (limited to 'media/jni')
-rw-r--r-- | media/jni/android_media_tv_Tuner.cpp | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp index 5daf8b0f88f8..694b93919cde 100644 --- a/media/jni/android_media_tv_Tuner.cpp +++ b/media/jni/android_media_tv_Tuner.cpp @@ -169,8 +169,9 @@ static fields_t gFields; static int IP_V4_LENGTH = 4; static int IP_V6_LENGTH = 16; -void DestroyCallback(const C2Buffer * /* buf */, void *arg) { +void DestroyCallback(const C2Buffer * buf, void *arg) { android::sp<android::MediaEvent> event = (android::MediaEvent *)arg; + android::Mutex::Autolock autoLock(event->mLock); if (event->mLinearBlockObj != NULL) { JNIEnv *env = android::AndroidRuntime::getJNIEnv(); env->DeleteWeakGlobalRef(event->mLinearBlockObj); @@ -179,6 +180,7 @@ void DestroyCallback(const C2Buffer * /* buf */, void *arg) { event->mAvHandleRefCnt--; event->finalize(); + event->decStrong(buf); } namespace android { @@ -369,6 +371,7 @@ jobject MediaEvent::getLinearBlock() { pC2Buffer->setInfo(info); } pC2Buffer->registerOnDestroyNotify(&DestroyCallback, this); + incStrong(pC2Buffer.get()); jobject linearBlock = env->NewObject( env->FindClass("android/media/MediaCodec$LinearBlock"), @@ -3646,6 +3649,7 @@ static jobject android_media_tv_Tuner_media_event_get_linear_block( ALOGD("Failed get MediaEvent"); return NULL; } + android::Mutex::Autolock autoLock(mediaEventSp->mLock); return mediaEventSp->getLinearBlock(); } |