Is there a way to find out if DASH manifest is DRM protected in ExoPlayer

897 Views Asked by At

I want to determine whether a DASH manifest URL is DRM protected or not using ExoPlayer - however I cannot seem to find something that can help me in this.

I can see that you can achieve this using SmoothStreaming in ExoPlayer as there is a protection element.

Just wondered if anyone has faced this before?

1

There are 1 best solutions below

0
On

The DASH manifest itself contains an element which indicates whether the content is protected or not.

For example here is a PlayReady indication (from the MS documentation):

<ContentProtection schemeIdUri="urn:uuid:9a04f079-9840-4286-ab92-e65be0885f95" value=”MSPR 2.0”>
    <cenc:pssh>
          <!-- *base64-encoded PlayReady ‘pssh’ complete box* -->
    </cenc:pssh>
    <mspr:pro>
          <!-- *base64-encoded PlayReady Object* -->
    </mspr:pro>
</ContentProtection>

The individual media 'chunk' URL's can be obfuscated or random so these URLs themselves do not really help convey this information.

ExoPlayer has a check of the protection indication in the manifest. You can see it being parsed in the 'DashManifestParser' class - e.g.:

else if (XmlPullParserUtil.isStartTag(xpp, "ContentProtection")) {
        Pair<String, SchemeData> contentProtection = parseContentProtection(xpp);
        if (contentProtection.first != null) {
          drmSchemeType = contentProtection.first;
        }
        if (contentProtection.second != null) {
          drmSchemeDatas.add(contentProtection.second);
        }

One this to be aware of (or wary of..) is that the spec says that the fact that media is protected can be indicated in the manifest and/or the media itself - i.e. an ISO file there is a 'box' where the protections scheme information can be specified.

In theory this means that you can specify itinerary either place, but in practice not all players implement it this way - some, including ExoPlayer in the past I think, would not play if the media stream was protected but the Manifest did not indicate this.