Allow user to pick which track types to create placeholder sessions for
Issue:#4867 PiperOrigin-RevId: 281064793
This commit is contained in:
parent
1ef345192c
commit
d984a8cdd3
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user