From d1d43d62e665cf905c3816275d49126eb1dfa4f9 Mon Sep 17 00:00:00 2001 From: aquilescanta Date: Fri, 6 Dec 2019 22:26:59 +0000 Subject: [PATCH] Add demo app support for attaching DrmSessions to clear content Issue:#4867 PiperOrigin-RevId: 284262626 --- RELEASENOTES.md | 1 + demos/main/src/main/assets/media.exolist.json | 7 +++ .../exoplayer2/demo/PlayerActivity.java | 2 + .../android/exoplayer2/demo/Sample.java | 43 ++++++++++++++++++- .../demo/SampleChooserActivity.java | 11 +++++ 5 files changed, 63 insertions(+), 1 deletion(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 07bb6914ab..13676f2735 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -29,6 +29,7 @@ * Add `play` and `pause` methods to `Player`. * Upgrade Truth dependency from 0.44 to 1.0. * Upgrade to JUnit 4.13-rc-2. +* Add support for attaching DRM sessions to clear content in the demo app. ### 2.11.0 (not yet released) ### diff --git a/demos/main/src/main/assets/media.exolist.json b/demos/main/src/main/assets/media.exolist.json index 4375bdf3a7..06f063b1c1 100644 --- a/demos/main/src/main/assets/media.exolist.json +++ b/demos/main/src/main/assets/media.exolist.json @@ -208,6 +208,13 @@ "uri": "https://storage.googleapis.com/wvmedia/cbcs/h264/tears/tears_aes_cbcs_uhd.mpd", "drm_scheme": "widevine", "drm_license_url": "https://proxy.uat.widevine.com/proxy?provider=widevine_test" + }, + { + "name": "WV: Secure and Clear SD & HD (cenc,MP4,H264)", + "uri": "https://storage.googleapis.com/exoplayer-test-media-1/widevine/tears_enc_clear_enc.mpd", + "drm_scheme": "widevine", + "drm_license_url": "https://proxy.uat.widevine.com/proxy?provider=widevine_test", + "drm_session_for_clear_types": ["audio", "video"] } ] }, 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 4636c252f5..82fd987089 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 @@ -115,6 +115,7 @@ public class PlayerActivity extends AppCompatActivity public static final String DRM_SCHEME_EXTRA = "drm_scheme"; public static final String DRM_LICENSE_URL_EXTRA = "drm_license_url"; 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_MULTI_SESSION_EXTRA = "drm_multi_session"; public static final String PREFER_EXTENSION_DECODERS_EXTRA = "prefer_extension_decoders"; public static final String TUNNELING_EXTRA = "tunneling"; @@ -488,6 +489,7 @@ public class PlayerActivity extends AppCompatActivity new DefaultDrmSessionManager.Builder() .setUuidAndExoMediaDrmProvider(drmInfo.drmScheme, FrameworkMediaDrm.DEFAULT_PROVIDER) .setMultiSession(drmInfo.drmMultiSession) + .setUseDrmSessionsForClearContent(drmInfo.drmSessionForClearTypes) .build(mediaDrmCallback); } diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/Sample.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/Sample.java index 85530b993b..0bf0d2a80c 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/Sample.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/Sample.java @@ -22,6 +22,7 @@ import static com.google.android.exoplayer2.demo.PlayerActivity.DRM_LICENSE_URL_ import static com.google.android.exoplayer2.demo.PlayerActivity.DRM_MULTI_SESSION_EXTRA; import static com.google.android.exoplayer2.demo.PlayerActivity.DRM_SCHEME_EXTRA; import static com.google.android.exoplayer2.demo.PlayerActivity.DRM_SCHEME_UUID_EXTRA; +import static com.google.android.exoplayer2.demo.PlayerActivity.DRM_SESSION_FOR_CLEAR_TYPES_EXTRA; import static com.google.android.exoplayer2.demo.PlayerActivity.EXTENSION_EXTRA; import static com.google.android.exoplayer2.demo.PlayerActivity.IS_LIVE_EXTRA; import static com.google.android.exoplayer2.demo.PlayerActivity.SUBTITLE_LANGUAGE_EXTRA; @@ -32,9 +33,11 @@ import static com.google.android.exoplayer2.demo.PlayerActivity.URI_EXTRA; import android.content.Intent; import android.net.Uri; import androidx.annotation.Nullable; +import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Util; import java.util.ArrayList; +import java.util.HashSet; import java.util.UUID; /* package */ abstract class Sample { @@ -147,24 +150,35 @@ import java.util.UUID; String drmLicenseUrl = intent.getStringExtra(DRM_LICENSE_URL_EXTRA + extrasKeySuffix); String[] keyRequestPropertiesArray = intent.getStringArrayExtra(DRM_KEY_REQUEST_PROPERTIES_EXTRA + extrasKeySuffix); + String[] drmSessionForClearTypesExtra = + intent.getStringArrayExtra(DRM_SESSION_FOR_CLEAR_TYPES_EXTRA + extrasKeySuffix); + int[] drmSessionForClearTypes = toTrackTypeArray(drmSessionForClearTypesExtra); boolean drmMultiSession = intent.getBooleanExtra(DRM_MULTI_SESSION_EXTRA + extrasKeySuffix, false); - return new DrmInfo(drmScheme, drmLicenseUrl, keyRequestPropertiesArray, drmMultiSession); + return new DrmInfo( + drmScheme, + drmLicenseUrl, + keyRequestPropertiesArray, + drmSessionForClearTypes, + drmMultiSession); } public final UUID drmScheme; public final String drmLicenseUrl; public final String[] drmKeyRequestProperties; + public final int[] drmSessionForClearTypes; public final boolean drmMultiSession; public DrmInfo( UUID drmScheme, String drmLicenseUrl, String[] drmKeyRequestProperties, + int[] drmSessionForClearTypes, boolean drmMultiSession) { this.drmScheme = drmScheme; this.drmLicenseUrl = drmLicenseUrl; this.drmKeyRequestProperties = drmKeyRequestProperties; + this.drmSessionForClearTypes = drmSessionForClearTypes; this.drmMultiSession = drmMultiSession; } @@ -173,6 +187,13 @@ import java.util.UUID; intent.putExtra(DRM_SCHEME_EXTRA + extrasKeySuffix, drmScheme.toString()); intent.putExtra(DRM_LICENSE_URL_EXTRA + extrasKeySuffix, drmLicenseUrl); intent.putExtra(DRM_KEY_REQUEST_PROPERTIES_EXTRA + extrasKeySuffix, drmKeyRequestProperties); + ArrayList typeStrings = new ArrayList<>(); + for (int type : drmSessionForClearTypes) { + // Only audio and video are supported. + typeStrings.add(type == C.TRACK_TYPE_AUDIO ? "audio" : "video"); + } + intent.putExtra( + DRM_SESSION_FOR_CLEAR_TYPES_EXTRA + extrasKeySuffix, typeStrings.toArray(new String[0])); intent.putExtra(DRM_MULTI_SESSION_EXTRA + extrasKeySuffix, drmMultiSession); } } @@ -207,6 +228,26 @@ import java.util.UUID; } } + public static int[] toTrackTypeArray(@Nullable String[] trackTypeStringsArray) { + if (trackTypeStringsArray == null) { + return new int[0]; + } + HashSet trackTypes = new HashSet<>(); + for (String trackTypeString : trackTypeStringsArray) { + switch (Util.toLowerInvariant(trackTypeString)) { + case "audio": + trackTypes.add(C.TRACK_TYPE_AUDIO); + break; + case "video": + trackTypes.add(C.TRACK_TYPE_VIDEO); + break; + default: + throw new IllegalArgumentException("Invalid track type: " + trackTypeString); + } + } + return Util.toArray(new ArrayList<>(trackTypes)); + } + public static Sample createFromIntent(Intent intent) { if (ACTION_VIEW_LIST.equals(intent.getAction())) { ArrayList intentUris = new ArrayList<>(); 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 cdce29aa5e..66bf4bad5a 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 @@ -307,6 +307,7 @@ public class SampleChooserActivity extends AppCompatActivity String drmScheme = null; String drmLicenseUrl = null; String[] drmKeyRequestProperties = null; + String[] drmSessionForClearTypes = null; boolean drmMultiSession = false; ArrayList playlistSamples = null; String adTagUri = null; @@ -348,6 +349,15 @@ public class SampleChooserActivity extends AppCompatActivity reader.endObject(); drmKeyRequestProperties = drmKeyRequestPropertiesList.toArray(new String[0]); break; + case "drm_session_for_clear_types": + ArrayList drmSessionForClearTypesList = new ArrayList<>(); + reader.beginArray(); + while (reader.hasNext()) { + drmSessionForClearTypesList.add(reader.nextString()); + } + reader.endArray(); + drmSessionForClearTypes = drmSessionForClearTypesList.toArray(new String[0]); + break; case "drm_multi_session": drmMultiSession = reader.nextBoolean(); break; @@ -389,6 +399,7 @@ public class SampleChooserActivity extends AppCompatActivity Util.getDrmUuid(drmScheme), drmLicenseUrl, drmKeyRequestProperties, + Sample.toTrackTypeArray(drmSessionForClearTypes), drmMultiSession); Sample.SubtitleInfo subtitleInfo = subtitleUri == null