From 6ae3e0983a4538e7aea2c797e55e490ddc7846ef Mon Sep 17 00:00:00 2001 From: aquilescanta Date: Mon, 16 Sep 2019 19:18:41 +0100 Subject: [PATCH] Add default implementations for ExoMediaDrm.Provider Issue:#4721 PiperOrigin-RevId: 269378440 --- .../android/exoplayer2/drm/ExoMediaDrm.java | 22 +++++++++++++ .../exoplayer2/drm/FrameworkMediaDrm.java | 33 ++++++++++++++++--- 2 files changed, 50 insertions(+), 5 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/ExoMediaDrm.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/ExoMediaDrm.java index f4d5eb14178..9846a763288 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/ExoMediaDrm.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/ExoMediaDrm.java @@ -46,6 +46,28 @@ interface Provider { ExoMediaDrm acquireExoMediaDrm(UUID uuid); } + /** + * {@link Provider} implementation which provides an {@link ExoMediaDrm} instance owned by the + * app. + * + *

This provider should be used to manually handle {@link ExoMediaDrm} resources. + */ + final class AppManagedProvider implements Provider { + + private final ExoMediaDrm exoMediaDrm; + + /** Creates an instance, which provides the given {@link ExoMediaDrm}. */ + public AppManagedProvider(ExoMediaDrm exoMediaDrm) { + this.exoMediaDrm = exoMediaDrm; + } + + @Override + public ExoMediaDrm acquireExoMediaDrm(UUID uuid) { + exoMediaDrm.acquire(); + return exoMediaDrm; + } + } + /** @see MediaDrm#EVENT_KEY_REQUIRED */ @SuppressWarnings("InlinedApi") int EVENT_KEY_REQUIRED = MediaDrm.EVENT_KEY_REQUIRED; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/FrameworkMediaDrm.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/FrameworkMediaDrm.java index 983a7139f2f..42050d7eb96 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/FrameworkMediaDrm.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/FrameworkMediaDrm.java @@ -48,6 +48,22 @@ @TargetApi(23) public final class FrameworkMediaDrm implements ExoMediaDrm { + /** + * {@link ExoMediaDrm.Provider} that returns a new {@link FrameworkMediaDrm} for the requested + * UUID. Returns a {@link DummyExoMediaDrm} if the protection scheme identified by the given UUID + * is not supported by the device. + * + *

This provider should be used to make ExoPlayer handle {@link ExoMediaDrm} resources. + */ + public static final Provider DEFAULT_PROVIDER = + uuid -> { + try { + return newInstance(uuid); + } catch (UnsupportedDrmException e) { + return new DummyExoMediaDrm<>(); + } + }; + private static final String CENC_SCHEME_MIME_TYPE = "cenc"; private static final String MOCK_LA_URL_VALUE = "https://x"; private static final String MOCK_LA_URL = "" + MOCK_LA_URL_VALUE + ""; @@ -56,9 +72,11 @@ public final class FrameworkMediaDrm implements ExoMediaDrm queryKeyStatus(byte[] sessionId) { } @Override - public void acquire() { - // TODO: Implement reference counting. + public synchronized void acquire() { + Assertions.checkState(referenceCount > 0); + referenceCount++; } @Override - public void release() { - mediaDrm.release(); + public synchronized void release() { + if (--referenceCount == 0) { + mediaDrm.release(); + } } @Override