Add key set id to MediaItem

PiperOrigin-RevId: 307390673
This commit is contained in:
bachinger 2020-04-20 14:58:58 +01:00 committed by Ian Baker
parent cb51a1bfe6
commit 8d0d31e15c
2 changed files with 36 additions and 3 deletions

View File

@ -68,6 +68,7 @@ public final class MediaItem {
private boolean drmMultiSession; private boolean drmMultiSession;
private boolean drmPlayClearContentWithoutKey; private boolean drmPlayClearContentWithoutKey;
private List<Integer> drmSessionForClearTypes; private List<Integer> drmSessionForClearTypes;
@Nullable private byte[] drmKeySetId;
private List<StreamKey> streamKeys; private List<StreamKey> streamKeys;
@Nullable private String customCacheKey; @Nullable private String customCacheKey;
private List<Subtitle> subtitles; private List<Subtitle> subtitles;
@ -110,6 +111,7 @@ public final class MediaItem {
drmPlayClearContentWithoutKey = drmConfiguration.playClearContentWithoutKey; drmPlayClearContentWithoutKey = drmConfiguration.playClearContentWithoutKey;
drmSessionForClearTypes = drmConfiguration.sessionForClearTypes; drmSessionForClearTypes = drmConfiguration.sessionForClearTypes;
drmUuid = drmConfiguration.uuid; drmUuid = drmConfiguration.uuid;
drmKeySetId = drmConfiguration.getKeySetId();
} }
} }
} }
@ -311,6 +313,20 @@ public final class MediaItem {
return this; return this;
} }
/**
* Sets the key set ID of the offline license.
*
* <p>The key set ID identifies an offline license. The ID is required to query, renew or
* release an existing offline license (see {@code DefaultDrmSessionManager#setMode(int
* mode,byte[] offlineLicenseKeySetId)}).
*
* <p>If no valid DRM configuration is specified, the key set ID is ignored.
*/
public Builder setDrmKeySetId(@Nullable byte[] keySetId) {
this.drmKeySetId = keySetId != null ? Arrays.copyOf(keySetId, keySetId.length) : null;
return this;
}
/** /**
* Sets the optional stream keys by which the manifest is filtered (only used for adaptive * Sets the optional stream keys by which the manifest is filtered (only used for adaptive
* streams). * streams).
@ -414,7 +430,8 @@ public final class MediaItem {
drmLicenseRequestHeaders, drmLicenseRequestHeaders,
drmMultiSession, drmMultiSession,
drmPlayClearContentWithoutKey, drmPlayClearContentWithoutKey,
drmSessionForClearTypes) drmSessionForClearTypes,
drmKeySetId)
: null, : null,
streamKeys, streamKeys,
customCacheKey, customCacheKey,
@ -463,19 +480,29 @@ public final class MediaItem {
/** 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;
@Nullable private final byte[] keySetId;
private DrmConfiguration( private DrmConfiguration(
UUID uuid, UUID uuid,
@Nullable Uri licenseUri, @Nullable Uri licenseUri,
Map<String, String> requestHeaders, Map<String, String> requestHeaders,
boolean multiSession, boolean multiSession,
boolean playClearContentWithoutKey, boolean playClearContentWithoutKey,
List<Integer> drmSessionForClearTypes) { List<Integer> drmSessionForClearTypes,
@Nullable byte[] keySetId) {
this.uuid = uuid; this.uuid = uuid;
this.licenseUri = licenseUri; this.licenseUri = licenseUri;
this.requestHeaders = requestHeaders; this.requestHeaders = requestHeaders;
this.multiSession = multiSession; this.multiSession = multiSession;
this.playClearContentWithoutKey = playClearContentWithoutKey; this.playClearContentWithoutKey = playClearContentWithoutKey;
this.sessionForClearTypes = drmSessionForClearTypes; this.sessionForClearTypes = drmSessionForClearTypes;
this.keySetId = keySetId != null ? Arrays.copyOf(keySetId, keySetId.length) : null;
}
/** Returns the key set ID of the offline license. */
@Nullable
public byte[] getKeySetId() {
return keySetId != null ? Arrays.copyOf(keySetId, keySetId.length) : null;
} }
@Override @Override
@ -493,7 +520,8 @@ public final class MediaItem {
&& Util.areEqual(requestHeaders, other.requestHeaders) && Util.areEqual(requestHeaders, other.requestHeaders)
&& multiSession == other.multiSession && multiSession == other.multiSession
&& playClearContentWithoutKey == other.playClearContentWithoutKey && playClearContentWithoutKey == other.playClearContentWithoutKey
&& sessionForClearTypes.equals(other.sessionForClearTypes); && sessionForClearTypes.equals(other.sessionForClearTypes)
&& Arrays.equals(keySetId, other.keySetId);
} }
@Override @Override
@ -504,6 +532,7 @@ public final class MediaItem {
result = 31 * result + (multiSession ? 1 : 0); result = 31 * result + (multiSession ? 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);
return result; return result;
} }
} }

View File

@ -91,6 +91,7 @@ public class MediaItemTest {
Uri licenseUri = Uri.parse(URI_STRING); Uri licenseUri = Uri.parse(URI_STRING);
Map<String, String> requestHeaders = new HashMap<>(); Map<String, String> requestHeaders = new HashMap<>();
requestHeaders.put("Referer", "http://www.google.com"); requestHeaders.put("Referer", "http://www.google.com");
byte[] keySetId = new byte[] {1, 2, 3};
MediaItem mediaItem = MediaItem mediaItem =
new MediaItem.Builder() new MediaItem.Builder()
.setSourceUri(URI_STRING) .setSourceUri(URI_STRING)
@ -100,6 +101,7 @@ public class MediaItemTest {
.setDrmMultiSession(/* multiSession= */ true) .setDrmMultiSession(/* multiSession= */ true)
.setDrmPlayClearContentWithoutKey(true) .setDrmPlayClearContentWithoutKey(true)
.setDrmSessionForClearTypes(Collections.singletonList(C.TRACK_TYPE_AUDIO)) .setDrmSessionForClearTypes(Collections.singletonList(C.TRACK_TYPE_AUDIO))
.setDrmKeySetId(keySetId)
.build(); .build();
assertThat(mediaItem.playbackProperties.drmConfiguration).isNotNull(); assertThat(mediaItem.playbackProperties.drmConfiguration).isNotNull();
@ -111,6 +113,7 @@ public class MediaItemTest {
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);
assertThat(mediaItem.playbackProperties.drmConfiguration.getKeySetId()).isEqualTo(keySetId);
} }
@Test @Test
@ -304,6 +307,7 @@ public class MediaItemTest {
.setDrmMultiSession(true) .setDrmMultiSession(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})
.setMediaId("mediaId") .setMediaId("mediaId")
.setMediaMetadata(new MediaMetadata.Builder().setTitle("title").build()) .setMediaMetadata(new MediaMetadata.Builder().setTitle("title").build())
.setMimeType(MimeTypes.APPLICATION_MP4) .setMimeType(MimeTypes.APPLICATION_MP4)