提交 7314e9bd 编写于 作者: O olly 提交者: Oliver Woodman

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
上级 2bc734af
......@@ -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;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册