diff --git a/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/DemoUtil.java b/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/DemoUtil.java index 50343f9205..1354a275da 100644 --- a/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/DemoUtil.java +++ b/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/DemoUtil.java @@ -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); diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java index 903c031491..c679c871ae 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java @@ -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; } diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java index a3e89cd753..f8310066cd 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java @@ -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 { diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java index c655179fe3..16174d5a3f 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java @@ -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 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 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( diff --git a/docs/media-items.md b/docs/media-items.md index 2e26584aee..bede066c90 100644 --- a/docs/media-items.md +++ b/docs/media-items.md @@ -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} diff --git a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/DefaultMediaItemConverter.java b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/DefaultMediaItemConverter.java index 09bf339f0e..e03c9a4a7c 100644 --- a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/DefaultMediaItemConverter.java +++ b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/DefaultMediaItemConverter.java @@ -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 requestHeaders = new HashMap<>(); for (Iterator 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. diff --git a/extensions/cast/src/test/java/com/google/android/exoplayer2/ext/cast/DefaultMediaItemConverterTest.java b/extensions/cast/src/test/java/com/google/android/exoplayer2/ext/cast/DefaultMediaItemConverterTest.java index 9d80725c56..1092ecd8da 100644 --- a/extensions/cast/src/test/java/com/google/android/exoplayer2/ext/cast/DefaultMediaItemConverterTest.java +++ b/extensions/cast/src/test/java/com/google/android/exoplayer2/ext/cast/DefaultMediaItemConverterTest.java @@ -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(); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/ads/AdsMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/ads/AdsMediaSource.java index 182ead64d1..23bdc14dc4 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/ads/AdsMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/ads/AdsMediaSource.java @@ -316,21 +316,8 @@ public final class AdsMediaSource extends CompositeMediaSource { @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); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/source/DefaultDrmSessionManagerProviderTest.java b/library/core/src/test/java/com/google/android/exoplayer2/source/DefaultDrmSessionManagerProviderTest.java index 0c830ca5ab..a887b1b124 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/source/DefaultDrmSessionManagerProviderTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/source/DefaultDrmSessionManagerProviderTest.java @@ -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();