Remove generics from DRM components

PiperOrigin-RevId: 301798563
This commit is contained in:
aquilescanta 2020-03-19 13:09:15 +00:00 committed by Oliver Woodman
parent 077e7932bf
commit aa9eb5abc9
39 changed files with 258 additions and 275 deletions

View File

@ -83,6 +83,7 @@
* Add option to inject a custom `DefaultDrmSessionManager` into * Add option to inject a custom `DefaultDrmSessionManager` into
`OfflineLicenseHelper` `OfflineLicenseHelper`
([#7078](https://github.com/google/ExoPlayer/issues/7078)). ([#7078](https://github.com/google/ExoPlayer/issues/7078)).
* Remove generics from DRM components.
* Downloads: Merge downloads in `SegmentDownloader` to improve overall * Downloads: Merge downloads in `SegmentDownloader` to improve overall
download speed ([#5978](https://github.com/google/ExoPlayer/issues/5978)). download speed ([#5978](https://github.com/google/ExoPlayer/issues/5978)).
* DASH: * DASH:

View File

@ -28,7 +28,6 @@ import com.google.android.exoplayer2.Player;
import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.SimpleExoPlayer;
import com.google.android.exoplayer2.drm.DefaultDrmSessionManager; import com.google.android.exoplayer2.drm.DefaultDrmSessionManager;
import com.google.android.exoplayer2.drm.DrmSessionManager; 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.FrameworkMediaDrm;
import com.google.android.exoplayer2.drm.HttpMediaDrmCallback; import com.google.android.exoplayer2.drm.HttpMediaDrmCallback;
import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.MediaSource;
@ -140,7 +139,7 @@ public final class MainActivity extends Activity {
? Assertions.checkNotNull(intent.getData()) ? Assertions.checkNotNull(intent.getData())
: Uri.parse(DEFAULT_MEDIA_URI); : Uri.parse(DEFAULT_MEDIA_URI);
String userAgent = Util.getUserAgent(this, getString(R.string.application_name)); String userAgent = Util.getUserAgent(this, getString(R.string.application_name));
DrmSessionManager<ExoMediaCrypto> drmSessionManager; DrmSessionManager drmSessionManager;
if (Util.SDK_INT >= 18 && intent.hasExtra(DRM_SCHEME_EXTRA)) { if (Util.SDK_INT >= 18 && intent.hasExtra(DRM_SCHEME_EXTRA)) {
String drmScheme = Assertions.checkNotNull(intent.getStringExtra(DRM_SCHEME_EXTRA)); String drmScheme = Assertions.checkNotNull(intent.getStringExtra(DRM_SCHEME_EXTRA));
String drmLicenseUrl = Assertions.checkNotNull(intent.getStringExtra(DRM_LICENSE_URL_EXTRA)); String drmLicenseUrl = Assertions.checkNotNull(intent.getStringExtra(DRM_LICENSE_URL_EXTRA));

View File

@ -32,7 +32,6 @@ import com.google.android.exoplayer2.Player;
import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.SimpleExoPlayer;
import com.google.android.exoplayer2.drm.DefaultDrmSessionManager; import com.google.android.exoplayer2.drm.DefaultDrmSessionManager;
import com.google.android.exoplayer2.drm.DrmSessionManager; 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.FrameworkMediaDrm;
import com.google.android.exoplayer2.drm.HttpMediaDrmCallback; import com.google.android.exoplayer2.drm.HttpMediaDrmCallback;
import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.MediaSource;
@ -185,7 +184,7 @@ public final class MainActivity extends Activity {
? Assertions.checkNotNull(intent.getData()) ? Assertions.checkNotNull(intent.getData())
: Uri.parse(DEFAULT_MEDIA_URI); : Uri.parse(DEFAULT_MEDIA_URI);
String userAgent = Util.getUserAgent(this, getString(R.string.application_name)); String userAgent = Util.getUserAgent(this, getString(R.string.application_name));
DrmSessionManager<ExoMediaCrypto> drmSessionManager; DrmSessionManager drmSessionManager;
if (intent.hasExtra(DRM_SCHEME_EXTRA)) { if (intent.hasExtra(DRM_SCHEME_EXTRA)) {
String drmScheme = Assertions.checkNotNull(intent.getStringExtra(DRM_SCHEME_EXTRA)); String drmScheme = Assertions.checkNotNull(intent.getStringExtra(DRM_SCHEME_EXTRA));
String drmLicenseUrl = Assertions.checkNotNull(intent.getStringExtra(DRM_LICENSE_URL_EXTRA)); String drmLicenseUrl = Assertions.checkNotNull(intent.getStringExtra(DRM_LICENSE_URL_EXTRA));

View File

@ -24,7 +24,7 @@ import com.google.android.exoplayer2.drm.DrmSession;
public final class FormatHolder { public final class FormatHolder {
/** An accompanying context for decrypting samples in the format. */ /** An accompanying context for decrypting samples in the format. */
@Nullable public DrmSession<?> drmSession; @Nullable public DrmSession drmSession;
/** The held {@link Format}. */ /** The held {@link Format}. */
@Nullable public Format format; @Nullable public Format format;

View File

@ -111,8 +111,8 @@ public abstract class DecoderAudioRenderer extends BaseRenderer implements Media
@Nullable private DecoderInputBuffer inputBuffer; @Nullable private DecoderInputBuffer inputBuffer;
@Nullable private SimpleOutputBuffer outputBuffer; @Nullable private SimpleOutputBuffer outputBuffer;
@Nullable private DrmSession<ExoMediaCrypto> decoderDrmSession; @Nullable private DrmSession decoderDrmSession;
@Nullable private DrmSession<ExoMediaCrypto> sourceDrmSession; @Nullable private DrmSession sourceDrmSession;
@ReinitializationState private int decoderReinitializationState; @ReinitializationState private int decoderReinitializationState;
private boolean decoderReceivedBuffers; private boolean decoderReceivedBuffers;
@ -627,12 +627,12 @@ public abstract class DecoderAudioRenderer extends BaseRenderer implements Media
setDecoderDrmSession(null); setDecoderDrmSession(null);
} }
private void setSourceDrmSession(@Nullable DrmSession<ExoMediaCrypto> session) { private void setSourceDrmSession(@Nullable DrmSession session) {
DrmSession.replaceSession(sourceDrmSession, session); DrmSession.replaceSession(sourceDrmSession, session);
sourceDrmSession = session; sourceDrmSession = session;
} }
private void setDecoderDrmSession(@Nullable DrmSession<ExoMediaCrypto> session) { private void setDecoderDrmSession(@Nullable DrmSession session) {
DrmSession.replaceSession(decoderDrmSession, session); DrmSession.replaceSession(decoderDrmSession, session);
decoderDrmSession = session; decoderDrmSession = session;
} }
@ -640,7 +640,7 @@ public abstract class DecoderAudioRenderer extends BaseRenderer implements Media
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private void onInputFormatChanged(FormatHolder formatHolder) throws ExoPlaybackException { private void onInputFormatChanged(FormatHolder formatHolder) throws ExoPlaybackException {
Format newFormat = Assertions.checkNotNull(formatHolder.format); Format newFormat = Assertions.checkNotNull(formatHolder.format);
setSourceDrmSession((DrmSession<ExoMediaCrypto>) formatHolder.drmSession); setSourceDrmSession(formatHolder.drmSession);
Format oldFormat = inputFormat; Format oldFormat = inputFormat;
inputFormat = newFormat; inputFormat = newFormat;

View File

@ -32,7 +32,6 @@ import com.google.android.exoplayer2.PlayerMessage.Target;
import com.google.android.exoplayer2.RendererCapabilities; import com.google.android.exoplayer2.RendererCapabilities;
import com.google.android.exoplayer2.audio.AudioRendererEventListener.EventDispatcher; import com.google.android.exoplayer2.audio.AudioRendererEventListener.EventDispatcher;
import com.google.android.exoplayer2.decoder.DecoderInputBuffer; 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.MediaCodecInfo;
import com.google.android.exoplayer2.mediacodec.MediaCodecRenderer; import com.google.android.exoplayer2.mediacodec.MediaCodecRenderer;
import com.google.android.exoplayer2.mediacodec.MediaCodecSelector; import com.google.android.exoplayer2.mediacodec.MediaCodecSelector;
@ -214,8 +213,7 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
} }
@TunnelingSupport @TunnelingSupport
int tunnelingSupport = Util.SDK_INT >= 21 ? TUNNELING_SUPPORTED : TUNNELING_NOT_SUPPORTED; int tunnelingSupport = Util.SDK_INT >= 21 ? TUNNELING_SUPPORTED : TUNNELING_NOT_SUPPORTED;
boolean supportsFormatDrm = boolean supportsFormatDrm = supportsFormatDrm(format);
format.drmInitData == null || FrameworkMediaCrypto.class.equals(format.exoMediaCryptoType);
if (supportsFormatDrm if (supportsFormatDrm
&& allowPassthrough(format.channelCount, mimeType) && allowPassthrough(format.channelCount, mimeType)
&& mediaCodecSelector.getPassthroughDecoderInfo() != null) { && mediaCodecSelector.getPassthroughDecoderInfo() != null) {

View File

@ -48,7 +48,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
/** A {@link DrmSession} that supports playbacks using {@link ExoMediaDrm}. */ /** A {@link DrmSession} that supports playbacks using {@link ExoMediaDrm}. */
@RequiresApi(18) @RequiresApi(18)
/* package */ class DefaultDrmSession<T extends ExoMediaCrypto> implements DrmSession<T> { /* package */ class DefaultDrmSession implements DrmSession {
/** Thrown when an unexpected exception or error is thrown during provisioning or key requests. */ /** Thrown when an unexpected exception or error is thrown during provisioning or key requests. */
public static final class UnexpectedDrmSessionException extends IOException { public static final class UnexpectedDrmSessionException extends IOException {
@ -59,7 +59,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
} }
/** Manages provisioning requests. */ /** Manages provisioning requests. */
public interface ProvisioningManager<T extends ExoMediaCrypto> { public interface ProvisioningManager {
/** /**
* Called when a session requires provisioning. The manager <em>may</em> call {@link * Called when a session requires provisioning. The manager <em>may</em> call {@link
@ -69,7 +69,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
* *
* @param session The session. * @param session The session.
*/ */
void provisionRequired(DefaultDrmSession<T> session); void provisionRequired(DefaultDrmSession session);
/** /**
* Called by a session when it fails to perform a provisioning operation. * 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. */ /** Callback to be notified when the session is released. */
public interface ReleaseCallback<T extends ExoMediaCrypto> { public interface ReleaseCallback {
/** /**
* Called immediately after releasing session resources. * Called immediately after releasing session resources.
* *
* @param session The session. * @param session The session.
*/ */
void onSessionReleased(DefaultDrmSession<T> session); void onSessionReleased(DefaultDrmSession session);
} }
private static final String TAG = "DefaultDrmSession"; 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. */ /** The DRM scheme datas, or null if this session uses offline keys. */
@Nullable public final List<SchemeData> schemeDatas; @Nullable public final List<SchemeData> schemeDatas;
private final ExoMediaDrm<T> mediaDrm; private final ExoMediaDrm mediaDrm;
private final ProvisioningManager<T> provisioningManager; private final ProvisioningManager provisioningManager;
private final ReleaseCallback<T> releaseCallback; private final ReleaseCallback releaseCallback;
private final @DefaultDrmSessionManager.Mode int mode; private final @DefaultDrmSessionManager.Mode int mode;
private final boolean playClearSamplesWithoutKeys; private final boolean playClearSamplesWithoutKeys;
private final boolean isPlaceholderSession; private final boolean isPlaceholderSession;
@ -120,7 +120,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
private int referenceCount; private int referenceCount;
@Nullable private HandlerThread requestHandlerThread; @Nullable private HandlerThread requestHandlerThread;
@Nullable private RequestHandler requestHandler; @Nullable private RequestHandler requestHandler;
@Nullable private T mediaCrypto; @Nullable private ExoMediaCrypto mediaCrypto;
@Nullable private DrmSessionException lastException; @Nullable private DrmSessionException lastException;
@Nullable private byte[] sessionId; @Nullable private byte[] sessionId;
private byte @MonotonicNonNull [] offlineLicenseKeySetId; private byte @MonotonicNonNull [] offlineLicenseKeySetId;
@ -150,9 +150,9 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
*/ */
public DefaultDrmSession( public DefaultDrmSession(
UUID uuid, UUID uuid,
ExoMediaDrm<T> mediaDrm, ExoMediaDrm mediaDrm,
ProvisioningManager<T> provisioningManager, ProvisioningManager provisioningManager,
ReleaseCallback<T> releaseCallback, ReleaseCallback releaseCallback,
@Nullable List<SchemeData> schemeDatas, @Nullable List<SchemeData> schemeDatas,
@DefaultDrmSessionManager.Mode int mode, @DefaultDrmSessionManager.Mode int mode,
boolean playClearSamplesWithoutKeys, boolean playClearSamplesWithoutKeys,
@ -242,7 +242,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
} }
@Override @Override
public final @Nullable T getMediaCrypto() { public final @Nullable ExoMediaCrypto getMediaCrypto() {
return mediaCrypto; return mediaCrypto;
} }

View File

@ -45,7 +45,7 @@ import java.util.UUID;
/** A {@link DrmSessionManager} that supports playbacks using {@link ExoMediaDrm}. */ /** A {@link DrmSessionManager} that supports playbacks using {@link ExoMediaDrm}. */
@RequiresApi(18) @RequiresApi(18)
public class DefaultDrmSessionManager<T extends ExoMediaCrypto> implements DrmSessionManager<T> { public class DefaultDrmSessionManager implements DrmSessionManager {
/** /**
* Builder for {@link DefaultDrmSessionManager} instances. * Builder for {@link DefaultDrmSessionManager} instances.
@ -56,7 +56,7 @@ public class DefaultDrmSessionManager<T extends ExoMediaCrypto> implements DrmSe
private final HashMap<String, String> keyRequestParameters; private final HashMap<String, String> keyRequestParameters;
private UUID uuid; private UUID uuid;
private ExoMediaDrm.Provider<ExoMediaCrypto> exoMediaDrmProvider; private ExoMediaDrm.Provider exoMediaDrmProvider;
private boolean multiSession; private boolean multiSession;
private int[] useDrmSessionsForClearContentTrackTypes; private int[] useDrmSessionsForClearContentTrackTypes;
private boolean playClearSamplesWithoutKeys; private boolean playClearSamplesWithoutKeys;
@ -77,11 +77,10 @@ public class DefaultDrmSessionManager<T extends ExoMediaCrypto> implements DrmSe
* DefaultLoadErrorHandlingPolicy}. * DefaultLoadErrorHandlingPolicy}.
* </ul> * </ul>
*/ */
@SuppressWarnings("unchecked")
public Builder() { public Builder() {
keyRequestParameters = new HashMap<>(); keyRequestParameters = new HashMap<>();
uuid = C.WIDEVINE_UUID; uuid = C.WIDEVINE_UUID;
exoMediaDrmProvider = (ExoMediaDrm.Provider) FrameworkMediaDrm.DEFAULT_PROVIDER; exoMediaDrmProvider = FrameworkMediaDrm.DEFAULT_PROVIDER;
loadErrorHandlingPolicy = new DefaultLoadErrorHandlingPolicy(); loadErrorHandlingPolicy = new DefaultLoadErrorHandlingPolicy();
useDrmSessionsForClearContentTrackTypes = new int[0]; useDrmSessionsForClearContentTrackTypes = new int[0];
} }
@ -111,7 +110,6 @@ public class DefaultDrmSessionManager<T extends ExoMediaCrypto> implements DrmSe
* @param exoMediaDrmProvider The {@link ExoMediaDrm.Provider}. * @param exoMediaDrmProvider The {@link ExoMediaDrm.Provider}.
* @return This builder. * @return This builder.
*/ */
@SuppressWarnings({"rawtypes", "unchecked"})
public Builder setUuidAndExoMediaDrmProvider( public Builder setUuidAndExoMediaDrmProvider(
UUID uuid, ExoMediaDrm.Provider exoMediaDrmProvider) { UUID uuid, ExoMediaDrm.Provider exoMediaDrmProvider) {
this.uuid = Assertions.checkNotNull(uuid); this.uuid = Assertions.checkNotNull(uuid);
@ -184,8 +182,8 @@ public class DefaultDrmSessionManager<T extends ExoMediaCrypto> implements DrmSe
} }
/** Builds a {@link DefaultDrmSessionManager} instance. */ /** Builds a {@link DefaultDrmSessionManager} instance. */
public DefaultDrmSessionManager<ExoMediaCrypto> build(MediaDrmCallback mediaDrmCallback) { public DefaultDrmSessionManager build(MediaDrmCallback mediaDrmCallback) {
return new DefaultDrmSessionManager<>( return new DefaultDrmSessionManager(
uuid, uuid,
exoMediaDrmProvider, exoMediaDrmProvider,
mediaDrmCallback, mediaDrmCallback,
@ -239,7 +237,7 @@ public class DefaultDrmSessionManager<T extends ExoMediaCrypto> implements DrmSe
private static final String TAG = "DefaultDrmSessionMgr"; private static final String TAG = "DefaultDrmSessionMgr";
private final UUID uuid; private final UUID uuid;
private final ExoMediaDrm.Provider<T> exoMediaDrmProvider; private final ExoMediaDrm.Provider exoMediaDrmProvider;
private final MediaDrmCallback callback; private final MediaDrmCallback callback;
private final HashMap<String, String> keyRequestParameters; private final HashMap<String, String> keyRequestParameters;
private final EventDispatcher<DrmSessionEventListener> eventDispatcher; private final EventDispatcher<DrmSessionEventListener> eventDispatcher;
@ -249,13 +247,13 @@ public class DefaultDrmSessionManager<T extends ExoMediaCrypto> implements DrmSe
private final ProvisioningManagerImpl provisioningManagerImpl; private final ProvisioningManagerImpl provisioningManagerImpl;
private final LoadErrorHandlingPolicy loadErrorHandlingPolicy; private final LoadErrorHandlingPolicy loadErrorHandlingPolicy;
private final List<DefaultDrmSession<T>> sessions; private final List<DefaultDrmSession> sessions;
private final List<DefaultDrmSession<T>> provisioningSessions; private final List<DefaultDrmSession> provisioningSessions;
private int prepareCallsCount; private int prepareCallsCount;
@Nullable private ExoMediaDrm<T> exoMediaDrm; @Nullable private ExoMediaDrm exoMediaDrm;
@Nullable private DefaultDrmSession<T> placeholderDrmSession; @Nullable private DefaultDrmSession placeholderDrmSession;
@Nullable private DefaultDrmSession<T> noMultiSessionDrmSession; @Nullable private DefaultDrmSession noMultiSessionDrmSession;
@Nullable private Looper playbackLooper; @Nullable private Looper playbackLooper;
private int mode; private int mode;
@Nullable private byte[] offlineLicenseKeySetId; @Nullable private byte[] offlineLicenseKeySetId;
@ -274,7 +272,7 @@ public class DefaultDrmSessionManager<T extends ExoMediaCrypto> implements DrmSe
@Deprecated @Deprecated
public DefaultDrmSessionManager( public DefaultDrmSessionManager(
UUID uuid, UUID uuid,
ExoMediaDrm<T> exoMediaDrm, ExoMediaDrm exoMediaDrm,
MediaDrmCallback callback, MediaDrmCallback callback,
@Nullable HashMap<String, String> keyRequestParameters) { @Nullable HashMap<String, String> keyRequestParameters) {
this( this(
@ -299,7 +297,7 @@ public class DefaultDrmSessionManager<T extends ExoMediaCrypto> implements DrmSe
@Deprecated @Deprecated
public DefaultDrmSessionManager( public DefaultDrmSessionManager(
UUID uuid, UUID uuid,
ExoMediaDrm<T> exoMediaDrm, ExoMediaDrm exoMediaDrm,
MediaDrmCallback callback, MediaDrmCallback callback,
@Nullable HashMap<String, String> keyRequestParameters, @Nullable HashMap<String, String> keyRequestParameters,
boolean multiSession) { boolean multiSession) {
@ -327,14 +325,14 @@ public class DefaultDrmSessionManager<T extends ExoMediaCrypto> implements DrmSe
@Deprecated @Deprecated
public DefaultDrmSessionManager( public DefaultDrmSessionManager(
UUID uuid, UUID uuid,
ExoMediaDrm<T> exoMediaDrm, ExoMediaDrm exoMediaDrm,
MediaDrmCallback callback, MediaDrmCallback callback,
@Nullable HashMap<String, String> keyRequestParameters, @Nullable HashMap<String, String> keyRequestParameters,
boolean multiSession, boolean multiSession,
int initialDrmRequestRetryCount) { int initialDrmRequestRetryCount) {
this( this(
uuid, uuid,
new ExoMediaDrm.AppManagedProvider<>(exoMediaDrm), new ExoMediaDrm.AppManagedProvider(exoMediaDrm),
callback, callback,
keyRequestParameters == null ? new HashMap<>() : keyRequestParameters, keyRequestParameters == null ? new HashMap<>() : keyRequestParameters,
multiSession, multiSession,
@ -345,7 +343,7 @@ public class DefaultDrmSessionManager<T extends ExoMediaCrypto> implements DrmSe
private DefaultDrmSessionManager( private DefaultDrmSessionManager(
UUID uuid, UUID uuid,
ExoMediaDrm.Provider<T> exoMediaDrmProvider, ExoMediaDrm.Provider exoMediaDrmProvider,
MediaDrmCallback callback, MediaDrmCallback callback,
HashMap<String, String> keyRequestParameters, HashMap<String, String> keyRequestParameters,
boolean multiSession, boolean multiSession,
@ -474,9 +472,9 @@ public class DefaultDrmSessionManager<T extends ExoMediaCrypto> implements DrmSe
@Override @Override
@Nullable @Nullable
public DrmSession<T> acquirePlaceholderSession(Looper playbackLooper, int trackType) { public DrmSession acquirePlaceholderSession(Looper playbackLooper, int trackType) {
assertExpectedPlaybackLooper(playbackLooper); assertExpectedPlaybackLooper(playbackLooper);
ExoMediaDrm<T> exoMediaDrm = Assertions.checkNotNull(this.exoMediaDrm); ExoMediaDrm exoMediaDrm = Assertions.checkNotNull(this.exoMediaDrm);
boolean avoidPlaceholderDrmSessions = boolean avoidPlaceholderDrmSessions =
FrameworkMediaCrypto.class.equals(exoMediaDrm.getExoMediaCryptoType()) FrameworkMediaCrypto.class.equals(exoMediaDrm.getExoMediaCryptoType())
&& FrameworkMediaCrypto.WORKAROUND_DEVICE_NEEDS_KEYS_TO_CONFIGURE_CODEC; && FrameworkMediaCrypto.WORKAROUND_DEVICE_NEEDS_KEYS_TO_CONFIGURE_CODEC;
@ -488,7 +486,7 @@ public class DefaultDrmSessionManager<T extends ExoMediaCrypto> implements DrmSe
} }
maybeCreateMediaDrmHandler(playbackLooper); maybeCreateMediaDrmHandler(playbackLooper);
if (placeholderDrmSession == null) { if (placeholderDrmSession == null) {
DefaultDrmSession<T> placeholderDrmSession = DefaultDrmSession placeholderDrmSession =
createNewDefaultSession( createNewDefaultSession(
/* schemeDatas= */ Collections.emptyList(), /* isPlaceholderSession= */ true); /* schemeDatas= */ Collections.emptyList(), /* isPlaceholderSession= */ true);
sessions.add(placeholderDrmSession); sessions.add(placeholderDrmSession);
@ -499,7 +497,7 @@ public class DefaultDrmSessionManager<T extends ExoMediaCrypto> implements DrmSe
} }
@Override @Override
public DrmSession<T> acquireSession( public DrmSession acquireSession(
Looper playbackLooper, Looper playbackLooper,
@Nullable MediaSourceEventDispatcher eventDispatcher, @Nullable MediaSourceEventDispatcher eventDispatcher,
DrmInitData drmInitData) { DrmInitData drmInitData) {
@ -512,17 +510,17 @@ public class DefaultDrmSessionManager<T extends ExoMediaCrypto> implements DrmSe
if (schemeDatas.isEmpty()) { if (schemeDatas.isEmpty()) {
final MissingSchemeDataException error = new MissingSchemeDataException(uuid); final MissingSchemeDataException error = new MissingSchemeDataException(uuid);
this.eventDispatcher.dispatch(listener -> listener.onDrmSessionManagerError(error)); this.eventDispatcher.dispatch(listener -> listener.onDrmSessionManagerError(error));
return new ErrorStateDrmSession<>(new DrmSessionException(error)); return new ErrorStateDrmSession(new DrmSessionException(error));
} }
} }
@Nullable DefaultDrmSession<T> session; @Nullable DefaultDrmSession session;
if (!multiSession) { if (!multiSession) {
session = noMultiSessionDrmSession; session = noMultiSessionDrmSession;
} else { } else {
// Only use an existing session if it has matching init data. // Only use an existing session if it has matching init data.
session = null; session = null;
for (DefaultDrmSession<T> existingSession : sessions) { for (DefaultDrmSession existingSession : sessions) {
if (Util.areEqual(existingSession.schemeDatas, schemeDatas)) { if (Util.areEqual(existingSession.schemeDatas, schemeDatas)) {
session = existingSession; session = existingSession;
break; break;
@ -544,7 +542,7 @@ public class DefaultDrmSessionManager<T extends ExoMediaCrypto> implements DrmSe
@Override @Override
@Nullable @Nullable
public Class<T> getExoMediaCryptoType(DrmInitData drmInitData) { public Class<? extends ExoMediaCrypto> getExoMediaCryptoType(DrmInitData drmInitData) {
return canAcquireSession(drmInitData) return canAcquireSession(drmInitData)
? Assertions.checkNotNull(exoMediaDrm).getExoMediaCryptoType() ? Assertions.checkNotNull(exoMediaDrm).getExoMediaCryptoType()
: null; : null;
@ -563,12 +561,12 @@ public class DefaultDrmSessionManager<T extends ExoMediaCrypto> implements DrmSe
} }
} }
private DefaultDrmSession<T> createNewDefaultSession( private DefaultDrmSession createNewDefaultSession(
@Nullable List<SchemeData> schemeDatas, boolean isPlaceholderSession) { @Nullable List<SchemeData> schemeDatas, boolean isPlaceholderSession) {
Assertions.checkNotNull(exoMediaDrm); Assertions.checkNotNull(exoMediaDrm);
// Placeholder sessions should always play clear samples without keys. // Placeholder sessions should always play clear samples without keys.
boolean playClearSamplesWithoutKeys = this.playClearSamplesWithoutKeys | isPlaceholderSession; boolean playClearSamplesWithoutKeys = this.playClearSamplesWithoutKeys | isPlaceholderSession;
return new DefaultDrmSession<>( return new DefaultDrmSession(
uuid, uuid,
exoMediaDrm, exoMediaDrm,
/* provisioningManager= */ provisioningManagerImpl, /* provisioningManager= */ provisioningManagerImpl,
@ -585,7 +583,7 @@ public class DefaultDrmSessionManager<T extends ExoMediaCrypto> implements DrmSe
loadErrorHandlingPolicy); loadErrorHandlingPolicy);
} }
private void onSessionReleased(DefaultDrmSession<T> drmSession) { private void onSessionReleased(DefaultDrmSession drmSession) {
sessions.remove(drmSession); sessions.remove(drmSession);
if (placeholderDrmSession == drmSession) { if (placeholderDrmSession == drmSession) {
placeholderDrmSession = null; placeholderDrmSession = null;
@ -641,7 +639,7 @@ public class DefaultDrmSessionManager<T extends ExoMediaCrypto> implements DrmSe
// The event is not associated with any particular session. // The event is not associated with any particular session.
return; return;
} }
for (DefaultDrmSession<T> session : sessions) { for (DefaultDrmSession session : sessions) {
if (session.hasSessionId(sessionId)) { if (session.hasSessionId(sessionId)) {
session.onMediaDrmEvent(msg.what); session.onMediaDrmEvent(msg.what);
return; return;
@ -650,9 +648,9 @@ public class DefaultDrmSessionManager<T extends ExoMediaCrypto> implements DrmSe
} }
} }
private class ProvisioningManagerImpl implements DefaultDrmSession.ProvisioningManager<T> { private class ProvisioningManagerImpl implements DefaultDrmSession.ProvisioningManager {
@Override @Override
public void provisionRequired(DefaultDrmSession<T> session) { public void provisionRequired(DefaultDrmSession session) {
if (provisioningSessions.contains(session)) { if (provisioningSessions.contains(session)) {
// The session has already requested provisioning. // The session has already requested provisioning.
return; return;
@ -666,7 +664,7 @@ public class DefaultDrmSessionManager<T extends ExoMediaCrypto> implements DrmSe
@Override @Override
public void onProvisionCompleted() { public void onProvisionCompleted() {
for (DefaultDrmSession<T> session : provisioningSessions) { for (DefaultDrmSession session : provisioningSessions) {
session.onProvisionCompleted(); session.onProvisionCompleted();
} }
provisioningSessions.clear(); provisioningSessions.clear();
@ -674,22 +672,18 @@ public class DefaultDrmSessionManager<T extends ExoMediaCrypto> implements DrmSe
@Override @Override
public void onProvisionError(Exception error) { public void onProvisionError(Exception error) {
for (DefaultDrmSession<T> session : provisioningSessions) { for (DefaultDrmSession session : provisioningSessions) {
session.onProvisionError(error); session.onProvisionError(error);
} }
provisioningSessions.clear(); provisioningSessions.clear();
} }
} }
private class MediaDrmEventListener implements OnEventListener<T> { private class MediaDrmEventListener implements OnEventListener {
@Override @Override
public void onEvent( public void onEvent(
ExoMediaDrm<? extends T> md, ExoMediaDrm md, @Nullable byte[] sessionId, int event, int extra, @Nullable byte[] data) {
@Nullable byte[] sessionId,
int event,
int extra,
@Nullable byte[] data) {
Assertions.checkNotNull(mediaDrmHandler).obtainMessage(event, sessionId).sendToTarget(); Assertions.checkNotNull(mediaDrmHandler).obtainMessage(event, sessionId).sendToTarget();
} }
} }

View File

@ -25,10 +25,8 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
import java.util.Map; import java.util.Map;
/** /** A DRM session. */
* A DRM session. public interface DrmSession {
*/
public interface DrmSession<T extends ExoMediaCrypto> {
/** /**
* Acquires {@code newSession} then releases {@code previousSession}. * Acquires {@code newSession} then releases {@code previousSession}.
@ -38,8 +36,8 @@ public interface DrmSession<T extends ExoMediaCrypto> {
* eventDispatcher = null}). Null arguments are ignored. Does nothing if {@code previousSession} * eventDispatcher = null}). Null arguments are ignored. Does nothing if {@code previousSession}
* and {@code newSession} are the same session. * and {@code newSession} are the same session.
*/ */
static <T extends ExoMediaCrypto> void replaceSession( static void replaceSession(
@Nullable DrmSession<T> previousSession, @Nullable DrmSession<T> newSession) { @Nullable DrmSession previousSession, @Nullable DrmSession newSession) {
if (previousSession == newSession) { if (previousSession == newSession) {
// Do nothing. // Do nothing.
return; return;
@ -106,11 +104,11 @@ public interface DrmSession<T extends ExoMediaCrypto> {
DrmSessionException getError(); DrmSessionException getError();
/** /**
* Returns a {@link ExoMediaCrypto} for the open session, or null if called before the session has * Returns an {@link ExoMediaCrypto} for the open session, or null if called before the session
* been opened or after it's been released. * has been opened or after it's been released.
*/ */
@Nullable @Nullable
T getMediaCrypto(); ExoMediaCrypto getMediaCrypto();
/** /**
* Returns a map describing the key status for the session, or null if called before the session * Returns a map describing the key status for the session, or null if called before the session

View File

@ -21,20 +21,18 @@ import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.drm.DrmInitData.SchemeData; import com.google.android.exoplayer2.drm.DrmInitData.SchemeData;
import com.google.android.exoplayer2.util.MediaSourceEventDispatcher; import com.google.android.exoplayer2.util.MediaSourceEventDispatcher;
/** /** Manages a DRM session. */
* Manages a DRM session. public interface DrmSessionManager {
*/
public interface DrmSessionManager<T extends ExoMediaCrypto> {
/** Returns {@link #DUMMY}. */ /** Returns {@link #DUMMY}. */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
static <T extends ExoMediaCrypto> DrmSessionManager<T> getDummyDrmSessionManager() { static DrmSessionManager getDummyDrmSessionManager() {
return (DrmSessionManager<T>) DUMMY; return DUMMY;
} }
/** {@link DrmSessionManager} that supports no DRM schemes. */ /** {@link DrmSessionManager} that supports no DRM schemes. */
DrmSessionManager<ExoMediaCrypto> DUMMY = DrmSessionManager DUMMY =
new DrmSessionManager<ExoMediaCrypto>() { new DrmSessionManager() {
@Override @Override
public boolean canAcquireSession(DrmInitData drmInitData) { public boolean canAcquireSession(DrmInitData drmInitData) {
@ -42,11 +40,11 @@ public interface DrmSessionManager<T extends ExoMediaCrypto> {
} }
@Override @Override
public DrmSession<ExoMediaCrypto> acquireSession( public DrmSession acquireSession(
Looper playbackLooper, Looper playbackLooper,
@Nullable MediaSourceEventDispatcher eventDispatcher, @Nullable MediaSourceEventDispatcher eventDispatcher,
DrmInitData drmInitData) { DrmInitData drmInitData) {
return new ErrorStateDrmSession<>( return new ErrorStateDrmSession(
new DrmSession.DrmSessionException( new DrmSession.DrmSessionException(
new UnsupportedDrmException(UnsupportedDrmException.REASON_UNSUPPORTED_SCHEME))); new UnsupportedDrmException(UnsupportedDrmException.REASON_UNSUPPORTED_SCHEME)));
} }
@ -99,7 +97,7 @@ public interface DrmSessionManager<T extends ExoMediaCrypto> {
* placeholder sessions. * placeholder sessions.
*/ */
@Nullable @Nullable
default DrmSession<T> acquirePlaceholderSession(Looper playbackLooper, int trackType) { default DrmSession acquirePlaceholderSession(Looper playbackLooper, int trackType) {
return null; return null;
} }
@ -115,7 +113,7 @@ public interface DrmSessionManager<T extends ExoMediaCrypto> {
* non-null {@link SchemeData#data}. * non-null {@link SchemeData#data}.
* @return The DRM session. * @return The DRM session.
*/ */
DrmSession<T> acquireSession( DrmSession acquireSession(
Looper playbackLooper, Looper playbackLooper,
@Nullable MediaSourceEventDispatcher eventDispatcher, @Nullable MediaSourceEventDispatcher eventDispatcher,
DrmInitData drmInitData); DrmInitData drmInitData);

View File

@ -26,26 +26,25 @@ import java.util.Map;
/** An {@link ExoMediaDrm} that does not support any protection schemes. */ /** An {@link ExoMediaDrm} that does not support any protection schemes. */
@RequiresApi(18) @RequiresApi(18)
public final class DummyExoMediaDrm<T extends ExoMediaCrypto> implements ExoMediaDrm<T> { public final class DummyExoMediaDrm implements ExoMediaDrm {
/** Returns a new instance. */ /** Returns a new instance. */
@SuppressWarnings("unchecked") public static DummyExoMediaDrm getInstance() {
public static <T extends ExoMediaCrypto> DummyExoMediaDrm<T> getInstance() { return new DummyExoMediaDrm();
return (DummyExoMediaDrm<T>) new DummyExoMediaDrm<>();
} }
@Override @Override
public void setOnEventListener(OnEventListener<? super T> listener) { public void setOnEventListener(OnEventListener listener) {
// Do nothing. // Do nothing.
} }
@Override @Override
public void setOnKeyStatusChangeListener(OnKeyStatusChangeListener<? super T> listener) { public void setOnKeyStatusChangeListener(OnKeyStatusChangeListener listener) {
// Do nothing. // Do nothing.
} }
@Override @Override
public void setOnExpirationUpdateListener(OnExpirationUpdateListener<? super T> listener) { public void setOnExpirationUpdateListener(OnExpirationUpdateListener listener) {
// Do nothing. // Do nothing.
} }
@ -137,14 +136,14 @@ public final class DummyExoMediaDrm<T extends ExoMediaCrypto> implements ExoMedi
} }
@Override @Override
public T createMediaCrypto(byte[] sessionId) { public ExoMediaCrypto createMediaCrypto(byte[] sessionId) {
// Should not be invoked. No session should exist. // Should not be invoked. No session should exist.
throw new IllegalStateException(); throw new IllegalStateException();
} }
@Override @Override
@Nullable @Nullable
public Class<T> getExoMediaCryptoType() { public Class<ExoMediaCrypto> getExoMediaCryptoType() {
// No ExoMediaCrypto type is supported. // No ExoMediaCrypto type is supported.
return null; return null;
} }

View File

@ -21,7 +21,7 @@ import com.google.android.exoplayer2.util.MediaSourceEventDispatcher;
import java.util.Map; import java.util.Map;
/** A {@link DrmSession} that's in a terminal error state. */ /** A {@link DrmSession} that's in a terminal error state. */
public final class ErrorStateDrmSession<T extends ExoMediaCrypto> implements DrmSession<T> { public final class ErrorStateDrmSession implements DrmSession {
private final DrmSessionException error; private final DrmSessionException error;
@ -47,7 +47,7 @@ public final class ErrorStateDrmSession<T extends ExoMediaCrypto> implements Drm
@Override @Override
@Nullable @Nullable
public T getMediaCrypto() { public ExoMediaCrypto getMediaCrypto() {
return null; return null;
} }

View File

@ -42,17 +42,17 @@ import java.util.UUID;
* new instance does not normally need to call {@link #acquire()}, and must call {@link #release()} * new instance does not normally need to call {@link #acquire()}, and must call {@link #release()}
* when the instance is no longer required. * when the instance is no longer required.
*/ */
public interface ExoMediaDrm<T extends ExoMediaCrypto> { public interface ExoMediaDrm {
/** {@link ExoMediaDrm} instances provider. */ /** {@link ExoMediaDrm} instances provider. */
interface Provider<T extends ExoMediaCrypto> { interface Provider {
/** /**
* Returns an {@link ExoMediaDrm} instance with an incremented reference count. When the caller * 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 * no longer needs to use the instance, it must call {@link ExoMediaDrm#release()} to decrement
* the reference count. * the reference count.
*/ */
ExoMediaDrm<T> acquireExoMediaDrm(UUID uuid); ExoMediaDrm acquireExoMediaDrm(UUID uuid);
} }
/** /**
@ -62,17 +62,17 @@ public interface ExoMediaDrm<T extends ExoMediaCrypto> {
* instance, and remains responsible for calling {@link ExoMediaDrm#release()} on the instance * instance, and remains responsible for calling {@link ExoMediaDrm#release()} on the instance
* when it's no longer being used. * when it's no longer being used.
*/ */
final class AppManagedProvider<T extends ExoMediaCrypto> implements Provider<T> { final class AppManagedProvider implements Provider {
private final ExoMediaDrm<T> exoMediaDrm; private final ExoMediaDrm exoMediaDrm;
/** Creates an instance that provides the given {@link ExoMediaDrm}. */ /** Creates an instance that provides the given {@link ExoMediaDrm}. */
public AppManagedProvider(ExoMediaDrm<T> exoMediaDrm) { public AppManagedProvider(ExoMediaDrm exoMediaDrm) {
this.exoMediaDrm = exoMediaDrm; this.exoMediaDrm = exoMediaDrm;
} }
@Override @Override
public ExoMediaDrm<T> acquireExoMediaDrm(UUID uuid) { public ExoMediaDrm acquireExoMediaDrm(UUID uuid) {
exoMediaDrm.acquire(); exoMediaDrm.acquire();
return exoMediaDrm; return exoMediaDrm;
} }
@ -108,10 +108,8 @@ public interface ExoMediaDrm<T extends ExoMediaCrypto> {
@SuppressWarnings("InlinedApi") @SuppressWarnings("InlinedApi")
int KEY_TYPE_RELEASE = MediaDrm.KEY_TYPE_RELEASE; int KEY_TYPE_RELEASE = MediaDrm.KEY_TYPE_RELEASE;
/** /** @see android.media.MediaDrm.OnEventListener */
* @see android.media.MediaDrm.OnEventListener interface OnEventListener {
*/
interface OnEventListener<T extends ExoMediaCrypto> {
/** /**
* Called when an event occurs that requires the app to be notified * Called when an event occurs that requires the app to be notified
* *
@ -122,17 +120,15 @@ public interface ExoMediaDrm<T extends ExoMediaCrypto> {
* @param data Optional byte array of data that may be associated with the event. * @param data Optional byte array of data that may be associated with the event.
*/ */
void onEvent( void onEvent(
ExoMediaDrm<? extends T> mediaDrm, ExoMediaDrm mediaDrm,
@Nullable byte[] sessionId, @Nullable byte[] sessionId,
int event, int event,
int extra, int extra,
@Nullable byte[] data); @Nullable byte[] data);
} }
/** /** @see android.media.MediaDrm.OnKeyStatusChangeListener */
* @see android.media.MediaDrm.OnKeyStatusChangeListener interface OnKeyStatusChangeListener {
*/
interface OnKeyStatusChangeListener<T extends ExoMediaCrypto> {
/** /**
* Called when the keys in a session change status, such as when the license is renewed or * Called when the keys in a session change status, such as when the license is renewed or
* expires. * expires.
@ -143,14 +139,14 @@ public interface ExoMediaDrm<T extends ExoMediaCrypto> {
* @param hasNewUsableKey Whether a new key became usable. * @param hasNewUsableKey Whether a new key became usable.
*/ */
void onKeyStatusChange( void onKeyStatusChange(
ExoMediaDrm<? extends T> mediaDrm, ExoMediaDrm mediaDrm,
byte[] sessionId, byte[] sessionId,
List<KeyStatus> exoKeyInformation, List<KeyStatus> exoKeyInformation,
boolean hasNewUsableKey); boolean hasNewUsableKey);
} }
/** @see android.media.MediaDrm.OnExpirationUpdateListener */ /** @see android.media.MediaDrm.OnExpirationUpdateListener */
interface OnExpirationUpdateListener<T extends ExoMediaCrypto> { interface OnExpirationUpdateListener {
/** /**
* Called when a session expiration update occurs, to inform the app about the change in * Called when a session expiration update occurs, to inform the app about the change in
@ -162,8 +158,7 @@ public interface ExoMediaDrm<T extends ExoMediaCrypto> {
* milliseconds, relative to the Unix epoch. A time of 0 indicates that the keys never * milliseconds, relative to the Unix epoch. A time of 0 indicates that the keys never
* expire. * expire.
*/ */
void onExpirationUpdate( void onExpirationUpdate(ExoMediaDrm mediaDrm, byte[] sessionId, long expirationTimeMs);
ExoMediaDrm<? extends T> mediaDrm, byte[] sessionId, long expirationTimeMs);
} }
/** @see android.media.MediaDrm.KeyStatus */ /** @see android.media.MediaDrm.KeyStatus */
@ -229,18 +224,14 @@ public interface ExoMediaDrm<T extends ExoMediaCrypto> {
} }
/** /** @see MediaDrm#setOnEventListener(MediaDrm.OnEventListener) */
* @see MediaDrm#setOnEventListener(MediaDrm.OnEventListener) void setOnEventListener(OnEventListener listener);
*/
void setOnEventListener(OnEventListener<? super T> listener);
/** /** @see MediaDrm#setOnKeyStatusChangeListener(MediaDrm.OnKeyStatusChangeListener, Handler) */
* @see MediaDrm#setOnKeyStatusChangeListener(MediaDrm.OnKeyStatusChangeListener, Handler) void setOnKeyStatusChangeListener(OnKeyStatusChangeListener listener);
*/
void setOnKeyStatusChangeListener(OnKeyStatusChangeListener<? super T> listener);
/** @see MediaDrm#setOnExpirationUpdateListener(MediaDrm.OnExpirationUpdateListener, Handler) */ /** @see MediaDrm#setOnExpirationUpdateListener(MediaDrm.OnExpirationUpdateListener, Handler) */
void setOnExpirationUpdateListener(OnExpirationUpdateListener<? super T> listener); void setOnExpirationUpdateListener(OnExpirationUpdateListener listener);
/** @see MediaDrm#openSession() */ /** @see MediaDrm#openSession() */
byte[] openSession() throws MediaDrmException; byte[] openSession() throws MediaDrmException;
@ -349,12 +340,12 @@ public interface ExoMediaDrm<T extends ExoMediaCrypto> {
* @return An object extends {@link ExoMediaCrypto}, using opaque crypto scheme specific data. * @return An object extends {@link ExoMediaCrypto}, using opaque crypto scheme specific data.
* @throws MediaCryptoException If the instance can't be created. * @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 * Returns the {@link ExoMediaCrypto} type created by {@link #createMediaCrypto(byte[])}, or null
* if this instance cannot create any {@link ExoMediaCrypto} instances. * if this instance cannot create any {@link ExoMediaCrypto} instances.
*/ */
@Nullable @Nullable
Class<T> getExoMediaCryptoType(); Class<? extends ExoMediaCrypto> getExoMediaCryptoType();
} }

View File

@ -47,7 +47,7 @@ import java.util.UUID;
/** An {@link ExoMediaDrm} implementation that wraps the framework {@link MediaDrm}. */ /** An {@link ExoMediaDrm} implementation that wraps the framework {@link MediaDrm}. */
@TargetApi(23) @TargetApi(23)
@RequiresApi(18) @RequiresApi(18)
public final class FrameworkMediaDrm implements ExoMediaDrm<FrameworkMediaCrypto> { public final class FrameworkMediaDrm implements ExoMediaDrm {
private static final String TAG = "FrameworkMediaDrm"; private static final String TAG = "FrameworkMediaDrm";
@ -56,13 +56,13 @@ public final class FrameworkMediaDrm implements ExoMediaDrm<FrameworkMediaCrypto
* UUID. Returns a {@link DummyExoMediaDrm} if the protection scheme identified by the given UUID * UUID. Returns a {@link DummyExoMediaDrm} if the protection scheme identified by the given UUID
* is not supported by the device. * is not supported by the device.
*/ */
public static final Provider<FrameworkMediaCrypto> DEFAULT_PROVIDER = public static final Provider DEFAULT_PROVIDER =
uuid -> { uuid -> {
try { try {
return newInstance(uuid); return newInstance(uuid);
} catch (UnsupportedDrmException e) { } catch (UnsupportedDrmException e) {
Log.e(TAG, "Failed to instantiate a FrameworkMediaDrm for uuid: " + uuid + "."); 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<FrameworkMediaCrypto
} }
@Override @Override
public void setOnEventListener( public void setOnEventListener(ExoMediaDrm.OnEventListener listener) {
ExoMediaDrm.OnEventListener<? super FrameworkMediaCrypto> listener) {
mediaDrm.setOnEventListener( mediaDrm.setOnEventListener(
listener == null listener == null
? null ? null
@ -116,8 +115,7 @@ public final class FrameworkMediaDrm implements ExoMediaDrm<FrameworkMediaCrypto
} }
@Override @Override
public void setOnKeyStatusChangeListener( public void setOnKeyStatusChangeListener(ExoMediaDrm.OnKeyStatusChangeListener listener) {
ExoMediaDrm.OnKeyStatusChangeListener<? super FrameworkMediaCrypto> listener) {
if (Util.SDK_INT < 23) { if (Util.SDK_INT < 23) {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }
@ -137,8 +135,7 @@ public final class FrameworkMediaDrm implements ExoMediaDrm<FrameworkMediaCrypto
} }
@Override @Override
public void setOnExpirationUpdateListener( public void setOnExpirationUpdateListener(OnExpirationUpdateListener listener) {
OnExpirationUpdateListener<? super FrameworkMediaCrypto> listener) {
if (Util.SDK_INT < 23) { if (Util.SDK_INT < 23) {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }

View File

@ -32,12 +32,12 @@ import java.util.UUID;
/** Helper class to download, renew and release offline licenses. */ /** Helper class to download, renew and release offline licenses. */
@RequiresApi(18) @RequiresApi(18)
public final class OfflineLicenseHelper<T extends ExoMediaCrypto> { public final class OfflineLicenseHelper {
private static final DrmInitData DUMMY_DRM_INIT_DATA = new DrmInitData(); private static final DrmInitData DUMMY_DRM_INIT_DATA = new DrmInitData();
private final ConditionVariable conditionVariable; private final ConditionVariable conditionVariable;
private final DefaultDrmSessionManager<T> drmSessionManager; private final DefaultDrmSessionManager drmSessionManager;
private final HandlerThread handlerThread; private final HandlerThread handlerThread;
private final MediaSourceEventDispatcher eventDispatcher; private final MediaSourceEventDispatcher eventDispatcher;
@ -52,7 +52,7 @@ public final class OfflineLicenseHelper<T extends ExoMediaCrypto> {
* events. * events.
* @return A new instance which uses Widevine CDM. * @return A new instance which uses Widevine CDM.
*/ */
public static OfflineLicenseHelper<ExoMediaCrypto> newWidevineInstance( public static OfflineLicenseHelper newWidevineInstance(
String defaultLicenseUrl, String defaultLicenseUrl,
HttpDataSource.Factory httpDataSourceFactory, HttpDataSource.Factory httpDataSourceFactory,
MediaSourceEventDispatcher eventDispatcher) { MediaSourceEventDispatcher eventDispatcher) {
@ -76,7 +76,7 @@ public final class OfflineLicenseHelper<T extends ExoMediaCrypto> {
* events. * events.
* @return A new instance which uses Widevine CDM. * @return A new instance which uses Widevine CDM.
*/ */
public static OfflineLicenseHelper<ExoMediaCrypto> newWidevineInstance( public static OfflineLicenseHelper newWidevineInstance(
String defaultLicenseUrl, String defaultLicenseUrl,
boolean forceDefaultLicenseUrl, boolean forceDefaultLicenseUrl,
HttpDataSource.Factory httpDataSourceFactory, HttpDataSource.Factory httpDataSourceFactory,
@ -105,13 +105,13 @@ public final class OfflineLicenseHelper<T extends ExoMediaCrypto> {
* @see DefaultDrmSessionManager.Builder * @see DefaultDrmSessionManager.Builder
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public static OfflineLicenseHelper<ExoMediaCrypto> newWidevineInstance( public static OfflineLicenseHelper newWidevineInstance(
String defaultLicenseUrl, String defaultLicenseUrl,
boolean forceDefaultLicenseUrl, boolean forceDefaultLicenseUrl,
HttpDataSource.Factory httpDataSourceFactory, HttpDataSource.Factory httpDataSourceFactory,
@Nullable Map<String, String> optionalKeyRequestParameters, @Nullable Map<String, String> optionalKeyRequestParameters,
MediaSourceEventDispatcher eventDispatcher) { MediaSourceEventDispatcher eventDispatcher) {
return new OfflineLicenseHelper<>( return new OfflineLicenseHelper(
new DefaultDrmSessionManager.Builder() new DefaultDrmSessionManager.Builder()
.setKeyRequestParameters(optionalKeyRequestParameters) .setKeyRequestParameters(optionalKeyRequestParameters)
.build( .build(
@ -128,12 +128,11 @@ public final class OfflineLicenseHelper<T extends ExoMediaCrypto> {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public OfflineLicenseHelper( public OfflineLicenseHelper(
UUID uuid, UUID uuid,
ExoMediaDrm.Provider<T> mediaDrmProvider, ExoMediaDrm.Provider mediaDrmProvider,
MediaDrmCallback callback, MediaDrmCallback callback,
@Nullable Map<String, String> optionalKeyRequestParameters, @Nullable Map<String, String> optionalKeyRequestParameters,
MediaSourceEventDispatcher eventDispatcher) { MediaSourceEventDispatcher eventDispatcher) {
this( this(
(DefaultDrmSessionManager<T>)
new DefaultDrmSessionManager.Builder() new DefaultDrmSessionManager.Builder()
.setUuidAndExoMediaDrmProvider(uuid, mediaDrmProvider) .setUuidAndExoMediaDrmProvider(uuid, mediaDrmProvider)
.setKeyRequestParameters(optionalKeyRequestParameters) .setKeyRequestParameters(optionalKeyRequestParameters)
@ -149,7 +148,7 @@ public final class OfflineLicenseHelper<T extends ExoMediaCrypto> {
* events. * events.
*/ */
public OfflineLicenseHelper( public OfflineLicenseHelper(
DefaultDrmSessionManager<T> defaultDrmSessionManager, DefaultDrmSessionManager defaultDrmSessionManager,
MediaSourceEventDispatcher eventDispatcher) { MediaSourceEventDispatcher eventDispatcher) {
this.drmSessionManager = defaultDrmSessionManager; this.drmSessionManager = defaultDrmSessionManager;
this.eventDispatcher = eventDispatcher; this.eventDispatcher = eventDispatcher;
@ -231,7 +230,7 @@ public final class OfflineLicenseHelper<T extends ExoMediaCrypto> {
throws DrmSessionException { throws DrmSessionException {
Assertions.checkNotNull(offlineLicenseKeySetId); Assertions.checkNotNull(offlineLicenseKeySetId);
drmSessionManager.prepare(); drmSessionManager.prepare();
DrmSession<T> drmSession = DrmSession drmSession =
openBlockingKeyRequest( openBlockingKeyRequest(
DefaultDrmSessionManager.MODE_QUERY, offlineLicenseKeySetId, DUMMY_DRM_INIT_DATA); DefaultDrmSessionManager.MODE_QUERY, offlineLicenseKeySetId, DUMMY_DRM_INIT_DATA);
DrmSessionException error = drmSession.getError(); DrmSessionException error = drmSession.getError();
@ -259,8 +258,8 @@ public final class OfflineLicenseHelper<T extends ExoMediaCrypto> {
@Mode int licenseMode, @Nullable byte[] offlineLicenseKeySetId, DrmInitData drmInitData) @Mode int licenseMode, @Nullable byte[] offlineLicenseKeySetId, DrmInitData drmInitData)
throws DrmSessionException { throws DrmSessionException {
drmSessionManager.prepare(); drmSessionManager.prepare();
DrmSession<T> drmSession = openBlockingKeyRequest(licenseMode, offlineLicenseKeySetId, DrmSession drmSession =
drmInitData); openBlockingKeyRequest(licenseMode, offlineLicenseKeySetId, drmInitData);
DrmSessionException error = drmSession.getError(); DrmSessionException error = drmSession.getError();
byte[] keySetId = drmSession.getOfflineLicenseKeySetId(); byte[] keySetId = drmSession.getOfflineLicenseKeySetId();
drmSession.release(eventDispatcher); drmSession.release(eventDispatcher);
@ -271,11 +270,11 @@ public final class OfflineLicenseHelper<T extends ExoMediaCrypto> {
return Assertions.checkNotNull(keySetId); return Assertions.checkNotNull(keySetId);
} }
private DrmSession<T> openBlockingKeyRequest( private DrmSession openBlockingKeyRequest(
@Mode int licenseMode, @Nullable byte[] offlineLicenseKeySetId, DrmInitData drmInitData) { @Mode int licenseMode, @Nullable byte[] offlineLicenseKeySetId, DrmInitData drmInitData) {
drmSessionManager.setMode(licenseMode, offlineLicenseKeySetId); drmSessionManager.setMode(licenseMode, offlineLicenseKeySetId);
conditionVariable.close(); conditionVariable.close();
DrmSession<T> drmSession = DrmSession drmSession =
drmSessionManager.acquireSession(handlerThread.getLooper(), eventDispatcher, drmInitData); drmSessionManager.acquireSession(handlerThread.getLooper(), eventDispatcher, drmInitData);
// Block current thread until key loading is finished // Block current thread until key loading is finished
conditionVariable.block(); conditionVariable.block();

View File

@ -39,8 +39,7 @@ public final class WidevineUtil {
* @return A {@link Pair} consisting of the remaining license and playback durations in seconds, * @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. * or null if called before the session has been opened or after it's been released.
*/ */
public static @Nullable Pair<Long, Long> getLicenseDurationRemainingSec( public static @Nullable Pair<Long, Long> getLicenseDurationRemainingSec(DrmSession drmSession) {
DrmSession<?> drmSession) {
Map<String, String> keyStatus = drmSession.queryKeyStatus(); Map<String, String> keyStatus = drmSession.queryKeyStatus();
if (keyStatus == null) { if (keyStatus == null) {
return null; return null;

View File

@ -39,6 +39,7 @@ import com.google.android.exoplayer2.decoder.DecoderCounters;
import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
import com.google.android.exoplayer2.drm.DrmSession; import com.google.android.exoplayer2.drm.DrmSession;
import com.google.android.exoplayer2.drm.DrmSession.DrmSessionException; 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.drm.FrameworkMediaCrypto;
import com.google.android.exoplayer2.mediacodec.MediaCodecUtil.DecoderQueryException; import com.google.android.exoplayer2.mediacodec.MediaCodecUtil.DecoderQueryException;
import com.google.android.exoplayer2.source.MediaPeriod; import com.google.android.exoplayer2.source.MediaPeriod;
@ -368,8 +369,8 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
@Nullable private Format inputFormat; @Nullable private Format inputFormat;
private Format outputFormat; private Format outputFormat;
@Nullable private DrmSession<FrameworkMediaCrypto> codecDrmSession; @Nullable private DrmSession codecDrmSession;
@Nullable private DrmSession<FrameworkMediaCrypto> sourceDrmSession; @Nullable private DrmSession sourceDrmSession;
@Nullable private MediaCrypto mediaCrypto; @Nullable private MediaCrypto mediaCrypto;
private boolean mediaCryptoRequiresSecureDecoder; private boolean mediaCryptoRequiresSecureDecoder;
private long renderTimeLimitMs; private long renderTimeLimitMs;
@ -574,9 +575,10 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
String mimeType = inputFormat.sampleMimeType; String mimeType = inputFormat.sampleMimeType;
if (codecDrmSession != null) { if (codecDrmSession != null) {
if (mediaCrypto == null) { if (mediaCrypto == null) {
FrameworkMediaCrypto sessionMediaCrypto = codecDrmSession.getMediaCrypto(); @Nullable
FrameworkMediaCrypto sessionMediaCrypto = getFrameworkMediaCrypto(codecDrmSession);
if (sessionMediaCrypto == null) { if (sessionMediaCrypto == null) {
DrmSessionException drmError = codecDrmSession.getError(); @Nullable DrmSessionException drmError = codecDrmSession.getError();
if (drmError != null) { if (drmError != null) {
// Continue for now. We may be able to avoid failure if the session recovers, or if a // 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. // 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; outputBuffer = null;
} }
private void setSourceDrmSession(@Nullable DrmSession<FrameworkMediaCrypto> session) { private void setSourceDrmSession(@Nullable DrmSession session) {
DrmSession.replaceSession(sourceDrmSession, session); DrmSession.replaceSession(sourceDrmSession, session);
sourceDrmSession = session; sourceDrmSession = session;
} }
private void setCodecDrmSession(@Nullable DrmSession<FrameworkMediaCrypto> session) { private void setCodecDrmSession(@Nullable DrmSession session) {
DrmSession.replaceSession(codecDrmSession, session); DrmSession.replaceSession(codecDrmSession, session);
codecDrmSession = session; codecDrmSession = session;
} }
@ -1357,7 +1359,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
protected void onInputFormatChanged(FormatHolder formatHolder) throws ExoPlaybackException { protected void onInputFormatChanged(FormatHolder formatHolder) throws ExoPlaybackException {
waitingForFirstSampleInFormat = true; waitingForFirstSampleInFormat = true;
Format newFormat = Assertions.checkNotNull(formatHolder.format); Format newFormat = Assertions.checkNotNull(formatHolder.format);
setSourceDrmSession((DrmSession<FrameworkMediaCrypto>) formatHolder.drmSession); setSourceDrmSession(formatHolder.drmSession);
inputFormat = newFormat; inputFormat = newFormat;
if (codec == null) { if (codec == null) {
@ -1865,6 +1867,47 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
return outputStreamOffsetUs; 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 { private void reinitializeCodec() throws ExoPlaybackException {
releaseCodec(); releaseCodec();
maybeInitCodec(); maybeInitCodec();
@ -1885,7 +1928,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
@RequiresApi(23) @RequiresApi(23)
private void updateDrmSessionOrReinitializeCodecV23() throws ExoPlaybackException { private void updateDrmSessionOrReinitializeCodecV23() throws ExoPlaybackException {
@Nullable FrameworkMediaCrypto sessionMediaCrypto = sourceDrmSession.getMediaCrypto(); @Nullable FrameworkMediaCrypto sessionMediaCrypto = getFrameworkMediaCrypto(sourceDrmSession);
if (sessionMediaCrypto == null) { if (sessionMediaCrypto == null) {
// We'd only expect this to happen if the CDM from which the pending session is obtained needs // 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 // 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; codecDrainAction = DRAIN_ACTION_NONE;
} }
/** @Nullable
* Returns whether a {@link DrmSession} may require a secure decoder for a given {@link Format}. private FrameworkMediaCrypto getFrameworkMediaCrypto(DrmSession drmSession)
* throws ExoPlaybackException {
* @param drmSession The {@link DrmSession}. @Nullable ExoMediaCrypto mediaCrypto = drmSession.getMediaCrypto();
* @param format The {@link Format}. if (mediaCrypto != null && !(mediaCrypto instanceof FrameworkMediaCrypto)) {
* @return Whether a secure decoder may be required. // This should not happen if the track went through a supportsFormatDrm() check, during track
*/ // selection.
private static boolean maybeRequiresSecureDecoder( throw createRendererException(
DrmSession<FrameworkMediaCrypto> drmSession, Format format) { new IllegalArgumentException("Expecting FrameworkMediaCrypto but found: " + mediaCrypto),
@Nullable FrameworkMediaCrypto sessionMediaCrypto = drmSession.getMediaCrypto(); inputFormat);
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();
} }
return (FrameworkMediaCrypto) mediaCrypto;
} }
private static boolean isMediaCodecException(IllegalStateException error) { private static boolean isMediaCodecException(IllegalStateException error) {

View File

@ -30,7 +30,6 @@ import com.google.android.exoplayer2.RenderersFactory;
import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.Timeline;
import com.google.android.exoplayer2.audio.AudioRendererEventListener; import com.google.android.exoplayer2.audio.AudioRendererEventListener;
import com.google.android.exoplayer2.drm.DrmSessionManager; 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.MediaPeriod;
import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId; import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId;
@ -281,7 +280,7 @@ public final class DownloadHelper {
Uri uri, Uri uri,
DataSource.Factory dataSourceFactory, DataSource.Factory dataSourceFactory,
RenderersFactory renderersFactory, RenderersFactory renderersFactory,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager, @Nullable DrmSessionManager drmSessionManager,
DefaultTrackSelector.Parameters trackSelectorParameters) { DefaultTrackSelector.Parameters trackSelectorParameters) {
return new DownloadHelper( return new DownloadHelper(
DownloadRequest.TYPE_DASH, DownloadRequest.TYPE_DASH,
@ -351,7 +350,7 @@ public final class DownloadHelper {
Uri uri, Uri uri,
DataSource.Factory dataSourceFactory, DataSource.Factory dataSourceFactory,
RenderersFactory renderersFactory, RenderersFactory renderersFactory,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager, @Nullable DrmSessionManager drmSessionManager,
DefaultTrackSelector.Parameters trackSelectorParameters) { DefaultTrackSelector.Parameters trackSelectorParameters) {
return new DownloadHelper( return new DownloadHelper(
DownloadRequest.TYPE_HLS, DownloadRequest.TYPE_HLS,
@ -421,7 +420,7 @@ public final class DownloadHelper {
Uri uri, Uri uri,
DataSource.Factory dataSourceFactory, DataSource.Factory dataSourceFactory,
RenderersFactory renderersFactory, RenderersFactory renderersFactory,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager, @Nullable DrmSessionManager drmSessionManager,
DefaultTrackSelector.Parameters trackSelectorParameters) { DefaultTrackSelector.Parameters trackSelectorParameters) {
return new DownloadHelper( return new DownloadHelper(
DownloadRequest.TYPE_SS, DownloadRequest.TYPE_SS,
@ -459,7 +458,7 @@ public final class DownloadHelper {
public static MediaSource createMediaSource( public static MediaSource createMediaSource(
DownloadRequest downloadRequest, DownloadRequest downloadRequest,
DataSource.Factory dataSourceFactory, DataSource.Factory dataSourceFactory,
@Nullable DrmSessionManager<?> drmSessionManager) { @Nullable DrmSessionManager drmSessionManager) {
@Nullable Constructor<? extends MediaSourceFactory> constructor; @Nullable Constructor<? extends MediaSourceFactory> constructor;
switch (downloadRequest.type) { switch (downloadRequest.type) {
case DownloadRequest.TYPE_DASH: case DownloadRequest.TYPE_DASH:
@ -943,7 +942,7 @@ public final class DownloadHelper {
@Nullable Constructor<? extends MediaSourceFactory> constructor, @Nullable Constructor<? extends MediaSourceFactory> constructor,
Uri uri, Uri uri,
Factory dataSourceFactory, Factory dataSourceFactory,
@Nullable DrmSessionManager<?> drmSessionManager, @Nullable DrmSessionManager drmSessionManager,
@Nullable List<StreamKey> streamKeys) { @Nullable List<StreamKey> streamKeys) {
if (constructor == null) { if (constructor == null) {
throw new IllegalStateException("Module missing to create media source."); throw new IllegalStateException("Module missing to create media source.");

View File

@ -126,7 +126,7 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory {
@C.ContentType private final int[] supportedTypes; @C.ContentType private final int[] supportedTypes;
private final String userAgent; private final String userAgent;
private DrmSessionManager<?> drmSessionManager; private DrmSessionManager drmSessionManager;
private HttpDataSource.Factory drmHttpDataSourceFactory; private HttpDataSource.Factory drmHttpDataSourceFactory;
private boolean playClearContentWithoutKey; private boolean playClearContentWithoutKey;
private int[] useDrmSessionsForClearContentTrackTypes; private int[] useDrmSessionsForClearContentTrackTypes;
@ -191,7 +191,7 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory {
@Override @Override
public DefaultMediaSourceFactory setDrmSessionManager( public DefaultMediaSourceFactory setDrmSessionManager(
@Nullable DrmSessionManager<?> drmSessionManager) { @Nullable DrmSessionManager drmSessionManager) {
this.drmSessionManager = this.drmSessionManager =
drmSessionManager != null drmSessionManager != null
? drmSessionManager ? drmSessionManager
@ -249,7 +249,7 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory {
// internal methods // internal methods
private DrmSessionManager<?> createDrmSessionManager(MediaItem mediaItem) { private DrmSessionManager createDrmSessionManager(MediaItem mediaItem) {
Assertions.checkNotNull(mediaItem.playbackProperties); Assertions.checkNotNull(mediaItem.playbackProperties);
if (mediaItem.playbackProperties.drmConfiguration == null if (mediaItem.playbackProperties.drmConfiguration == null
|| mediaItem.playbackProperties.drmConfiguration.licenseUri == null || mediaItem.playbackProperties.drmConfiguration.licenseUri == null

View File

@ -164,7 +164,7 @@ public final class ExtractorMediaSource extends CompositeMediaSource<Void> {
/** @deprecated Use {@link ProgressiveMediaSource.Factory#setDrmSessionManager} instead. */ /** @deprecated Use {@link ProgressiveMediaSource.Factory#setDrmSessionManager} instead. */
@Deprecated @Deprecated
@Override @Override
public Factory setDrmSessionManager(@Nullable DrmSessionManager<?> drmSessionManager) { public Factory setDrmSessionManager(@Nullable DrmSessionManager drmSessionManager) {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }

View File

@ -40,7 +40,7 @@ public interface MediaSourceFactory {
* @param drmSessionManager The {@link DrmSessionManager}. * @param drmSessionManager The {@link DrmSessionManager}.
* @return This factory, for convenience. * @return This factory, for convenience.
*/ */
MediaSourceFactory setDrmSessionManager(@Nullable DrmSessionManager<?> drmSessionManager); MediaSourceFactory setDrmSessionManager(@Nullable DrmSessionManager drmSessionManager);
/** /**
* Sets an optional {@link LoadErrorHandlingPolicy}. * Sets an optional {@link LoadErrorHandlingPolicy}.

View File

@ -97,7 +97,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
private final Uri uri; private final Uri uri;
private final DataSource dataSource; private final DataSource dataSource;
private final DrmSessionManager<?> drmSessionManager; private final DrmSessionManager drmSessionManager;
private final LoadErrorHandlingPolicy loadErrorHandlingPolicy; private final LoadErrorHandlingPolicy loadErrorHandlingPolicy;
private final EventDispatcher eventDispatcher; private final EventDispatcher eventDispatcher;
private final Listener listener; private final Listener listener;
@ -161,7 +161,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
Uri uri, Uri uri,
DataSource dataSource, DataSource dataSource,
Extractor[] extractors, Extractor[] extractors,
DrmSessionManager<?> drmSessionManager, DrmSessionManager drmSessionManager,
LoadErrorHandlingPolicy loadErrorHandlingPolicy, LoadErrorHandlingPolicy loadErrorHandlingPolicy,
EventDispatcher eventDispatcher, EventDispatcher eventDispatcher,
Listener listener, Listener listener,

View File

@ -52,7 +52,7 @@ public final class ProgressiveMediaSource extends BaseMediaSource
private final DataSource.Factory dataSourceFactory; private final DataSource.Factory dataSourceFactory;
private ExtractorsFactory extractorsFactory; private ExtractorsFactory extractorsFactory;
private DrmSessionManager<?> drmSessionManager; private DrmSessionManager drmSessionManager;
private LoadErrorHandlingPolicy loadErrorHandlingPolicy; private LoadErrorHandlingPolicy loadErrorHandlingPolicy;
private int continueLoadingCheckIntervalBytes; private int continueLoadingCheckIntervalBytes;
@Nullable private String customCacheKey; @Nullable private String customCacheKey;
@ -156,7 +156,7 @@ public final class ProgressiveMediaSource extends BaseMediaSource
* @return This factory, for convenience. * @return This factory, for convenience.
*/ */
@Override @Override
public Factory setDrmSessionManager(@Nullable DrmSessionManager<?> drmSessionManager) { public Factory setDrmSessionManager(@Nullable DrmSessionManager drmSessionManager) {
this.drmSessionManager = this.drmSessionManager =
drmSessionManager != null drmSessionManager != null
? drmSessionManager ? drmSessionManager
@ -211,7 +211,7 @@ public final class ProgressiveMediaSource extends BaseMediaSource
private final Uri uri; private final Uri uri;
private final DataSource.Factory dataSourceFactory; private final DataSource.Factory dataSourceFactory;
private final ExtractorsFactory extractorsFactory; private final ExtractorsFactory extractorsFactory;
private final DrmSessionManager<?> drmSessionManager; private final DrmSessionManager drmSessionManager;
private final LoadErrorHandlingPolicy loadableLoadErrorHandlingPolicy; private final LoadErrorHandlingPolicy loadableLoadErrorHandlingPolicy;
@Nullable private final String customCacheKey; @Nullable private final String customCacheKey;
private final int continueLoadingCheckIntervalBytes; private final int continueLoadingCheckIntervalBytes;
@ -228,7 +228,7 @@ public final class ProgressiveMediaSource extends BaseMediaSource
Uri uri, Uri uri,
DataSource.Factory dataSourceFactory, DataSource.Factory dataSourceFactory,
ExtractorsFactory extractorsFactory, ExtractorsFactory extractorsFactory,
DrmSessionManager<?> drmSessionManager, DrmSessionManager drmSessionManager,
LoadErrorHandlingPolicy loadableLoadErrorHandlingPolicy, LoadErrorHandlingPolicy loadableLoadErrorHandlingPolicy,
@Nullable String customCacheKey, @Nullable String customCacheKey,
int continueLoadingCheckIntervalBytes, int continueLoadingCheckIntervalBytes,

View File

@ -55,12 +55,12 @@ public class SampleQueue implements TrackOutput {
private final SampleDataQueue sampleDataQueue; private final SampleDataQueue sampleDataQueue;
private final SampleExtrasHolder extrasHolder; private final SampleExtrasHolder extrasHolder;
private final DrmSessionManager<?> drmSessionManager; private final DrmSessionManager drmSessionManager;
private final MediaSourceEventDispatcher eventDispatcher; private final MediaSourceEventDispatcher eventDispatcher;
@Nullable private UpstreamFormatChangedListener upstreamFormatChangeListener; @Nullable private UpstreamFormatChangedListener upstreamFormatChangeListener;
@Nullable private Format downstreamFormat; @Nullable private Format downstreamFormat;
@Nullable private DrmSession<?> currentDrmSession; @Nullable private DrmSession currentDrmSession;
private int capacity; private int capacity;
private int[] sourceIds; private int[] sourceIds;
@ -101,7 +101,7 @@ public class SampleQueue implements TrackOutput {
*/ */
public SampleQueue( public SampleQueue(
Allocator allocator, Allocator allocator,
DrmSessionManager<?> drmSessionManager, DrmSessionManager drmSessionManager,
MediaSourceEventDispatcher eventDispatcher) { MediaSourceEventDispatcher eventDispatcher) {
sampleDataQueue = new SampleDataQueue(allocator); sampleDataQueue = new SampleDataQueue(allocator);
this.drmSessionManager = drmSessionManager; 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 // Ensure we acquire the new session before releasing the previous one in case the same session
// is being used for both DrmInitData. // is being used for both DrmInitData.
@Nullable DrmSession<?> previousSession = currentDrmSession; @Nullable DrmSession previousSession = currentDrmSession;
Looper playbackLooper = Assertions.checkNotNull(Looper.myLooper()); Looper playbackLooper = Assertions.checkNotNull(Looper.myLooper());
currentDrmSession = currentDrmSession =
newDrmInitData != null newDrmInitData != null

View File

@ -110,7 +110,7 @@ public class ChunkSampleStream<T extends ChunkSource> implements SampleStream, S
Callback<ChunkSampleStream<T>> callback, Callback<ChunkSampleStream<T>> callback,
Allocator allocator, Allocator allocator,
long positionUs, long positionUs,
DrmSessionManager<?> drmSessionManager, DrmSessionManager drmSessionManager,
LoadErrorHandlingPolicy loadErrorHandlingPolicy, LoadErrorHandlingPolicy loadErrorHandlingPolicy,
EventDispatcher eventDispatcher) { EventDispatcher eventDispatcher) {
this.primaryTrackType = primaryTrackType; this.primaryTrackType = primaryTrackType;

View File

@ -105,8 +105,8 @@ public abstract class DecoderVideoRenderer extends BaseRenderer {
@Nullable private VideoFrameMetadataListener frameMetadataListener; @Nullable private VideoFrameMetadataListener frameMetadataListener;
@C.VideoOutputMode private int outputMode; @C.VideoOutputMode private int outputMode;
@Nullable private DrmSession<ExoMediaCrypto> decoderDrmSession; @Nullable private DrmSession decoderDrmSession;
@Nullable private DrmSession<ExoMediaCrypto> sourceDrmSession; @Nullable private DrmSession sourceDrmSession;
@ReinitializationState private int decoderReinitializationState; @ReinitializationState private int decoderReinitializationState;
private boolean decoderReceivedBuffers; private boolean decoderReceivedBuffers;
@ -379,7 +379,7 @@ public abstract class DecoderVideoRenderer extends BaseRenderer {
protected void onInputFormatChanged(FormatHolder formatHolder) throws ExoPlaybackException { protected void onInputFormatChanged(FormatHolder formatHolder) throws ExoPlaybackException {
waitingForFirstSampleInFormat = true; waitingForFirstSampleInFormat = true;
Format newFormat = Assertions.checkNotNull(formatHolder.format); Format newFormat = Assertions.checkNotNull(formatHolder.format);
setSourceDrmSession((DrmSession<ExoMediaCrypto>) formatHolder.drmSession); setSourceDrmSession(formatHolder.drmSession);
inputFormat = newFormat; inputFormat = newFormat;
if (sourceDrmSession != decoderDrmSession) { if (sourceDrmSession != decoderDrmSession) {
@ -643,12 +643,12 @@ public abstract class DecoderVideoRenderer extends BaseRenderer {
// Internal methods. // Internal methods.
private void setSourceDrmSession(@Nullable DrmSession<ExoMediaCrypto> session) { private void setSourceDrmSession(@Nullable DrmSession session) {
DrmSession.replaceSession(sourceDrmSession, session); DrmSession.replaceSession(sourceDrmSession, session);
sourceDrmSession = session; sourceDrmSession = session;
} }
private void setDecoderDrmSession(@Nullable DrmSession<ExoMediaCrypto> session) { private void setDecoderDrmSession(@Nullable DrmSession session) {
DrmSession.replaceSession(decoderDrmSession, session); DrmSession.replaceSession(decoderDrmSession, session);
decoderDrmSession = session; decoderDrmSession = session;
} }
@ -891,7 +891,7 @@ public abstract class DecoderVideoRenderer extends BaseRenderer {
} }
private boolean shouldWaitForKeys(boolean bufferEncrypted) throws ExoPlaybackException { private boolean shouldWaitForKeys(boolean bufferEncrypted) throws ExoPlaybackException {
DrmSession<ExoMediaCrypto> decoderDrmSession = this.decoderDrmSession; DrmSession decoderDrmSession = this.decoderDrmSession;
if (decoderDrmSession == null if (decoderDrmSession == null
|| (!bufferEncrypted && decoderDrmSession.playClearSamplesWithoutKeys())) { || (!bufferEncrypted && decoderDrmSession.playClearSamplesWithoutKeys())) {
return false; return false;

View File

@ -42,7 +42,6 @@ import com.google.android.exoplayer2.PlayerMessage.Target;
import com.google.android.exoplayer2.RendererCapabilities; import com.google.android.exoplayer2.RendererCapabilities;
import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
import com.google.android.exoplayer2.drm.DrmInitData; 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.MediaCodecDecoderException;
import com.google.android.exoplayer2.mediacodec.MediaCodecInfo; import com.google.android.exoplayer2.mediacodec.MediaCodecInfo;
import com.google.android.exoplayer2.mediacodec.MediaCodecRenderer; import com.google.android.exoplayer2.mediacodec.MediaCodecRenderer;
@ -272,9 +271,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
if (decoderInfos.isEmpty()) { if (decoderInfos.isEmpty()) {
return RendererCapabilities.create(FORMAT_UNSUPPORTED_SUBTYPE); return RendererCapabilities.create(FORMAT_UNSUPPORTED_SUBTYPE);
} }
boolean supportsFormatDrm = if (!supportsFormatDrm(format)) {
drmInitData == null || FrameworkMediaCrypto.class.equals(format.exoMediaCryptoType);
if (!supportsFormatDrm) {
return RendererCapabilities.create(FORMAT_UNSUPPORTED_DRM); return RendererCapabilities.create(FORMAT_UNSUPPORTED_DRM);
} }
// Check capabilities for the first decoder in the list, which takes priority. // Check capabilities for the first decoder in the list, which takes priority.

View File

@ -40,9 +40,9 @@ import org.robolectric.annotation.LooperMode;
@LooperMode(LooperMode.Mode.PAUSED) @LooperMode(LooperMode.Mode.PAUSED)
public class OfflineLicenseHelperTest { public class OfflineLicenseHelperTest {
private OfflineLicenseHelper<?> offlineLicenseHelper; private OfflineLicenseHelper offlineLicenseHelper;
@Mock private MediaDrmCallback mediaDrmCallback; @Mock private MediaDrmCallback mediaDrmCallback;
@Mock private ExoMediaDrm<ExoMediaCrypto> mediaDrm; @Mock private ExoMediaDrm mediaDrm;
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
@ -52,9 +52,9 @@ public class OfflineLicenseHelperTest {
.thenReturn( .thenReturn(
new ExoMediaDrm.KeyRequest(/* data= */ new byte[0], /* licenseServerUrl= */ "")); new ExoMediaDrm.KeyRequest(/* data= */ new byte[0], /* licenseServerUrl= */ ""));
offlineLicenseHelper = offlineLicenseHelper =
new OfflineLicenseHelper<>( new OfflineLicenseHelper(
C.WIDEVINE_UUID, C.WIDEVINE_UUID,
new ExoMediaDrm.AppManagedProvider<>(mediaDrm), new ExoMediaDrm.AppManagedProvider(mediaDrm),
mediaDrmCallback, mediaDrmCallback,
/* optionalKeyRequestParameters= */ null, /* optionalKeyRequestParameters= */ null,
new MediaSourceEventDispatcher()); new MediaSourceEventDispatcher());

View File

@ -35,7 +35,6 @@ import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
import com.google.android.exoplayer2.drm.DrmInitData; import com.google.android.exoplayer2.drm.DrmInitData;
import com.google.android.exoplayer2.drm.DrmSession; import com.google.android.exoplayer2.drm.DrmSession;
import com.google.android.exoplayer2.drm.DrmSessionManager; 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.extractor.TrackOutput;
import com.google.android.exoplayer2.testutil.TestUtil; import com.google.android.exoplayer2.testutil.TestUtil;
import com.google.android.exoplayer2.upstream.Allocator; 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); new TrackOutput.CryptoData(C.CRYPTO_MODE_AES_CTR, new byte[16], 0, 0);
private Allocator allocator; private Allocator allocator;
private DrmSessionManager<ExoMediaCrypto> mockDrmSessionManager; private DrmSessionManager mockDrmSessionManager;
private DrmSession<ExoMediaCrypto> mockDrmSession; private DrmSession mockDrmSession;
private MediaSourceEventDispatcher eventDispatcher; private MediaSourceEventDispatcher eventDispatcher;
private SampleQueue sampleQueue; private SampleQueue sampleQueue;
private FormatHolder formatHolder; private FormatHolder formatHolder;
@ -135,9 +134,8 @@ public final class SampleQueueTest {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public void setUp() { public void setUp() {
allocator = new DefaultAllocator(false, ALLOCATION_SIZE); allocator = new DefaultAllocator(false, ALLOCATION_SIZE);
mockDrmSessionManager = mockDrmSessionManager = Mockito.mock(DrmSessionManager.class);
(DrmSessionManager<ExoMediaCrypto>) Mockito.mock(DrmSessionManager.class); mockDrmSession = Mockito.mock(DrmSession.class);
mockDrmSession = (DrmSession<ExoMediaCrypto>) Mockito.mock(DrmSession.class);
when(mockDrmSessionManager.acquireSession( when(mockDrmSessionManager.acquireSession(
ArgumentMatchers.any(), ArgumentMatchers.any(), ArgumentMatchers.any())) ArgumentMatchers.any(), ArgumentMatchers.any(), ArgumentMatchers.any()))
.thenReturn(mockDrmSession); .thenReturn(mockDrmSession);
@ -418,8 +416,7 @@ public final class SampleQueueTest {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public void allowPlaceholderSessionPopulatesDrmSession() { public void allowPlaceholderSessionPopulatesDrmSession() {
when(mockDrmSession.getState()).thenReturn(DrmSession.STATE_OPENED_WITH_KEYS); when(mockDrmSession.getState()).thenReturn(DrmSession.STATE_OPENED_WITH_KEYS);
DrmSession<ExoMediaCrypto> mockPlaceholderDrmSession = DrmSession mockPlaceholderDrmSession = Mockito.mock(DrmSession.class);
(DrmSession<ExoMediaCrypto>) Mockito.mock(DrmSession.class);
when(mockPlaceholderDrmSession.getState()).thenReturn(DrmSession.STATE_OPENED_WITH_KEYS); when(mockPlaceholderDrmSession.getState()).thenReturn(DrmSession.STATE_OPENED_WITH_KEYS);
when(mockDrmSessionManager.acquirePlaceholderSession( when(mockDrmSessionManager.acquirePlaceholderSession(
ArgumentMatchers.any(), ArgumentMatchers.anyInt())) ArgumentMatchers.any(), ArgumentMatchers.anyInt()))
@ -465,8 +462,7 @@ public final class SampleQueueTest {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public void trailingCryptoInfoInitializationVectorBytesZeroed() { public void trailingCryptoInfoInitializationVectorBytesZeroed() {
when(mockDrmSession.getState()).thenReturn(DrmSession.STATE_OPENED_WITH_KEYS); when(mockDrmSession.getState()).thenReturn(DrmSession.STATE_OPENED_WITH_KEYS);
DrmSession<ExoMediaCrypto> mockPlaceholderDrmSession = DrmSession mockPlaceholderDrmSession = Mockito.mock(DrmSession.class);
(DrmSession<ExoMediaCrypto>) Mockito.mock(DrmSession.class);
when(mockPlaceholderDrmSession.getState()).thenReturn(DrmSession.STATE_OPENED_WITH_KEYS); when(mockPlaceholderDrmSession.getState()).thenReturn(DrmSession.STATE_OPENED_WITH_KEYS);
when(mockDrmSessionManager.acquirePlaceholderSession( when(mockDrmSessionManager.acquirePlaceholderSession(
ArgumentMatchers.any(), ArgumentMatchers.anyInt())) ArgumentMatchers.any(), ArgumentMatchers.anyInt()))

View File

@ -73,7 +73,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
/* package */ final int id; /* package */ final int id;
private final DashChunkSource.Factory chunkSourceFactory; private final DashChunkSource.Factory chunkSourceFactory;
@Nullable private final TransferListener transferListener; @Nullable private final TransferListener transferListener;
private final DrmSessionManager<?> drmSessionManager; private final DrmSessionManager drmSessionManager;
private final LoadErrorHandlingPolicy loadErrorHandlingPolicy; private final LoadErrorHandlingPolicy loadErrorHandlingPolicy;
private final long elapsedRealtimeOffsetMs; private final long elapsedRealtimeOffsetMs;
private final LoaderErrorThrower manifestLoaderErrorThrower; private final LoaderErrorThrower manifestLoaderErrorThrower;
@ -101,7 +101,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
int periodIndex, int periodIndex,
DashChunkSource.Factory chunkSourceFactory, DashChunkSource.Factory chunkSourceFactory,
@Nullable TransferListener transferListener, @Nullable TransferListener transferListener,
DrmSessionManager<?> drmSessionManager, DrmSessionManager drmSessionManager,
LoadErrorHandlingPolicy loadErrorHandlingPolicy, LoadErrorHandlingPolicy loadErrorHandlingPolicy,
EventDispatcher eventDispatcher, EventDispatcher eventDispatcher,
long elapsedRealtimeOffsetMs, long elapsedRealtimeOffsetMs,
@ -480,7 +480,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
} }
private static Pair<TrackGroupArray, TrackGroupInfo[]> buildTrackGroups( private static Pair<TrackGroupArray, TrackGroupInfo[]> buildTrackGroups(
DrmSessionManager<?> drmSessionManager, DrmSessionManager drmSessionManager,
List<AdaptationSet> adaptationSets, List<AdaptationSet> adaptationSets,
List<EventStream> eventStreams) { List<EventStream> eventStreams) {
int[][] groupedAdaptationSetIndices = getGroupedAdaptationSetIndices(adaptationSets); int[][] groupedAdaptationSetIndices = getGroupedAdaptationSetIndices(adaptationSets);
@ -598,7 +598,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
} }
private static int buildPrimaryAndEmbeddedTrackGroupInfos( private static int buildPrimaryAndEmbeddedTrackGroupInfos(
DrmSessionManager<?> drmSessionManager, DrmSessionManager drmSessionManager,
List<AdaptationSet> adaptationSets, List<AdaptationSet> adaptationSets,
int[][] groupedAdaptationSetIndices, int[][] groupedAdaptationSetIndices,
int primaryGroupCount, int primaryGroupCount,

View File

@ -84,7 +84,7 @@ public final class DashMediaSource extends BaseMediaSource {
private final DashChunkSource.Factory chunkSourceFactory; private final DashChunkSource.Factory chunkSourceFactory;
@Nullable private final DataSource.Factory manifestDataSourceFactory; @Nullable private final DataSource.Factory manifestDataSourceFactory;
private DrmSessionManager<?> drmSessionManager; private DrmSessionManager drmSessionManager;
private CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory; private CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory;
private LoadErrorHandlingPolicy loadErrorHandlingPolicy; private LoadErrorHandlingPolicy loadErrorHandlingPolicy;
private long livePresentationDelayMs; private long livePresentationDelayMs;
@ -154,7 +154,7 @@ public final class DashMediaSource extends BaseMediaSource {
* @return This factory, for convenience. * @return This factory, for convenience.
*/ */
@Override @Override
public Factory setDrmSessionManager(@Nullable DrmSessionManager<?> drmSessionManager) { public Factory setDrmSessionManager(@Nullable DrmSessionManager drmSessionManager) {
this.drmSessionManager = this.drmSessionManager =
drmSessionManager != null drmSessionManager != null
? drmSessionManager ? drmSessionManager
@ -388,7 +388,7 @@ public final class DashMediaSource extends BaseMediaSource {
private final DataSource.Factory manifestDataSourceFactory; private final DataSource.Factory manifestDataSourceFactory;
private final DashChunkSource.Factory chunkSourceFactory; private final DashChunkSource.Factory chunkSourceFactory;
private final CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory; private final CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory;
private final DrmSessionManager<?> drmSessionManager; private final DrmSessionManager drmSessionManager;
private final LoadErrorHandlingPolicy loadErrorHandlingPolicy; private final LoadErrorHandlingPolicy loadErrorHandlingPolicy;
private final long livePresentationDelayMs; private final long livePresentationDelayMs;
private final boolean livePresentationDelayOverridesManifest; private final boolean livePresentationDelayOverridesManifest;
@ -604,7 +604,7 @@ public final class DashMediaSource extends BaseMediaSource {
@Nullable ParsingLoadable.Parser<? extends DashManifest> manifestParser, @Nullable ParsingLoadable.Parser<? extends DashManifest> manifestParser,
DashChunkSource.Factory chunkSourceFactory, DashChunkSource.Factory chunkSourceFactory,
CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory, CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory,
DrmSessionManager<?> drmSessionManager, DrmSessionManager drmSessionManager,
LoadErrorHandlingPolicy loadErrorHandlingPolicy, LoadErrorHandlingPolicy loadErrorHandlingPolicy,
long livePresentationDelayMs, long livePresentationDelayMs,
boolean livePresentationDelayOverridesManifest, boolean livePresentationDelayOverridesManifest,

View File

@ -67,7 +67,7 @@ public final class HlsMediaPeriod implements MediaPeriod, HlsSampleStreamWrapper
private final HlsPlaylistTracker playlistTracker; private final HlsPlaylistTracker playlistTracker;
private final HlsDataSourceFactory dataSourceFactory; private final HlsDataSourceFactory dataSourceFactory;
@Nullable private final TransferListener mediaTransferListener; @Nullable private final TransferListener mediaTransferListener;
private final DrmSessionManager<?> drmSessionManager; private final DrmSessionManager drmSessionManager;
private final LoadErrorHandlingPolicy loadErrorHandlingPolicy; private final LoadErrorHandlingPolicy loadErrorHandlingPolicy;
private final EventDispatcher eventDispatcher; private final EventDispatcher eventDispatcher;
private final Allocator allocator; private final Allocator allocator;
@ -112,7 +112,7 @@ public final class HlsMediaPeriod implements MediaPeriod, HlsSampleStreamWrapper
HlsPlaylistTracker playlistTracker, HlsPlaylistTracker playlistTracker,
HlsDataSourceFactory dataSourceFactory, HlsDataSourceFactory dataSourceFactory,
@Nullable TransferListener mediaTransferListener, @Nullable TransferListener mediaTransferListener,
DrmSessionManager<?> drmSessionManager, DrmSessionManager drmSessionManager,
LoadErrorHandlingPolicy loadErrorHandlingPolicy, LoadErrorHandlingPolicy loadErrorHandlingPolicy,
EventDispatcher eventDispatcher, EventDispatcher eventDispatcher,
Allocator allocator, Allocator allocator,

View File

@ -95,7 +95,7 @@ public final class HlsMediaSource extends BaseMediaSource
private HlsPlaylistParserFactory playlistParserFactory; private HlsPlaylistParserFactory playlistParserFactory;
private HlsPlaylistTracker.Factory playlistTrackerFactory; private HlsPlaylistTracker.Factory playlistTrackerFactory;
private CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory; private CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory;
private DrmSessionManager<?> drmSessionManager; private DrmSessionManager drmSessionManager;
private LoadErrorHandlingPolicy loadErrorHandlingPolicy; private LoadErrorHandlingPolicy loadErrorHandlingPolicy;
private boolean allowChunklessPreparation; private boolean allowChunklessPreparation;
@MetadataType private int metadataType; @MetadataType private int metadataType;
@ -290,7 +290,7 @@ public final class HlsMediaSource extends BaseMediaSource
* @return This factory, for convenience. * @return This factory, for convenience.
*/ */
@Override @Override
public Factory setDrmSessionManager(@Nullable DrmSessionManager<?> drmSessionManager) { public Factory setDrmSessionManager(@Nullable DrmSessionManager drmSessionManager) {
this.drmSessionManager = this.drmSessionManager =
drmSessionManager != null drmSessionManager != null
? drmSessionManager ? drmSessionManager
@ -382,7 +382,7 @@ public final class HlsMediaSource extends BaseMediaSource
private final Uri manifestUri; private final Uri manifestUri;
private final HlsDataSourceFactory dataSourceFactory; private final HlsDataSourceFactory dataSourceFactory;
private final CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory; private final CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory;
private final DrmSessionManager<?> drmSessionManager; private final DrmSessionManager drmSessionManager;
private final LoadErrorHandlingPolicy loadErrorHandlingPolicy; private final LoadErrorHandlingPolicy loadErrorHandlingPolicy;
private final boolean allowChunklessPreparation; private final boolean allowChunklessPreparation;
private final @MetadataType int metadataType; private final @MetadataType int metadataType;
@ -397,7 +397,7 @@ public final class HlsMediaSource extends BaseMediaSource
HlsDataSourceFactory dataSourceFactory, HlsDataSourceFactory dataSourceFactory,
HlsExtractorFactory extractorFactory, HlsExtractorFactory extractorFactory,
CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory, CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory,
DrmSessionManager<?> drmSessionManager, DrmSessionManager drmSessionManager,
LoadErrorHandlingPolicy loadErrorHandlingPolicy, LoadErrorHandlingPolicy loadErrorHandlingPolicy,
HlsPlaylistTracker playlistTracker, HlsPlaylistTracker playlistTracker,
boolean allowChunklessPreparation, boolean allowChunklessPreparation,

View File

@ -114,7 +114,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
private final HlsChunkSource chunkSource; private final HlsChunkSource chunkSource;
private final Allocator allocator; private final Allocator allocator;
@Nullable private final Format muxedAudioFormat; @Nullable private final Format muxedAudioFormat;
private final DrmSessionManager<?> drmSessionManager; private final DrmSessionManager drmSessionManager;
private final LoadErrorHandlingPolicy loadErrorHandlingPolicy; private final LoadErrorHandlingPolicy loadErrorHandlingPolicy;
private final Loader loader; private final Loader loader;
private final EventDispatcher eventDispatcher; private final EventDispatcher eventDispatcher;
@ -190,7 +190,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
Allocator allocator, Allocator allocator,
long positionUs, long positionUs,
@Nullable Format muxedAudioFormat, @Nullable Format muxedAudioFormat,
DrmSessionManager<?> drmSessionManager, DrmSessionManager drmSessionManager,
LoadErrorHandlingPolicy loadErrorHandlingPolicy, LoadErrorHandlingPolicy loadErrorHandlingPolicy,
EventDispatcher eventDispatcher, EventDispatcher eventDispatcher,
@HlsMediaSource.MetadataType int metadataType) { @HlsMediaSource.MetadataType int metadataType) {
@ -1349,7 +1349,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
public FormatAdjustingSampleQueue( public FormatAdjustingSampleQueue(
Allocator allocator, Allocator allocator,
DrmSessionManager<?> drmSessionManager, DrmSessionManager drmSessionManager,
MediaSourceEventDispatcher eventDispatcher, MediaSourceEventDispatcher eventDispatcher,
Map<String, DrmInitData> overridingDrmInitData) { Map<String, DrmInitData> overridingDrmInitData) {
super(allocator, drmSessionManager, eventDispatcher); super(allocator, drmSessionManager, eventDispatcher);

View File

@ -47,7 +47,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
private final SsChunkSource.Factory chunkSourceFactory; private final SsChunkSource.Factory chunkSourceFactory;
@Nullable private final TransferListener transferListener; @Nullable private final TransferListener transferListener;
private final LoaderErrorThrower manifestLoaderErrorThrower; private final LoaderErrorThrower manifestLoaderErrorThrower;
private final DrmSessionManager<?> drmSessionManager; private final DrmSessionManager drmSessionManager;
private final LoadErrorHandlingPolicy loadErrorHandlingPolicy; private final LoadErrorHandlingPolicy loadErrorHandlingPolicy;
private final EventDispatcher eventDispatcher; private final EventDispatcher eventDispatcher;
private final Allocator allocator; private final Allocator allocator;
@ -65,7 +65,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
SsChunkSource.Factory chunkSourceFactory, SsChunkSource.Factory chunkSourceFactory,
@Nullable TransferListener transferListener, @Nullable TransferListener transferListener,
CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory, CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory,
DrmSessionManager<?> drmSessionManager, DrmSessionManager drmSessionManager,
LoadErrorHandlingPolicy loadErrorHandlingPolicy, LoadErrorHandlingPolicy loadErrorHandlingPolicy,
EventDispatcher eventDispatcher, EventDispatcher eventDispatcher,
LoaderErrorThrower manifestLoaderErrorThrower, LoaderErrorThrower manifestLoaderErrorThrower,
@ -259,7 +259,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
} }
private static TrackGroupArray buildTrackGroups( private static TrackGroupArray buildTrackGroups(
SsManifest manifest, DrmSessionManager<?> drmSessionManager) { SsManifest manifest, DrmSessionManager drmSessionManager) {
TrackGroup[] trackGroups = new TrackGroup[manifest.streamElements.length]; TrackGroup[] trackGroups = new TrackGroup[manifest.streamElements.length];
for (int i = 0; i < manifest.streamElements.length; i++) { for (int i = 0; i < manifest.streamElements.length; i++) {
Format[] manifestFormats = manifest.streamElements[i].formats; Format[] manifestFormats = manifest.streamElements[i].formats;

View File

@ -72,7 +72,7 @@ public final class SsMediaSource extends BaseMediaSource
@Nullable private final DataSource.Factory manifestDataSourceFactory; @Nullable private final DataSource.Factory manifestDataSourceFactory;
private CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory; private CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory;
private DrmSessionManager<?> drmSessionManager; private DrmSessionManager drmSessionManager;
private LoadErrorHandlingPolicy loadErrorHandlingPolicy; private LoadErrorHandlingPolicy loadErrorHandlingPolicy;
private long livePresentationDelayMs; private long livePresentationDelayMs;
@Nullable private ParsingLoadable.Parser<? extends SsManifest> manifestParser; @Nullable private ParsingLoadable.Parser<? extends SsManifest> manifestParser;
@ -197,7 +197,7 @@ public final class SsMediaSource extends BaseMediaSource
* @return This factory, for convenience. * @return This factory, for convenience.
*/ */
@Override @Override
public Factory setDrmSessionManager(@Nullable DrmSessionManager<?> drmSessionManager) { public Factory setDrmSessionManager(@Nullable DrmSessionManager drmSessionManager) {
this.drmSessionManager = this.drmSessionManager =
drmSessionManager != null drmSessionManager != null
? drmSessionManager ? drmSessionManager
@ -346,7 +346,7 @@ public final class SsMediaSource extends BaseMediaSource
private final DataSource.Factory manifestDataSourceFactory; private final DataSource.Factory manifestDataSourceFactory;
private final SsChunkSource.Factory chunkSourceFactory; private final SsChunkSource.Factory chunkSourceFactory;
private final CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory; private final CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory;
private final DrmSessionManager<?> drmSessionManager; private final DrmSessionManager drmSessionManager;
private final LoadErrorHandlingPolicy loadErrorHandlingPolicy; private final LoadErrorHandlingPolicy loadErrorHandlingPolicy;
private final long livePresentationDelayMs; private final long livePresentationDelayMs;
private final EventDispatcher manifestEventDispatcher; private final EventDispatcher manifestEventDispatcher;
@ -529,7 +529,7 @@ public final class SsMediaSource extends BaseMediaSource
@Nullable ParsingLoadable.Parser<? extends SsManifest> manifestParser, @Nullable ParsingLoadable.Parser<? extends SsManifest> manifestParser,
SsChunkSource.Factory chunkSourceFactory, SsChunkSource.Factory chunkSourceFactory,
CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory, CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory,
DrmSessionManager<?> drmSessionManager, DrmSessionManager drmSessionManager,
LoadErrorHandlingPolicy loadErrorHandlingPolicy, LoadErrorHandlingPolicy loadErrorHandlingPolicy,
long livePresentationDelayMs, long livePresentationDelayMs,
@Nullable Object tag) { @Nullable Object tag) {

View File

@ -29,7 +29,6 @@ import com.google.android.exoplayer2.SimpleExoPlayer;
import com.google.android.exoplayer2.decoder.DecoderCounters; import com.google.android.exoplayer2.decoder.DecoderCounters;
import com.google.android.exoplayer2.drm.DefaultDrmSessionManager; import com.google.android.exoplayer2.drm.DefaultDrmSessionManager;
import com.google.android.exoplayer2.drm.DrmSessionManager; 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.FrameworkMediaDrm;
import com.google.android.exoplayer2.drm.HttpMediaDrmCallback; import com.google.android.exoplayer2.drm.HttpMediaDrmCallback;
import com.google.android.exoplayer2.drm.MediaDrmCallback; import com.google.android.exoplayer2.drm.MediaDrmCallback;
@ -256,8 +255,7 @@ import java.util.List;
} }
@Override @Override
protected DrmSessionManager<FrameworkMediaCrypto> buildDrmSessionManager( protected DrmSessionManager buildDrmSessionManager(final String userAgent) {
final String userAgent) {
if (widevineLicenseUrl == null) { if (widevineLicenseUrl == null) {
return DrmSessionManager.getDummyDrmSessionManager(); return DrmSessionManager.getDummyDrmSessionManager();
} }
@ -265,8 +263,8 @@ import java.util.List;
MediaDrmCallback drmCallback = new HttpMediaDrmCallback(widevineLicenseUrl, MediaDrmCallback drmCallback = new HttpMediaDrmCallback(widevineLicenseUrl,
new DefaultHttpDataSourceFactory(userAgent)); new DefaultHttpDataSourceFactory(userAgent));
FrameworkMediaDrm frameworkMediaDrm = FrameworkMediaDrm.newInstance(WIDEVINE_UUID); FrameworkMediaDrm frameworkMediaDrm = FrameworkMediaDrm.newInstance(WIDEVINE_UUID);
DefaultDrmSessionManager<FrameworkMediaCrypto> drmSessionManager = DefaultDrmSessionManager drmSessionManager =
new DefaultDrmSessionManager<>( new DefaultDrmSessionManager(
C.WIDEVINE_UUID, C.WIDEVINE_UUID,
frameworkMediaDrm, frameworkMediaDrm,
drmCallback, drmCallback,
@ -299,7 +297,7 @@ import java.util.List;
@Override @Override
protected MediaSource buildSource( protected MediaSource buildSource(
HostActivity host, String userAgent, DrmSessionManager<?> drmSessionManager) { HostActivity host, String userAgent, DrmSessionManager drmSessionManager) {
DataSource.Factory dataSourceFactory = DataSource.Factory dataSourceFactory =
this.dataSourceFactory != null this.dataSourceFactory != null
? this.dataSourceFactory ? this.dataSourceFactory

View File

@ -27,7 +27,6 @@ import androidx.test.rule.ActivityTestRule;
import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Player;
import com.google.android.exoplayer2.drm.DrmInitData; import com.google.android.exoplayer2.drm.DrmInitData;
import com.google.android.exoplayer2.drm.DrmSession.DrmSessionException; 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.drm.OfflineLicenseHelper;
import com.google.android.exoplayer2.source.dash.DashUtil; import com.google.android.exoplayer2.source.dash.DashUtil;
import com.google.android.exoplayer2.source.dash.manifest.DashManifest; import com.google.android.exoplayer2.source.dash.manifest.DashManifest;
@ -54,7 +53,7 @@ public final class DashWidevineOfflineTest {
private DashTestRunner testRunner; private DashTestRunner testRunner;
private DefaultHttpDataSourceFactory httpDataSourceFactory; private DefaultHttpDataSourceFactory httpDataSourceFactory;
private OfflineLicenseHelper<ExoMediaCrypto> offlineLicenseHelper; private OfflineLicenseHelper offlineLicenseHelper;
private byte[] offlineLicenseKeySetId; private byte[] offlineLicenseKeySetId;
@Rule public ActivityTestRule<HostActivity> testRule = new ActivityTestRule<>(HostActivity.class); @Rule public ActivityTestRule<HostActivity> testRule = new ActivityTestRule<>(HostActivity.class);

View File

@ -31,7 +31,6 @@ import com.google.android.exoplayer2.analytics.AnalyticsListener;
import com.google.android.exoplayer2.audio.DefaultAudioSink; import com.google.android.exoplayer2.audio.DefaultAudioSink;
import com.google.android.exoplayer2.decoder.DecoderCounters; import com.google.android.exoplayer2.decoder.DecoderCounters;
import com.google.android.exoplayer2.drm.DrmSessionManager; 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.source.MediaSource;
import com.google.android.exoplayer2.testutil.HostActivity.HostedTest; import com.google.android.exoplayer2.testutil.HostActivity.HostedTest;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; 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.start(player, trackSelector, surface, actionHandler, /* callback= */ null);
pendingSchedule = null; pendingSchedule = null;
} }
DrmSessionManager<FrameworkMediaCrypto> drmSessionManager = buildDrmSessionManager(userAgent); DrmSessionManager drmSessionManager = buildDrmSessionManager(userAgent);
player.setMediaSource(buildSource(host, Util.getUserAgent(host, userAgent), drmSessionManager)); player.setMediaSource(buildSource(host, Util.getUserAgent(host, userAgent), drmSessionManager));
player.prepare(); player.prepare();
} }
@ -232,7 +231,7 @@ public abstract class ExoHostedTest implements AnalyticsListener, HostedTest {
return true; return true;
} }
protected DrmSessionManager<FrameworkMediaCrypto> buildDrmSessionManager(String userAgent) { protected DrmSessionManager buildDrmSessionManager(String userAgent) {
// Do nothing. Interested subclasses may override. // Do nothing. Interested subclasses may override.
return DrmSessionManager.getDummyDrmSessionManager(); return DrmSessionManager.getDummyDrmSessionManager();
} }
@ -255,7 +254,7 @@ public abstract class ExoHostedTest implements AnalyticsListener, HostedTest {
} }
protected abstract MediaSource buildSource( protected abstract MediaSource buildSource(
HostActivity host, String userAgent, DrmSessionManager<?> drmSessionManager); HostActivity host, String userAgent, DrmSessionManager drmSessionManager);
protected void onPlayerErrorInternal(ExoPlaybackException error) { protected void onPlayerErrorInternal(ExoPlaybackException error) {
// Do nothing. Interested subclasses may override. // Do nothing. Interested subclasses may override.