Commit 6624c7cb by ibaker Committed by kim-vde

Check referenceCount > 0 in DefaultDrmSession#release()

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

Suggestions from review comments on:
https://github.com/google/ExoPlayer/commit/316f8a88cdaeff2b1b5d219097b2739ef607b2c4

PiperOrigin-RevId: 320572462
parent 3214851f
......@@ -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;
......
......@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment