diff options
Diffstat (limited to 'media')
| -rw-r--r-- | media/java/android/media/tv/tuner/Tuner.java | 45 | ||||
| -rw-r--r-- | media/jni/android_media_tv_Tuner.cpp | 15 | ||||
| -rw-r--r-- | media/jni/android_media_tv_Tuner.h | 1 |
3 files changed, 46 insertions, 15 deletions
diff --git a/media/java/android/media/tv/tuner/Tuner.java b/media/java/android/media/tv/tuner/Tuner.java index 12490f5bddd1..37723f1254ae 100644 --- a/media/java/android/media/tv/tuner/Tuner.java +++ b/media/java/android/media/tv/tuner/Tuner.java @@ -60,6 +60,7 @@ import com.android.internal.util.FrameworkStatsLog; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -228,8 +229,8 @@ public class Tuner implements AutoCloseable { private Executor mOnResourceLostListenerExecutor; private Integer mDemuxHandle; - private Map<Integer, Descrambler> mDescramblers = new HashMap<>(); - private List<Filter> mFilters = new ArrayList<>(); + private Map<Integer, WeakReference<Descrambler>> mDescramblers = new HashMap<>(); + private List<WeakReference<Filter>> mFilters = new ArrayList<WeakReference<Filter>>(); private final TunerResourceManager.ResourcesReclaimListener mResourceListener = new TunerResourceManager.ResourcesReclaimListener() { @@ -240,6 +241,7 @@ public class Tuner implements AutoCloseable { .write(FrameworkStatsLog.TV_TUNER_STATE_CHANGED, mUserId, FrameworkStatsLog.TV_TUNER_STATE_CHANGED__STATE__UNKNOWN); } + releaseAll(); mHandler.sendMessage(mHandler.obtainMessage(MSG_RESOURCE_LOST)); } }; @@ -382,18 +384,28 @@ public class Tuner implements AutoCloseable { if (mLnb != null) { mLnb.close(); } - if (!mDescramblers.isEmpty()) { - for (Map.Entry<Integer, Descrambler> d : mDescramblers.entrySet()) { - d.getValue().close(); - mTunerResourceManager.releaseDescrambler(d.getKey(), mClientId); + synchronized (mDescramblers) { + if (!mDescramblers.isEmpty()) { + for (Map.Entry<Integer, WeakReference<Descrambler>> d : mDescramblers.entrySet()) { + Descrambler descrambler = d.getValue().get(); + if (descrambler != null) { + descrambler.close(); + } + mTunerResourceManager.releaseDescrambler(d.getKey(), mClientId); + } + mDescramblers.clear(); } - mDescramblers.clear(); } - if (!mFilters.isEmpty()) { - for (Filter f : mFilters) { - f.close(); + synchronized (mFilters) { + if (!mFilters.isEmpty()) { + for (WeakReference<Filter> weakFilter : mFilters) { + Filter filter = weakFilter.get(); + if (filter != null) { + filter.close(); + } + } + mFilters.clear(); } - mFilters.clear(); } if (mDemuxHandle != null) { int res = nativeCloseDemux(mDemuxHandle); @@ -500,7 +512,6 @@ public class Tuner implements AutoCloseable { break; } case MSG_RESOURCE_LOST: { - releaseAll(); if (mOnResourceLostListener != null && mOnResourceLostListenerExecutor != null) { mOnResourceLostListenerExecutor.execute( @@ -954,7 +965,10 @@ public class Tuner implements AutoCloseable { if (mHandler == null) { mHandler = createEventHandler(); } - mFilters.add(filter); + synchronized (mFilters) { + WeakReference<Filter> weakFilter = new WeakReference<Filter>(filter); + mFilters.add(weakFilter); + } } return filter; } @@ -1122,7 +1136,10 @@ public class Tuner implements AutoCloseable { int handle = descramblerHandle[0]; Descrambler descrambler = nativeOpenDescramblerByHandle(handle); if (descrambler != null) { - mDescramblers.put(handle, descrambler); + synchronized (mDescramblers) { + WeakReference weakDescrambler = new WeakReference<Descrambler>(descrambler); + mDescramblers.put(handle, weakDescrambler); + } } else { mTunerResourceManager.releaseDescrambler(handle, mClientId); } diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp index 5db672993df1..5daf8b0f88f8 100644 --- a/media/jni/android_media_tv_Tuner.cpp +++ b/media/jni/android_media_tv_Tuner.cpp @@ -171,6 +171,12 @@ static int IP_V6_LENGTH = 16; void DestroyCallback(const C2Buffer * /* buf */, void *arg) { android::sp<android::MediaEvent> event = (android::MediaEvent *)arg; + if (event->mLinearBlockObj != NULL) { + JNIEnv *env = android::AndroidRuntime::getJNIEnv(); + env->DeleteWeakGlobalRef(event->mLinearBlockObj); + event->mLinearBlockObj = NULL; + } + event->mAvHandleRefCnt--; event->finalize(); } @@ -182,6 +188,12 @@ LnbCallback::LnbCallback(jobject lnbObj, LnbId id) : mId(id) { mLnb = env->NewWeakGlobalRef(lnbObj); } +LnbCallback::~LnbCallback() { + JNIEnv *env = AndroidRuntime::getJNIEnv(); + env->DeleteWeakGlobalRef(mLnb); + mLnb = NULL; +} + Return<void> LnbCallback::onEvent(LnbEventType lnbEventType) { ALOGD("LnbCallback::onEvent, type=%d", lnbEventType); JNIEnv *env = AndroidRuntime::getJNIEnv(); @@ -305,6 +317,7 @@ MediaEvent::MediaEvent(sp<IFilter> iFilter, hidl_handle avHandle, JNIEnv *env = AndroidRuntime::getJNIEnv(); mMediaEventObj = env->NewWeakGlobalRef(obj); mAvHandle = native_handle_clone(avHandle.getNativeHandle()); + mLinearBlockObj = NULL; } MediaEvent::~MediaEvent() { @@ -367,7 +380,7 @@ jobject MediaEvent::getLinearBlock() { true); mLinearBlockObj = env->NewWeakGlobalRef(linearBlock); mAvHandleRefCnt++; - return mLinearBlockObj; + return linearBlock; } else { native_handle_close(const_cast<native_handle_t*>( reinterpret_cast<const native_handle_t*>(mIonHandle))); diff --git a/media/jni/android_media_tv_Tuner.h b/media/jni/android_media_tv_Tuner.h index fd2995917475..c4deeaf887bb 100644 --- a/media/jni/android_media_tv_Tuner.h +++ b/media/jni/android_media_tv_Tuner.h @@ -73,6 +73,7 @@ namespace android { struct LnbCallback : public ILnbCallback { LnbCallback(jweak tunerObj, LnbId id); + ~LnbCallback(); virtual Return<void> onEvent(LnbEventType lnbEventType); virtual Return<void> onDiseqcMessage(const hidl_vec<uint8_t>& diseqcMessage); jweak mLnb; |
