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

View File

@ -440,26 +440,28 @@ public class DefaultDrmSessionManager implements DrmSessionManager {
@Override
public final void prepare() {
if (prepareCallsCount++ == 0) {
Assertions.checkState(exoMediaDrm == null);
exoMediaDrm = exoMediaDrmProvider.acquireExoMediaDrm(uuid);
exoMediaDrm.setOnEventListener(new MediaDrmEventListener());
if (prepareCallsCount++ != 0) {
return;
}
Assertions.checkState(exoMediaDrm == null);
exoMediaDrm = exoMediaDrmProvider.acquireExoMediaDrm(uuid);
exoMediaDrm.setOnEventListener(new MediaDrmEventListener());
}
@Override
public final void release() {
if (--prepareCallsCount == 0) {
// 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;
if (--prepareCallsCount != 0) {
return;
}
// 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