Commit 66fd8140 by bachinger Committed by Oliver Woodman

Add forceDefaultLicenseUri to MediaItem.DrmConfiguration

ISSUE: #7114
PiperOrigin-RevId: 311115835
parent c4cd5593
...@@ -84,6 +84,7 @@ public class IntentUtil { ...@@ -84,6 +84,7 @@ public class IntentUtil {
public static final String DRM_KEY_REQUEST_PROPERTIES_EXTRA = "drm_key_request_properties"; public static final String DRM_KEY_REQUEST_PROPERTIES_EXTRA = "drm_key_request_properties";
public static final String DRM_SESSION_FOR_CLEAR_TYPES_EXTRA = "drm_session_for_clear_types"; public static final String DRM_SESSION_FOR_CLEAR_TYPES_EXTRA = "drm_session_for_clear_types";
public static final String DRM_MULTI_SESSION_EXTRA = "drm_multi_session"; public static final String DRM_MULTI_SESSION_EXTRA = "drm_multi_session";
public static final String DRM_FORCE_DEFAULT_LICENSE_URI_EXTRA = "drm_force_default_license_uri";
public static final String AD_TAG_URI_EXTRA = "ad_tag_uri"; public static final String AD_TAG_URI_EXTRA = "ad_tag_uri";
public static final String SUBTITLE_URI_EXTRA = "subtitle_uri"; public static final String SUBTITLE_URI_EXTRA = "subtitle_uri";
public static final String SUBTITLE_MIME_TYPE_EXTRA = "subtitle_mime_type"; public static final String SUBTITLE_MIME_TYPE_EXTRA = "subtitle_mime_type";
...@@ -214,6 +215,8 @@ public class IntentUtil { ...@@ -214,6 +215,8 @@ public class IntentUtil {
.setDrmSessionForClearTypes(toTrackTypeList(drmSessionForClearTypesExtra)) .setDrmSessionForClearTypes(toTrackTypeList(drmSessionForClearTypesExtra))
.setDrmMultiSession( .setDrmMultiSession(
intent.getBooleanExtra(DRM_MULTI_SESSION_EXTRA + extrasKeySuffix, false)) intent.getBooleanExtra(DRM_MULTI_SESSION_EXTRA + extrasKeySuffix, false))
.setDrmForceDefaultLicenseUri(
intent.getBooleanExtra(DRM_FORCE_DEFAULT_LICENSE_URI_EXTRA + extrasKeySuffix, false))
.setDrmLicenseRequestHeaders(headers); .setDrmLicenseRequestHeaders(headers);
return builder; return builder;
} }
...@@ -273,6 +276,9 @@ public class IntentUtil { ...@@ -273,6 +276,9 @@ public class IntentUtil {
DRM_LICENSE_URL_EXTRA + extrasKeySuffix, DRM_LICENSE_URL_EXTRA + extrasKeySuffix,
checkNotNull(drmConfiguration.licenseUri).toString()); checkNotNull(drmConfiguration.licenseUri).toString());
intent.putExtra(DRM_MULTI_SESSION_EXTRA + extrasKeySuffix, drmConfiguration.multiSession); intent.putExtra(DRM_MULTI_SESSION_EXTRA + extrasKeySuffix, drmConfiguration.multiSession);
intent.putExtra(
DRM_FORCE_DEFAULT_LICENSE_URI_EXTRA + extrasKeySuffix,
drmConfiguration.forceDefaultLicenseUri);
String[] drmKeyRequestProperties = new String[drmConfiguration.requestHeaders.size() * 2]; String[] drmKeyRequestProperties = new String[drmConfiguration.requestHeaders.size() * 2];
int index = 0; int index = 0;
......
...@@ -417,6 +417,9 @@ public class SampleChooserActivity extends AppCompatActivity ...@@ -417,6 +417,9 @@ public class SampleChooserActivity extends AppCompatActivity
case "drm_multi_session": case "drm_multi_session":
mediaItem.setDrmMultiSession(reader.nextBoolean()); mediaItem.setDrmMultiSession(reader.nextBoolean());
break; break;
case "drm_force_default_license_uri":
mediaItem.setDrmForceDefaultLicenseUri(reader.nextBoolean());
break;
case "playlist": case "playlist":
Assertions.checkState(!insidePlaylist, "Invalid nesting of playlists"); Assertions.checkState(!insidePlaylist, "Invalid nesting of playlists");
children = new ArrayList<>(); children = new ArrayList<>();
......
...@@ -32,10 +32,10 @@ import java.util.UUID; ...@@ -32,10 +32,10 @@ import java.util.UUID;
public final class MediaItem { public final class MediaItem {
/** /**
* Creates a {@link MediaItem} for the given uri. * Creates a {@link MediaItem} for the given URI.
* *
* @param uri The uri. * @param uri The URI.
* @return An {@link MediaItem} for the given uri. * @return An {@link MediaItem} for the given URI.
*/ */
public static MediaItem fromUri(String uri) { public static MediaItem fromUri(String uri) {
return new MediaItem.Builder().setUri(uri).build(); return new MediaItem.Builder().setUri(uri).build();
...@@ -67,6 +67,7 @@ public final class MediaItem { ...@@ -67,6 +67,7 @@ public final class MediaItem {
@Nullable private UUID drmUuid; @Nullable private UUID drmUuid;
private boolean drmMultiSession; private boolean drmMultiSession;
private boolean drmPlayClearContentWithoutKey; private boolean drmPlayClearContentWithoutKey;
private boolean drmForceDefaultLicenseUri;
private List<Integer> drmSessionForClearTypes; private List<Integer> drmSessionForClearTypes;
@Nullable private byte[] drmKeySetId; @Nullable private byte[] drmKeySetId;
private List<StreamKey> streamKeys; private List<StreamKey> streamKeys;
...@@ -108,6 +109,7 @@ public final class MediaItem { ...@@ -108,6 +109,7 @@ public final class MediaItem {
drmLicenseUri = drmConfiguration.licenseUri; drmLicenseUri = drmConfiguration.licenseUri;
drmLicenseRequestHeaders = drmConfiguration.requestHeaders; drmLicenseRequestHeaders = drmConfiguration.requestHeaders;
drmMultiSession = drmConfiguration.multiSession; drmMultiSession = drmConfiguration.multiSession;
drmForceDefaultLicenseUri = drmConfiguration.forceDefaultLicenseUri;
drmPlayClearContentWithoutKey = drmConfiguration.playClearContentWithoutKey; drmPlayClearContentWithoutKey = drmConfiguration.playClearContentWithoutKey;
drmSessionForClearTypes = drmConfiguration.sessionForClearTypes; drmSessionForClearTypes = drmConfiguration.sessionForClearTypes;
drmUuid = drmConfiguration.uuid; drmUuid = drmConfiguration.uuid;
...@@ -267,6 +269,18 @@ public final class MediaItem { ...@@ -267,6 +269,18 @@ public final class MediaItem {
} }
/** /**
* Sets whether to use the license URI of the media item for key requests that include their own
* license URI.
*
* <p>If a {@link PlaybackProperties#uri} is set, the drm force default license flag is used to
* create a {@link PlaybackProperties} object. Otherwise it will be ignored.
*/
public Builder setDrmForceDefaultLicenseUri(boolean forceDefaultLicenseUri) {
this.drmForceDefaultLicenseUri = forceDefaultLicenseUri;
return this;
}
/**
* Sets whether clear samples within protected content should be played when keys for the * Sets whether clear samples within protected content should be played when keys for the
* encrypted part of the content have yet to be loaded. * encrypted part of the content have yet to be loaded.
*/ */
...@@ -426,6 +440,7 @@ public final class MediaItem { ...@@ -426,6 +440,7 @@ public final class MediaItem {
drmLicenseUri, drmLicenseUri,
drmLicenseRequestHeaders, drmLicenseRequestHeaders,
drmMultiSession, drmMultiSession,
drmForceDefaultLicenseUri,
drmPlayClearContentWithoutKey, drmPlayClearContentWithoutKey,
drmSessionForClearTypes, drmSessionForClearTypes,
drmKeySetId) drmKeySetId)
...@@ -462,7 +477,7 @@ public final class MediaItem { ...@@ -462,7 +477,7 @@ public final class MediaItem {
*/ */
@Nullable public final Uri licenseUri; @Nullable public final Uri licenseUri;
/** The headers to attach to the request for the license uri. */ /** The headers to attach to the request for the license URI. */
public final Map<String, String> requestHeaders; public final Map<String, String> requestHeaders;
/** Whether the drm configuration is multi session enabled. */ /** Whether the drm configuration is multi session enabled. */
...@@ -474,6 +489,12 @@ public final class MediaItem { ...@@ -474,6 +489,12 @@ public final class MediaItem {
*/ */
public final boolean playClearContentWithoutKey; public final boolean playClearContentWithoutKey;
/**
* Sets whether to use the license URI of the media item for key requests that include their own
* license URI.
*/
public final boolean forceDefaultLicenseUri;
/** The types of clear tracks for which to use a drm session. */ /** The types of clear tracks for which to use a drm session. */
public final List<Integer> sessionForClearTypes; public final List<Integer> sessionForClearTypes;
...@@ -484,6 +505,7 @@ public final class MediaItem { ...@@ -484,6 +505,7 @@ public final class MediaItem {
@Nullable Uri licenseUri, @Nullable Uri licenseUri,
Map<String, String> requestHeaders, Map<String, String> requestHeaders,
boolean multiSession, boolean multiSession,
boolean forceDefaultLicenseUri,
boolean playClearContentWithoutKey, boolean playClearContentWithoutKey,
List<Integer> drmSessionForClearTypes, List<Integer> drmSessionForClearTypes,
@Nullable byte[] keySetId) { @Nullable byte[] keySetId) {
...@@ -491,6 +513,7 @@ public final class MediaItem { ...@@ -491,6 +513,7 @@ public final class MediaItem {
this.licenseUri = licenseUri; this.licenseUri = licenseUri;
this.requestHeaders = requestHeaders; this.requestHeaders = requestHeaders;
this.multiSession = multiSession; this.multiSession = multiSession;
this.forceDefaultLicenseUri = forceDefaultLicenseUri;
this.playClearContentWithoutKey = playClearContentWithoutKey; this.playClearContentWithoutKey = playClearContentWithoutKey;
this.sessionForClearTypes = drmSessionForClearTypes; this.sessionForClearTypes = drmSessionForClearTypes;
this.keySetId = keySetId != null ? Arrays.copyOf(keySetId, keySetId.length) : null; this.keySetId = keySetId != null ? Arrays.copyOf(keySetId, keySetId.length) : null;
...@@ -516,6 +539,7 @@ public final class MediaItem { ...@@ -516,6 +539,7 @@ public final class MediaItem {
&& Util.areEqual(licenseUri, other.licenseUri) && Util.areEqual(licenseUri, other.licenseUri)
&& Util.areEqual(requestHeaders, other.requestHeaders) && Util.areEqual(requestHeaders, other.requestHeaders)
&& multiSession == other.multiSession && multiSession == other.multiSession
&& forceDefaultLicenseUri == other.forceDefaultLicenseUri
&& playClearContentWithoutKey == other.playClearContentWithoutKey && playClearContentWithoutKey == other.playClearContentWithoutKey
&& sessionForClearTypes.equals(other.sessionForClearTypes) && sessionForClearTypes.equals(other.sessionForClearTypes)
&& Arrays.equals(keySetId, other.keySetId); && Arrays.equals(keySetId, other.keySetId);
...@@ -527,6 +551,7 @@ public final class MediaItem { ...@@ -527,6 +551,7 @@ public final class MediaItem {
result = 31 * result + (licenseUri != null ? licenseUri.hashCode() : 0); result = 31 * result + (licenseUri != null ? licenseUri.hashCode() : 0);
result = 31 * result + requestHeaders.hashCode(); result = 31 * result + requestHeaders.hashCode();
result = 31 * result + (multiSession ? 1 : 0); result = 31 * result + (multiSession ? 1 : 0);
result = 31 * result + (forceDefaultLicenseUri ? 1 : 0);
result = 31 * result + (playClearContentWithoutKey ? 1 : 0); result = 31 * result + (playClearContentWithoutKey ? 1 : 0);
result = 31 * result + sessionForClearTypes.hashCode(); result = 31 * result + sessionForClearTypes.hashCode();
result = 31 * result + Arrays.hashCode(keySetId); result = 31 * result + Arrays.hashCode(keySetId);
...@@ -638,7 +663,7 @@ public final class MediaItem { ...@@ -638,7 +663,7 @@ public final class MediaItem {
/** /**
* Creates an instance. * Creates an instance.
* *
* @param uri The {@link Uri uri} to the subtitle file. * @param uri The {@link Uri URI} to the subtitle file.
* @param mimeType The mime type. * @param mimeType The mime type.
* @param language The optional language. * @param language The optional language.
*/ */
...@@ -649,7 +674,7 @@ public final class MediaItem { ...@@ -649,7 +674,7 @@ public final class MediaItem {
/** /**
* Creates an instance with the given selection flags. * Creates an instance with the given selection flags.
* *
* @param uri The {@link Uri uri} to the subtitle file. * @param uri The {@link Uri URI} to the subtitle file.
* @param mimeType The mime type. * @param mimeType The mime type.
* @param language The optional language. * @param language The optional language.
* @param selectionFlags The selection flags. * @param selectionFlags The selection flags.
......
...@@ -95,7 +95,8 @@ public class MediaItemTest { ...@@ -95,7 +95,8 @@ public class MediaItemTest {
.setDrmUuid(C.WIDEVINE_UUID) .setDrmUuid(C.WIDEVINE_UUID)
.setDrmLicenseUri(licenseUri) .setDrmLicenseUri(licenseUri)
.setDrmLicenseRequestHeaders(requestHeaders) .setDrmLicenseRequestHeaders(requestHeaders)
.setDrmMultiSession(/* multiSession= */ true) .setDrmMultiSession(true)
.setDrmForceDefaultLicenseUri(true)
.setDrmPlayClearContentWithoutKey(true) .setDrmPlayClearContentWithoutKey(true)
.setDrmSessionForClearTypes(Collections.singletonList(C.TRACK_TYPE_AUDIO)) .setDrmSessionForClearTypes(Collections.singletonList(C.TRACK_TYPE_AUDIO))
.setDrmKeySetId(keySetId) .setDrmKeySetId(keySetId)
...@@ -107,6 +108,7 @@ public class MediaItemTest { ...@@ -107,6 +108,7 @@ public class MediaItemTest {
assertThat(mediaItem.playbackProperties.drmConfiguration.requestHeaders) assertThat(mediaItem.playbackProperties.drmConfiguration.requestHeaders)
.isEqualTo(requestHeaders); .isEqualTo(requestHeaders);
assertThat(mediaItem.playbackProperties.drmConfiguration.multiSession).isTrue(); assertThat(mediaItem.playbackProperties.drmConfiguration.multiSession).isTrue();
assertThat(mediaItem.playbackProperties.drmConfiguration.forceDefaultLicenseUri).isTrue();
assertThat(mediaItem.playbackProperties.drmConfiguration.playClearContentWithoutKey).isTrue(); assertThat(mediaItem.playbackProperties.drmConfiguration.playClearContentWithoutKey).isTrue();
assertThat(mediaItem.playbackProperties.drmConfiguration.sessionForClearTypes) assertThat(mediaItem.playbackProperties.drmConfiguration.sessionForClearTypes)
.containsExactly(C.TRACK_TYPE_AUDIO); .containsExactly(C.TRACK_TYPE_AUDIO);
...@@ -301,6 +303,7 @@ public class MediaItemTest { ...@@ -301,6 +303,7 @@ public class MediaItemTest {
.setDrmLicenseRequestHeaders( .setDrmLicenseRequestHeaders(
Collections.singletonMap("Referer", "http://www.google.com")) Collections.singletonMap("Referer", "http://www.google.com"))
.setDrmMultiSession(true) .setDrmMultiSession(true)
.setDrmForceDefaultLicenseUri(true)
.setDrmPlayClearContentWithoutKey(true) .setDrmPlayClearContentWithoutKey(true)
.setDrmSessionForClearTypes(Collections.singletonList(C.TRACK_TYPE_AUDIO)) .setDrmSessionForClearTypes(Collections.singletonList(C.TRACK_TYPE_AUDIO))
.setDrmKeySetId(new byte[] {1, 2, 3}) .setDrmKeySetId(new byte[] {1, 2, 3})
......
...@@ -306,7 +306,10 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { ...@@ -306,7 +306,10 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory {
private MediaDrmCallback createHttpMediaDrmCallback(MediaItem.DrmConfiguration drmConfiguration) { private MediaDrmCallback createHttpMediaDrmCallback(MediaItem.DrmConfiguration drmConfiguration) {
Assertions.checkNotNull(drmConfiguration.licenseUri); Assertions.checkNotNull(drmConfiguration.licenseUri);
HttpMediaDrmCallback drmCallback = HttpMediaDrmCallback drmCallback =
new HttpMediaDrmCallback(drmConfiguration.licenseUri.toString(), drmHttpDataSourceFactory); new HttpMediaDrmCallback(
drmConfiguration.licenseUri.toString(),
drmConfiguration.forceDefaultLicenseUri,
drmHttpDataSourceFactory);
for (Map.Entry<String, String> entry : drmConfiguration.requestHeaders.entrySet()) { for (Map.Entry<String, String> entry : drmConfiguration.requestHeaders.entrySet()) {
drmCallback.setKeyRequestProperty(entry.getKey(), entry.getValue()); drmCallback.setKeyRequestProperty(entry.getKey(), entry.getValue());
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment