mirror of
https://github.com/samsonjs/media.git
synced 2026-04-08 11:45:51 +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.
|
||||
* Note: `SeekParameters` are only currently effective when playing
|
||||
`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.
|
||||
* HLS: Add opt-in support for chunkless preparation in HLS. This allows an
|
||||
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.NonNull;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import com.google.android.exoplayer2.C;
|
||||
import com.google.android.exoplayer2.Player;
|
||||
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.
|
||||
*/
|
||||
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. */
|
||||
@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. */
|
||||
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 ExoMediaDrm<T> mediaDrm;
|
||||
private final MediaDrmCallback callback;
|
||||
|
|
@ -350,8 +353,14 @@ public class DefaultDrmSessionManager<T extends ExoMediaCrypto> implements DrmSe
|
|||
public boolean canAcquireSession(@NonNull DrmInitData drmInitData) {
|
||||
SchemeData schemeData = getSchemeData(drmInitData, uuid, true);
|
||||
if (schemeData == null) {
|
||||
// No data for this manager's scheme.
|
||||
return false;
|
||||
if (drmInitData.schemeDataCount == 1 && drmInitData.get(0).matches(C.COMMON_PSSH_UUID)) {
|
||||
// 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;
|
||||
if (schemeType == null || C.CENC_TYPE_cenc.equals(schemeType)) {
|
||||
|
|
|
|||
|
|
@ -365,9 +365,14 @@ public class DashManifestParser extends DefaultHandler
|
|||
case "urn:mpeg:dash:mp4protection:2011":
|
||||
schemeType = xpp.getAttributeValue(null, "value");
|
||||
String defaultKid = xpp.getAttributeValue(null, "cenc:default_KID");
|
||||
if (defaultKid != null && !"00000000-0000-0000-0000-000000000000".equals(defaultKid)) {
|
||||
UUID keyId = UUID.fromString(defaultKid);
|
||||
data = PsshAtomUtil.buildPsshAtom(C.COMMON_PSSH_UUID, new UUID[] {keyId}, null);
|
||||
if (!TextUtils.isEmpty(defaultKid)
|
||||
&& !"00000000-0000-0000-0000-000000000000".equals(defaultKid)) {
|
||||
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;
|
||||
}
|
||||
break;
|
||||
|
|
|
|||
Loading…
Reference in a new issue