Check referenceCount > 0 in DefaultDrmSession#release()

Also flip DefaultDrmSessionManager#prepare()/release() into guard
clauses.

Suggestions from review comments on:
316f8a88cd

PiperOrigin-RevId: 320572462
This commit is contained in:
ibaker 2020-07-10 10:52:27 +01:00 committed by kim-vde
parent 3214851fbb
commit 6624c7cb9a
2 changed files with 21 additions and 16 deletions

View File

@ -15,6 +15,8 @@
*/ */
package com.google.android.exoplayer2.drm; package com.google.android.exoplayer2.drm;
import static com.google.android.exoplayer2.util.Assertions.checkState;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.media.NotProvisionedException; import android.media.NotProvisionedException;
import android.os.Handler; import android.os.Handler;
@ -272,12 +274,12 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
@Override @Override
public void acquire(@Nullable DrmSessionEventListener.EventDispatcher eventDispatcher) { public void acquire(@Nullable DrmSessionEventListener.EventDispatcher eventDispatcher) {
Assertions.checkState(referenceCount >= 0); checkState(referenceCount >= 0);
if (eventDispatcher != null) { if (eventDispatcher != null) {
eventDispatchers.add(eventDispatcher); eventDispatchers.add(eventDispatcher);
} }
if (++referenceCount == 1) { if (++referenceCount == 1) {
Assertions.checkState(state == STATE_OPENING); checkState(state == STATE_OPENING);
requestHandlerThread = new HandlerThread("ExoPlayer:DrmRequestHandler"); requestHandlerThread = new HandlerThread("ExoPlayer:DrmRequestHandler");
requestHandlerThread.start(); requestHandlerThread.start();
requestHandler = new RequestHandler(requestHandlerThread.getLooper()); requestHandler = new RequestHandler(requestHandlerThread.getLooper());
@ -295,6 +297,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
@Override @Override
public void release(@Nullable DrmSessionEventListener.EventDispatcher eventDispatcher) { public void release(@Nullable DrmSessionEventListener.EventDispatcher eventDispatcher) {
checkState(referenceCount > 0);
if (--referenceCount == 0) { if (--referenceCount == 0) {
// Assigning null to various non-null variables for clean-up. // Assigning null to various non-null variables for clean-up.
state = STATE_RELEASED; state = STATE_RELEASED;

View File

@ -440,26 +440,28 @@ public class DefaultDrmSessionManager implements DrmSessionManager {
@Override @Override
public final void prepare() { public final void prepare() {
if (prepareCallsCount++ == 0) { if (prepareCallsCount++ != 0) {
Assertions.checkState(exoMediaDrm == null); return;
exoMediaDrm = exoMediaDrmProvider.acquireExoMediaDrm(uuid);
exoMediaDrm.setOnEventListener(new MediaDrmEventListener());
} }
Assertions.checkState(exoMediaDrm == null);
exoMediaDrm = exoMediaDrmProvider.acquireExoMediaDrm(uuid);
exoMediaDrm.setOnEventListener(new MediaDrmEventListener());
} }
@Override @Override
public final void release() { public final void release() {
if (--prepareCallsCount == 0) { if (--prepareCallsCount != 0) {
// Make a local copy, because sessions are removed from this.sessions during release (via return;
// callback).
List<DefaultDrmSession> sessions = new ArrayList<>(this.sessions);
for (int i = 0; i < sessions.size(); i++) {
// Release all the keepalive acquisitions.
sessions.get(i).release(/* eventDispatcher= */ null);
}
Assertions.checkNotNull(exoMediaDrm).release();
exoMediaDrm = null;
} }
// Make a local copy, because sessions are removed from this.sessions during release (via
// callback).
List<DefaultDrmSession> sessions = new ArrayList<>(this.sessions);
for (int i = 0; i < sessions.size(); i++) {
// Release all the keepalive acquisitions.
sessions.get(i).release(/* eventDispatcher= */ null);
}
Assertions.checkNotNull(exoMediaDrm).release();
exoMediaDrm = null;
} }
@Override @Override