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
`OfflineLicenseHelper`
([#7078](https://github.com/google/ExoPlayer/issues/7078)).
* Remove generics from DRM components.
* Downloads: Merge downloads in `SegmentDownloader` to improve overall
download speed ([#5978](https://github.com/google/ExoPlayer/issues/5978)).
* DASH:

View File

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

View File

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

View File

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

View File

@ -111,8 +111,8 @@ public abstract class DecoderAudioRenderer extends BaseRenderer implements Media
@Nullable private DecoderInputBuffer inputBuffer;
@Nullable private SimpleOutputBuffer outputBuffer;
@Nullable private DrmSession<ExoMediaCrypto> decoderDrmSession;
@Nullable private DrmSession<ExoMediaCrypto> sourceDrmSession;
@Nullable private DrmSession decoderDrmSession;
@Nullable private DrmSession sourceDrmSession;
@ReinitializationState private int decoderReinitializationState;
private boolean decoderReceivedBuffers;
@ -627,12 +627,12 @@ public abstract class DecoderAudioRenderer extends BaseRenderer implements Media
setDecoderDrmSession(null);
}
private void setSourceDrmSession(@Nullable DrmSession<ExoMediaCrypto> session) {
private void setSourceDrmSession(@Nullable DrmSession session) {
DrmSession.replaceSession(sourceDrmSession, session);
sourceDrmSession = session;
}
private void setDecoderDrmSession(@Nullable DrmSession<ExoMediaCrypto> session) {
private void setDecoderDrmSession(@Nullable DrmSession session) {
DrmSession.replaceSession(decoderDrmSession, session);
decoderDrmSession = session;
}
@ -640,7 +640,7 @@ public abstract class DecoderAudioRenderer extends BaseRenderer implements Media
@SuppressWarnings("unchecked")
private void onInputFormatChanged(FormatHolder formatHolder) throws ExoPlaybackException {
Format newFormat = Assertions.checkNotNull(formatHolder.format);
setSourceDrmSession((DrmSession<ExoMediaCrypto>) formatHolder.drmSession);
setSourceDrmSession(formatHolder.drmSession);
Format oldFormat = inputFormat;
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.audio.AudioRendererEventListener.EventDispatcher;
import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
import com.google.android.exoplayer2.drm.FrameworkMediaCrypto;
import com.google.android.exoplayer2.mediacodec.MediaCodecInfo;
import com.google.android.exoplayer2.mediacodec.MediaCodecRenderer;
import com.google.android.exoplayer2.mediacodec.MediaCodecSelector;
@ -214,8 +213,7 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
}
@TunnelingSupport
int tunnelingSupport = Util.SDK_INT >= 21 ? TUNNELING_SUPPORTED : TUNNELING_NOT_SUPPORTED;
boolean supportsFormatDrm =
format.drmInitData == null || FrameworkMediaCrypto.class.equals(format.exoMediaCryptoType);
boolean supportsFormatDrm = supportsFormatDrm(format);
if (supportsFormatDrm
&& allowPassthrough(format.channelCount, mimeType)
&& mediaCodecSelector.getPassthroughDecoderInfo() != null) {

View File

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

View File

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

View File

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

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

View File

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

View File

@ -21,7 +21,7 @@ import com.google.android.exoplayer2.util.MediaSourceEventDispatcher;
import java.util.Map;
/** A {@link DrmSession} that's in a terminal error state. */
public final class ErrorStateDrmSession<T extends ExoMediaCrypto> implements DrmSession<T> {
public final class ErrorStateDrmSession implements DrmSession {
private final DrmSessionException error;
@ -47,7 +47,7 @@ public final class ErrorStateDrmSession<T extends ExoMediaCrypto> implements Drm
@Override
@Nullable
public T getMediaCrypto() {
public ExoMediaCrypto getMediaCrypto() {
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()}
* when the instance is no longer required.
*/
public interface ExoMediaDrm<T extends ExoMediaCrypto> {
public interface ExoMediaDrm {
/** {@link ExoMediaDrm} instances provider. */
interface Provider<T extends ExoMediaCrypto> {
interface Provider {
/**
* Returns an {@link ExoMediaDrm} instance with an incremented reference count. When the caller
* no longer needs to use the instance, it must call {@link ExoMediaDrm#release()} to decrement
* the reference count.
*/
ExoMediaDrm<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
* 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}. */
public AppManagedProvider(ExoMediaDrm<T> exoMediaDrm) {
public AppManagedProvider(ExoMediaDrm exoMediaDrm) {
this.exoMediaDrm = exoMediaDrm;
}
@Override
public ExoMediaDrm<T> acquireExoMediaDrm(UUID uuid) {
public ExoMediaDrm acquireExoMediaDrm(UUID uuid) {
exoMediaDrm.acquire();
return exoMediaDrm;
}
@ -108,10 +108,8 @@ public interface ExoMediaDrm<T extends ExoMediaCrypto> {
@SuppressWarnings("InlinedApi")
int KEY_TYPE_RELEASE = MediaDrm.KEY_TYPE_RELEASE;
/**
* @see android.media.MediaDrm.OnEventListener
*/
interface OnEventListener<T extends ExoMediaCrypto> {
/** @see android.media.MediaDrm.OnEventListener */
interface OnEventListener {
/**
* Called when an event occurs that requires the app to be notified
*
@ -122,17 +120,15 @@ public interface ExoMediaDrm<T extends ExoMediaCrypto> {
* @param data Optional byte array of data that may be associated with the event.
*/
void onEvent(
ExoMediaDrm<? extends T> mediaDrm,
ExoMediaDrm mediaDrm,
@Nullable byte[] sessionId,
int event,
int extra,
@Nullable byte[] data);
}
/**
* @see android.media.MediaDrm.OnKeyStatusChangeListener
*/
interface OnKeyStatusChangeListener<T extends ExoMediaCrypto> {
/** @see android.media.MediaDrm.OnKeyStatusChangeListener */
interface OnKeyStatusChangeListener {
/**
* Called when the keys in a session change status, such as when the license is renewed or
* expires.
@ -143,14 +139,14 @@ public interface ExoMediaDrm<T extends ExoMediaCrypto> {
* @param hasNewUsableKey Whether a new key became usable.
*/
void onKeyStatusChange(
ExoMediaDrm<? extends T> mediaDrm,
ExoMediaDrm mediaDrm,
byte[] sessionId,
List<KeyStatus> exoKeyInformation,
boolean hasNewUsableKey);
}
/** @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
@ -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
* expire.
*/
void onExpirationUpdate(
ExoMediaDrm<? extends T> mediaDrm, byte[] sessionId, long expirationTimeMs);
void onExpirationUpdate(ExoMediaDrm mediaDrm, byte[] sessionId, long expirationTimeMs);
}
/** @see android.media.MediaDrm.KeyStatus */
@ -229,18 +224,14 @@ public interface ExoMediaDrm<T extends ExoMediaCrypto> {
}
/**
* @see MediaDrm#setOnEventListener(MediaDrm.OnEventListener)
*/
void setOnEventListener(OnEventListener<? super T> listener);
/** @see MediaDrm#setOnEventListener(MediaDrm.OnEventListener) */
void setOnEventListener(OnEventListener listener);
/**
* @see MediaDrm#setOnKeyStatusChangeListener(MediaDrm.OnKeyStatusChangeListener, Handler)
*/
void setOnKeyStatusChangeListener(OnKeyStatusChangeListener<? super T> listener);
/** @see MediaDrm#setOnKeyStatusChangeListener(MediaDrm.OnKeyStatusChangeListener, Handler) */
void setOnKeyStatusChangeListener(OnKeyStatusChangeListener listener);
/** @see MediaDrm#setOnExpirationUpdateListener(MediaDrm.OnExpirationUpdateListener, Handler) */
void setOnExpirationUpdateListener(OnExpirationUpdateListener<? super T> listener);
void setOnExpirationUpdateListener(OnExpirationUpdateListener listener);
/** @see MediaDrm#openSession() */
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.
* @throws MediaCryptoException If the instance can't be created.
*/
T createMediaCrypto(byte[] sessionId) throws MediaCryptoException;
ExoMediaCrypto createMediaCrypto(byte[] sessionId) throws MediaCryptoException;
/**
* Returns the {@link ExoMediaCrypto} type created by {@link #createMediaCrypto(byte[])}, or null
* if this instance cannot create any {@link ExoMediaCrypto} instances.
*/
@Nullable
Class<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}. */
@TargetApi(23)
@RequiresApi(18)
public final class FrameworkMediaDrm implements ExoMediaDrm<FrameworkMediaCrypto> {
public final class FrameworkMediaDrm implements ExoMediaDrm {
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
* is not supported by the device.
*/
public static final Provider<FrameworkMediaCrypto> DEFAULT_PROVIDER =
public static final Provider DEFAULT_PROVIDER =
uuid -> {
try {
return newInstance(uuid);
} catch (UnsupportedDrmException e) {
Log.e(TAG, "Failed to instantiate a FrameworkMediaDrm for uuid: " + uuid + ".");
return new DummyExoMediaDrm<>();
return new DummyExoMediaDrm();
}
};
@ -106,8 +106,7 @@ public final class FrameworkMediaDrm implements ExoMediaDrm<FrameworkMediaCrypto
}
@Override
public void setOnEventListener(
ExoMediaDrm.OnEventListener<? super FrameworkMediaCrypto> listener) {
public void setOnEventListener(ExoMediaDrm.OnEventListener listener) {
mediaDrm.setOnEventListener(
listener == null
? null
@ -116,8 +115,7 @@ public final class FrameworkMediaDrm implements ExoMediaDrm<FrameworkMediaCrypto
}
@Override
public void setOnKeyStatusChangeListener(
ExoMediaDrm.OnKeyStatusChangeListener<? super FrameworkMediaCrypto> listener) {
public void setOnKeyStatusChangeListener(ExoMediaDrm.OnKeyStatusChangeListener listener) {
if (Util.SDK_INT < 23) {
throw new UnsupportedOperationException();
}
@ -137,8 +135,7 @@ public final class FrameworkMediaDrm implements ExoMediaDrm<FrameworkMediaCrypto
}
@Override
public void setOnExpirationUpdateListener(
OnExpirationUpdateListener<? super FrameworkMediaCrypto> listener) {
public void setOnExpirationUpdateListener(OnExpirationUpdateListener listener) {
if (Util.SDK_INT < 23) {
throw new UnsupportedOperationException();
}

View File

@ -32,12 +32,12 @@ import java.util.UUID;
/** Helper class to download, renew and release offline licenses. */
@RequiresApi(18)
public final class OfflineLicenseHelper<T extends ExoMediaCrypto> {
public final class OfflineLicenseHelper {
private static final DrmInitData DUMMY_DRM_INIT_DATA = new DrmInitData();
private final ConditionVariable conditionVariable;
private final DefaultDrmSessionManager<T> drmSessionManager;
private final DefaultDrmSessionManager drmSessionManager;
private final HandlerThread handlerThread;
private final MediaSourceEventDispatcher eventDispatcher;
@ -52,7 +52,7 @@ public final class OfflineLicenseHelper<T extends ExoMediaCrypto> {
* events.
* @return A new instance which uses Widevine CDM.
*/
public static OfflineLicenseHelper<ExoMediaCrypto> newWidevineInstance(
public static OfflineLicenseHelper newWidevineInstance(
String defaultLicenseUrl,
HttpDataSource.Factory httpDataSourceFactory,
MediaSourceEventDispatcher eventDispatcher) {
@ -76,7 +76,7 @@ public final class OfflineLicenseHelper<T extends ExoMediaCrypto> {
* events.
* @return A new instance which uses Widevine CDM.
*/
public static OfflineLicenseHelper<ExoMediaCrypto> newWidevineInstance(
public static OfflineLicenseHelper newWidevineInstance(
String defaultLicenseUrl,
boolean forceDefaultLicenseUrl,
HttpDataSource.Factory httpDataSourceFactory,
@ -105,13 +105,13 @@ public final class OfflineLicenseHelper<T extends ExoMediaCrypto> {
* @see DefaultDrmSessionManager.Builder
*/
@SuppressWarnings("unchecked")
public static OfflineLicenseHelper<ExoMediaCrypto> newWidevineInstance(
public static OfflineLicenseHelper newWidevineInstance(
String defaultLicenseUrl,
boolean forceDefaultLicenseUrl,
HttpDataSource.Factory httpDataSourceFactory,
@Nullable Map<String, String> optionalKeyRequestParameters,
MediaSourceEventDispatcher eventDispatcher) {
return new OfflineLicenseHelper<>(
return new OfflineLicenseHelper(
new DefaultDrmSessionManager.Builder()
.setKeyRequestParameters(optionalKeyRequestParameters)
.build(
@ -128,12 +128,11 @@ public final class OfflineLicenseHelper<T extends ExoMediaCrypto> {
@SuppressWarnings("unchecked")
public OfflineLicenseHelper(
UUID uuid,
ExoMediaDrm.Provider<T> mediaDrmProvider,
ExoMediaDrm.Provider mediaDrmProvider,
MediaDrmCallback callback,
@Nullable Map<String, String> optionalKeyRequestParameters,
MediaSourceEventDispatcher eventDispatcher) {
this(
(DefaultDrmSessionManager<T>)
new DefaultDrmSessionManager.Builder()
.setUuidAndExoMediaDrmProvider(uuid, mediaDrmProvider)
.setKeyRequestParameters(optionalKeyRequestParameters)
@ -149,7 +148,7 @@ public final class OfflineLicenseHelper<T extends ExoMediaCrypto> {
* events.
*/
public OfflineLicenseHelper(
DefaultDrmSessionManager<T> defaultDrmSessionManager,
DefaultDrmSessionManager defaultDrmSessionManager,
MediaSourceEventDispatcher eventDispatcher) {
this.drmSessionManager = defaultDrmSessionManager;
this.eventDispatcher = eventDispatcher;
@ -231,7 +230,7 @@ public final class OfflineLicenseHelper<T extends ExoMediaCrypto> {
throws DrmSessionException {
Assertions.checkNotNull(offlineLicenseKeySetId);
drmSessionManager.prepare();
DrmSession<T> drmSession =
DrmSession drmSession =
openBlockingKeyRequest(
DefaultDrmSessionManager.MODE_QUERY, offlineLicenseKeySetId, DUMMY_DRM_INIT_DATA);
DrmSessionException error = drmSession.getError();
@ -259,8 +258,8 @@ public final class OfflineLicenseHelper<T extends ExoMediaCrypto> {
@Mode int licenseMode, @Nullable byte[] offlineLicenseKeySetId, DrmInitData drmInitData)
throws DrmSessionException {
drmSessionManager.prepare();
DrmSession<T> drmSession = openBlockingKeyRequest(licenseMode, offlineLicenseKeySetId,
drmInitData);
DrmSession drmSession =
openBlockingKeyRequest(licenseMode, offlineLicenseKeySetId, drmInitData);
DrmSessionException error = drmSession.getError();
byte[] keySetId = drmSession.getOfflineLicenseKeySetId();
drmSession.release(eventDispatcher);
@ -271,11 +270,11 @@ public final class OfflineLicenseHelper<T extends ExoMediaCrypto> {
return Assertions.checkNotNull(keySetId);
}
private DrmSession<T> openBlockingKeyRequest(
private DrmSession openBlockingKeyRequest(
@Mode int licenseMode, @Nullable byte[] offlineLicenseKeySetId, DrmInitData drmInitData) {
drmSessionManager.setMode(licenseMode, offlineLicenseKeySetId);
conditionVariable.close();
DrmSession<T> drmSession =
DrmSession drmSession =
drmSessionManager.acquireSession(handlerThread.getLooper(), eventDispatcher, drmInitData);
// Block current thread until key loading is finished
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,
* or null if called before the session has been opened or after it's been released.
*/
public static @Nullable Pair<Long, Long> getLicenseDurationRemainingSec(
DrmSession<?> drmSession) {
public static @Nullable Pair<Long, Long> getLicenseDurationRemainingSec(DrmSession drmSession) {
Map<String, String> keyStatus = drmSession.queryKeyStatus();
if (keyStatus == 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.drm.DrmSession;
import com.google.android.exoplayer2.drm.DrmSession.DrmSessionException;
import com.google.android.exoplayer2.drm.ExoMediaCrypto;
import com.google.android.exoplayer2.drm.FrameworkMediaCrypto;
import com.google.android.exoplayer2.mediacodec.MediaCodecUtil.DecoderQueryException;
import com.google.android.exoplayer2.source.MediaPeriod;
@ -368,8 +369,8 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
@Nullable private Format inputFormat;
private Format outputFormat;
@Nullable private DrmSession<FrameworkMediaCrypto> codecDrmSession;
@Nullable private DrmSession<FrameworkMediaCrypto> sourceDrmSession;
@Nullable private DrmSession codecDrmSession;
@Nullable private DrmSession sourceDrmSession;
@Nullable private MediaCrypto mediaCrypto;
private boolean mediaCryptoRequiresSecureDecoder;
private long renderTimeLimitMs;
@ -574,9 +575,10 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
String mimeType = inputFormat.sampleMimeType;
if (codecDrmSession != null) {
if (mediaCrypto == null) {
FrameworkMediaCrypto sessionMediaCrypto = codecDrmSession.getMediaCrypto();
@Nullable
FrameworkMediaCrypto sessionMediaCrypto = getFrameworkMediaCrypto(codecDrmSession);
if (sessionMediaCrypto == null) {
DrmSessionException drmError = codecDrmSession.getError();
@Nullable DrmSessionException drmError = codecDrmSession.getError();
if (drmError != null) {
// Continue for now. We may be able to avoid failure if the session recovers, or if a
// new input format causes the session to be replaced before it's used.
@ -1146,12 +1148,12 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
outputBuffer = null;
}
private void setSourceDrmSession(@Nullable DrmSession<FrameworkMediaCrypto> session) {
private void setSourceDrmSession(@Nullable DrmSession session) {
DrmSession.replaceSession(sourceDrmSession, session);
sourceDrmSession = session;
}
private void setCodecDrmSession(@Nullable DrmSession<FrameworkMediaCrypto> session) {
private void setCodecDrmSession(@Nullable DrmSession session) {
DrmSession.replaceSession(codecDrmSession, session);
codecDrmSession = session;
}
@ -1357,7 +1359,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
protected void onInputFormatChanged(FormatHolder formatHolder) throws ExoPlaybackException {
waitingForFirstSampleInFormat = true;
Format newFormat = Assertions.checkNotNull(formatHolder.format);
setSourceDrmSession((DrmSession<FrameworkMediaCrypto>) formatHolder.drmSession);
setSourceDrmSession(formatHolder.drmSession);
inputFormat = newFormat;
if (codec == null) {
@ -1865,6 +1867,47 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
return outputStreamOffsetUs;
}
/** Returns whether this renderer supports the given {@link Format Format's} DRM scheme. */
protected static boolean supportsFormatDrm(Format format) {
return format.drmInitData == null
|| FrameworkMediaCrypto.class.equals(format.exoMediaCryptoType);
}
/**
* Returns whether a {@link DrmSession} may require a secure decoder for a given {@link Format}.
*
* @param drmSession The {@link DrmSession}.
* @param format The {@link Format}.
* @return Whether a secure decoder may be required.
*/
private boolean maybeRequiresSecureDecoder(DrmSession drmSession, Format format)
throws ExoPlaybackException {
// MediaCrypto type is checked during track selection.
@Nullable FrameworkMediaCrypto sessionMediaCrypto = getFrameworkMediaCrypto(drmSession);
if (sessionMediaCrypto == null) {
// We'd only expect this to happen if the CDM from which the pending session is obtained needs
// provisioning. This is unlikely to happen (it probably requires a switch from one DRM scheme
// to another, where the new CDM hasn't been used before and needs provisioning). Assume that
// a secure decoder may be required.
return true;
}
if (sessionMediaCrypto.forceAllowInsecureDecoderComponents) {
return false;
}
MediaCrypto mediaCrypto;
try {
mediaCrypto = new MediaCrypto(sessionMediaCrypto.uuid, sessionMediaCrypto.sessionId);
} catch (MediaCryptoException e) {
// This shouldn't happen, but if it does then assume that a secure decoder may be required.
return true;
}
try {
return mediaCrypto.requiresSecureDecoderComponent(format.sampleMimeType);
} finally {
mediaCrypto.release();
}
}
private void reinitializeCodec() throws ExoPlaybackException {
releaseCodec();
maybeInitCodec();
@ -1885,7 +1928,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
@RequiresApi(23)
private void updateDrmSessionOrReinitializeCodecV23() throws ExoPlaybackException {
@Nullable FrameworkMediaCrypto sessionMediaCrypto = sourceDrmSession.getMediaCrypto();
@Nullable FrameworkMediaCrypto sessionMediaCrypto = getFrameworkMediaCrypto(sourceDrmSession);
if (sessionMediaCrypto == null) {
// We'd only expect this to happen if the CDM from which the pending session is obtained needs
// provisioning. This is unlikely to happen (it probably requires a switch from one DRM scheme
@ -1919,38 +1962,18 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
codecDrainAction = DRAIN_ACTION_NONE;
}
/**
* Returns whether a {@link DrmSession} may require a secure decoder for a given {@link Format}.
*
* @param drmSession The {@link DrmSession}.
* @param format The {@link Format}.
* @return Whether a secure decoder may be required.
*/
private static boolean maybeRequiresSecureDecoder(
DrmSession<FrameworkMediaCrypto> drmSession, Format format) {
@Nullable FrameworkMediaCrypto sessionMediaCrypto = drmSession.getMediaCrypto();
if (sessionMediaCrypto == null) {
// We'd only expect this to happen if the CDM from which the pending session is obtained needs
// provisioning. This is unlikely to happen (it probably requires a switch from one DRM scheme
// to another, where the new CDM hasn't been used before and needs provisioning). Assume that
// a secure decoder may be required.
return true;
}
if (sessionMediaCrypto.forceAllowInsecureDecoderComponents) {
return false;
}
MediaCrypto mediaCrypto;
try {
mediaCrypto = new MediaCrypto(sessionMediaCrypto.uuid, sessionMediaCrypto.sessionId);
} catch (MediaCryptoException e) {
// This shouldn't happen, but if it does then assume that a secure decoder may be required.
return true;
}
try {
return mediaCrypto.requiresSecureDecoderComponent(format.sampleMimeType);
} finally {
mediaCrypto.release();
@Nullable
private FrameworkMediaCrypto getFrameworkMediaCrypto(DrmSession drmSession)
throws ExoPlaybackException {
@Nullable ExoMediaCrypto mediaCrypto = drmSession.getMediaCrypto();
if (mediaCrypto != null && !(mediaCrypto instanceof FrameworkMediaCrypto)) {
// This should not happen if the track went through a supportsFormatDrm() check, during track
// selection.
throw createRendererException(
new IllegalArgumentException("Expecting FrameworkMediaCrypto but found: " + mediaCrypto),
inputFormat);
}
return (FrameworkMediaCrypto) mediaCrypto;
}
private static boolean isMediaCodecException(IllegalStateException error) {

View File

@ -30,7 +30,6 @@ import com.google.android.exoplayer2.RenderersFactory;
import com.google.android.exoplayer2.Timeline;
import com.google.android.exoplayer2.audio.AudioRendererEventListener;
import com.google.android.exoplayer2.drm.DrmSessionManager;
import com.google.android.exoplayer2.drm.FrameworkMediaCrypto;
import com.google.android.exoplayer2.source.MediaPeriod;
import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId;
@ -281,7 +280,7 @@ public final class DownloadHelper {
Uri uri,
DataSource.Factory dataSourceFactory,
RenderersFactory renderersFactory,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
@Nullable DrmSessionManager drmSessionManager,
DefaultTrackSelector.Parameters trackSelectorParameters) {
return new DownloadHelper(
DownloadRequest.TYPE_DASH,
@ -351,7 +350,7 @@ public final class DownloadHelper {
Uri uri,
DataSource.Factory dataSourceFactory,
RenderersFactory renderersFactory,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
@Nullable DrmSessionManager drmSessionManager,
DefaultTrackSelector.Parameters trackSelectorParameters) {
return new DownloadHelper(
DownloadRequest.TYPE_HLS,
@ -421,7 +420,7 @@ public final class DownloadHelper {
Uri uri,
DataSource.Factory dataSourceFactory,
RenderersFactory renderersFactory,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
@Nullable DrmSessionManager drmSessionManager,
DefaultTrackSelector.Parameters trackSelectorParameters) {
return new DownloadHelper(
DownloadRequest.TYPE_SS,
@ -459,7 +458,7 @@ public final class DownloadHelper {
public static MediaSource createMediaSource(
DownloadRequest downloadRequest,
DataSource.Factory dataSourceFactory,
@Nullable DrmSessionManager<?> drmSessionManager) {
@Nullable DrmSessionManager drmSessionManager) {
@Nullable Constructor<? extends MediaSourceFactory> constructor;
switch (downloadRequest.type) {
case DownloadRequest.TYPE_DASH:
@ -943,7 +942,7 @@ public final class DownloadHelper {
@Nullable Constructor<? extends MediaSourceFactory> constructor,
Uri uri,
Factory dataSourceFactory,
@Nullable DrmSessionManager<?> drmSessionManager,
@Nullable DrmSessionManager drmSessionManager,
@Nullable List<StreamKey> streamKeys) {
if (constructor == null) {
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;
private final String userAgent;
private DrmSessionManager<?> drmSessionManager;
private DrmSessionManager drmSessionManager;
private HttpDataSource.Factory drmHttpDataSourceFactory;
private boolean playClearContentWithoutKey;
private int[] useDrmSessionsForClearContentTrackTypes;
@ -191,7 +191,7 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory {
@Override
public DefaultMediaSourceFactory setDrmSessionManager(
@Nullable DrmSessionManager<?> drmSessionManager) {
@Nullable DrmSessionManager drmSessionManager) {
this.drmSessionManager =
drmSessionManager != null
? drmSessionManager
@ -249,7 +249,7 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory {
// internal methods
private DrmSessionManager<?> createDrmSessionManager(MediaItem mediaItem) {
private DrmSessionManager createDrmSessionManager(MediaItem mediaItem) {
Assertions.checkNotNull(mediaItem.playbackProperties);
if (mediaItem.playbackProperties.drmConfiguration == null
|| mediaItem.playbackProperties.drmConfiguration.licenseUri == null

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -105,8 +105,8 @@ public abstract class DecoderVideoRenderer extends BaseRenderer {
@Nullable private VideoFrameMetadataListener frameMetadataListener;
@C.VideoOutputMode private int outputMode;
@Nullable private DrmSession<ExoMediaCrypto> decoderDrmSession;
@Nullable private DrmSession<ExoMediaCrypto> sourceDrmSession;
@Nullable private DrmSession decoderDrmSession;
@Nullable private DrmSession sourceDrmSession;
@ReinitializationState private int decoderReinitializationState;
private boolean decoderReceivedBuffers;
@ -379,7 +379,7 @@ public abstract class DecoderVideoRenderer extends BaseRenderer {
protected void onInputFormatChanged(FormatHolder formatHolder) throws ExoPlaybackException {
waitingForFirstSampleInFormat = true;
Format newFormat = Assertions.checkNotNull(formatHolder.format);
setSourceDrmSession((DrmSession<ExoMediaCrypto>) formatHolder.drmSession);
setSourceDrmSession(formatHolder.drmSession);
inputFormat = newFormat;
if (sourceDrmSession != decoderDrmSession) {
@ -643,12 +643,12 @@ public abstract class DecoderVideoRenderer extends BaseRenderer {
// Internal methods.
private void setSourceDrmSession(@Nullable DrmSession<ExoMediaCrypto> session) {
private void setSourceDrmSession(@Nullable DrmSession session) {
DrmSession.replaceSession(sourceDrmSession, session);
sourceDrmSession = session;
}
private void setDecoderDrmSession(@Nullable DrmSession<ExoMediaCrypto> session) {
private void setDecoderDrmSession(@Nullable DrmSession session) {
DrmSession.replaceSession(decoderDrmSession, session);
decoderDrmSession = session;
}
@ -891,7 +891,7 @@ public abstract class DecoderVideoRenderer extends BaseRenderer {
}
private boolean shouldWaitForKeys(boolean bufferEncrypted) throws ExoPlaybackException {
DrmSession<ExoMediaCrypto> decoderDrmSession = this.decoderDrmSession;
DrmSession decoderDrmSession = this.decoderDrmSession;
if (decoderDrmSession == null
|| (!bufferEncrypted && decoderDrmSession.playClearSamplesWithoutKeys())) {
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.decoder.DecoderInputBuffer;
import com.google.android.exoplayer2.drm.DrmInitData;
import com.google.android.exoplayer2.drm.FrameworkMediaCrypto;
import com.google.android.exoplayer2.mediacodec.MediaCodecDecoderException;
import com.google.android.exoplayer2.mediacodec.MediaCodecInfo;
import com.google.android.exoplayer2.mediacodec.MediaCodecRenderer;
@ -272,9 +271,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
if (decoderInfos.isEmpty()) {
return RendererCapabilities.create(FORMAT_UNSUPPORTED_SUBTYPE);
}
boolean supportsFormatDrm =
drmInitData == null || FrameworkMediaCrypto.class.equals(format.exoMediaCryptoType);
if (!supportsFormatDrm) {
if (!supportsFormatDrm(format)) {
return RendererCapabilities.create(FORMAT_UNSUPPORTED_DRM);
}
// Check capabilities for the first decoder in the list, which takes priority.

View File

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

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -72,7 +72,7 @@ public final class SsMediaSource extends BaseMediaSource
@Nullable private final DataSource.Factory manifestDataSourceFactory;
private CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory;
private DrmSessionManager<?> drmSessionManager;
private DrmSessionManager drmSessionManager;
private LoadErrorHandlingPolicy loadErrorHandlingPolicy;
private long livePresentationDelayMs;
@Nullable private ParsingLoadable.Parser<? extends SsManifest> manifestParser;
@ -197,7 +197,7 @@ public final class SsMediaSource extends BaseMediaSource
* @return This factory, for convenience.
*/
@Override
public Factory setDrmSessionManager(@Nullable DrmSessionManager<?> drmSessionManager) {
public Factory setDrmSessionManager(@Nullable DrmSessionManager drmSessionManager) {
this.drmSessionManager =
drmSessionManager != null
? drmSessionManager
@ -346,7 +346,7 @@ public final class SsMediaSource extends BaseMediaSource
private final DataSource.Factory manifestDataSourceFactory;
private final SsChunkSource.Factory chunkSourceFactory;
private final CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory;
private final DrmSessionManager<?> drmSessionManager;
private final DrmSessionManager drmSessionManager;
private final LoadErrorHandlingPolicy loadErrorHandlingPolicy;
private final long livePresentationDelayMs;
private final EventDispatcher manifestEventDispatcher;
@ -529,7 +529,7 @@ public final class SsMediaSource extends BaseMediaSource
@Nullable ParsingLoadable.Parser<? extends SsManifest> manifestParser,
SsChunkSource.Factory chunkSourceFactory,
CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory,
DrmSessionManager<?> drmSessionManager,
DrmSessionManager drmSessionManager,
LoadErrorHandlingPolicy loadErrorHandlingPolicy,
long livePresentationDelayMs,
@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.drm.DefaultDrmSessionManager;
import com.google.android.exoplayer2.drm.DrmSessionManager;
import com.google.android.exoplayer2.drm.FrameworkMediaCrypto;
import com.google.android.exoplayer2.drm.FrameworkMediaDrm;
import com.google.android.exoplayer2.drm.HttpMediaDrmCallback;
import com.google.android.exoplayer2.drm.MediaDrmCallback;
@ -256,8 +255,7 @@ import java.util.List;
}
@Override
protected DrmSessionManager<FrameworkMediaCrypto> buildDrmSessionManager(
final String userAgent) {
protected DrmSessionManager buildDrmSessionManager(final String userAgent) {
if (widevineLicenseUrl == null) {
return DrmSessionManager.getDummyDrmSessionManager();
}
@ -265,8 +263,8 @@ import java.util.List;
MediaDrmCallback drmCallback = new HttpMediaDrmCallback(widevineLicenseUrl,
new DefaultHttpDataSourceFactory(userAgent));
FrameworkMediaDrm frameworkMediaDrm = FrameworkMediaDrm.newInstance(WIDEVINE_UUID);
DefaultDrmSessionManager<FrameworkMediaCrypto> drmSessionManager =
new DefaultDrmSessionManager<>(
DefaultDrmSessionManager drmSessionManager =
new DefaultDrmSessionManager(
C.WIDEVINE_UUID,
frameworkMediaDrm,
drmCallback,
@ -299,7 +297,7 @@ import java.util.List;
@Override
protected MediaSource buildSource(
HostActivity host, String userAgent, DrmSessionManager<?> drmSessionManager) {
HostActivity host, String userAgent, DrmSessionManager drmSessionManager) {
DataSource.Factory dataSourceFactory =
this.dataSourceFactory != null
? this.dataSourceFactory

View File

@ -27,7 +27,6 @@ import androidx.test.rule.ActivityTestRule;
import com.google.android.exoplayer2.Player;
import com.google.android.exoplayer2.drm.DrmInitData;
import com.google.android.exoplayer2.drm.DrmSession.DrmSessionException;
import com.google.android.exoplayer2.drm.ExoMediaCrypto;
import com.google.android.exoplayer2.drm.OfflineLicenseHelper;
import com.google.android.exoplayer2.source.dash.DashUtil;
import com.google.android.exoplayer2.source.dash.manifest.DashManifest;
@ -54,7 +53,7 @@ public final class DashWidevineOfflineTest {
private DashTestRunner testRunner;
private DefaultHttpDataSourceFactory httpDataSourceFactory;
private OfflineLicenseHelper<ExoMediaCrypto> offlineLicenseHelper;
private OfflineLicenseHelper offlineLicenseHelper;
private byte[] offlineLicenseKeySetId;
@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.decoder.DecoderCounters;
import com.google.android.exoplayer2.drm.DrmSessionManager;
import com.google.android.exoplayer2.drm.FrameworkMediaCrypto;
import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.testutil.HostActivity.HostedTest;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
@ -142,7 +141,7 @@ public abstract class ExoHostedTest implements AnalyticsListener, HostedTest {
pendingSchedule.start(player, trackSelector, surface, actionHandler, /* callback= */ null);
pendingSchedule = null;
}
DrmSessionManager<FrameworkMediaCrypto> drmSessionManager = buildDrmSessionManager(userAgent);
DrmSessionManager drmSessionManager = buildDrmSessionManager(userAgent);
player.setMediaSource(buildSource(host, Util.getUserAgent(host, userAgent), drmSessionManager));
player.prepare();
}
@ -232,7 +231,7 @@ public abstract class ExoHostedTest implements AnalyticsListener, HostedTest {
return true;
}
protected DrmSessionManager<FrameworkMediaCrypto> buildDrmSessionManager(String userAgent) {
protected DrmSessionManager buildDrmSessionManager(String userAgent) {
// Do nothing. Interested subclasses may override.
return DrmSessionManager.getDummyDrmSessionManager();
}
@ -255,7 +254,7 @@ public abstract class ExoHostedTest implements AnalyticsListener, HostedTest {
}
protected abstract MediaSource buildSource(
HostActivity host, String userAgent, DrmSessionManager<?> drmSessionManager);
HostActivity host, String userAgent, DrmSessionManager drmSessionManager);
protected void onPlayerErrorInternal(ExoPlaybackException error) {
// Do nothing. Interested subclasses may override.