mirror of
https://github.com/samsonjs/media.git
synced 2026-04-27 15:07:40 +00:00
DRM fixes
- Parse multiple kids from default_KID. It's specified as a whitespace separated list of UUIDs rather than a single UUID. - Opportunistically proceed with playback in cases where the manifest only defines a single SchemeData with the common PSSH UUID. In such cases the manifest isn't saying anything about which specific DRM schemes it supports. Issue: #3630 ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=180675056
This commit is contained in:
parent
2bc734afec
commit
7314e9bddc
3 changed files with 23 additions and 6 deletions
|
|
@ -26,6 +26,9 @@
|
||||||
positions.
|
positions.
|
||||||
* Note: `SeekParameters` are only currently effective when playing
|
* Note: `SeekParameters` are only currently effective when playing
|
||||||
`ExtractorMediaSource`s (i.e. progressive streams).
|
`ExtractorMediaSource`s (i.e. progressive streams).
|
||||||
|
* DRM: Optimistically attempt playback of DRM protected content that does not
|
||||||
|
declare scheme specific init data
|
||||||
|
([#3630](https://github.com/google/ExoPlayer/issues/3630)).
|
||||||
* DASH: Support DASH manifest EventStream elements.
|
* DASH: Support DASH manifest EventStream elements.
|
||||||
* HLS: Add opt-in support for chunkless preparation in HLS. This allows an
|
* HLS: Add opt-in support for chunkless preparation in HLS. This allows an
|
||||||
HLS source to finish preparation without downloading any chunks, which can
|
HLS source to finish preparation without downloading any chunks, which can
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,7 @@ import android.os.Message;
|
||||||
import android.support.annotation.IntDef;
|
import android.support.annotation.IntDef;
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
|
import android.util.Log;
|
||||||
import com.google.android.exoplayer2.C;
|
import com.google.android.exoplayer2.C;
|
||||||
import com.google.android.exoplayer2.Player;
|
import com.google.android.exoplayer2.Player;
|
||||||
import com.google.android.exoplayer2.drm.DefaultDrmSession.ProvisioningManager;
|
import com.google.android.exoplayer2.drm.DefaultDrmSession.ProvisioningManager;
|
||||||
|
|
@ -87,7 +88,6 @@ public class DefaultDrmSessionManager<T extends ExoMediaCrypto> implements DrmSe
|
||||||
* The key to use when passing CustomData to a PlayReady instance in an optional parameter map.
|
* The key to use when passing CustomData to a PlayReady instance in an optional parameter map.
|
||||||
*/
|
*/
|
||||||
public static final String PLAYREADY_CUSTOM_DATA_KEY = "PRCustomData";
|
public static final String PLAYREADY_CUSTOM_DATA_KEY = "PRCustomData";
|
||||||
private static final String CENC_SCHEME_MIME_TYPE = "cenc";
|
|
||||||
|
|
||||||
/** Determines the action to be done after a session acquired. */
|
/** Determines the action to be done after a session acquired. */
|
||||||
@Retention(RetentionPolicy.SOURCE)
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
|
|
@ -109,6 +109,9 @@ public class DefaultDrmSessionManager<T extends ExoMediaCrypto> implements DrmSe
|
||||||
/** Number of times to retry for initial provisioning and key request for reporting error. */
|
/** Number of times to retry for initial provisioning and key request for reporting error. */
|
||||||
public static final int INITIAL_DRM_REQUEST_RETRY_COUNT = 3;
|
public static final int INITIAL_DRM_REQUEST_RETRY_COUNT = 3;
|
||||||
|
|
||||||
|
private static final String TAG = "DrmSessionManager";
|
||||||
|
private static final String CENC_SCHEME_MIME_TYPE = "cenc";
|
||||||
|
|
||||||
private final UUID uuid;
|
private final UUID uuid;
|
||||||
private final ExoMediaDrm<T> mediaDrm;
|
private final ExoMediaDrm<T> mediaDrm;
|
||||||
private final MediaDrmCallback callback;
|
private final MediaDrmCallback callback;
|
||||||
|
|
@ -350,8 +353,14 @@ public class DefaultDrmSessionManager<T extends ExoMediaCrypto> implements DrmSe
|
||||||
public boolean canAcquireSession(@NonNull DrmInitData drmInitData) {
|
public boolean canAcquireSession(@NonNull DrmInitData drmInitData) {
|
||||||
SchemeData schemeData = getSchemeData(drmInitData, uuid, true);
|
SchemeData schemeData = getSchemeData(drmInitData, uuid, true);
|
||||||
if (schemeData == null) {
|
if (schemeData == null) {
|
||||||
// No data for this manager's scheme.
|
if (drmInitData.schemeDataCount == 1 && drmInitData.get(0).matches(C.COMMON_PSSH_UUID)) {
|
||||||
return false;
|
// Assume scheme specific data will be added before the session is opened.
|
||||||
|
Log.w(
|
||||||
|
TAG, "DrmInitData only contains common PSSH SchemeData. Assuming support for: " + uuid);
|
||||||
|
} else {
|
||||||
|
// No data for this manager's scheme.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
String schemeType = drmInitData.schemeType;
|
String schemeType = drmInitData.schemeType;
|
||||||
if (schemeType == null || C.CENC_TYPE_cenc.equals(schemeType)) {
|
if (schemeType == null || C.CENC_TYPE_cenc.equals(schemeType)) {
|
||||||
|
|
|
||||||
|
|
@ -365,9 +365,14 @@ public class DashManifestParser extends DefaultHandler
|
||||||
case "urn:mpeg:dash:mp4protection:2011":
|
case "urn:mpeg:dash:mp4protection:2011":
|
||||||
schemeType = xpp.getAttributeValue(null, "value");
|
schemeType = xpp.getAttributeValue(null, "value");
|
||||||
String defaultKid = xpp.getAttributeValue(null, "cenc:default_KID");
|
String defaultKid = xpp.getAttributeValue(null, "cenc:default_KID");
|
||||||
if (defaultKid != null && !"00000000-0000-0000-0000-000000000000".equals(defaultKid)) {
|
if (!TextUtils.isEmpty(defaultKid)
|
||||||
UUID keyId = UUID.fromString(defaultKid);
|
&& !"00000000-0000-0000-0000-000000000000".equals(defaultKid)) {
|
||||||
data = PsshAtomUtil.buildPsshAtom(C.COMMON_PSSH_UUID, new UUID[] {keyId}, null);
|
String[] defaultKidStrings = defaultKid.split("\\s+");
|
||||||
|
UUID[] defaultKids = new UUID[defaultKidStrings.length];
|
||||||
|
for (int i = 0; i < defaultKidStrings.length; i++) {
|
||||||
|
defaultKids[i] = UUID.fromString(defaultKidStrings[i]);
|
||||||
|
}
|
||||||
|
data = PsshAtomUtil.buildPsshAtom(C.COMMON_PSSH_UUID, defaultKids, null);
|
||||||
uuid = C.COMMON_PSSH_UUID;
|
uuid = C.COMMON_PSSH_UUID;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue