From 7ca77c6002d36e621202ca484407647bbb336c6d Mon Sep 17 00:00:00 2001 From: olly Date: Wed, 13 Nov 2019 07:41:04 +0000 Subject: [PATCH] Make DrmSession acquire/release consistent with ExoMediaDrm This aligns the method naming and Javadoc. The only remaining inconsistency I can see is that the initial reference count for DrmSession is 0 rather than 1. Unfortunately I think it's not trivial to get these aligned, because DefaultDrmSessionManager relies on being able to do something between instantiation and the DrmSession starting to open the session. In practice this doesn't really matter, since DrmSessions will be obtained via the manager, which does increment thee reference count to 1 to be consistent with how ExoMediaDrm acquisition works. PiperOrigin-RevId: 280136574 --- .../android/exoplayer2/BaseRenderer.java | 2 +- .../audio/SimpleDecoderAudioRenderer.java | 4 +-- .../exoplayer2/drm/DefaultDrmSession.java | 5 ++-- .../drm/DefaultDrmSessionManager.java | 4 +-- .../android/exoplayer2/drm/DrmSession.java | 26 +++++++++---------- .../exoplayer2/drm/DrmSessionManager.java | 12 ++++----- .../exoplayer2/drm/ErrorStateDrmSession.java | 4 +-- .../exoplayer2/drm/OfflineLicenseHelper.java | 4 +-- .../mediacodec/MediaCodecRenderer.java | 4 +-- .../source/SampleMetadataQueue.java | 4 +-- .../video/SimpleDecoderVideoRenderer.java | 4 +-- 11 files changed, 36 insertions(+), 37 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/BaseRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/BaseRenderer.java index 6c323deca4..3cdab8baf1 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/BaseRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/BaseRenderer.java @@ -321,7 +321,7 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities { Assertions.checkNotNull(Looper.myLooper()), newFormat.drmInitData); } if (existingSourceSession != null) { - existingSourceSession.releaseReference(); + existingSourceSession.release(); } return newSourceDrmSession; } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/SimpleDecoderAudioRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/SimpleDecoderAudioRenderer.java index 32516e7dcd..76abfd6e0f 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/SimpleDecoderAudioRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/SimpleDecoderAudioRenderer.java @@ -657,12 +657,12 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements } private void setSourceDrmSession(@Nullable DrmSession session) { - DrmSession.replaceSessionReferences(sourceDrmSession, session); + DrmSession.replaceSession(sourceDrmSession, session); sourceDrmSession = session; } private void setDecoderDrmSession(@Nullable DrmSession session) { - DrmSession.replaceSessionReferences(decoderDrmSession, session); + DrmSession.replaceSession(decoderDrmSession, session); decoderDrmSession = session; } 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 d962efd96b..25a08c9058 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 @@ -251,7 +251,8 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; } @Override - public void acquireReference() { + public void acquire() { + Assertions.checkState(referenceCount >= 0); if (++referenceCount == 1) { Assertions.checkState(state == STATE_OPENING); requestHandlerThread = new HandlerThread("DrmRequestHandler"); @@ -264,7 +265,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; } @Override - public void releaseReference() { + public void release() { 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 15f87318f0..a65f45309a 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 @@ -480,7 +480,7 @@ public class DefaultDrmSessionManager implements DrmSe sessions.add(placeholderDrmSession); this.placeholderDrmSession = placeholderDrmSession; } - placeholderDrmSession.acquireReference(); + placeholderDrmSession.acquire(); return placeholderDrmSession; } @@ -521,7 +521,7 @@ public class DefaultDrmSessionManager implements DrmSe } sessions.add(session); } - session.acquireReference(); + session.acquire(); return session; } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/DrmSession.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/DrmSession.java index 722ab946f0..13e29e141a 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/DrmSession.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/DrmSession.java @@ -30,21 +30,21 @@ import java.util.Map; public interface DrmSession { /** - * Invokes {@code newSession's} {@link #acquireReference()} and {@code previousSession's} {@link - * #releaseReference()} in that order. Null arguments are ignored. Does nothing if {@code - * previousSession} and {@code newSession} are the same session. + * Invokes {@code newSession's} {@link #acquire()} and {@code previousSession's} {@link + * #release()} in that order. Null arguments are ignored. Does nothing if {@code previousSession} + * and {@code newSession} are the same session. */ - static void replaceSessionReferences( + static void replaceSession( @Nullable DrmSession previousSession, @Nullable DrmSession newSession) { if (previousSession == newSession) { // Do nothing. return; } if (newSession != null) { - newSession.acquireReference(); + newSession.acquire(); } if (previousSession != null) { - previousSession.releaseReference(); + previousSession.release(); } } @@ -130,16 +130,14 @@ public interface DrmSession { byte[] getOfflineLicenseKeySetId(); /** - * Increments the reference count for this session. A non-zero reference count session will keep - * any acquired resources. + * Increments the reference count. When the caller no longer needs to use the instance, it must + * call {@link #release()} to decrement the reference count. */ - void acquireReference(); + void acquire(); /** - * Decreases by one the reference count for this session. A session that reaches a zero reference - * count will release any resources it holds. - * - *

The session must not be used after its reference count has been reduced to 0. + * Decrements the reference count. If the reference count drops to 0 underlying resources are + * released, and the instance cannot be re-used. */ - void releaseReference(); + void release(); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/DrmSessionManager.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/DrmSessionManager.java index 1a9e01441f..c92d68ed17 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/DrmSessionManager.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/DrmSessionManager.java @@ -105,8 +105,9 @@ public interface DrmSessionManager { boolean canAcquireSession(DrmInitData drmInitData); /** - * Returns a {@link DrmSession} with an acquired reference that does not execute key requests. - * Returns null if placeholder sessions are not supported by this DRM session manager. + * Returns a {@link DrmSession} that does not execute key requests, with an incremented reference + * count. When the caller no longer needs to use the instance, it must call {@link + * DrmSession#release()} to decrement the reference count. * *

Placeholder {@link DrmSession DrmSessions} may be used to configure secure decoders for * playback of clear samples, which reduces the costs of transitioning between clear and encrypted @@ -124,10 +125,9 @@ public interface DrmSessionManager { } /** - * Returns a {@link DrmSession} with an acquired reference for the specified {@link DrmInitData}. - * - *

The caller must call {@link DrmSession#releaseReference} to decrement the session's - * reference count when the session is no longer required. + * Returns a {@link DrmSession} for the specified {@link DrmInitData}, with an incremented + * reference count. When the caller no longer needs to use the instance, it must call {@link + * DrmSession#release()} to decrement the reference count. * * @param playbackLooper The looper associated with the media playback thread. * @param drmInitData DRM initialization data. All contained {@link SchemeData}s must contain diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/ErrorStateDrmSession.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/ErrorStateDrmSession.java index d40cf60906..aa15c82900 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/ErrorStateDrmSession.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/ErrorStateDrmSession.java @@ -58,12 +58,12 @@ public final class ErrorStateDrmSession implements Drm } @Override - public void acquireReference() { + public void acquire() { // Do nothing. } @Override - public void releaseReference() { + public void release() { // Do nothing. } } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/OfflineLicenseHelper.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/OfflineLicenseHelper.java index 9ed2fe3f27..31211d7b2a 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/OfflineLicenseHelper.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/OfflineLicenseHelper.java @@ -210,7 +210,7 @@ public final class OfflineLicenseHelper { DrmSessionException error = drmSession.getError(); Pair licenseDurationRemainingSec = WidevineUtil.getLicenseDurationRemainingSec(drmSession); - drmSession.releaseReference(); + drmSession.release(); drmSessionManager.release(); if (error != null) { if (error.getCause() instanceof KeysExpiredException) { @@ -236,7 +236,7 @@ public final class OfflineLicenseHelper { drmInitData); DrmSessionException error = drmSession.getError(); byte[] keySetId = drmSession.getOfflineLicenseKeySetId(); - drmSession.releaseReference(); + drmSession.release(); drmSessionManager.release(); if (error != null) { throw error; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java index 8f8d600f93..80d2625a3e 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java @@ -1011,12 +1011,12 @@ public abstract class MediaCodecRenderer extends BaseRenderer { } private void setSourceDrmSession(@Nullable DrmSession session) { - DrmSession.replaceSessionReferences(sourceDrmSession, session); + DrmSession.replaceSession(sourceDrmSession, session); sourceDrmSession = session; } private void setCodecDrmSession(@Nullable DrmSession session) { - DrmSession.replaceSessionReferences(codecDrmSession, session); + DrmSession.replaceSession(codecDrmSession, session); codecDrmSession = session; } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/SampleMetadataQueue.java b/library/core/src/main/java/com/google/android/exoplayer2/source/SampleMetadataQueue.java index 891f36f47c..0cc576a145 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/SampleMetadataQueue.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/SampleMetadataQueue.java @@ -171,7 +171,7 @@ import java.io.IOException; /** Releases any owned {@link DrmSession} references. */ public void releaseDrmSessionReferences() { if (currentDrmSession != null) { - currentDrmSession.releaseReference(); + currentDrmSession.release(); currentDrmSession = null; // Clear downstream format to avoid violating the assumption that downstreamFormat.drmInitData // != null implies currentSession != null @@ -629,7 +629,7 @@ import java.io.IOException; outputFormatHolder.drmSession = currentDrmSession; if (previousSession != null) { - previousSession.releaseReference(); + previousSession.release(); } } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/video/SimpleDecoderVideoRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/video/SimpleDecoderVideoRenderer.java index c7dc056823..cd3823b342 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/video/SimpleDecoderVideoRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/SimpleDecoderVideoRenderer.java @@ -635,12 +635,12 @@ public abstract class SimpleDecoderVideoRenderer extends BaseRenderer { // Internal methods. private void setSourceDrmSession(@Nullable DrmSession session) { - DrmSession.replaceSessionReferences(sourceDrmSession, session); + DrmSession.replaceSession(sourceDrmSession, session); sourceDrmSession = session; } private void setDecoderDrmSession(@Nullable DrmSession session) { - DrmSession.replaceSessionReferences(decoderDrmSession, session); + DrmSession.replaceSession(decoderDrmSession, session); decoderDrmSession = session; }