From aa9eb5abc9b2b121db52d436215f40805928599c Mon Sep 17 00:00:00 2001 From: aquilescanta Date: Thu, 19 Mar 2020 13:09:15 +0000 Subject: [PATCH] Remove generics from DRM components PiperOrigin-RevId: 301798563 --- RELEASENOTES.md | 1 + .../exoplayer2/gldemo/MainActivity.java | 3 +- .../exoplayer2/surfacedemo/MainActivity.java | 3 +- .../android/exoplayer2/FormatHolder.java | 2 +- .../audio/DecoderAudioRenderer.java | 10 +- .../audio/MediaCodecAudioRenderer.java | 4 +- .../exoplayer2/drm/DefaultDrmSession.java | 26 ++--- .../drm/DefaultDrmSessionManager.java | 74 ++++++------- .../android/exoplayer2/drm/DrmSession.java | 16 ++- .../exoplayer2/drm/DrmSessionManager.java | 22 ++-- .../exoplayer2/drm/DummyExoMediaDrm.java | 17 ++- .../exoplayer2/drm/ErrorStateDrmSession.java | 4 +- .../android/exoplayer2/drm/ExoMediaDrm.java | 53 ++++----- .../exoplayer2/drm/FrameworkMediaDrm.java | 15 ++- .../exoplayer2/drm/OfflineLicenseHelper.java | 27 +++-- .../android/exoplayer2/drm/WidevineUtil.java | 3 +- .../mediacodec/MediaCodecRenderer.java | 101 +++++++++++------- .../exoplayer2/offline/DownloadHelper.java | 11 +- .../source/DefaultMediaSourceFactory.java | 6 +- .../source/ExtractorMediaSource.java | 2 +- .../exoplayer2/source/MediaSourceFactory.java | 2 +- .../source/ProgressiveMediaPeriod.java | 4 +- .../source/ProgressiveMediaSource.java | 8 +- .../exoplayer2/source/SampleQueue.java | 8 +- .../source/chunk/ChunkSampleStream.java | 2 +- .../video/DecoderVideoRenderer.java | 12 +-- .../video/MediaCodecVideoRenderer.java | 5 +- .../drm/OfflineLicenseHelperTest.java | 8 +- .../exoplayer2/source/SampleQueueTest.java | 16 ++- .../source/dash/DashMediaPeriod.java | 8 +- .../source/dash/DashMediaSource.java | 8 +- .../exoplayer2/source/hls/HlsMediaPeriod.java | 4 +- .../exoplayer2/source/hls/HlsMediaSource.java | 8 +- .../source/hls/HlsSampleStreamWrapper.java | 6 +- .../source/smoothstreaming/SsMediaPeriod.java | 6 +- .../source/smoothstreaming/SsMediaSource.java | 8 +- .../playbacktests/gts/DashTestRunner.java | 10 +- .../gts/DashWidevineOfflineTest.java | 3 +- .../exoplayer2/testutil/ExoHostedTest.java | 7 +- 39 files changed, 258 insertions(+), 275 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 59c32b9927..62bc766b11 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -83,6 +83,7 @@ * Add option to inject a custom `DefaultDrmSessionManager` into `OfflineLicenseHelper` ([#7078](https://github.com/google/ExoPlayer/issues/7078)). + * Remove generics from DRM components. * Downloads: Merge downloads in `SegmentDownloader` to improve overall download speed ([#5978](https://github.com/google/ExoPlayer/issues/5978)). * DASH: diff --git a/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/MainActivity.java b/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/MainActivity.java index c3af319593..c788f752f7 100644 --- a/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/MainActivity.java +++ b/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/MainActivity.java @@ -28,7 +28,6 @@ import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.drm.DefaultDrmSessionManager; import com.google.android.exoplayer2.drm.DrmSessionManager; -import com.google.android.exoplayer2.drm.ExoMediaCrypto; import com.google.android.exoplayer2.drm.FrameworkMediaDrm; import com.google.android.exoplayer2.drm.HttpMediaDrmCallback; import com.google.android.exoplayer2.source.MediaSource; @@ -140,7 +139,7 @@ public final class MainActivity extends Activity { ? Assertions.checkNotNull(intent.getData()) : Uri.parse(DEFAULT_MEDIA_URI); String userAgent = Util.getUserAgent(this, getString(R.string.application_name)); - DrmSessionManager drmSessionManager; + DrmSessionManager drmSessionManager; if (Util.SDK_INT >= 18 && intent.hasExtra(DRM_SCHEME_EXTRA)) { String drmScheme = Assertions.checkNotNull(intent.getStringExtra(DRM_SCHEME_EXTRA)); String drmLicenseUrl = Assertions.checkNotNull(intent.getStringExtra(DRM_LICENSE_URL_EXTRA)); diff --git a/demos/surface/src/main/java/com/google/android/exoplayer2/surfacedemo/MainActivity.java b/demos/surface/src/main/java/com/google/android/exoplayer2/surfacedemo/MainActivity.java index 5b11aa372f..67419edf3b 100644 --- a/demos/surface/src/main/java/com/google/android/exoplayer2/surfacedemo/MainActivity.java +++ b/demos/surface/src/main/java/com/google/android/exoplayer2/surfacedemo/MainActivity.java @@ -32,7 +32,6 @@ import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.drm.DefaultDrmSessionManager; import com.google.android.exoplayer2.drm.DrmSessionManager; -import com.google.android.exoplayer2.drm.ExoMediaCrypto; import com.google.android.exoplayer2.drm.FrameworkMediaDrm; import com.google.android.exoplayer2.drm.HttpMediaDrmCallback; import com.google.android.exoplayer2.source.MediaSource; @@ -185,7 +184,7 @@ public final class MainActivity extends Activity { ? Assertions.checkNotNull(intent.getData()) : Uri.parse(DEFAULT_MEDIA_URI); String userAgent = Util.getUserAgent(this, getString(R.string.application_name)); - DrmSessionManager drmSessionManager; + DrmSessionManager drmSessionManager; if (intent.hasExtra(DRM_SCHEME_EXTRA)) { String drmScheme = Assertions.checkNotNull(intent.getStringExtra(DRM_SCHEME_EXTRA)); String drmLicenseUrl = Assertions.checkNotNull(intent.getStringExtra(DRM_LICENSE_URL_EXTRA)); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/FormatHolder.java b/library/core/src/main/java/com/google/android/exoplayer2/FormatHolder.java index 465369e498..13c0659ccc 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/FormatHolder.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/FormatHolder.java @@ -24,7 +24,7 @@ import com.google.android.exoplayer2.drm.DrmSession; public final class FormatHolder { /** An accompanying context for decrypting samples in the format. */ - @Nullable public DrmSession drmSession; + @Nullable public DrmSession drmSession; /** The held {@link Format}. */ @Nullable public Format format; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java index e3ef5bd698..16c0619ad9 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java @@ -111,8 +111,8 @@ public abstract class DecoderAudioRenderer extends BaseRenderer implements Media @Nullable private DecoderInputBuffer inputBuffer; @Nullable private SimpleOutputBuffer outputBuffer; - @Nullable private DrmSession decoderDrmSession; - @Nullable private DrmSession sourceDrmSession; + @Nullable private DrmSession decoderDrmSession; + @Nullable private DrmSession sourceDrmSession; @ReinitializationState private int decoderReinitializationState; private boolean decoderReceivedBuffers; @@ -627,12 +627,12 @@ public abstract class DecoderAudioRenderer extends BaseRenderer implements Media setDecoderDrmSession(null); } - private void setSourceDrmSession(@Nullable DrmSession session) { + private void setSourceDrmSession(@Nullable DrmSession session) { DrmSession.replaceSession(sourceDrmSession, session); sourceDrmSession = session; } - private void setDecoderDrmSession(@Nullable DrmSession session) { + private void setDecoderDrmSession(@Nullable DrmSession session) { DrmSession.replaceSession(decoderDrmSession, session); decoderDrmSession = session; } @@ -640,7 +640,7 @@ public abstract class DecoderAudioRenderer extends BaseRenderer implements Media @SuppressWarnings("unchecked") private void onInputFormatChanged(FormatHolder formatHolder) throws ExoPlaybackException { Format newFormat = Assertions.checkNotNull(formatHolder.format); - setSourceDrmSession((DrmSession) formatHolder.drmSession); + setSourceDrmSession(formatHolder.drmSession); Format oldFormat = inputFormat; inputFormat = newFormat; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java index c1131a4f1f..bc61a2093e 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java @@ -32,7 +32,6 @@ import com.google.android.exoplayer2.PlayerMessage.Target; import com.google.android.exoplayer2.RendererCapabilities; import com.google.android.exoplayer2.audio.AudioRendererEventListener.EventDispatcher; import com.google.android.exoplayer2.decoder.DecoderInputBuffer; -import com.google.android.exoplayer2.drm.FrameworkMediaCrypto; import com.google.android.exoplayer2.mediacodec.MediaCodecInfo; import com.google.android.exoplayer2.mediacodec.MediaCodecRenderer; import com.google.android.exoplayer2.mediacodec.MediaCodecSelector; @@ -214,8 +213,7 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media } @TunnelingSupport int tunnelingSupport = Util.SDK_INT >= 21 ? TUNNELING_SUPPORTED : TUNNELING_NOT_SUPPORTED; - boolean supportsFormatDrm = - format.drmInitData == null || FrameworkMediaCrypto.class.equals(format.exoMediaCryptoType); + boolean supportsFormatDrm = supportsFormatDrm(format); if (supportsFormatDrm && allowPassthrough(format.channelCount, mimeType) && mediaCodecSelector.getPassthroughDecoderInfo() != null) { 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 e373b05f94..9c054b12fa 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 @@ -48,7 +48,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; /** A {@link DrmSession} that supports playbacks using {@link ExoMediaDrm}. */ @RequiresApi(18) -/* package */ class DefaultDrmSession implements DrmSession { +/* package */ class DefaultDrmSession implements DrmSession { /** Thrown when an unexpected exception or error is thrown during provisioning or key requests. */ public static final class UnexpectedDrmSessionException extends IOException { @@ -59,7 +59,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; } /** Manages provisioning requests. */ - public interface ProvisioningManager { + public interface ProvisioningManager { /** * Called when a session requires provisioning. The manager may call {@link @@ -69,7 +69,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; * * @param session The session. */ - void provisionRequired(DefaultDrmSession session); + void provisionRequired(DefaultDrmSession session); /** * Called by a session when it fails to perform a provisioning operation. @@ -83,14 +83,14 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; } /** Callback to be notified when the session is released. */ - public interface ReleaseCallback { + public interface ReleaseCallback { /** * Called immediately after releasing session resources. * * @param session The session. */ - void onSessionReleased(DefaultDrmSession session); + void onSessionReleased(DefaultDrmSession session); } private static final String TAG = "DefaultDrmSession"; @@ -102,9 +102,9 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; /** The DRM scheme datas, or null if this session uses offline keys. */ @Nullable public final List schemeDatas; - private final ExoMediaDrm mediaDrm; - private final ProvisioningManager provisioningManager; - private final ReleaseCallback releaseCallback; + private final ExoMediaDrm mediaDrm; + private final ProvisioningManager provisioningManager; + private final ReleaseCallback releaseCallback; private final @DefaultDrmSessionManager.Mode int mode; private final boolean playClearSamplesWithoutKeys; private final boolean isPlaceholderSession; @@ -120,7 +120,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; private int referenceCount; @Nullable private HandlerThread requestHandlerThread; @Nullable private RequestHandler requestHandler; - @Nullable private T mediaCrypto; + @Nullable private ExoMediaCrypto mediaCrypto; @Nullable private DrmSessionException lastException; @Nullable private byte[] sessionId; private byte @MonotonicNonNull [] offlineLicenseKeySetId; @@ -150,9 +150,9 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; */ public DefaultDrmSession( UUID uuid, - ExoMediaDrm mediaDrm, - ProvisioningManager provisioningManager, - ReleaseCallback releaseCallback, + ExoMediaDrm mediaDrm, + ProvisioningManager provisioningManager, + ReleaseCallback releaseCallback, @Nullable List schemeDatas, @DefaultDrmSessionManager.Mode int mode, boolean playClearSamplesWithoutKeys, @@ -242,7 +242,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; } @Override - public final @Nullable T getMediaCrypto() { + public final @Nullable ExoMediaCrypto getMediaCrypto() { return mediaCrypto; } 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 bcf84479df..4e1a8a5b87 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 @@ -45,7 +45,7 @@ import java.util.UUID; /** A {@link DrmSessionManager} that supports playbacks using {@link ExoMediaDrm}. */ @RequiresApi(18) -public class DefaultDrmSessionManager implements DrmSessionManager { +public class DefaultDrmSessionManager implements DrmSessionManager { /** * Builder for {@link DefaultDrmSessionManager} instances. @@ -56,7 +56,7 @@ public class DefaultDrmSessionManager implements DrmSe private final HashMap keyRequestParameters; private UUID uuid; - private ExoMediaDrm.Provider exoMediaDrmProvider; + private ExoMediaDrm.Provider exoMediaDrmProvider; private boolean multiSession; private int[] useDrmSessionsForClearContentTrackTypes; private boolean playClearSamplesWithoutKeys; @@ -77,11 +77,10 @@ public class DefaultDrmSessionManager implements DrmSe * DefaultLoadErrorHandlingPolicy}. * */ - @SuppressWarnings("unchecked") public Builder() { keyRequestParameters = new HashMap<>(); uuid = C.WIDEVINE_UUID; - exoMediaDrmProvider = (ExoMediaDrm.Provider) FrameworkMediaDrm.DEFAULT_PROVIDER; + exoMediaDrmProvider = FrameworkMediaDrm.DEFAULT_PROVIDER; loadErrorHandlingPolicy = new DefaultLoadErrorHandlingPolicy(); useDrmSessionsForClearContentTrackTypes = new int[0]; } @@ -111,7 +110,6 @@ public class DefaultDrmSessionManager implements DrmSe * @param exoMediaDrmProvider The {@link ExoMediaDrm.Provider}. * @return This builder. */ - @SuppressWarnings({"rawtypes", "unchecked"}) public Builder setUuidAndExoMediaDrmProvider( UUID uuid, ExoMediaDrm.Provider exoMediaDrmProvider) { this.uuid = Assertions.checkNotNull(uuid); @@ -184,8 +182,8 @@ public class DefaultDrmSessionManager implements DrmSe } /** Builds a {@link DefaultDrmSessionManager} instance. */ - public DefaultDrmSessionManager build(MediaDrmCallback mediaDrmCallback) { - return new DefaultDrmSessionManager<>( + public DefaultDrmSessionManager build(MediaDrmCallback mediaDrmCallback) { + return new DefaultDrmSessionManager( uuid, exoMediaDrmProvider, mediaDrmCallback, @@ -239,7 +237,7 @@ public class DefaultDrmSessionManager implements DrmSe private static final String TAG = "DefaultDrmSessionMgr"; private final UUID uuid; - private final ExoMediaDrm.Provider exoMediaDrmProvider; + private final ExoMediaDrm.Provider exoMediaDrmProvider; private final MediaDrmCallback callback; private final HashMap keyRequestParameters; private final EventDispatcher eventDispatcher; @@ -249,13 +247,13 @@ public class DefaultDrmSessionManager implements DrmSe private final ProvisioningManagerImpl provisioningManagerImpl; private final LoadErrorHandlingPolicy loadErrorHandlingPolicy; - private final List> sessions; - private final List> provisioningSessions; + private final List sessions; + private final List provisioningSessions; private int prepareCallsCount; - @Nullable private ExoMediaDrm exoMediaDrm; - @Nullable private DefaultDrmSession placeholderDrmSession; - @Nullable private DefaultDrmSession noMultiSessionDrmSession; + @Nullable private ExoMediaDrm exoMediaDrm; + @Nullable private DefaultDrmSession placeholderDrmSession; + @Nullable private DefaultDrmSession noMultiSessionDrmSession; @Nullable private Looper playbackLooper; private int mode; @Nullable private byte[] offlineLicenseKeySetId; @@ -274,7 +272,7 @@ public class DefaultDrmSessionManager implements DrmSe @Deprecated public DefaultDrmSessionManager( UUID uuid, - ExoMediaDrm exoMediaDrm, + ExoMediaDrm exoMediaDrm, MediaDrmCallback callback, @Nullable HashMap keyRequestParameters) { this( @@ -299,7 +297,7 @@ public class DefaultDrmSessionManager implements DrmSe @Deprecated public DefaultDrmSessionManager( UUID uuid, - ExoMediaDrm exoMediaDrm, + ExoMediaDrm exoMediaDrm, MediaDrmCallback callback, @Nullable HashMap keyRequestParameters, boolean multiSession) { @@ -327,14 +325,14 @@ public class DefaultDrmSessionManager implements DrmSe @Deprecated public DefaultDrmSessionManager( UUID uuid, - ExoMediaDrm exoMediaDrm, + ExoMediaDrm exoMediaDrm, MediaDrmCallback callback, @Nullable HashMap keyRequestParameters, boolean multiSession, int initialDrmRequestRetryCount) { this( uuid, - new ExoMediaDrm.AppManagedProvider<>(exoMediaDrm), + new ExoMediaDrm.AppManagedProvider(exoMediaDrm), callback, keyRequestParameters == null ? new HashMap<>() : keyRequestParameters, multiSession, @@ -345,7 +343,7 @@ public class DefaultDrmSessionManager implements DrmSe private DefaultDrmSessionManager( UUID uuid, - ExoMediaDrm.Provider exoMediaDrmProvider, + ExoMediaDrm.Provider exoMediaDrmProvider, MediaDrmCallback callback, HashMap keyRequestParameters, boolean multiSession, @@ -474,9 +472,9 @@ public class DefaultDrmSessionManager implements DrmSe @Override @Nullable - public DrmSession acquirePlaceholderSession(Looper playbackLooper, int trackType) { + public DrmSession acquirePlaceholderSession(Looper playbackLooper, int trackType) { assertExpectedPlaybackLooper(playbackLooper); - ExoMediaDrm exoMediaDrm = Assertions.checkNotNull(this.exoMediaDrm); + ExoMediaDrm exoMediaDrm = Assertions.checkNotNull(this.exoMediaDrm); boolean avoidPlaceholderDrmSessions = FrameworkMediaCrypto.class.equals(exoMediaDrm.getExoMediaCryptoType()) && FrameworkMediaCrypto.WORKAROUND_DEVICE_NEEDS_KEYS_TO_CONFIGURE_CODEC; @@ -488,7 +486,7 @@ public class DefaultDrmSessionManager implements DrmSe } maybeCreateMediaDrmHandler(playbackLooper); if (placeholderDrmSession == null) { - DefaultDrmSession placeholderDrmSession = + DefaultDrmSession placeholderDrmSession = createNewDefaultSession( /* schemeDatas= */ Collections.emptyList(), /* isPlaceholderSession= */ true); sessions.add(placeholderDrmSession); @@ -499,7 +497,7 @@ public class DefaultDrmSessionManager implements DrmSe } @Override - public DrmSession acquireSession( + public DrmSession acquireSession( Looper playbackLooper, @Nullable MediaSourceEventDispatcher eventDispatcher, DrmInitData drmInitData) { @@ -512,17 +510,17 @@ public class DefaultDrmSessionManager implements DrmSe if (schemeDatas.isEmpty()) { final MissingSchemeDataException error = new MissingSchemeDataException(uuid); this.eventDispatcher.dispatch(listener -> listener.onDrmSessionManagerError(error)); - return new ErrorStateDrmSession<>(new DrmSessionException(error)); + return new ErrorStateDrmSession(new DrmSessionException(error)); } } - @Nullable DefaultDrmSession session; + @Nullable DefaultDrmSession session; if (!multiSession) { session = noMultiSessionDrmSession; } else { // Only use an existing session if it has matching init data. session = null; - for (DefaultDrmSession existingSession : sessions) { + for (DefaultDrmSession existingSession : sessions) { if (Util.areEqual(existingSession.schemeDatas, schemeDatas)) { session = existingSession; break; @@ -544,7 +542,7 @@ public class DefaultDrmSessionManager implements DrmSe @Override @Nullable - public Class getExoMediaCryptoType(DrmInitData drmInitData) { + public Class getExoMediaCryptoType(DrmInitData drmInitData) { return canAcquireSession(drmInitData) ? Assertions.checkNotNull(exoMediaDrm).getExoMediaCryptoType() : null; @@ -563,12 +561,12 @@ public class DefaultDrmSessionManager implements DrmSe } } - private DefaultDrmSession createNewDefaultSession( + private DefaultDrmSession createNewDefaultSession( @Nullable List schemeDatas, boolean isPlaceholderSession) { Assertions.checkNotNull(exoMediaDrm); // Placeholder sessions should always play clear samples without keys. boolean playClearSamplesWithoutKeys = this.playClearSamplesWithoutKeys | isPlaceholderSession; - return new DefaultDrmSession<>( + return new DefaultDrmSession( uuid, exoMediaDrm, /* provisioningManager= */ provisioningManagerImpl, @@ -585,7 +583,7 @@ public class DefaultDrmSessionManager implements DrmSe loadErrorHandlingPolicy); } - private void onSessionReleased(DefaultDrmSession drmSession) { + private void onSessionReleased(DefaultDrmSession drmSession) { sessions.remove(drmSession); if (placeholderDrmSession == drmSession) { placeholderDrmSession = null; @@ -641,7 +639,7 @@ public class DefaultDrmSessionManager implements DrmSe // The event is not associated with any particular session. return; } - for (DefaultDrmSession session : sessions) { + for (DefaultDrmSession session : sessions) { if (session.hasSessionId(sessionId)) { session.onMediaDrmEvent(msg.what); return; @@ -650,9 +648,9 @@ public class DefaultDrmSessionManager implements DrmSe } } - private class ProvisioningManagerImpl implements DefaultDrmSession.ProvisioningManager { + private class ProvisioningManagerImpl implements DefaultDrmSession.ProvisioningManager { @Override - public void provisionRequired(DefaultDrmSession session) { + public void provisionRequired(DefaultDrmSession session) { if (provisioningSessions.contains(session)) { // The session has already requested provisioning. return; @@ -666,7 +664,7 @@ public class DefaultDrmSessionManager implements DrmSe @Override public void onProvisionCompleted() { - for (DefaultDrmSession session : provisioningSessions) { + for (DefaultDrmSession session : provisioningSessions) { session.onProvisionCompleted(); } provisioningSessions.clear(); @@ -674,22 +672,18 @@ public class DefaultDrmSessionManager implements DrmSe @Override public void onProvisionError(Exception error) { - for (DefaultDrmSession session : provisioningSessions) { + for (DefaultDrmSession session : provisioningSessions) { session.onProvisionError(error); } provisioningSessions.clear(); } } - private class MediaDrmEventListener implements OnEventListener { + private class MediaDrmEventListener implements OnEventListener { @Override public void onEvent( - ExoMediaDrm md, - @Nullable byte[] sessionId, - int event, - int extra, - @Nullable byte[] data) { + ExoMediaDrm md, @Nullable byte[] sessionId, int event, int extra, @Nullable byte[] data) { Assertions.checkNotNull(mediaDrmHandler).obtainMessage(event, sessionId).sendToTarget(); } } 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 950b612f16..3f2aae7b30 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 @@ -25,10 +25,8 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.Map; -/** - * A DRM session. - */ -public interface DrmSession { +/** A DRM session. */ +public interface DrmSession { /** * Acquires {@code newSession} then releases {@code previousSession}. @@ -38,8 +36,8 @@ public interface DrmSession { * eventDispatcher = null}). Null arguments are ignored. Does nothing if {@code previousSession} * and {@code newSession} are the same session. */ - static void replaceSession( - @Nullable DrmSession previousSession, @Nullable DrmSession newSession) { + static void replaceSession( + @Nullable DrmSession previousSession, @Nullable DrmSession newSession) { if (previousSession == newSession) { // Do nothing. return; @@ -106,11 +104,11 @@ public interface DrmSession { DrmSessionException getError(); /** - * Returns a {@link ExoMediaCrypto} for the open session, or null if called before the session has - * been opened or after it's been released. + * Returns an {@link ExoMediaCrypto} for the open session, or null if called before the session + * has been opened or after it's been released. */ @Nullable - T getMediaCrypto(); + ExoMediaCrypto getMediaCrypto(); /** * Returns a map describing the key status for the session, or null if called before the session 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 47ee4bb495..687caf61f9 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 @@ -21,20 +21,18 @@ import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.drm.DrmInitData.SchemeData; import com.google.android.exoplayer2.util.MediaSourceEventDispatcher; -/** - * Manages a DRM session. - */ -public interface DrmSessionManager { +/** Manages a DRM session. */ +public interface DrmSessionManager { /** Returns {@link #DUMMY}. */ @SuppressWarnings("unchecked") - static DrmSessionManager getDummyDrmSessionManager() { - return (DrmSessionManager) DUMMY; + static DrmSessionManager getDummyDrmSessionManager() { + return DUMMY; } /** {@link DrmSessionManager} that supports no DRM schemes. */ - DrmSessionManager DUMMY = - new DrmSessionManager() { + DrmSessionManager DUMMY = + new DrmSessionManager() { @Override public boolean canAcquireSession(DrmInitData drmInitData) { @@ -42,11 +40,11 @@ public interface DrmSessionManager { } @Override - public DrmSession acquireSession( + public DrmSession acquireSession( Looper playbackLooper, @Nullable MediaSourceEventDispatcher eventDispatcher, DrmInitData drmInitData) { - return new ErrorStateDrmSession<>( + return new ErrorStateDrmSession( new DrmSession.DrmSessionException( new UnsupportedDrmException(UnsupportedDrmException.REASON_UNSUPPORTED_SCHEME))); } @@ -99,7 +97,7 @@ public interface DrmSessionManager { * placeholder sessions. */ @Nullable - default DrmSession acquirePlaceholderSession(Looper playbackLooper, int trackType) { + default DrmSession acquirePlaceholderSession(Looper playbackLooper, int trackType) { return null; } @@ -115,7 +113,7 @@ public interface DrmSessionManager { * non-null {@link SchemeData#data}. * @return The DRM session. */ - DrmSession acquireSession( + DrmSession acquireSession( Looper playbackLooper, @Nullable MediaSourceEventDispatcher eventDispatcher, DrmInitData drmInitData); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/DummyExoMediaDrm.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/DummyExoMediaDrm.java index b7e1dc9d62..724a7d2c87 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/DummyExoMediaDrm.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/DummyExoMediaDrm.java @@ -26,26 +26,25 @@ import java.util.Map; /** An {@link ExoMediaDrm} that does not support any protection schemes. */ @RequiresApi(18) -public final class DummyExoMediaDrm implements ExoMediaDrm { +public final class DummyExoMediaDrm implements ExoMediaDrm { /** Returns a new instance. */ - @SuppressWarnings("unchecked") - public static DummyExoMediaDrm getInstance() { - return (DummyExoMediaDrm) new DummyExoMediaDrm<>(); + public static DummyExoMediaDrm getInstance() { + return new DummyExoMediaDrm(); } @Override - public void setOnEventListener(OnEventListener listener) { + public void setOnEventListener(OnEventListener listener) { // Do nothing. } @Override - public void setOnKeyStatusChangeListener(OnKeyStatusChangeListener listener) { + public void setOnKeyStatusChangeListener(OnKeyStatusChangeListener listener) { // Do nothing. } @Override - public void setOnExpirationUpdateListener(OnExpirationUpdateListener listener) { + public void setOnExpirationUpdateListener(OnExpirationUpdateListener listener) { // Do nothing. } @@ -137,14 +136,14 @@ public final class DummyExoMediaDrm implements ExoMedi } @Override - public T createMediaCrypto(byte[] sessionId) { + public ExoMediaCrypto createMediaCrypto(byte[] sessionId) { // Should not be invoked. No session should exist. throw new IllegalStateException(); } @Override @Nullable - public Class getExoMediaCryptoType() { + public Class getExoMediaCryptoType() { // No ExoMediaCrypto type is supported. return null; } 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 d7b33bbc26..ff0a861f4b 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 @@ -21,7 +21,7 @@ import com.google.android.exoplayer2.util.MediaSourceEventDispatcher; import java.util.Map; /** A {@link DrmSession} that's in a terminal error state. */ -public final class ErrorStateDrmSession implements DrmSession { +public final class ErrorStateDrmSession implements DrmSession { private final DrmSessionException error; @@ -47,7 +47,7 @@ public final class ErrorStateDrmSession implements Drm @Override @Nullable - public T getMediaCrypto() { + public ExoMediaCrypto getMediaCrypto() { return null; } 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 0a337798fa..c74d1a1ff5 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 @@ -42,17 +42,17 @@ import java.util.UUID; * new instance does not normally need to call {@link #acquire()}, and must call {@link #release()} * when the instance is no longer required. */ -public interface ExoMediaDrm { +public interface ExoMediaDrm { /** {@link ExoMediaDrm} instances provider. */ - interface Provider { + interface Provider { /** * Returns an {@link ExoMediaDrm} instance with an incremented reference count. When the caller * no longer needs to use the instance, it must call {@link ExoMediaDrm#release()} to decrement * the reference count. */ - ExoMediaDrm acquireExoMediaDrm(UUID uuid); + ExoMediaDrm acquireExoMediaDrm(UUID uuid); } /** @@ -62,17 +62,17 @@ public interface ExoMediaDrm { * instance, and remains responsible for calling {@link ExoMediaDrm#release()} on the instance * when it's no longer being used. */ - final class AppManagedProvider implements Provider { + final class AppManagedProvider implements Provider { - private final ExoMediaDrm exoMediaDrm; + private final ExoMediaDrm exoMediaDrm; /** Creates an instance that provides the given {@link ExoMediaDrm}. */ - public AppManagedProvider(ExoMediaDrm exoMediaDrm) { + public AppManagedProvider(ExoMediaDrm exoMediaDrm) { this.exoMediaDrm = exoMediaDrm; } @Override - public ExoMediaDrm acquireExoMediaDrm(UUID uuid) { + public ExoMediaDrm acquireExoMediaDrm(UUID uuid) { exoMediaDrm.acquire(); return exoMediaDrm; } @@ -108,10 +108,8 @@ public interface ExoMediaDrm { @SuppressWarnings("InlinedApi") int KEY_TYPE_RELEASE = MediaDrm.KEY_TYPE_RELEASE; - /** - * @see android.media.MediaDrm.OnEventListener - */ - interface OnEventListener { + /** @see android.media.MediaDrm.OnEventListener */ + interface OnEventListener { /** * Called when an event occurs that requires the app to be notified * @@ -122,17 +120,15 @@ public interface ExoMediaDrm { * @param data Optional byte array of data that may be associated with the event. */ void onEvent( - ExoMediaDrm mediaDrm, + ExoMediaDrm mediaDrm, @Nullable byte[] sessionId, int event, int extra, @Nullable byte[] data); } - /** - * @see android.media.MediaDrm.OnKeyStatusChangeListener - */ - interface OnKeyStatusChangeListener { + /** @see android.media.MediaDrm.OnKeyStatusChangeListener */ + interface OnKeyStatusChangeListener { /** * Called when the keys in a session change status, such as when the license is renewed or * expires. @@ -143,14 +139,14 @@ public interface ExoMediaDrm { * @param hasNewUsableKey Whether a new key became usable. */ void onKeyStatusChange( - ExoMediaDrm mediaDrm, + ExoMediaDrm mediaDrm, byte[] sessionId, List exoKeyInformation, boolean hasNewUsableKey); } /** @see android.media.MediaDrm.OnExpirationUpdateListener */ - interface OnExpirationUpdateListener { + interface OnExpirationUpdateListener { /** * Called when a session expiration update occurs, to inform the app about the change in @@ -162,8 +158,7 @@ public interface ExoMediaDrm { * milliseconds, relative to the Unix epoch. A time of 0 indicates that the keys never * expire. */ - void onExpirationUpdate( - ExoMediaDrm mediaDrm, byte[] sessionId, long expirationTimeMs); + void onExpirationUpdate(ExoMediaDrm mediaDrm, byte[] sessionId, long expirationTimeMs); } /** @see android.media.MediaDrm.KeyStatus */ @@ -229,18 +224,14 @@ public interface ExoMediaDrm { } - /** - * @see MediaDrm#setOnEventListener(MediaDrm.OnEventListener) - */ - void setOnEventListener(OnEventListener listener); + /** @see MediaDrm#setOnEventListener(MediaDrm.OnEventListener) */ + void setOnEventListener(OnEventListener listener); - /** - * @see MediaDrm#setOnKeyStatusChangeListener(MediaDrm.OnKeyStatusChangeListener, Handler) - */ - void setOnKeyStatusChangeListener(OnKeyStatusChangeListener listener); + /** @see MediaDrm#setOnKeyStatusChangeListener(MediaDrm.OnKeyStatusChangeListener, Handler) */ + void setOnKeyStatusChangeListener(OnKeyStatusChangeListener listener); /** @see MediaDrm#setOnExpirationUpdateListener(MediaDrm.OnExpirationUpdateListener, Handler) */ - void setOnExpirationUpdateListener(OnExpirationUpdateListener listener); + void setOnExpirationUpdateListener(OnExpirationUpdateListener listener); /** @see MediaDrm#openSession() */ byte[] openSession() throws MediaDrmException; @@ -349,12 +340,12 @@ public interface ExoMediaDrm { * @return An object extends {@link ExoMediaCrypto}, using opaque crypto scheme specific data. * @throws MediaCryptoException If the instance can't be created. */ - T createMediaCrypto(byte[] sessionId) throws MediaCryptoException; + ExoMediaCrypto createMediaCrypto(byte[] sessionId) throws MediaCryptoException; /** * Returns the {@link ExoMediaCrypto} type created by {@link #createMediaCrypto(byte[])}, or null * if this instance cannot create any {@link ExoMediaCrypto} instances. */ @Nullable - Class getExoMediaCryptoType(); + Class getExoMediaCryptoType(); } 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 2f5e258e86..93d863ab0f 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 @@ -47,7 +47,7 @@ import java.util.UUID; /** An {@link ExoMediaDrm} implementation that wraps the framework {@link MediaDrm}. */ @TargetApi(23) @RequiresApi(18) -public final class FrameworkMediaDrm implements ExoMediaDrm { +public final class FrameworkMediaDrm implements ExoMediaDrm { private static final String TAG = "FrameworkMediaDrm"; @@ -56,13 +56,13 @@ public final class FrameworkMediaDrm implements ExoMediaDrm DEFAULT_PROVIDER = + public static final Provider DEFAULT_PROVIDER = uuid -> { try { return newInstance(uuid); } catch (UnsupportedDrmException e) { Log.e(TAG, "Failed to instantiate a FrameworkMediaDrm for uuid: " + uuid + "."); - return new DummyExoMediaDrm<>(); + return new DummyExoMediaDrm(); } }; @@ -106,8 +106,7 @@ public final class FrameworkMediaDrm implements ExoMediaDrm listener) { + public void setOnEventListener(ExoMediaDrm.OnEventListener listener) { mediaDrm.setOnEventListener( listener == null ? null @@ -116,8 +115,7 @@ public final class FrameworkMediaDrm implements ExoMediaDrm listener) { + public void setOnKeyStatusChangeListener(ExoMediaDrm.OnKeyStatusChangeListener listener) { if (Util.SDK_INT < 23) { throw new UnsupportedOperationException(); } @@ -137,8 +135,7 @@ public final class FrameworkMediaDrm implements ExoMediaDrm listener) { + public void setOnExpirationUpdateListener(OnExpirationUpdateListener listener) { if (Util.SDK_INT < 23) { throw new UnsupportedOperationException(); } 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 c483bf44c7..d4b42c1ac1 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 @@ -32,12 +32,12 @@ import java.util.UUID; /** Helper class to download, renew and release offline licenses. */ @RequiresApi(18) -public final class OfflineLicenseHelper { +public final class OfflineLicenseHelper { private static final DrmInitData DUMMY_DRM_INIT_DATA = new DrmInitData(); private final ConditionVariable conditionVariable; - private final DefaultDrmSessionManager drmSessionManager; + private final DefaultDrmSessionManager drmSessionManager; private final HandlerThread handlerThread; private final MediaSourceEventDispatcher eventDispatcher; @@ -52,7 +52,7 @@ public final class OfflineLicenseHelper { * events. * @return A new instance which uses Widevine CDM. */ - public static OfflineLicenseHelper newWidevineInstance( + public static OfflineLicenseHelper newWidevineInstance( String defaultLicenseUrl, HttpDataSource.Factory httpDataSourceFactory, MediaSourceEventDispatcher eventDispatcher) { @@ -76,7 +76,7 @@ public final class OfflineLicenseHelper { * events. * @return A new instance which uses Widevine CDM. */ - public static OfflineLicenseHelper newWidevineInstance( + public static OfflineLicenseHelper newWidevineInstance( String defaultLicenseUrl, boolean forceDefaultLicenseUrl, HttpDataSource.Factory httpDataSourceFactory, @@ -105,13 +105,13 @@ public final class OfflineLicenseHelper { * @see DefaultDrmSessionManager.Builder */ @SuppressWarnings("unchecked") - public static OfflineLicenseHelper newWidevineInstance( + public static OfflineLicenseHelper newWidevineInstance( String defaultLicenseUrl, boolean forceDefaultLicenseUrl, HttpDataSource.Factory httpDataSourceFactory, @Nullable Map optionalKeyRequestParameters, MediaSourceEventDispatcher eventDispatcher) { - return new OfflineLicenseHelper<>( + return new OfflineLicenseHelper( new DefaultDrmSessionManager.Builder() .setKeyRequestParameters(optionalKeyRequestParameters) .build( @@ -128,12 +128,11 @@ public final class OfflineLicenseHelper { @SuppressWarnings("unchecked") public OfflineLicenseHelper( UUID uuid, - ExoMediaDrm.Provider mediaDrmProvider, + ExoMediaDrm.Provider mediaDrmProvider, MediaDrmCallback callback, @Nullable Map optionalKeyRequestParameters, MediaSourceEventDispatcher eventDispatcher) { this( - (DefaultDrmSessionManager) new DefaultDrmSessionManager.Builder() .setUuidAndExoMediaDrmProvider(uuid, mediaDrmProvider) .setKeyRequestParameters(optionalKeyRequestParameters) @@ -149,7 +148,7 @@ public final class OfflineLicenseHelper { * events. */ public OfflineLicenseHelper( - DefaultDrmSessionManager defaultDrmSessionManager, + DefaultDrmSessionManager defaultDrmSessionManager, MediaSourceEventDispatcher eventDispatcher) { this.drmSessionManager = defaultDrmSessionManager; this.eventDispatcher = eventDispatcher; @@ -231,7 +230,7 @@ public final class OfflineLicenseHelper { throws DrmSessionException { Assertions.checkNotNull(offlineLicenseKeySetId); drmSessionManager.prepare(); - DrmSession drmSession = + DrmSession drmSession = openBlockingKeyRequest( DefaultDrmSessionManager.MODE_QUERY, offlineLicenseKeySetId, DUMMY_DRM_INIT_DATA); DrmSessionException error = drmSession.getError(); @@ -259,8 +258,8 @@ public final class OfflineLicenseHelper { @Mode int licenseMode, @Nullable byte[] offlineLicenseKeySetId, DrmInitData drmInitData) throws DrmSessionException { drmSessionManager.prepare(); - DrmSession drmSession = openBlockingKeyRequest(licenseMode, offlineLicenseKeySetId, - drmInitData); + DrmSession drmSession = + openBlockingKeyRequest(licenseMode, offlineLicenseKeySetId, drmInitData); DrmSessionException error = drmSession.getError(); byte[] keySetId = drmSession.getOfflineLicenseKeySetId(); drmSession.release(eventDispatcher); @@ -271,11 +270,11 @@ public final class OfflineLicenseHelper { return Assertions.checkNotNull(keySetId); } - private DrmSession openBlockingKeyRequest( + private DrmSession openBlockingKeyRequest( @Mode int licenseMode, @Nullable byte[] offlineLicenseKeySetId, DrmInitData drmInitData) { drmSessionManager.setMode(licenseMode, offlineLicenseKeySetId); conditionVariable.close(); - DrmSession drmSession = + DrmSession drmSession = drmSessionManager.acquireSession(handlerThread.getLooper(), eventDispatcher, drmInitData); // Block current thread until key loading is finished conditionVariable.block(); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/WidevineUtil.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/WidevineUtil.java index 004f873a33..5f60ad690e 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/WidevineUtil.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/WidevineUtil.java @@ -39,8 +39,7 @@ public final class WidevineUtil { * @return A {@link Pair} consisting of the remaining license and playback durations in seconds, * or null if called before the session has been opened or after it's been released. */ - public static @Nullable Pair getLicenseDurationRemainingSec( - DrmSession drmSession) { + public static @Nullable Pair getLicenseDurationRemainingSec(DrmSession drmSession) { Map keyStatus = drmSession.queryKeyStatus(); if (keyStatus == null) { return null; 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 ba14f0e1dd..5db1289669 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 @@ -39,6 +39,7 @@ import com.google.android.exoplayer2.decoder.DecoderCounters; import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.drm.DrmSession; import com.google.android.exoplayer2.drm.DrmSession.DrmSessionException; +import com.google.android.exoplayer2.drm.ExoMediaCrypto; import com.google.android.exoplayer2.drm.FrameworkMediaCrypto; import com.google.android.exoplayer2.mediacodec.MediaCodecUtil.DecoderQueryException; import com.google.android.exoplayer2.source.MediaPeriod; @@ -368,8 +369,8 @@ public abstract class MediaCodecRenderer extends BaseRenderer { @Nullable private Format inputFormat; private Format outputFormat; - @Nullable private DrmSession codecDrmSession; - @Nullable private DrmSession sourceDrmSession; + @Nullable private DrmSession codecDrmSession; + @Nullable private DrmSession sourceDrmSession; @Nullable private MediaCrypto mediaCrypto; private boolean mediaCryptoRequiresSecureDecoder; private long renderTimeLimitMs; @@ -574,9 +575,10 @@ public abstract class MediaCodecRenderer extends BaseRenderer { String mimeType = inputFormat.sampleMimeType; if (codecDrmSession != null) { if (mediaCrypto == null) { - FrameworkMediaCrypto sessionMediaCrypto = codecDrmSession.getMediaCrypto(); + @Nullable + FrameworkMediaCrypto sessionMediaCrypto = getFrameworkMediaCrypto(codecDrmSession); if (sessionMediaCrypto == null) { - DrmSessionException drmError = codecDrmSession.getError(); + @Nullable DrmSessionException drmError = codecDrmSession.getError(); if (drmError != null) { // Continue for now. We may be able to avoid failure if the session recovers, or if a // new input format causes the session to be replaced before it's used. @@ -1146,12 +1148,12 @@ public abstract class MediaCodecRenderer extends BaseRenderer { outputBuffer = null; } - private void setSourceDrmSession(@Nullable DrmSession session) { + private void setSourceDrmSession(@Nullable DrmSession session) { DrmSession.replaceSession(sourceDrmSession, session); sourceDrmSession = session; } - private void setCodecDrmSession(@Nullable DrmSession session) { + private void setCodecDrmSession(@Nullable DrmSession session) { DrmSession.replaceSession(codecDrmSession, session); codecDrmSession = session; } @@ -1357,7 +1359,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer { protected void onInputFormatChanged(FormatHolder formatHolder) throws ExoPlaybackException { waitingForFirstSampleInFormat = true; Format newFormat = Assertions.checkNotNull(formatHolder.format); - setSourceDrmSession((DrmSession) formatHolder.drmSession); + setSourceDrmSession(formatHolder.drmSession); inputFormat = newFormat; if (codec == null) { @@ -1865,6 +1867,47 @@ public abstract class MediaCodecRenderer extends BaseRenderer { return outputStreamOffsetUs; } + /** Returns whether this renderer supports the given {@link Format Format's} DRM scheme. */ + protected static boolean supportsFormatDrm(Format format) { + return format.drmInitData == null + || FrameworkMediaCrypto.class.equals(format.exoMediaCryptoType); + } + + /** + * Returns whether a {@link DrmSession} may require a secure decoder for a given {@link Format}. + * + * @param drmSession The {@link DrmSession}. + * @param format The {@link Format}. + * @return Whether a secure decoder may be required. + */ + private boolean maybeRequiresSecureDecoder(DrmSession drmSession, Format format) + throws ExoPlaybackException { + // MediaCrypto type is checked during track selection. + @Nullable FrameworkMediaCrypto sessionMediaCrypto = getFrameworkMediaCrypto(drmSession); + if (sessionMediaCrypto == null) { + // We'd only expect this to happen if the CDM from which the pending session is obtained needs + // provisioning. This is unlikely to happen (it probably requires a switch from one DRM scheme + // to another, where the new CDM hasn't been used before and needs provisioning). Assume that + // a secure decoder may be required. + return true; + } + if (sessionMediaCrypto.forceAllowInsecureDecoderComponents) { + return false; + } + MediaCrypto mediaCrypto; + try { + mediaCrypto = new MediaCrypto(sessionMediaCrypto.uuid, sessionMediaCrypto.sessionId); + } catch (MediaCryptoException e) { + // This shouldn't happen, but if it does then assume that a secure decoder may be required. + return true; + } + try { + return mediaCrypto.requiresSecureDecoderComponent(format.sampleMimeType); + } finally { + mediaCrypto.release(); + } + } + private void reinitializeCodec() throws ExoPlaybackException { releaseCodec(); maybeInitCodec(); @@ -1885,7 +1928,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer { @RequiresApi(23) private void updateDrmSessionOrReinitializeCodecV23() throws ExoPlaybackException { - @Nullable FrameworkMediaCrypto sessionMediaCrypto = sourceDrmSession.getMediaCrypto(); + @Nullable FrameworkMediaCrypto sessionMediaCrypto = getFrameworkMediaCrypto(sourceDrmSession); if (sessionMediaCrypto == null) { // We'd only expect this to happen if the CDM from which the pending session is obtained needs // provisioning. This is unlikely to happen (it probably requires a switch from one DRM scheme @@ -1919,38 +1962,18 @@ public abstract class MediaCodecRenderer extends BaseRenderer { codecDrainAction = DRAIN_ACTION_NONE; } - /** - * Returns whether a {@link DrmSession} may require a secure decoder for a given {@link Format}. - * - * @param drmSession The {@link DrmSession}. - * @param format The {@link Format}. - * @return Whether a secure decoder may be required. - */ - private static boolean maybeRequiresSecureDecoder( - DrmSession drmSession, Format format) { - @Nullable FrameworkMediaCrypto sessionMediaCrypto = drmSession.getMediaCrypto(); - if (sessionMediaCrypto == null) { - // We'd only expect this to happen if the CDM from which the pending session is obtained needs - // provisioning. This is unlikely to happen (it probably requires a switch from one DRM scheme - // to another, where the new CDM hasn't been used before and needs provisioning). Assume that - // a secure decoder may be required. - return true; - } - if (sessionMediaCrypto.forceAllowInsecureDecoderComponents) { - return false; - } - MediaCrypto mediaCrypto; - try { - mediaCrypto = new MediaCrypto(sessionMediaCrypto.uuid, sessionMediaCrypto.sessionId); - } catch (MediaCryptoException e) { - // This shouldn't happen, but if it does then assume that a secure decoder may be required. - return true; - } - try { - return mediaCrypto.requiresSecureDecoderComponent(format.sampleMimeType); - } finally { - mediaCrypto.release(); + @Nullable + private FrameworkMediaCrypto getFrameworkMediaCrypto(DrmSession drmSession) + throws ExoPlaybackException { + @Nullable ExoMediaCrypto mediaCrypto = drmSession.getMediaCrypto(); + if (mediaCrypto != null && !(mediaCrypto instanceof FrameworkMediaCrypto)) { + // This should not happen if the track went through a supportsFormatDrm() check, during track + // selection. + throw createRendererException( + new IllegalArgumentException("Expecting FrameworkMediaCrypto but found: " + mediaCrypto), + inputFormat); } + return (FrameworkMediaCrypto) mediaCrypto; } private static boolean isMediaCodecException(IllegalStateException error) { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java index 928ffadc4f..01f0bc2838 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java @@ -30,7 +30,6 @@ import com.google.android.exoplayer2.RenderersFactory; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.audio.AudioRendererEventListener; import com.google.android.exoplayer2.drm.DrmSessionManager; -import com.google.android.exoplayer2.drm.FrameworkMediaCrypto; import com.google.android.exoplayer2.source.MediaPeriod; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId; @@ -281,7 +280,7 @@ public final class DownloadHelper { Uri uri, DataSource.Factory dataSourceFactory, RenderersFactory renderersFactory, - @Nullable DrmSessionManager drmSessionManager, + @Nullable DrmSessionManager drmSessionManager, DefaultTrackSelector.Parameters trackSelectorParameters) { return new DownloadHelper( DownloadRequest.TYPE_DASH, @@ -351,7 +350,7 @@ public final class DownloadHelper { Uri uri, DataSource.Factory dataSourceFactory, RenderersFactory renderersFactory, - @Nullable DrmSessionManager drmSessionManager, + @Nullable DrmSessionManager drmSessionManager, DefaultTrackSelector.Parameters trackSelectorParameters) { return new DownloadHelper( DownloadRequest.TYPE_HLS, @@ -421,7 +420,7 @@ public final class DownloadHelper { Uri uri, DataSource.Factory dataSourceFactory, RenderersFactory renderersFactory, - @Nullable DrmSessionManager drmSessionManager, + @Nullable DrmSessionManager drmSessionManager, DefaultTrackSelector.Parameters trackSelectorParameters) { return new DownloadHelper( DownloadRequest.TYPE_SS, @@ -459,7 +458,7 @@ public final class DownloadHelper { public static MediaSource createMediaSource( DownloadRequest downloadRequest, DataSource.Factory dataSourceFactory, - @Nullable DrmSessionManager drmSessionManager) { + @Nullable DrmSessionManager drmSessionManager) { @Nullable Constructor constructor; switch (downloadRequest.type) { case DownloadRequest.TYPE_DASH: @@ -943,7 +942,7 @@ public final class DownloadHelper { @Nullable Constructor constructor, Uri uri, Factory dataSourceFactory, - @Nullable DrmSessionManager drmSessionManager, + @Nullable DrmSessionManager drmSessionManager, @Nullable List streamKeys) { if (constructor == null) { throw new IllegalStateException("Module missing to create media source."); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java index 3ebbd7331f..16f7d5edc9 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java @@ -126,7 +126,7 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { @C.ContentType private final int[] supportedTypes; private final String userAgent; - private DrmSessionManager drmSessionManager; + private DrmSessionManager drmSessionManager; private HttpDataSource.Factory drmHttpDataSourceFactory; private boolean playClearContentWithoutKey; private int[] useDrmSessionsForClearContentTrackTypes; @@ -191,7 +191,7 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { @Override public DefaultMediaSourceFactory setDrmSessionManager( - @Nullable DrmSessionManager drmSessionManager) { + @Nullable DrmSessionManager drmSessionManager) { this.drmSessionManager = drmSessionManager != null ? drmSessionManager @@ -249,7 +249,7 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { // internal methods - private DrmSessionManager createDrmSessionManager(MediaItem mediaItem) { + private DrmSessionManager createDrmSessionManager(MediaItem mediaItem) { Assertions.checkNotNull(mediaItem.playbackProperties); if (mediaItem.playbackProperties.drmConfiguration == null || mediaItem.playbackProperties.drmConfiguration.licenseUri == null diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaSource.java index e86cca294e..66c54b935c 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaSource.java @@ -164,7 +164,7 @@ public final class ExtractorMediaSource extends CompositeMediaSource { /** @deprecated Use {@link ProgressiveMediaSource.Factory#setDrmSessionManager} instead. */ @Deprecated @Override - public Factory setDrmSessionManager(@Nullable DrmSessionManager drmSessionManager) { + public Factory setDrmSessionManager(@Nullable DrmSessionManager drmSessionManager) { throw new UnsupportedOperationException(); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSourceFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSourceFactory.java index c00d23ad6b..da9e2d7349 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSourceFactory.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSourceFactory.java @@ -40,7 +40,7 @@ public interface MediaSourceFactory { * @param drmSessionManager The {@link DrmSessionManager}. * @return This factory, for convenience. */ - MediaSourceFactory setDrmSessionManager(@Nullable DrmSessionManager drmSessionManager); + MediaSourceFactory setDrmSessionManager(@Nullable DrmSessionManager drmSessionManager); /** * Sets an optional {@link LoadErrorHandlingPolicy}. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaPeriod.java b/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaPeriod.java index e88112a74f..598fc32a3b 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaPeriod.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaPeriod.java @@ -97,7 +97,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; private final Uri uri; private final DataSource dataSource; - private final DrmSessionManager drmSessionManager; + private final DrmSessionManager drmSessionManager; private final LoadErrorHandlingPolicy loadErrorHandlingPolicy; private final EventDispatcher eventDispatcher; private final Listener listener; @@ -161,7 +161,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; Uri uri, DataSource dataSource, Extractor[] extractors, - DrmSessionManager drmSessionManager, + DrmSessionManager drmSessionManager, LoadErrorHandlingPolicy loadErrorHandlingPolicy, EventDispatcher eventDispatcher, Listener listener, diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaSource.java index ab608f52c1..d643f653b1 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaSource.java @@ -52,7 +52,7 @@ public final class ProgressiveMediaSource extends BaseMediaSource private final DataSource.Factory dataSourceFactory; private ExtractorsFactory extractorsFactory; - private DrmSessionManager drmSessionManager; + private DrmSessionManager drmSessionManager; private LoadErrorHandlingPolicy loadErrorHandlingPolicy; private int continueLoadingCheckIntervalBytes; @Nullable private String customCacheKey; @@ -156,7 +156,7 @@ public final class ProgressiveMediaSource extends BaseMediaSource * @return This factory, for convenience. */ @Override - public Factory setDrmSessionManager(@Nullable DrmSessionManager drmSessionManager) { + public Factory setDrmSessionManager(@Nullable DrmSessionManager drmSessionManager) { this.drmSessionManager = drmSessionManager != null ? drmSessionManager @@ -211,7 +211,7 @@ public final class ProgressiveMediaSource extends BaseMediaSource private final Uri uri; private final DataSource.Factory dataSourceFactory; private final ExtractorsFactory extractorsFactory; - private final DrmSessionManager drmSessionManager; + private final DrmSessionManager drmSessionManager; private final LoadErrorHandlingPolicy loadableLoadErrorHandlingPolicy; @Nullable private final String customCacheKey; private final int continueLoadingCheckIntervalBytes; @@ -228,7 +228,7 @@ public final class ProgressiveMediaSource extends BaseMediaSource Uri uri, DataSource.Factory dataSourceFactory, ExtractorsFactory extractorsFactory, - DrmSessionManager drmSessionManager, + DrmSessionManager drmSessionManager, LoadErrorHandlingPolicy loadableLoadErrorHandlingPolicy, @Nullable String customCacheKey, int continueLoadingCheckIntervalBytes, diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/SampleQueue.java b/library/core/src/main/java/com/google/android/exoplayer2/source/SampleQueue.java index ccbed81124..db7763c399 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/SampleQueue.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/SampleQueue.java @@ -55,12 +55,12 @@ public class SampleQueue implements TrackOutput { private final SampleDataQueue sampleDataQueue; private final SampleExtrasHolder extrasHolder; - private final DrmSessionManager drmSessionManager; + private final DrmSessionManager drmSessionManager; private final MediaSourceEventDispatcher eventDispatcher; @Nullable private UpstreamFormatChangedListener upstreamFormatChangeListener; @Nullable private Format downstreamFormat; - @Nullable private DrmSession currentDrmSession; + @Nullable private DrmSession currentDrmSession; private int capacity; private int[] sourceIds; @@ -101,7 +101,7 @@ public class SampleQueue implements TrackOutput { */ public SampleQueue( Allocator allocator, - DrmSessionManager drmSessionManager, + DrmSessionManager drmSessionManager, MediaSourceEventDispatcher eventDispatcher) { sampleDataQueue = new SampleDataQueue(allocator); this.drmSessionManager = drmSessionManager; @@ -795,7 +795,7 @@ public class SampleQueue implements TrackOutput { } // Ensure we acquire the new session before releasing the previous one in case the same session // is being used for both DrmInitData. - @Nullable DrmSession previousSession = currentDrmSession; + @Nullable DrmSession previousSession = currentDrmSession; Looper playbackLooper = Assertions.checkNotNull(Looper.myLooper()); currentDrmSession = newDrmInitData != null diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.java b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.java index 6d61cac9f3..19804450ff 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.java @@ -110,7 +110,7 @@ public class ChunkSampleStream implements SampleStream, S Callback> callback, Allocator allocator, long positionUs, - DrmSessionManager drmSessionManager, + DrmSessionManager drmSessionManager, LoadErrorHandlingPolicy loadErrorHandlingPolicy, EventDispatcher eventDispatcher) { this.primaryTrackType = primaryTrackType; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/video/DecoderVideoRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/video/DecoderVideoRenderer.java index 0ab79e8d5d..b48206221c 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/video/DecoderVideoRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/DecoderVideoRenderer.java @@ -105,8 +105,8 @@ public abstract class DecoderVideoRenderer extends BaseRenderer { @Nullable private VideoFrameMetadataListener frameMetadataListener; @C.VideoOutputMode private int outputMode; - @Nullable private DrmSession decoderDrmSession; - @Nullable private DrmSession sourceDrmSession; + @Nullable private DrmSession decoderDrmSession; + @Nullable private DrmSession sourceDrmSession; @ReinitializationState private int decoderReinitializationState; private boolean decoderReceivedBuffers; @@ -379,7 +379,7 @@ public abstract class DecoderVideoRenderer extends BaseRenderer { protected void onInputFormatChanged(FormatHolder formatHolder) throws ExoPlaybackException { waitingForFirstSampleInFormat = true; Format newFormat = Assertions.checkNotNull(formatHolder.format); - setSourceDrmSession((DrmSession) formatHolder.drmSession); + setSourceDrmSession(formatHolder.drmSession); inputFormat = newFormat; if (sourceDrmSession != decoderDrmSession) { @@ -643,12 +643,12 @@ public abstract class DecoderVideoRenderer extends BaseRenderer { // Internal methods. - private void setSourceDrmSession(@Nullable DrmSession session) { + private void setSourceDrmSession(@Nullable DrmSession session) { DrmSession.replaceSession(sourceDrmSession, session); sourceDrmSession = session; } - private void setDecoderDrmSession(@Nullable DrmSession session) { + private void setDecoderDrmSession(@Nullable DrmSession session) { DrmSession.replaceSession(decoderDrmSession, session); decoderDrmSession = session; } @@ -891,7 +891,7 @@ public abstract class DecoderVideoRenderer extends BaseRenderer { } private boolean shouldWaitForKeys(boolean bufferEncrypted) throws ExoPlaybackException { - DrmSession decoderDrmSession = this.decoderDrmSession; + DrmSession decoderDrmSession = this.decoderDrmSession; if (decoderDrmSession == null || (!bufferEncrypted && decoderDrmSession.playClearSamplesWithoutKeys())) { return false; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java index c11ad107e6..cd9cabce34 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java @@ -42,7 +42,6 @@ import com.google.android.exoplayer2.PlayerMessage.Target; import com.google.android.exoplayer2.RendererCapabilities; import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.drm.DrmInitData; -import com.google.android.exoplayer2.drm.FrameworkMediaCrypto; import com.google.android.exoplayer2.mediacodec.MediaCodecDecoderException; import com.google.android.exoplayer2.mediacodec.MediaCodecInfo; import com.google.android.exoplayer2.mediacodec.MediaCodecRenderer; @@ -272,9 +271,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { if (decoderInfos.isEmpty()) { return RendererCapabilities.create(FORMAT_UNSUPPORTED_SUBTYPE); } - boolean supportsFormatDrm = - drmInitData == null || FrameworkMediaCrypto.class.equals(format.exoMediaCryptoType); - if (!supportsFormatDrm) { + if (!supportsFormatDrm(format)) { return RendererCapabilities.create(FORMAT_UNSUPPORTED_DRM); } // Check capabilities for the first decoder in the list, which takes priority. diff --git a/library/core/src/test/java/com/google/android/exoplayer2/drm/OfflineLicenseHelperTest.java b/library/core/src/test/java/com/google/android/exoplayer2/drm/OfflineLicenseHelperTest.java index af0922fa4a..c36c6cff38 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/drm/OfflineLicenseHelperTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/drm/OfflineLicenseHelperTest.java @@ -40,9 +40,9 @@ import org.robolectric.annotation.LooperMode; @LooperMode(LooperMode.Mode.PAUSED) public class OfflineLicenseHelperTest { - private OfflineLicenseHelper offlineLicenseHelper; + private OfflineLicenseHelper offlineLicenseHelper; @Mock private MediaDrmCallback mediaDrmCallback; - @Mock private ExoMediaDrm mediaDrm; + @Mock private ExoMediaDrm mediaDrm; @Before public void setUp() throws Exception { @@ -52,9 +52,9 @@ public class OfflineLicenseHelperTest { .thenReturn( new ExoMediaDrm.KeyRequest(/* data= */ new byte[0], /* licenseServerUrl= */ "")); offlineLicenseHelper = - new OfflineLicenseHelper<>( + new OfflineLicenseHelper( C.WIDEVINE_UUID, - new ExoMediaDrm.AppManagedProvider<>(mediaDrm), + new ExoMediaDrm.AppManagedProvider(mediaDrm), mediaDrmCallback, /* optionalKeyRequestParameters= */ null, new MediaSourceEventDispatcher()); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/source/SampleQueueTest.java b/library/core/src/test/java/com/google/android/exoplayer2/source/SampleQueueTest.java index f9eb243524..5936c204cd 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/source/SampleQueueTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/source/SampleQueueTest.java @@ -35,7 +35,6 @@ import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.drm.DrmInitData; import com.google.android.exoplayer2.drm.DrmSession; import com.google.android.exoplayer2.drm.DrmSessionManager; -import com.google.android.exoplayer2.drm.ExoMediaCrypto; import com.google.android.exoplayer2.extractor.TrackOutput; import com.google.android.exoplayer2.testutil.TestUtil; import com.google.android.exoplayer2.upstream.Allocator; @@ -124,8 +123,8 @@ public final class SampleQueueTest { new TrackOutput.CryptoData(C.CRYPTO_MODE_AES_CTR, new byte[16], 0, 0); private Allocator allocator; - private DrmSessionManager mockDrmSessionManager; - private DrmSession mockDrmSession; + private DrmSessionManager mockDrmSessionManager; + private DrmSession mockDrmSession; private MediaSourceEventDispatcher eventDispatcher; private SampleQueue sampleQueue; private FormatHolder formatHolder; @@ -135,9 +134,8 @@ public final class SampleQueueTest { @SuppressWarnings("unchecked") public void setUp() { allocator = new DefaultAllocator(false, ALLOCATION_SIZE); - mockDrmSessionManager = - (DrmSessionManager) Mockito.mock(DrmSessionManager.class); - mockDrmSession = (DrmSession) Mockito.mock(DrmSession.class); + mockDrmSessionManager = Mockito.mock(DrmSessionManager.class); + mockDrmSession = Mockito.mock(DrmSession.class); when(mockDrmSessionManager.acquireSession( ArgumentMatchers.any(), ArgumentMatchers.any(), ArgumentMatchers.any())) .thenReturn(mockDrmSession); @@ -418,8 +416,7 @@ public final class SampleQueueTest { @SuppressWarnings("unchecked") public void allowPlaceholderSessionPopulatesDrmSession() { when(mockDrmSession.getState()).thenReturn(DrmSession.STATE_OPENED_WITH_KEYS); - DrmSession mockPlaceholderDrmSession = - (DrmSession) Mockito.mock(DrmSession.class); + DrmSession mockPlaceholderDrmSession = Mockito.mock(DrmSession.class); when(mockPlaceholderDrmSession.getState()).thenReturn(DrmSession.STATE_OPENED_WITH_KEYS); when(mockDrmSessionManager.acquirePlaceholderSession( ArgumentMatchers.any(), ArgumentMatchers.anyInt())) @@ -465,8 +462,7 @@ public final class SampleQueueTest { @SuppressWarnings("unchecked") public void trailingCryptoInfoInitializationVectorBytesZeroed() { when(mockDrmSession.getState()).thenReturn(DrmSession.STATE_OPENED_WITH_KEYS); - DrmSession mockPlaceholderDrmSession = - (DrmSession) Mockito.mock(DrmSession.class); + DrmSession mockPlaceholderDrmSession = Mockito.mock(DrmSession.class); when(mockPlaceholderDrmSession.getState()).thenReturn(DrmSession.STATE_OPENED_WITH_KEYS); when(mockDrmSessionManager.acquirePlaceholderSession( ArgumentMatchers.any(), ArgumentMatchers.anyInt())) diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaPeriod.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaPeriod.java index c51a883049..2f2cc26623 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaPeriod.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaPeriod.java @@ -73,7 +73,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; /* package */ final int id; private final DashChunkSource.Factory chunkSourceFactory; @Nullable private final TransferListener transferListener; - private final DrmSessionManager drmSessionManager; + private final DrmSessionManager drmSessionManager; private final LoadErrorHandlingPolicy loadErrorHandlingPolicy; private final long elapsedRealtimeOffsetMs; private final LoaderErrorThrower manifestLoaderErrorThrower; @@ -101,7 +101,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; int periodIndex, DashChunkSource.Factory chunkSourceFactory, @Nullable TransferListener transferListener, - DrmSessionManager drmSessionManager, + DrmSessionManager drmSessionManager, LoadErrorHandlingPolicy loadErrorHandlingPolicy, EventDispatcher eventDispatcher, long elapsedRealtimeOffsetMs, @@ -480,7 +480,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; } private static Pair buildTrackGroups( - DrmSessionManager drmSessionManager, + DrmSessionManager drmSessionManager, List adaptationSets, List eventStreams) { int[][] groupedAdaptationSetIndices = getGroupedAdaptationSetIndices(adaptationSets); @@ -598,7 +598,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; } private static int buildPrimaryAndEmbeddedTrackGroupInfos( - DrmSessionManager drmSessionManager, + DrmSessionManager drmSessionManager, List adaptationSets, int[][] groupedAdaptationSetIndices, int primaryGroupCount, diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java index 05ae0bb819..06bae8a0df 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java @@ -84,7 +84,7 @@ public final class DashMediaSource extends BaseMediaSource { private final DashChunkSource.Factory chunkSourceFactory; @Nullable private final DataSource.Factory manifestDataSourceFactory; - private DrmSessionManager drmSessionManager; + private DrmSessionManager drmSessionManager; private CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory; private LoadErrorHandlingPolicy loadErrorHandlingPolicy; private long livePresentationDelayMs; @@ -154,7 +154,7 @@ public final class DashMediaSource extends BaseMediaSource { * @return This factory, for convenience. */ @Override - public Factory setDrmSessionManager(@Nullable DrmSessionManager drmSessionManager) { + public Factory setDrmSessionManager(@Nullable DrmSessionManager drmSessionManager) { this.drmSessionManager = drmSessionManager != null ? drmSessionManager @@ -388,7 +388,7 @@ public final class DashMediaSource extends BaseMediaSource { private final DataSource.Factory manifestDataSourceFactory; private final DashChunkSource.Factory chunkSourceFactory; private final CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory; - private final DrmSessionManager drmSessionManager; + private final DrmSessionManager drmSessionManager; private final LoadErrorHandlingPolicy loadErrorHandlingPolicy; private final long livePresentationDelayMs; private final boolean livePresentationDelayOverridesManifest; @@ -604,7 +604,7 @@ public final class DashMediaSource extends BaseMediaSource { @Nullable ParsingLoadable.Parser manifestParser, DashChunkSource.Factory chunkSourceFactory, CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory, - DrmSessionManager drmSessionManager, + DrmSessionManager drmSessionManager, LoadErrorHandlingPolicy loadErrorHandlingPolicy, long livePresentationDelayMs, boolean livePresentationDelayOverridesManifest, diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaPeriod.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaPeriod.java index 5b06c74d2a..b6985a836c 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaPeriod.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaPeriod.java @@ -67,7 +67,7 @@ public final class HlsMediaPeriod implements MediaPeriod, HlsSampleStreamWrapper private final HlsPlaylistTracker playlistTracker; private final HlsDataSourceFactory dataSourceFactory; @Nullable private final TransferListener mediaTransferListener; - private final DrmSessionManager drmSessionManager; + private final DrmSessionManager drmSessionManager; private final LoadErrorHandlingPolicy loadErrorHandlingPolicy; private final EventDispatcher eventDispatcher; private final Allocator allocator; @@ -112,7 +112,7 @@ public final class HlsMediaPeriod implements MediaPeriod, HlsSampleStreamWrapper HlsPlaylistTracker playlistTracker, HlsDataSourceFactory dataSourceFactory, @Nullable TransferListener mediaTransferListener, - DrmSessionManager drmSessionManager, + DrmSessionManager drmSessionManager, LoadErrorHandlingPolicy loadErrorHandlingPolicy, EventDispatcher eventDispatcher, Allocator allocator, diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java index cca78d814b..7ddd632c0a 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java @@ -95,7 +95,7 @@ public final class HlsMediaSource extends BaseMediaSource private HlsPlaylistParserFactory playlistParserFactory; private HlsPlaylistTracker.Factory playlistTrackerFactory; private CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory; - private DrmSessionManager drmSessionManager; + private DrmSessionManager drmSessionManager; private LoadErrorHandlingPolicy loadErrorHandlingPolicy; private boolean allowChunklessPreparation; @MetadataType private int metadataType; @@ -290,7 +290,7 @@ public final class HlsMediaSource extends BaseMediaSource * @return This factory, for convenience. */ @Override - public Factory setDrmSessionManager(@Nullable DrmSessionManager drmSessionManager) { + public Factory setDrmSessionManager(@Nullable DrmSessionManager drmSessionManager) { this.drmSessionManager = drmSessionManager != null ? drmSessionManager @@ -382,7 +382,7 @@ public final class HlsMediaSource extends BaseMediaSource private final Uri manifestUri; private final HlsDataSourceFactory dataSourceFactory; private final CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory; - private final DrmSessionManager drmSessionManager; + private final DrmSessionManager drmSessionManager; private final LoadErrorHandlingPolicy loadErrorHandlingPolicy; private final boolean allowChunklessPreparation; private final @MetadataType int metadataType; @@ -397,7 +397,7 @@ public final class HlsMediaSource extends BaseMediaSource HlsDataSourceFactory dataSourceFactory, HlsExtractorFactory extractorFactory, CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory, - DrmSessionManager drmSessionManager, + DrmSessionManager drmSessionManager, LoadErrorHandlingPolicy loadErrorHandlingPolicy, HlsPlaylistTracker playlistTracker, boolean allowChunklessPreparation, diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java index 3a717ec2cd..9a69cbcb18 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java @@ -114,7 +114,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; private final HlsChunkSource chunkSource; private final Allocator allocator; @Nullable private final Format muxedAudioFormat; - private final DrmSessionManager drmSessionManager; + private final DrmSessionManager drmSessionManager; private final LoadErrorHandlingPolicy loadErrorHandlingPolicy; private final Loader loader; private final EventDispatcher eventDispatcher; @@ -190,7 +190,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; Allocator allocator, long positionUs, @Nullable Format muxedAudioFormat, - DrmSessionManager drmSessionManager, + DrmSessionManager drmSessionManager, LoadErrorHandlingPolicy loadErrorHandlingPolicy, EventDispatcher eventDispatcher, @HlsMediaSource.MetadataType int metadataType) { @@ -1349,7 +1349,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; public FormatAdjustingSampleQueue( Allocator allocator, - DrmSessionManager drmSessionManager, + DrmSessionManager drmSessionManager, MediaSourceEventDispatcher eventDispatcher, Map overridingDrmInitData) { super(allocator, drmSessionManager, eventDispatcher); diff --git a/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaPeriod.java b/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaPeriod.java index f7940fed1b..8efff23f43 100644 --- a/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaPeriod.java +++ b/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaPeriod.java @@ -47,7 +47,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; private final SsChunkSource.Factory chunkSourceFactory; @Nullable private final TransferListener transferListener; private final LoaderErrorThrower manifestLoaderErrorThrower; - private final DrmSessionManager drmSessionManager; + private final DrmSessionManager drmSessionManager; private final LoadErrorHandlingPolicy loadErrorHandlingPolicy; private final EventDispatcher eventDispatcher; private final Allocator allocator; @@ -65,7 +65,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; SsChunkSource.Factory chunkSourceFactory, @Nullable TransferListener transferListener, CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory, - DrmSessionManager drmSessionManager, + DrmSessionManager drmSessionManager, LoadErrorHandlingPolicy loadErrorHandlingPolicy, EventDispatcher eventDispatcher, LoaderErrorThrower manifestLoaderErrorThrower, @@ -259,7 +259,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; } private static TrackGroupArray buildTrackGroups( - SsManifest manifest, DrmSessionManager drmSessionManager) { + SsManifest manifest, DrmSessionManager drmSessionManager) { TrackGroup[] trackGroups = new TrackGroup[manifest.streamElements.length]; for (int i = 0; i < manifest.streamElements.length; i++) { Format[] manifestFormats = manifest.streamElements[i].formats; diff --git a/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.java b/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.java index 26a85cb424..7ff6be5077 100644 --- a/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.java +++ b/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.java @@ -72,7 +72,7 @@ public final class SsMediaSource extends BaseMediaSource @Nullable private final DataSource.Factory manifestDataSourceFactory; private CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory; - private DrmSessionManager drmSessionManager; + private DrmSessionManager drmSessionManager; private LoadErrorHandlingPolicy loadErrorHandlingPolicy; private long livePresentationDelayMs; @Nullable private ParsingLoadable.Parser manifestParser; @@ -197,7 +197,7 @@ public final class SsMediaSource extends BaseMediaSource * @return This factory, for convenience. */ @Override - public Factory setDrmSessionManager(@Nullable DrmSessionManager drmSessionManager) { + public Factory setDrmSessionManager(@Nullable DrmSessionManager drmSessionManager) { this.drmSessionManager = drmSessionManager != null ? drmSessionManager @@ -346,7 +346,7 @@ public final class SsMediaSource extends BaseMediaSource private final DataSource.Factory manifestDataSourceFactory; private final SsChunkSource.Factory chunkSourceFactory; private final CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory; - private final DrmSessionManager drmSessionManager; + private final DrmSessionManager drmSessionManager; private final LoadErrorHandlingPolicy loadErrorHandlingPolicy; private final long livePresentationDelayMs; private final EventDispatcher manifestEventDispatcher; @@ -529,7 +529,7 @@ public final class SsMediaSource extends BaseMediaSource @Nullable ParsingLoadable.Parser manifestParser, SsChunkSource.Factory chunkSourceFactory, CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory, - DrmSessionManager drmSessionManager, + DrmSessionManager drmSessionManager, LoadErrorHandlingPolicy loadErrorHandlingPolicy, long livePresentationDelayMs, @Nullable Object tag) { diff --git a/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashTestRunner.java b/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashTestRunner.java index b699fc0469..24469baf75 100644 --- a/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashTestRunner.java +++ b/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashTestRunner.java @@ -29,7 +29,6 @@ import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.decoder.DecoderCounters; import com.google.android.exoplayer2.drm.DefaultDrmSessionManager; import com.google.android.exoplayer2.drm.DrmSessionManager; -import com.google.android.exoplayer2.drm.FrameworkMediaCrypto; import com.google.android.exoplayer2.drm.FrameworkMediaDrm; import com.google.android.exoplayer2.drm.HttpMediaDrmCallback; import com.google.android.exoplayer2.drm.MediaDrmCallback; @@ -256,8 +255,7 @@ import java.util.List; } @Override - protected DrmSessionManager buildDrmSessionManager( - final String userAgent) { + protected DrmSessionManager buildDrmSessionManager(final String userAgent) { if (widevineLicenseUrl == null) { return DrmSessionManager.getDummyDrmSessionManager(); } @@ -265,8 +263,8 @@ import java.util.List; MediaDrmCallback drmCallback = new HttpMediaDrmCallback(widevineLicenseUrl, new DefaultHttpDataSourceFactory(userAgent)); FrameworkMediaDrm frameworkMediaDrm = FrameworkMediaDrm.newInstance(WIDEVINE_UUID); - DefaultDrmSessionManager drmSessionManager = - new DefaultDrmSessionManager<>( + DefaultDrmSessionManager drmSessionManager = + new DefaultDrmSessionManager( C.WIDEVINE_UUID, frameworkMediaDrm, drmCallback, @@ -299,7 +297,7 @@ import java.util.List; @Override protected MediaSource buildSource( - HostActivity host, String userAgent, DrmSessionManager drmSessionManager) { + HostActivity host, String userAgent, DrmSessionManager drmSessionManager) { DataSource.Factory dataSourceFactory = this.dataSourceFactory != null ? this.dataSourceFactory diff --git a/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashWidevineOfflineTest.java b/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashWidevineOfflineTest.java index 286a84bd37..62c5664039 100644 --- a/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashWidevineOfflineTest.java +++ b/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashWidevineOfflineTest.java @@ -27,7 +27,6 @@ import androidx.test.rule.ActivityTestRule; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.drm.DrmInitData; import com.google.android.exoplayer2.drm.DrmSession.DrmSessionException; -import com.google.android.exoplayer2.drm.ExoMediaCrypto; import com.google.android.exoplayer2.drm.OfflineLicenseHelper; import com.google.android.exoplayer2.source.dash.DashUtil; import com.google.android.exoplayer2.source.dash.manifest.DashManifest; @@ -54,7 +53,7 @@ public final class DashWidevineOfflineTest { private DashTestRunner testRunner; private DefaultHttpDataSourceFactory httpDataSourceFactory; - private OfflineLicenseHelper offlineLicenseHelper; + private OfflineLicenseHelper offlineLicenseHelper; private byte[] offlineLicenseKeySetId; @Rule public ActivityTestRule testRule = new ActivityTestRule<>(HostActivity.class); diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java index f95d13ba33..079e07506d 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java @@ -31,7 +31,6 @@ import com.google.android.exoplayer2.analytics.AnalyticsListener; import com.google.android.exoplayer2.audio.DefaultAudioSink; import com.google.android.exoplayer2.decoder.DecoderCounters; import com.google.android.exoplayer2.drm.DrmSessionManager; -import com.google.android.exoplayer2.drm.FrameworkMediaCrypto; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.testutil.HostActivity.HostedTest; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; @@ -142,7 +141,7 @@ public abstract class ExoHostedTest implements AnalyticsListener, HostedTest { pendingSchedule.start(player, trackSelector, surface, actionHandler, /* callback= */ null); pendingSchedule = null; } - DrmSessionManager drmSessionManager = buildDrmSessionManager(userAgent); + DrmSessionManager drmSessionManager = buildDrmSessionManager(userAgent); player.setMediaSource(buildSource(host, Util.getUserAgent(host, userAgent), drmSessionManager)); player.prepare(); } @@ -232,7 +231,7 @@ public abstract class ExoHostedTest implements AnalyticsListener, HostedTest { return true; } - protected DrmSessionManager buildDrmSessionManager(String userAgent) { + protected DrmSessionManager buildDrmSessionManager(String userAgent) { // Do nothing. Interested subclasses may override. return DrmSessionManager.getDummyDrmSessionManager(); } @@ -255,7 +254,7 @@ public abstract class ExoHostedTest implements AnalyticsListener, HostedTest { } protected abstract MediaSource buildSource( - HostActivity host, String userAgent, DrmSessionManager drmSessionManager); + HostActivity host, String userAgent, DrmSessionManager drmSessionManager); protected void onPlayerErrorInternal(ExoPlaybackException error) { // Do nothing. Interested subclasses may override.