From e0f7a124889f340f6b9db58efd3d4f577cb12126 Mon Sep 17 00:00:00 2001 From: wasabeef Date: Wed, 22 Feb 2017 16:01:43 +0900 Subject: [PATCH] Added support for CENC ClearKey --- demo/src/main/assets/media.exolist.json | 12 +++++++++++ .../demo/SampleChooserActivity.java | 2 ++ .../java/com/google/android/exoplayer2/C.java | 6 ++++++ .../drm/DefaultDrmSessionManager.java | 21 +++++++++++++++++++ 4 files changed, 41 insertions(+) diff --git a/demo/src/main/assets/media.exolist.json b/demo/src/main/assets/media.exolist.json index 6fba5bd65b3..dd88f206c1a 100644 --- a/demo/src/main/assets/media.exolist.json +++ b/demo/src/main/assets/media.exolist.json @@ -277,6 +277,18 @@ } ] }, + { + "name": "ClearKey DASH", + "samples": [ + { + "name": "Big Buck Bunny (CENC ClearKey)", + "uri": "http://html5.cablelabs.com:8100/cenc/ck/dash.mpd", + "extension": "mpd", + "drm_scheme": "cenc", + "drm_license_url": "https://wasabeef.jp/demos/cenc-ck-dash.json" + } + ] + }, { "name": "SmoothStreaming", "samples": [ diff --git a/demo/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java b/demo/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java index 946181284f2..7377aa416d8 100644 --- a/demo/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java +++ b/demo/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java @@ -267,6 +267,8 @@ private UUID getDrmUuid(String typeString) throws ParserException { return C.WIDEVINE_UUID; case "playready": return C.PLAYREADY_UUID; + case "cenc": + return C.CENC_UUID; default: try { return UUID.fromString(typeString); diff --git a/library/src/main/java/com/google/android/exoplayer2/C.java b/library/src/main/java/com/google/android/exoplayer2/C.java index 0b1c33bfc9f..ab2840d9e42 100644 --- a/library/src/main/java/com/google/android/exoplayer2/C.java +++ b/library/src/main/java/com/google/android/exoplayer2/C.java @@ -443,6 +443,12 @@ private C() {} */ public static final UUID UUID_NIL = new UUID(0L, 0L); + /** + * UUID for the PSSH box and MPEG-DASH Content Protection. + * W3C. + */ + public static final UUID CENC_UUID = new UUID(0x1077EFECC0B24D02L, 0xACE33C1E52E2FB4BL); + /** * UUID for the Widevine DRM scheme. *

diff --git a/library/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java b/library/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java index 1cd8d8464d6..c6480a0d09a 100644 --- a/library/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java +++ b/library/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java @@ -35,6 +35,7 @@ import com.google.android.exoplayer2.drm.ExoMediaDrm.ProvisionRequest; import com.google.android.exoplayer2.extractor.mp4.PsshAtomUtil; import com.google.android.exoplayer2.util.Assertions; +import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.Util; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -102,6 +103,11 @@ public interface EventListener { /** Releases an existing offline license. */ public static final int MODE_RELEASE = 3; + /** + * The format to use when ClearKey encryption. + */ + private static final String CENC_INIT_DATA_FORMAT = "cenc"; + private static final String TAG = "OfflineDrmSessionMngr"; private static final int MSG_PROVISION = 0; @@ -337,6 +343,21 @@ public DrmSession acquireSession(Looper playbackLooper, DrmInitData drmInitDa schemeInitData = psshData; } } + if (C.CENC_UUID.equals(uuid)) { + // If "video/mp4" and "audio/mp4" are not supported as CENC schema, change it to "cenc". + // Before 7.1.x in API 25, "video/mp4" and "audio/mp4" are not supported. + if (MimeTypes.VIDEO_MP4.equals(schemeMimeType) || MimeTypes.AUDIO_MP4.equals( + schemeMimeType)) { + if (Util.SDK_INT >= 26) { + // Nothing to do. + } else if (Util.SDK_INT == 25 && !MediaDrm.isCryptoSchemeSupported(uuid, + schemeMimeType)) { + schemeMimeType = CENC_INIT_DATA_FORMAT; + } else if (Util.SDK_INT <= 24) { + schemeMimeType = CENC_INIT_DATA_FORMAT; + } + } + } } state = STATE_OPENING; openInternal(true);