MediaPlayer2: clear MediaDrm objects upon close/reset
Bug: 112555913
Test: MediaPlayer2DrmTest
Change-Id: I3b60b0d8df4ae3273e17527975c154c80713b328
diff --git a/media/apex/java/android/media/MediaPlayer2.java b/media/apex/java/android/media/MediaPlayer2.java
index 925ca0d..012d967 100644
--- a/media/apex/java/android/media/MediaPlayer2.java
+++ b/media/apex/java/android/media/MediaPlayer2.java
@@ -63,6 +63,8 @@
import java.nio.ByteOrder;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
@@ -408,6 +410,7 @@
synchronized (mDrmEventCallbackLock) {
mDrmEventCallback = null;
}
+ clearMediaDrmObjects();
native_release();
@@ -418,6 +421,16 @@
mReleased = true;
}
+ void clearMediaDrmObjects() {
+ Collection<MediaDrm> drmObjs = mDrmObjs.values();
+ synchronized (mDrmObjs) {
+ for (MediaDrm drmObj : drmObjs) {
+ drmObj.close();
+ }
+ mDrmObjs.clear();
+ }
+ }
+
private native void native_release();
// Have to declare protected for finalize() since it is protected
@@ -442,6 +455,7 @@
// This is a synchronous call.
public void reset() {
clearSourceInfos();
+ clearMediaDrmObjects();
stayAwake(false);
native_reset();
@@ -4504,7 +4518,7 @@
};
// Modular DRM
- private final Map<UUID, MediaDrm> mDrmObjs = new HashMap<>();
+ private final Map<UUID, MediaDrm> mDrmObjs = Collections.synchronizedMap(new HashMap<>());
private class DrmHandle {
static final int PROVISION_TIMEOUT_MS = 60000;
@@ -4891,10 +4905,6 @@
mDrmObj.closeSession(mDrmSessionId);
mDrmSessionId = null;
}
- if (mDrmObj != null) {
- mDrmObj.close();
- mDrmObj = null;
- }
}
void release() throws NoDrmSchemeException {