From d48d59bda1c18587ea10fd92acddbc0bb4ab5b1d Mon Sep 17 00:00:00 2001 From: ibaker Date: Thu, 11 Feb 2021 13:13:30 +0000 Subject: [PATCH] Propagate DRM config when creating ad media sources The `DrmConfiguration.sessionForClearTypes` property is often used to ensure a secure decoder is used for clear ads played in encrypted content. This is because some devices show black frames when switching decoders. Before this change the DRM config isn't propagated down when constructing the ad media source, meaning `DrmSessionManager.DRM_UNSUPPORTED` is always used, which will cause playback to switch from secure to clear decoder when transitioning to an ad break (ignoring the MediaItem `sessionForClearTypes` option. Issue: #8568 PiperOrigin-RevId: 356951124 --- RELEASENOTES.md | 2 ++ .../exoplayer2/source/ads/AdsMediaSource.java | 24 +++++++++++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 4e46be344f..07f9a1b010 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -21,6 +21,8 @@ * Re-use the previous `DrmSessionManager` instance when playing a playlist (if possible) ([#8523](https://github.com/google/ExoPlayer/issues/8523)). + * Propagate DRM configuration when creating media sources for ad content + ([#8568](https://github.com/google/ExoPlayer/issues/8568)). ### 2.13.0 (2021-02-04) 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 4f2617e868..be1ab81cd3 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 @@ -318,8 +318,28 @@ public final class AdsMediaSource extends CompositeMediaSource { && adIndexInAdGroup < adPlaybackState.adGroups[adGroupIndex].uris.length) { @Nullable Uri adUri = adPlaybackState.adGroups[adGroupIndex].uris[adIndexInAdGroup]; if (adUri != null) { - MediaSource adMediaSource = - adMediaSourceFactory.createMediaSource(MediaItem.fromUri(adUri)); + MediaItem.Builder adMediaItem = new MediaItem.Builder().setUri(adUri); + // Propagate the content's DRM config into the ad media source. + @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); + } + MediaSource adMediaSource = adMediaSourceFactory.createMediaSource(adMediaItem.build()); adMediaSourceHolder.initializeWithMediaSource(adMediaSource, adUri); } }