diff options
author | Henry Fang <quxiangfang@google.com> | 2020-07-24 11:24:48 -0700 |
---|---|---|
committer | Henry Fang <quxiangfang@google.com> | 2020-12-29 20:08:14 +0000 |
commit | 1fc35e65ee2831fddf57124c355050b807df9eb6 (patch) | |
tree | 2405d0c2f1474750e8d5ca2c1b0313776ca2070f | |
parent | eec09803da33c931644f8cabfefd0d9a72547862 (diff) |
Fix issue which Ion handle are free twice.
bug: 162083545
Test: Manual
Change-Id: I3a53fe949ecfdff4614a44cc1ddecdbeaa583dd8
Merged-In: I3a53fe949ecfdff4614a44cc1ddecdbeaa583dd8
-rw-r--r-- | media/jni/android_media_tv_Tuner.cpp | 65 |
1 files changed, 38 insertions, 27 deletions
diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp index 515d610109ab..749f4d195952 100644 --- a/media/jni/android_media_tv_Tuner.cpp +++ b/media/jni/android_media_tv_Tuner.cpp @@ -337,33 +337,44 @@ jobject MediaEvent::getLinearBlock() { } mIonHandle = new C2HandleIon(dup(mAvHandle->data[0]), mDataLength); std::shared_ptr<C2LinearBlock> block = _C2BlockFactory::CreateLinearBlock(mIonHandle); - - JNIEnv *env = AndroidRuntime::getJNIEnv(); - std::unique_ptr<JMediaCodecLinearBlock> context{new JMediaCodecLinearBlock}; - context->mBlock = block; - std::shared_ptr<C2Buffer> pC2Buffer = context->toC2Buffer(0, mDataLength); - context->mBuffer = pC2Buffer; - mC2Buffer = pC2Buffer; - if (mAvHandle->numInts > 0) { - // use first int in the native_handle as the index - int index = mAvHandle->data[mAvHandle->numFds]; - std::shared_ptr<C2Param> c2param = std::make_shared<C2DataIdInfo>(index, mDataId); - std::shared_ptr<C2Info> info(std::static_pointer_cast<C2Info>(c2param)); - pC2Buffer->setInfo(info); - } - pC2Buffer->registerOnDestroyNotify(&DestroyCallback, this); - jobject linearBlock = - env->NewObject( - env->FindClass("android/media/MediaCodec$LinearBlock"), - gFields.linearBlockInitID); - env->CallVoidMethod( - linearBlock, - gFields.linearBlockSetInternalStateID, - (jlong)context.release(), - true); - mLinearBlockObj = env->NewWeakGlobalRef(linearBlock); - mAvHandleRefCnt++; - return mLinearBlockObj; + if (block != nullptr) { + // CreateLinearBlock delete mIonHandle after it create block successfully. + // ToDo: coordinate who is response to delete mIonHandle + mIonHandle = NULL; + JNIEnv *env = AndroidRuntime::getJNIEnv(); + std::unique_ptr<JMediaCodecLinearBlock> context{new JMediaCodecLinearBlock}; + context->mBlock = block; + std::shared_ptr<C2Buffer> pC2Buffer = context->toC2Buffer(0, mDataLength); + context->mBuffer = pC2Buffer; + mC2Buffer = pC2Buffer; + if (mAvHandle->numInts > 0) { + // use first int in the native_handle as the index + int index = mAvHandle->data[mAvHandle->numFds]; + std::shared_ptr<C2Param> c2param = std::make_shared<C2DataIdInfo>(index, mDataId); + std::shared_ptr<C2Info> info(std::static_pointer_cast<C2Info>(c2param)); + pC2Buffer->setInfo(info); + } + pC2Buffer->registerOnDestroyNotify(&DestroyCallback, this); + jobject linearBlock = + env->NewObject( + env->FindClass("android/media/MediaCodec$LinearBlock"), + gFields.linearBlockInitID); + env->CallVoidMethod( + linearBlock, + gFields.linearBlockSetInternalStateID, + (jlong)context.release(), + true); + mLinearBlockObj = env->NewWeakGlobalRef(linearBlock); + mAvHandleRefCnt++; + return mLinearBlockObj; + } else { + native_handle_close(const_cast<native_handle_t*>( + reinterpret_cast<const native_handle_t*>(mIonHandle))); + native_handle_delete(const_cast<native_handle_t*>( + reinterpret_cast<const native_handle_t*>(mIonHandle))); + mIonHandle = NULL; + return NULL; + } } uint64_t MediaEvent::getAudioHandle() { |