mirror of
https://github.com/androidx/media.git
synced 2025-04-30 06:46:50 +08:00
Remove generics from DRM components
PiperOrigin-RevId: 301798563
This commit is contained in:
parent
077e7932bf
commit
aa9eb5abc9
@ -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:
|
||||
|
@ -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));
|
||||
|
@ -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));
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
|
@ -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) {
|
||||
|
@ -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.");
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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}.
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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.
|
||||
|
@ -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());
|
||||
|
@ -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()))
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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) {
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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.
|
||||
|
Loading…
x
Reference in New Issue
Block a user