From 6624c7cb9a121566a62e4ac9690f0eb62c857f09 Mon Sep 17 00:00:00 2001 From: ibaker Date: Fri, 10 Jul 2020 10:52:27 +0100 Subject: [PATCH] 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 --- .../exoplayer2/drm/DefaultDrmSession.java | 7 +++-- .../drm/DefaultDrmSessionManager.java | 30 ++++++++++--------- 2 files changed, 21 insertions(+), 16 deletions(-) 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 400bb6c28f..c485101d10 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 @@ -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; 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 34e8cb2afd..becf548a45 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 @@ -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 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 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