diff --git a/media/java/android/media/tv/tuner/filter/MediaEvent.java b/media/java/android/media/tv/tuner/filter/MediaEvent.java index af63070027a25..57a04fd70a0bf 100644 --- a/media/java/android/media/tv/tuner/filter/MediaEvent.java +++ b/media/java/android/media/tv/tuner/filter/MediaEvent.java @@ -29,6 +29,7 @@ import android.media.MediaCodec.LinearBlock; @SystemApi public class MediaEvent extends FilterEvent { private long mNativeContext; + private boolean mReleased = false; private final Object mLock = new Object(); private native Long nativeGetAudioHandle(); @@ -181,7 +182,21 @@ public class MediaEvent extends FilterEvent { */ @Override protected void finalize() { - nativeFinalize(); - mNativeContext = 0; + release(); + } + + /** + * Releases the MediaEvent object. + * @hide + */ + public void release() { + synchronized (mLock) { + if (mReleased) { + return; + } + nativeFinalize(); + mNativeContext = 0; + mReleased = true; + } } } diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp index 7e721406a3001..e8f18a59049e1 100644 --- a/media/jni/android_media_tv_Tuner.cpp +++ b/media/jni/android_media_tv_Tuner.cpp @@ -314,8 +314,9 @@ MediaEvent::~MediaEvent() { if (mIonHandle != NULL) { delete mIonHandle; } - if (mC2Buffer != NULL) { - mC2Buffer->unregisterOnDestroyNotify(&DestroyCallback, this); + std::shared_ptr pC2Buffer = mC2Buffer.lock(); + if (pC2Buffer != NULL) { + pC2Buffer->unregisterOnDestroyNotify(&DestroyCallback, this); } } @@ -340,15 +341,17 @@ jobject MediaEvent::getLinearBlock() { JNIEnv *env = AndroidRuntime::getJNIEnv(); std::unique_ptr context{new JMediaCodecLinearBlock}; context->mBlock = block; - mC2Buffer = context->toC2Buffer(0, mDataLength); + std::shared_ptr 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 = std::make_shared(index, mDataId); std::shared_ptr info(std::static_pointer_cast(c2param)); - mC2Buffer->setInfo(info); + pC2Buffer->setInfo(info); } - mC2Buffer->registerOnDestroyNotify(&DestroyCallback, this); + pC2Buffer->registerOnDestroyNotify(&DestroyCallback, this); jobject linearBlock = env->NewObject( env->FindClass("android/media/MediaCodec$LinearBlock"), diff --git a/media/jni/android_media_tv_Tuner.h b/media/jni/android_media_tv_Tuner.h index c469a3ad8b76e..83e9db7963636 100644 --- a/media/jni/android_media_tv_Tuner.h +++ b/media/jni/android_media_tv_Tuner.h @@ -130,7 +130,7 @@ struct MediaEvent : public RefBase { jweak mMediaEventObj; jweak mLinearBlockObj; C2HandleIon* mIonHandle; - std::shared_ptr mC2Buffer; + std::weak_ptr mC2Buffer; }; struct Filter : public RefBase {