Use the new MediaItem.Builder#setDrmConfiguration method

PiperOrigin-RevId: 397290953
This commit is contained in:
ibaker 2021-09-17 12:36:20 +01:00 committed by Christos Tsilopoulos
parent 73aece6356
commit 13827186aa
9 changed files with 92 additions and 64 deletions

View File

@ -65,8 +65,10 @@ import java.util.List;
.setMediaMetadata(
new MediaMetadata.Builder().setTitle("Widevine DASH cenc: Tears").build())
.setMimeType(MIME_TYPE_DASH)
.setDrmUuid(C.WIDEVINE_UUID)
.setDrmLicenseUri("https://proxy.uat.widevine.com/proxy?provider=widevine_test")
.setDrmConfiguration(
new MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID)
.setLicenseUri("https://proxy.uat.widevine.com/proxy?provider=widevine_test")
.build())
.build());
samples.add(
new MediaItem.Builder()
@ -74,8 +76,10 @@ import java.util.List;
.setMediaMetadata(
new MediaMetadata.Builder().setTitle("Widevine DASH cbc1: Tears").build())
.setMimeType(MIME_TYPE_DASH)
.setDrmUuid(C.WIDEVINE_UUID)
.setDrmLicenseUri("https://proxy.uat.widevine.com/proxy?provider=widevine_test")
.setDrmConfiguration(
new MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID)
.setLicenseUri("https://proxy.uat.widevine.com/proxy?provider=widevine_test")
.build())
.build());
samples.add(
new MediaItem.Builder()
@ -83,8 +87,10 @@ import java.util.List;
.setMediaMetadata(
new MediaMetadata.Builder().setTitle("Widevine DASH cbcs: Tears").build())
.setMimeType(MIME_TYPE_DASH)
.setDrmUuid(C.WIDEVINE_UUID)
.setDrmLicenseUri("https://proxy.uat.widevine.com/proxy?provider=widevine_test")
.setDrmConfiguration(
new MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID)
.setLicenseUri("https://proxy.uat.widevine.com/proxy?provider=widevine_test")
.build())
.build());
SAMPLES = Collections.unmodifiableList(samples);

View File

@ -26,12 +26,12 @@ import com.google.android.exoplayer2.MediaItem;
import com.google.android.exoplayer2.MediaMetadata;
import com.google.android.exoplayer2.util.Assertions;
import com.google.android.exoplayer2.util.Util;
import com.google.common.collect.ImmutableList;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
/** Util to read from and populate an intent. */
public class IntentUtil {
@ -162,16 +162,20 @@ public class IntentUtil {
headers.put(keyRequestPropertiesArray[i], keyRequestPropertiesArray[i + 1]);
}
}
builder
.setDrmUuid(Util.getDrmUuid(Util.castNonNull(drmSchemeExtra)))
.setDrmLicenseUri(intent.getStringExtra(DRM_LICENSE_URI_EXTRA + extrasKeySuffix))
.setDrmMultiSession(
intent.getBooleanExtra(DRM_MULTI_SESSION_EXTRA + extrasKeySuffix, false))
.setDrmForceDefaultLicenseUri(
intent.getBooleanExtra(DRM_FORCE_DEFAULT_LICENSE_URI_EXTRA + extrasKeySuffix, false))
.setDrmLicenseRequestHeaders(headers);
if (intent.getBooleanExtra(DRM_SESSION_FOR_CLEAR_CONTENT + extrasKeySuffix, false)) {
builder.setDrmSessionForClearTypes(ImmutableList.of(C.TRACK_TYPE_VIDEO, C.TRACK_TYPE_AUDIO));
@Nullable UUID drmUuid = Util.getDrmUuid(Util.castNonNull(drmSchemeExtra));
if (drmUuid != null) {
builder.setDrmConfiguration(
new MediaItem.DrmConfiguration.Builder(drmUuid)
.setLicenseUri(intent.getStringExtra(DRM_LICENSE_URI_EXTRA + extrasKeySuffix))
.setMultiSession(
intent.getBooleanExtra(DRM_MULTI_SESSION_EXTRA + extrasKeySuffix, false))
.setForceDefaultLicenseUri(
intent.getBooleanExtra(
DRM_FORCE_DEFAULT_LICENSE_URI_EXTRA + extrasKeySuffix, false))
.setLicenseRequestHeaders(headers)
.setSessionForClearPeriods(
intent.getBooleanExtra(DRM_SESSION_FOR_CLEAR_CONTENT + extrasKeySuffix, false))
.build());
}
return builder;
}

View File

@ -504,9 +504,17 @@ public class PlayerActivity extends AppCompatActivity
.setUri(downloadRequest.uri)
.setCustomCacheKey(downloadRequest.customCacheKey)
.setMimeType(downloadRequest.mimeType)
.setStreamKeys(downloadRequest.streamKeys)
.setDrmKeySetId(downloadRequest.keySetId)
.setDrmLicenseRequestHeaders(getDrmRequestHeaders(item));
.setStreamKeys(downloadRequest.streamKeys);
@Nullable
MediaItem.DrmConfiguration drmConfiguration = item.playbackProperties.drmConfiguration;
if (drmConfiguration != null) {
builder.setDrmConfiguration(
drmConfiguration
.buildUpon()
.setKeySetId(downloadRequest.keySetId)
.setLicenseRequestHeaders(getDrmRequestHeaders(item))
.build());
}
mediaItems.add(builder.build());
} else {

View File

@ -43,7 +43,6 @@ import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.MediaItem;
import com.google.android.exoplayer2.MediaMetadata;
import com.google.android.exoplayer2.ParserException;
@ -54,7 +53,7 @@ import com.google.android.exoplayer2.upstream.DataSourceInputStream;
import com.google.android.exoplayer2.upstream.DataSpec;
import com.google.android.exoplayer2.util.Log;
import com.google.android.exoplayer2.util.Util;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
@ -64,6 +63,7 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
/** An activity for selecting from a list of media samples. */
public class SampleChooserActivity extends AppCompatActivity
@ -345,6 +345,12 @@ public class SampleChooserActivity extends AppCompatActivity
Uri subtitleUri = null;
String subtitleMimeType = null;
String subtitleLanguage = null;
UUID drmUuid = null;
String drmLicenseUri = null;
ImmutableMap<String, String> drmLicenseRequestHeaders = null;
boolean drmSessionForClearContent = false;
boolean drmMultiSession = false;
boolean drmForceDefaultLicenseUri = false;
MediaItem.Builder mediaItem = new MediaItem.Builder();
reader.beginObject();
@ -370,11 +376,11 @@ public class SampleChooserActivity extends AppCompatActivity
mediaItem.setAdTagUri(reader.nextString());
break;
case "drm_scheme":
mediaItem.setDrmUuid(Util.getDrmUuid(reader.nextString()));
drmUuid = Util.getDrmUuid(reader.nextString());
break;
case "drm_license_uri":
case "drm_license_url": // For backward compatibility only.
mediaItem.setDrmLicenseUri(reader.nextString());
drmLicenseUri = reader.nextString();
break;
case "drm_key_request_properties":
Map<String, String> requestHeaders = new HashMap<>();
@ -383,19 +389,16 @@ public class SampleChooserActivity extends AppCompatActivity
requestHeaders.put(reader.nextName(), reader.nextString());
}
reader.endObject();
mediaItem.setDrmLicenseRequestHeaders(requestHeaders);
drmLicenseRequestHeaders = ImmutableMap.copyOf(requestHeaders);
break;
case "drm_session_for_clear_content":
if (reader.nextBoolean()) {
mediaItem.setDrmSessionForClearTypes(
ImmutableList.of(C.TRACK_TYPE_VIDEO, C.TRACK_TYPE_AUDIO));
}
drmSessionForClearContent = reader.nextBoolean();
break;
case "drm_multi_session":
mediaItem.setDrmMultiSession(reader.nextBoolean());
drmMultiSession = reader.nextBoolean();
break;
case "drm_force_default_license_uri":
mediaItem.setDrmForceDefaultLicenseUri(reader.nextBoolean());
drmForceDefaultLicenseUri = reader.nextBoolean();
break;
case "subtitle_uri":
subtitleUri = Uri.parse(reader.nextString());
@ -436,6 +439,16 @@ public class SampleChooserActivity extends AppCompatActivity
.setUri(uri)
.setMediaMetadata(new MediaMetadata.Builder().setTitle(title).build())
.setMimeType(adaptiveMimeType);
if (drmUuid != null) {
mediaItem.setDrmConfiguration(
new MediaItem.DrmConfiguration.Builder(drmUuid)
.setLicenseUri(drmLicenseUri)
.setLicenseRequestHeaders(drmLicenseRequestHeaders)
.setSessionForClearPeriods(drmSessionForClearContent)
.setMultiSession(drmMultiSession)
.setForceDefaultLicenseUri(drmForceDefaultLicenseUri)
.build());
}
if (subtitleUri != null) {
MediaItem.Subtitle subtitle =
new MediaItem.Subtitle(

View File

@ -63,10 +63,12 @@ For protected content, the media item's DRM properties should be set:
~~~
MediaItem mediaItem = new MediaItem.Builder()
.setUri(videoUri)
.setDrmUuid(C.WIDEVINE_UUID)
.setDrmLicenseUri(licenseUri)
.setDrmLicenseRequestHeaders(httpRequestHeaders)
.setDrmMultiSession(true)
.setDrmConfiguration(
new MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID)
.setLicenseUri(licenseUri)
.setMultiSession(true)
.setLicenseRequestHeaders(httpRequestHeaders)
.build())
.build();
~~~
{: .language-java}

View File

@ -96,17 +96,19 @@ public final class DefaultMediaItemConverter implements MediaItemConverter {
}
}
private static void populateDrmConfiguration(JSONObject json, MediaItem.Builder builder)
private static void populateDrmConfiguration(JSONObject json, MediaItem.Builder mediaItem)
throws JSONException {
builder.setDrmUuid(UUID.fromString(json.getString(KEY_UUID)));
builder.setDrmLicenseUri(json.getString(KEY_LICENSE_URI));
MediaItem.DrmConfiguration.Builder drmConfiguration =
new MediaItem.DrmConfiguration.Builder(UUID.fromString(json.getString(KEY_UUID)))
.setLicenseUri(json.getString(KEY_LICENSE_URI));
JSONObject requestHeadersJson = json.getJSONObject(KEY_REQUEST_HEADERS);
HashMap<String, String> requestHeaders = new HashMap<>();
for (Iterator<String> iterator = requestHeadersJson.keys(); iterator.hasNext(); ) {
String key = iterator.next();
requestHeaders.put(key, requestHeadersJson.getString(key));
}
builder.setDrmLicenseRequestHeaders(requestHeaders);
drmConfiguration.setLicenseRequestHeaders(requestHeaders);
mediaItem.setDrmConfiguration(drmConfiguration.build());
}
// Serialization.

View File

@ -24,7 +24,7 @@ import com.google.android.exoplayer2.MediaItem;
import com.google.android.exoplayer2.MediaMetadata;
import com.google.android.exoplayer2.util.MimeTypes;
import com.google.android.gms.cast.MediaQueueItem;
import java.util.Collections;
import com.google.common.collect.ImmutableMap;
import org.junit.Test;
import org.junit.runner.RunWith;
@ -53,9 +53,11 @@ public class DefaultMediaItemConverterTest {
.setUri(Uri.parse("http://example.com"))
.setMediaMetadata(MediaMetadata.EMPTY)
.setMimeType(MimeTypes.APPLICATION_MPD)
.setDrmUuid(C.WIDEVINE_UUID)
.setDrmLicenseUri("http://license.com")
.setDrmLicenseRequestHeaders(Collections.singletonMap("key", "value"))
.setDrmConfiguration(
new MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID)
.setLicenseUri("http://license.com")
.setLicenseRequestHeaders(ImmutableMap.of("key", "value"))
.build())
.build();
DefaultMediaItemConverter converter = new DefaultMediaItemConverter();

View File

@ -316,21 +316,8 @@ public final class AdsMediaSource extends CompositeMediaSource<MediaPeriodId> {
@Nullable
MediaItem.PlaybackProperties contentPlaybackProperties =
contentMediaSource.getMediaItem().playbackProperties;
if (contentPlaybackProperties != null
&& contentPlaybackProperties.drmConfiguration != null) {
MediaItem.DrmConfiguration drmConfiguration =
contentPlaybackProperties.drmConfiguration;
// TODO(internal b/179984779): Use MediaItem.Builder#setDrmConfiguration() when it's
// available.
adMediaItem.setDrmUuid(drmConfiguration.uuid);
adMediaItem.setDrmKeySetId(drmConfiguration.getKeySetId());
adMediaItem.setDrmLicenseUri(drmConfiguration.licenseUri);
adMediaItem.setDrmForceDefaultLicenseUri(drmConfiguration.forceDefaultLicenseUri);
adMediaItem.setDrmLicenseRequestHeaders(drmConfiguration.requestHeaders);
adMediaItem.setDrmMultiSession(drmConfiguration.multiSession);
adMediaItem.setDrmPlayClearContentWithoutKey(
drmConfiguration.playClearContentWithoutKey);
adMediaItem.setDrmSessionForClearTypes(drmConfiguration.sessionForClearTypes);
if (contentPlaybackProperties != null) {
adMediaItem.setDrmConfiguration(contentPlaybackProperties.drmConfiguration);
}
MediaSource adMediaSource = adMediaSourceFactory.createMediaSource(adMediaItem.build());
adMediaSourceHolder.initializeWithMediaSource(adMediaSource, adUri);

View File

@ -43,8 +43,10 @@ public class DefaultDrmSessionManagerProviderTest {
MediaItem mediaItem =
new MediaItem.Builder()
.setUri(Uri.EMPTY)
.setDrmLicenseUri(Uri.EMPTY)
.setDrmUuid(C.WIDEVINE_UUID)
.setDrmConfiguration(
new MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID)
.setLicenseUri(Uri.EMPTY)
.build())
.build();
DrmSessionManager drmSessionManager = new DefaultDrmSessionManagerProvider().get(mediaItem);
@ -57,20 +59,22 @@ public class DefaultDrmSessionManagerProviderTest {
MediaItem mediaItem1 =
new MediaItem.Builder()
.setUri("https://example.test/content-1")
.setDrmUuid(C.WIDEVINE_UUID)
.setDrmConfiguration(new MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID).build())
.build();
// Same DRM info as item1, but different URL to check it doesn't prevent re-using a manager.
MediaItem mediaItem2 =
new MediaItem.Builder()
.setUri("https://example.test/content-2")
.setDrmUuid(C.WIDEVINE_UUID)
.setDrmConfiguration(new MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID).build())
.build();
// Different DRM info to 1 and 2, needs a different manager instance.
MediaItem mediaItem3 =
new MediaItem.Builder()
.setUri("https://example.test/content-3")
.setDrmUuid(C.WIDEVINE_UUID)
.setDrmLicenseUri("https://example.test/license")
.setDrmConfiguration(
new MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID)
.setLicenseUri("https://example.test/license")
.build())
.build();
DefaultDrmSessionManagerProvider provider = new DefaultDrmSessionManagerProvider();