mirror of
https://github.com/samsonjs/media.git
synced 2026-04-27 15:07:40 +00:00
Add forceDefaultLicenseUri to MediaItem.DrmConfiguration
ISSUE: #7114 PiperOrigin-RevId: 311115835
This commit is contained in:
parent
c4cd559315
commit
66fd81401b
5 changed files with 48 additions and 8 deletions
|
|
@ -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 {
|
||||||
.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 {
|
||||||
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
|
||||||
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;
|
||||||
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 {
|
||||||
@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 {
|
||||||
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;
|
||||||
|
|
@ -266,6 +268,18 @@ public final class MediaItem {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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 {
|
||||||
drmLicenseUri,
|
drmLicenseUri,
|
||||||
drmLicenseRequestHeaders,
|
drmLicenseRequestHeaders,
|
||||||
drmMultiSession,
|
drmMultiSession,
|
||||||
|
drmForceDefaultLicenseUri,
|
||||||
drmPlayClearContentWithoutKey,
|
drmPlayClearContentWithoutKey,
|
||||||
drmSessionForClearTypes,
|
drmSessionForClearTypes,
|
||||||
drmKeySetId)
|
drmKeySetId)
|
||||||
|
|
@ -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 {
|
||||||
*/
|
*/
|
||||||
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 {
|
||||||
@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 {
|
||||||
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 {
|
||||||
&& 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 {
|
||||||
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 {
|
||||||
/**
|
/**
|
||||||
* 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 {
|
||||||
/**
|
/**
|
||||||
* 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 {
|
||||||
.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 {
|
||||||
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 {
|
||||||
.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 {
|
||||||
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());
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue