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 f4d5eb1417..9846a76328 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 @@ public interface ExoMediaDrm { 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 983a7139f2..42050d7eb9 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 @@ import java.util.UUID; @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 0); + referenceCount++; } @Override - public void release() { - mediaDrm.release(); + public synchronized void release() { + if (--referenceCount == 0) { + mediaDrm.release(); + } } @Override