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 {
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_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 SUBTITLE_URI_EXTRA = "subtitle_uri";
public static final String SUBTITLE_MIME_TYPE_EXTRA = "subtitle_mime_type";
......@@ -214,6 +215,8 @@ public class IntentUtil {
.setDrmSessionForClearTypes(toTrackTypeList(drmSessionForClearTypesExtra))
.setDrmMultiSession(
intent.getBooleanExtra(DRM_MULTI_SESSION_EXTRA + extrasKeySuffix, false))
.setDrmForceDefaultLicenseUri(
intent.getBooleanExtra(DRM_FORCE_DEFAULT_LICENSE_URI_EXTRA + extrasKeySuffix, false))
.setDrmLicenseRequestHeaders(headers);
return builder;
}
......@@ -273,6 +276,9 @@ public class IntentUtil {
DRM_LICENSE_URL_EXTRA + extrasKeySuffix,
checkNotNull(drmConfiguration.licenseUri).toString());
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];
int index = 0;
......
......@@ -417,6 +417,9 @@ public class SampleChooserActivity extends AppCompatActivity
case "drm_multi_session":
mediaItem.setDrmMultiSession(reader.nextBoolean());
break;
case "drm_force_default_license_uri":
mediaItem.setDrmForceDefaultLicenseUri(reader.nextBoolean());
break;
case "playlist":
Assertions.checkState(!insidePlaylist, "Invalid nesting of playlists");
children = new ArrayList<>();
......
......@@ -32,10 +32,10 @@ import java.util.UUID;
public final class MediaItem {
/**
* Creates a {@link MediaItem} for the given uri.
* Creates a {@link MediaItem} for the given URI.
*
* @param uri The uri.
* @return An {@link MediaItem} for the given uri.
* @param uri The URI.
* @return An {@link MediaItem} for the given URI.
*/
public static MediaItem fromUri(String uri) {
return new MediaItem.Builder().setUri(uri).build();
......@@ -67,6 +67,7 @@ public final class MediaItem {
@Nullable private UUID drmUuid;
private boolean drmMultiSession;
private boolean drmPlayClearContentWithoutKey;
private boolean drmForceDefaultLicenseUri;
private List<Integer> drmSessionForClearTypes;
@Nullable private byte[] drmKeySetId;
private List<StreamKey> streamKeys;
......@@ -108,6 +109,7 @@ public final class MediaItem {
drmLicenseUri = drmConfiguration.licenseUri;
drmLicenseRequestHeaders = drmConfiguration.requestHeaders;
drmMultiSession = drmConfiguration.multiSession;
drmForceDefaultLicenseUri = drmConfiguration.forceDefaultLicenseUri;
drmPlayClearContentWithoutKey = drmConfiguration.playClearContentWithoutKey;
drmSessionForClearTypes = drmConfiguration.sessionForClearTypes;
drmUuid = drmConfiguration.uuid;
......@@ -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
* encrypted part of the content have yet to be loaded.
*/
......@@ -426,6 +440,7 @@ public final class MediaItem {
drmLicenseUri,
drmLicenseRequestHeaders,
drmMultiSession,
drmForceDefaultLicenseUri,
drmPlayClearContentWithoutKey,
drmSessionForClearTypes,
drmKeySetId)
......@@ -462,7 +477,7 @@ public final class MediaItem {
*/
@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;
/** Whether the drm configuration is multi session enabled. */
......@@ -474,6 +489,12 @@ public final class MediaItem {
*/
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. */
public final List<Integer> sessionForClearTypes;
......@@ -484,6 +505,7 @@ public final class MediaItem {
@Nullable Uri licenseUri,
Map<String, String> requestHeaders,
boolean multiSession,
boolean forceDefaultLicenseUri,
boolean playClearContentWithoutKey,
List<Integer> drmSessionForClearTypes,
@Nullable byte[] keySetId) {
......@@ -491,6 +513,7 @@ public final class MediaItem {
this.licenseUri = licenseUri;
this.requestHeaders = requestHeaders;
this.multiSession = multiSession;
this.forceDefaultLicenseUri = forceDefaultLicenseUri;
this.playClearContentWithoutKey = playClearContentWithoutKey;
this.sessionForClearTypes = drmSessionForClearTypes;
this.keySetId = keySetId != null ? Arrays.copyOf(keySetId, keySetId.length) : null;
......@@ -516,6 +539,7 @@ public final class MediaItem {
&& Util.areEqual(licenseUri, other.licenseUri)
&& Util.areEqual(requestHeaders, other.requestHeaders)
&& multiSession == other.multiSession
&& forceDefaultLicenseUri == other.forceDefaultLicenseUri
&& playClearContentWithoutKey == other.playClearContentWithoutKey
&& sessionForClearTypes.equals(other.sessionForClearTypes)
&& Arrays.equals(keySetId, other.keySetId);
......@@ -527,6 +551,7 @@ public final class MediaItem {
result = 31 * result + (licenseUri != null ? licenseUri.hashCode() : 0);
result = 31 * result + requestHeaders.hashCode();
result = 31 * result + (multiSession ? 1 : 0);
result = 31 * result + (forceDefaultLicenseUri ? 1 : 0);
result = 31 * result + (playClearContentWithoutKey ? 1 : 0);
result = 31 * result + sessionForClearTypes.hashCode();
result = 31 * result + Arrays.hashCode(keySetId);
......@@ -638,7 +663,7 @@ public final class MediaItem {
/**
* 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 language The optional language.
*/
......@@ -649,7 +674,7 @@ public final class MediaItem {
/**
* 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 language The optional language.
* @param selectionFlags The selection flags.
......
......@@ -95,7 +95,8 @@ public class MediaItemTest {
.setDrmUuid(C.WIDEVINE_UUID)
.setDrmLicenseUri(licenseUri)
.setDrmLicenseRequestHeaders(requestHeaders)
.setDrmMultiSession(/* multiSession= */ true)
.setDrmMultiSession(true)
.setDrmForceDefaultLicenseUri(true)
.setDrmPlayClearContentWithoutKey(true)
.setDrmSessionForClearTypes(Collections.singletonList(C.TRACK_TYPE_AUDIO))
.setDrmKeySetId(keySetId)
......@@ -107,6 +108,7 @@ public class MediaItemTest {
assertThat(mediaItem.playbackProperties.drmConfiguration.requestHeaders)
.isEqualTo(requestHeaders);
assertThat(mediaItem.playbackProperties.drmConfiguration.multiSession).isTrue();
assertThat(mediaItem.playbackProperties.drmConfiguration.forceDefaultLicenseUri).isTrue();
assertThat(mediaItem.playbackProperties.drmConfiguration.playClearContentWithoutKey).isTrue();
assertThat(mediaItem.playbackProperties.drmConfiguration.sessionForClearTypes)
.containsExactly(C.TRACK_TYPE_AUDIO);
......@@ -301,6 +303,7 @@ public class MediaItemTest {
.setDrmLicenseRequestHeaders(
Collections.singletonMap("Referer", "http://www.google.com"))
.setDrmMultiSession(true)
.setDrmForceDefaultLicenseUri(true)
.setDrmPlayClearContentWithoutKey(true)
.setDrmSessionForClearTypes(Collections.singletonList(C.TRACK_TYPE_AUDIO))
.setDrmKeySetId(new byte[] {1, 2, 3})
......
......@@ -306,7 +306,10 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory {
private MediaDrmCallback createHttpMediaDrmCallback(MediaItem.DrmConfiguration drmConfiguration) {
Assertions.checkNotNull(drmConfiguration.licenseUri);
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()) {
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