diff options
author | Treehugger Robot <treehugger-gerrit@google.com> | 2020-12-30 11:37:59 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2020-12-30 11:37:59 +0000 |
commit | d70c636ad4b163c42b48d9931e7b3b5c640d19b8 (patch) | |
tree | a115a13aa9c33299a95424b8308599ab1416d384 /media/jni | |
parent | cb5c02da8b29f02675fbc833d4d47c7b49c8cc8e (diff) | |
parent | 1fc35e65ee2831fddf57124c355050b807df9eb6 (diff) |
Merge "Fix issue which Ion handle are free twice."
Diffstat (limited to 'media/jni')
-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() { |