summaryrefslogtreecommitdiff
path: root/media
diff options
context:
space:
mode:
authorTreehugger Robot <treehugger-gerrit@google.com>2021-01-28 20:01:11 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2021-01-28 20:01:11 +0000
commit49467f1cdf29975f88d5f47bbf7e321d0385d1fc (patch)
treec9ffde3bff19904e1f25f2df1aff5feaf6e65819 /media
parentf2193be3f046af4e72936ba7764571bf89090507 (diff)
parent64cd9d3cf91b5f6b629c598285e635bcb6a56c7b (diff)
Merge "Fix race condition in linearblock release between TIS and MediaCodec"
Diffstat (limited to 'media')
-rw-r--r--media/jni/android_media_tv_Tuner.cpp6
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();
}