summaryrefslogtreecommitdiff
path: root/media
diff options
context:
space:
mode:
Diffstat (limited to 'media')
-rw-r--r--media/java/android/media/tv/tuner/Tuner.java45
-rw-r--r--media/jni/android_media_tv_Tuner.cpp15
-rw-r--r--media/jni/android_media_tv_Tuner.h1
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;