diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSession.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSession.java index 25546acb95..514d9da073 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSession.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSession.java @@ -209,23 +209,16 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; @SuppressWarnings("deprecation") public void onMediaDrmEvent(int what) { - if (!isOpen()) { - return; - } switch (what) { + case ExoMediaDrm.EVENT_PROVISION_REQUIRED: + onProvisionRequired(); + break; case ExoMediaDrm.EVENT_KEY_REQUIRED: - doLicense(false); + onKeysRequired(); break; case ExoMediaDrm.EVENT_KEY_EXPIRED: - // When an already expired key is loaded MediaDrm sends this event immediately. Ignore - // this event if the state isn't STATE_OPENED_WITH_KEYS yet which means we're still - // waiting for key response. onKeysExpired(); break; - case ExoMediaDrm.EVENT_PROVISION_REQUIRED: - state = STATE_OPENED; - provisioningManager.provisionRequired(this); - break; default: break; } @@ -441,8 +434,21 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; } } + private void onProvisionRequired() { + if (mode == DefaultDrmSessionManager.MODE_PLAYBACK && isOpen()) { + state = STATE_OPENED; + provisioningManager.provisionRequired(this); + } + } + + private void onKeysRequired() { + if (mode == DefaultDrmSessionManager.MODE_PLAYBACK && isOpen()) { + doLicense(/* allowRetry= */ false); + } + } + private void onKeysExpired() { - if (state == STATE_OPENED_WITH_KEYS) { + if (mode == DefaultDrmSessionManager.MODE_PLAYBACK && state == STATE_OPENED_WITH_KEYS) { state = STATE_OPENED; onError(new KeysExpiredException()); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java index d71c6fc64c..5f166c6114 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java @@ -589,6 +589,10 @@ public class DefaultDrmSessionManager implements DrmSe @Override public void provisionRequired(DefaultDrmSession session) { + if (provisioningSessions.contains(session)) { + // The session has already requested provisioning. + return; + } provisioningSessions.add(session); if (provisioningSessions.size() == 1) { // This is the first session requesting provisioning, so have it perform the operation. @@ -649,6 +653,10 @@ public class DefaultDrmSessionManager implements DrmSe @Override public void handleMessage(Message msg) { byte[] sessionId = (byte[]) msg.obj; + if (sessionId == null) { + // The event is not associated with any particular session. + return; + } for (DefaultDrmSession session : sessions) { if (session.hasSessionId(sessionId)) { session.onMediaDrmEvent(msg.what); @@ -668,9 +676,7 @@ public class DefaultDrmSessionManager implements DrmSe int event, int extra, @Nullable byte[] data) { - if (mode == DefaultDrmSessionManager.MODE_PLAYBACK) { - Assertions.checkNotNull(mediaDrmHandler).obtainMessage(event, sessionId).sendToTarget(); - } + Assertions.checkNotNull(mediaDrmHandler).obtainMessage(event, sessionId).sendToTarget(); } }