Allow user to pick which track types to create placeholder sessions for

Issue:#4867
PiperOrigin-RevId: 281064793
This commit is contained in:
aquilescanta 2019-11-18 15:32:46 +00:00 committed by Oliver Woodman
parent 1ef345192c
commit d984a8cdd3

View File

@ -57,7 +57,7 @@ public class DefaultDrmSessionManager<T extends ExoMediaCrypto> implements DrmSe
private UUID uuid; private UUID uuid;
private ExoMediaDrm.Provider<ExoMediaCrypto> exoMediaDrmProvider; private ExoMediaDrm.Provider<ExoMediaCrypto> exoMediaDrmProvider;
private boolean multiSession; private boolean multiSession;
private boolean preferSecureDecoders; private int[] useDrmSessionsForClearContentTrackTypes;
@Flags private int flags; @Flags private int flags;
private LoadErrorHandlingPolicy loadErrorHandlingPolicy; private LoadErrorHandlingPolicy loadErrorHandlingPolicy;
@ -70,7 +70,7 @@ public class DefaultDrmSessionManager<T extends ExoMediaCrypto> implements DrmSe
* <li>{@link #setUuidAndExoMediaDrmProvider ExoMediaDrm.Provider}: {@link * <li>{@link #setUuidAndExoMediaDrmProvider ExoMediaDrm.Provider}: {@link
* FrameworkMediaDrm#DEFAULT_PROVIDER}. * FrameworkMediaDrm#DEFAULT_PROVIDER}.
* <li>{@link #setMultiSession multiSession}: {@code false}. * <li>{@link #setMultiSession multiSession}: {@code false}.
* <li>{@link #setPreferSecureDecoders preferSecureDecoders}: {@code false}. * <li>{@link #setUseDrmSessionsForClearContent useDrmSessionsForClearContent}: No tracks.
* <li>{@link #setPlayClearSamplesWithoutKeys playClearSamplesWithoutKeys}: {@code false}. * <li>{@link #setPlayClearSamplesWithoutKeys playClearSamplesWithoutKeys}: {@code false}.
* <li>{@link #setLoadErrorHandlingPolicy LoadErrorHandlingPolicy}: {@link * <li>{@link #setLoadErrorHandlingPolicy LoadErrorHandlingPolicy}: {@link
* DefaultLoadErrorHandlingPolicy}. * DefaultLoadErrorHandlingPolicy}.
@ -82,6 +82,7 @@ public class DefaultDrmSessionManager<T extends ExoMediaCrypto> implements DrmSe
uuid = C.WIDEVINE_UUID; uuid = C.WIDEVINE_UUID;
exoMediaDrmProvider = (ExoMediaDrm.Provider) FrameworkMediaDrm.DEFAULT_PROVIDER; exoMediaDrmProvider = (ExoMediaDrm.Provider) FrameworkMediaDrm.DEFAULT_PROVIDER;
loadErrorHandlingPolicy = new DefaultLoadErrorHandlingPolicy(); loadErrorHandlingPolicy = new DefaultLoadErrorHandlingPolicy();
useDrmSessionsForClearContentTrackTypes = new int[0];
} }
/** /**
@ -127,14 +128,27 @@ public class DefaultDrmSessionManager<T extends ExoMediaCrypto> implements DrmSe
} }
/** /**
* Sets whether this session manager should hint the use of secure decoders for clear content. * Sets whether this session manager should attach {@link DrmSession DrmSessions} to the clear
* sections of the media content.
* *
* @param preferSecureDecoders Whether this session manager should hint the use of secure * <p>Using {@link DrmSession DrmSessions} for clear content avoids the recreation of decoders
* decoders for clear content. * when transitioning between clear and encrypted sections of content.
*
* @param useDrmSessionsForClearContentTrackTypes The track types ({@link C#TRACK_TYPE_AUDIO}
* and/or {@link C#TRACK_TYPE_VIDEO}) for which to use a {@link DrmSession} regardless of
* whether the content is clear or encrypted.
* @return This builder. * @return This builder.
* @throws IllegalArgumentException If {@code useDrmSessionsForClearContentTrackTypes} contains
* track types other than {@link C#TRACK_TYPE_AUDIO} and {@link C#TRACK_TYPE_VIDEO}.
*/ */
public Builder setPreferSecureDecoders(boolean preferSecureDecoders) { public Builder setUseDrmSessionsForClearContent(
this.preferSecureDecoders = preferSecureDecoders; int... useDrmSessionsForClearContentTrackTypes) {
for (int trackType : useDrmSessionsForClearContentTrackTypes) {
Assertions.checkArgument(
trackType == C.TRACK_TYPE_VIDEO || trackType == C.TRACK_TYPE_AUDIO);
}
this.useDrmSessionsForClearContentTrackTypes =
useDrmSessionsForClearContentTrackTypes.clone();
return this; return this;
} }
@ -174,7 +188,7 @@ public class DefaultDrmSessionManager<T extends ExoMediaCrypto> implements DrmSe
mediaDrmCallback, mediaDrmCallback,
keyRequestParameters, keyRequestParameters,
multiSession, multiSession,
preferSecureDecoders, useDrmSessionsForClearContentTrackTypes,
flags, flags,
loadErrorHandlingPolicy); loadErrorHandlingPolicy);
} }
@ -226,7 +240,7 @@ public class DefaultDrmSessionManager<T extends ExoMediaCrypto> implements DrmSe
@Nullable private final HashMap<String, String> optionalKeyRequestParameters; @Nullable private final HashMap<String, String> optionalKeyRequestParameters;
private final EventDispatcher<DefaultDrmSessionEventListener> eventDispatcher; private final EventDispatcher<DefaultDrmSessionEventListener> eventDispatcher;
private final boolean multiSession; private final boolean multiSession;
private final boolean preferSecureDecoders; private final int[] useDrmSessionsForClearContentTrackTypes;
@Flags private final int flags; @Flags private final int flags;
private final ProvisioningManagerImpl provisioningManagerImpl; private final ProvisioningManagerImpl provisioningManagerImpl;
private final LoadErrorHandlingPolicy loadErrorHandlingPolicy; private final LoadErrorHandlingPolicy loadErrorHandlingPolicy;
@ -320,7 +334,7 @@ public class DefaultDrmSessionManager<T extends ExoMediaCrypto> implements DrmSe
callback, callback,
optionalKeyRequestParameters, optionalKeyRequestParameters,
multiSession, multiSession,
/* preferSecureDecoders= */ false, /* useDrmSessionsForClearContentTrackTypes= */ new int[0],
/* flags= */ 0, /* flags= */ 0,
new DefaultLoadErrorHandlingPolicy(initialDrmRequestRetryCount)); new DefaultLoadErrorHandlingPolicy(initialDrmRequestRetryCount));
} }
@ -333,7 +347,7 @@ public class DefaultDrmSessionManager<T extends ExoMediaCrypto> implements DrmSe
MediaDrmCallback callback, MediaDrmCallback callback,
@Nullable HashMap<String, String> optionalKeyRequestParameters, @Nullable HashMap<String, String> optionalKeyRequestParameters,
boolean multiSession, boolean multiSession,
boolean preferSecureDecoders, int[] useDrmSessionsForClearContentTrackTypes,
@Flags int flags, @Flags int flags,
LoadErrorHandlingPolicy loadErrorHandlingPolicy) { LoadErrorHandlingPolicy loadErrorHandlingPolicy) {
Assertions.checkNotNull(uuid); Assertions.checkNotNull(uuid);
@ -344,7 +358,7 @@ public class DefaultDrmSessionManager<T extends ExoMediaCrypto> implements DrmSe
this.optionalKeyRequestParameters = optionalKeyRequestParameters; this.optionalKeyRequestParameters = optionalKeyRequestParameters;
this.eventDispatcher = new EventDispatcher<>(); this.eventDispatcher = new EventDispatcher<>();
this.multiSession = multiSession; this.multiSession = multiSession;
this.preferSecureDecoders = preferSecureDecoders; this.useDrmSessionsForClearContentTrackTypes = useDrmSessionsForClearContentTrackTypes;
this.flags = flags; this.flags = flags;
this.loadErrorHandlingPolicy = loadErrorHandlingPolicy; this.loadErrorHandlingPolicy = loadErrorHandlingPolicy;
provisioningManagerImpl = new ProvisioningManagerImpl(); provisioningManagerImpl = new ProvisioningManagerImpl();
@ -375,7 +389,7 @@ public class DefaultDrmSessionManager<T extends ExoMediaCrypto> implements DrmSe
/** /**
* Sets the mode, which determines the role of sessions acquired from the instance. This must be * Sets the mode, which determines the role of sessions acquired from the instance. This must be
* called before {@link #acquireSession(Looper, DrmInitData)} or {@link * called before {@link #acquireSession(Looper, DrmInitData)} or {@link
* #acquirePlaceholderSession(Looper)} is called. * #acquirePlaceholderSession} is called.
* *
* <p>By default, the mode is {@link #MODE_PLAYBACK} and a streaming license is requested when * <p>By default, the mode is {@link #MODE_PLAYBACK} and a streaming license is requested when
* required. * required.
@ -460,15 +474,13 @@ public class DefaultDrmSessionManager<T extends ExoMediaCrypto> implements DrmSe
@Nullable @Nullable
public DrmSession<T> acquirePlaceholderSession(Looper playbackLooper, int trackType) { public DrmSession<T> acquirePlaceholderSession(Looper playbackLooper, int trackType) {
assertExpectedPlaybackLooper(playbackLooper); assertExpectedPlaybackLooper(playbackLooper);
Assertions.checkNotNull(exoMediaDrm); ExoMediaDrm<T> exoMediaDrm = Assertions.checkNotNull(this.exoMediaDrm);
boolean avoidPlaceholderDrmSessions = boolean avoidPlaceholderDrmSessions =
FrameworkMediaCrypto.class.equals(exoMediaDrm.getExoMediaCryptoType()) FrameworkMediaCrypto.class.equals(exoMediaDrm.getExoMediaCryptoType())
&& FrameworkMediaCrypto.WORKAROUND_DEVICE_NEEDS_KEYS_TO_CONFIGURE_CODEC; && FrameworkMediaCrypto.WORKAROUND_DEVICE_NEEDS_KEYS_TO_CONFIGURE_CODEC;
// Avoid attaching a session to sparse formats. // Avoid attaching a session to sparse formats.
avoidPlaceholderDrmSessions |=
trackType != C.TRACK_TYPE_VIDEO && trackType != C.TRACK_TYPE_AUDIO;
if (avoidPlaceholderDrmSessions if (avoidPlaceholderDrmSessions
|| !preferSecureDecoders || Util.linearSearch(useDrmSessionsForClearContentTrackTypes, trackType) == C.INDEX_UNSET
|| exoMediaDrm.getExoMediaCryptoType() == null) { || exoMediaDrm.getExoMediaCryptoType() == null) {
return null; return null;
} }