Commit b62eab63 by zhihuichen Committed by Oliver Woodman

Implement multi session to support DRM key rotation.

Spec: https://storage.googleapis.com/wvdocs/Widevine_DRM_Android_Using_Key_Rotation.pdf

1. Implement multisession to support drm key rotation
2. Put MediaDrmEventListener back to manager since this is a per mediaDrm thing.
3. It seems diffrenciate between single/multi session is unnecessary.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=167602965
parent e16610a8
...@@ -89,6 +89,7 @@ public class PlayerActivity extends Activity implements OnClickListener, EventLi ...@@ -89,6 +89,7 @@ public class PlayerActivity extends Activity implements OnClickListener, EventLi
public static final String DRM_SCHEME_UUID_EXTRA = "drm_scheme_uuid"; public static final String DRM_SCHEME_UUID_EXTRA = "drm_scheme_uuid";
public static final String DRM_LICENSE_URL = "drm_license_url"; public static final String DRM_LICENSE_URL = "drm_license_url";
public static final String DRM_KEY_REQUEST_PROPERTIES = "drm_key_request_properties"; public static final String DRM_KEY_REQUEST_PROPERTIES = "drm_key_request_properties";
public static final String DRM_MULTI_SESSION = "drm_multi_session";
public static final String PREFER_EXTENSION_DECODERS = "prefer_extension_decoders"; public static final String PREFER_EXTENSION_DECODERS = "prefer_extension_decoders";
public static final String ACTION_VIEW = "com.google.android.exoplayer.demo.action.VIEW"; public static final String ACTION_VIEW = "com.google.android.exoplayer.demo.action.VIEW";
...@@ -264,13 +265,14 @@ public class PlayerActivity extends Activity implements OnClickListener, EventLi ...@@ -264,13 +265,14 @@ public class PlayerActivity extends Activity implements OnClickListener, EventLi
if (drmSchemeUuid != null) { if (drmSchemeUuid != null) {
String drmLicenseUrl = intent.getStringExtra(DRM_LICENSE_URL); String drmLicenseUrl = intent.getStringExtra(DRM_LICENSE_URL);
String[] keyRequestPropertiesArray = intent.getStringArrayExtra(DRM_KEY_REQUEST_PROPERTIES); String[] keyRequestPropertiesArray = intent.getStringArrayExtra(DRM_KEY_REQUEST_PROPERTIES);
boolean multiSession = intent.getBooleanExtra(DRM_MULTI_SESSION, false);
int errorStringId = R.string.error_drm_unknown; int errorStringId = R.string.error_drm_unknown;
if (Util.SDK_INT < 18) { if (Util.SDK_INT < 18) {
errorStringId = R.string.error_drm_not_supported; errorStringId = R.string.error_drm_not_supported;
} else { } else {
try { try {
drmSessionManager = buildDrmSessionManagerV18(drmSchemeUuid, drmLicenseUrl, drmSessionManager = buildDrmSessionManagerV18(drmSchemeUuid, drmLicenseUrl,
keyRequestPropertiesArray); keyRequestPropertiesArray, multiSession);
} catch (UnsupportedDrmException e) { } catch (UnsupportedDrmException e) {
errorStringId = e.reason == UnsupportedDrmException.REASON_UNSUPPORTED_SCHEME errorStringId = e.reason == UnsupportedDrmException.REASON_UNSUPPORTED_SCHEME
? R.string.error_drm_unsupported_scheme : R.string.error_drm_unknown; ? R.string.error_drm_unsupported_scheme : R.string.error_drm_unknown;
...@@ -379,7 +381,8 @@ public class PlayerActivity extends Activity implements OnClickListener, EventLi ...@@ -379,7 +381,8 @@ public class PlayerActivity extends Activity implements OnClickListener, EventLi
} }
private DrmSessionManager<FrameworkMediaCrypto> buildDrmSessionManagerV18(UUID uuid, private DrmSessionManager<FrameworkMediaCrypto> buildDrmSessionManagerV18(UUID uuid,
String licenseUrl, String[] keyRequestPropertiesArray) throws UnsupportedDrmException { String licenseUrl, String[] keyRequestPropertiesArray, boolean multiSession)
throws UnsupportedDrmException {
HttpMediaDrmCallback drmCallback = new HttpMediaDrmCallback(licenseUrl, HttpMediaDrmCallback drmCallback = new HttpMediaDrmCallback(licenseUrl,
buildHttpDataSourceFactory(false)); buildHttpDataSourceFactory(false));
if (keyRequestPropertiesArray != null) { if (keyRequestPropertiesArray != null) {
...@@ -389,7 +392,7 @@ public class PlayerActivity extends Activity implements OnClickListener, EventLi ...@@ -389,7 +392,7 @@ public class PlayerActivity extends Activity implements OnClickListener, EventLi
} }
} }
return new DefaultDrmSessionManager<>(uuid, FrameworkMediaDrm.newInstance(uuid), drmCallback, return new DefaultDrmSessionManager<>(uuid, FrameworkMediaDrm.newInstance(uuid), drmCallback,
null, mainHandler, eventLogger); null, mainHandler, eventLogger, multiSession);
} }
private void releasePlayer() { private void releasePlayer() {
......
...@@ -182,6 +182,7 @@ public class SampleChooserActivity extends Activity { ...@@ -182,6 +182,7 @@ public class SampleChooserActivity extends Activity {
UUID drmUuid = null; UUID drmUuid = null;
String drmLicenseUrl = null; String drmLicenseUrl = null;
String[] drmKeyRequestProperties = null; String[] drmKeyRequestProperties = null;
boolean drmMultiSession = false;
boolean preferExtensionDecoders = false; boolean preferExtensionDecoders = false;
ArrayList<UriSample> playlistSamples = null; ArrayList<UriSample> playlistSamples = null;
String adTagUri = null; String adTagUri = null;
...@@ -220,6 +221,9 @@ public class SampleChooserActivity extends Activity { ...@@ -220,6 +221,9 @@ public class SampleChooserActivity extends Activity {
reader.endObject(); reader.endObject();
drmKeyRequestProperties = drmKeyRequestPropertiesList.toArray(new String[0]); drmKeyRequestProperties = drmKeyRequestPropertiesList.toArray(new String[0]);
break; break;
case "drm_multi_session":
drmMultiSession = reader.nextBoolean();
break;
case "prefer_extension_decoders": case "prefer_extension_decoders":
Assertions.checkState(!insidePlaylist, Assertions.checkState(!insidePlaylist,
"Invalid attribute on nested item: prefer_extension_decoders"); "Invalid attribute on nested item: prefer_extension_decoders");
...@@ -242,15 +246,16 @@ public class SampleChooserActivity extends Activity { ...@@ -242,15 +246,16 @@ public class SampleChooserActivity extends Activity {
} }
} }
reader.endObject(); reader.endObject();
DrmInfo drmInfo = drmUuid == null ? null : new DrmInfo(drmUuid, drmLicenseUrl,
drmKeyRequestProperties, drmMultiSession);
if (playlistSamples != null) { if (playlistSamples != null) {
UriSample[] playlistSamplesArray = playlistSamples.toArray( UriSample[] playlistSamplesArray = playlistSamples.toArray(
new UriSample[playlistSamples.size()]); new UriSample[playlistSamples.size()]);
return new PlaylistSample(sampleName, drmUuid, drmLicenseUrl, drmKeyRequestProperties, return new PlaylistSample(sampleName, preferExtensionDecoders, drmInfo,
preferExtensionDecoders, playlistSamplesArray); playlistSamplesArray);
} else { } else {
return new UriSample(sampleName, drmUuid, drmLicenseUrl, drmKeyRequestProperties, return new UriSample(sampleName, preferExtensionDecoders, drmInfo, uri, extension,
preferExtensionDecoders, uri, extension, adTagUri); adTagUri);
} }
} }
...@@ -372,31 +377,47 @@ public class SampleChooserActivity extends Activity { ...@@ -372,31 +377,47 @@ public class SampleChooserActivity extends Activity {
} }
private abstract static class Sample { private static final class DrmInfo {
public final String name;
public final boolean preferExtensionDecoders;
public final UUID drmSchemeUuid; public final UUID drmSchemeUuid;
public final String drmLicenseUrl; public final String drmLicenseUrl;
public final String[] drmKeyRequestProperties; public final String[] drmKeyRequestProperties;
public final boolean drmMultiSession;
public Sample(String name, UUID drmSchemeUuid, String drmLicenseUrl, public DrmInfo(UUID drmSchemeUuid, String drmLicenseUrl,
String[] drmKeyRequestProperties, boolean preferExtensionDecoders) { String[] drmKeyRequestProperties, boolean drmMultiSession) {
this.name = name;
this.drmSchemeUuid = drmSchemeUuid; this.drmSchemeUuid = drmSchemeUuid;
this.drmLicenseUrl = drmLicenseUrl; this.drmLicenseUrl = drmLicenseUrl;
this.drmKeyRequestProperties = drmKeyRequestProperties; this.drmKeyRequestProperties = drmKeyRequestProperties;
this.drmMultiSession = drmMultiSession;
}
public void updateIntent(Intent intent) {
Assertions.checkNotNull(intent);
intent.putExtra(PlayerActivity.DRM_SCHEME_UUID_EXTRA, drmSchemeUuid.toString());
intent.putExtra(PlayerActivity.DRM_LICENSE_URL, drmLicenseUrl);
intent.putExtra(PlayerActivity.DRM_KEY_REQUEST_PROPERTIES, drmKeyRequestProperties);
intent.putExtra(PlayerActivity.DRM_MULTI_SESSION, drmMultiSession);
}
}
private abstract static class Sample {
public final String name;
public final boolean preferExtensionDecoders;
public final DrmInfo drmInfo;
public Sample(String name, boolean preferExtensionDecoders, DrmInfo drmInfo) {
this.name = name;
this.preferExtensionDecoders = preferExtensionDecoders; this.preferExtensionDecoders = preferExtensionDecoders;
this.drmInfo = drmInfo;
} }
public Intent buildIntent(Context context) { public Intent buildIntent(Context context) {
Intent intent = new Intent(context, PlayerActivity.class); Intent intent = new Intent(context, PlayerActivity.class);
intent.putExtra(PlayerActivity.PREFER_EXTENSION_DECODERS, preferExtensionDecoders); intent.putExtra(PlayerActivity.PREFER_EXTENSION_DECODERS, preferExtensionDecoders);
if (drmSchemeUuid != null) { if (drmInfo != null) {
intent.putExtra(PlayerActivity.DRM_SCHEME_UUID_EXTRA, drmSchemeUuid.toString()); drmInfo.updateIntent(intent);
intent.putExtra(PlayerActivity.DRM_LICENSE_URL, drmLicenseUrl);
intent.putExtra(PlayerActivity.DRM_KEY_REQUEST_PROPERTIES, drmKeyRequestProperties);
} }
return intent; return intent;
} }
...@@ -408,10 +429,9 @@ public class SampleChooserActivity extends Activity { ...@@ -408,10 +429,9 @@ public class SampleChooserActivity extends Activity {
public final String extension; public final String extension;
public final String adTagUri; public final String adTagUri;
public UriSample(String name, UUID drmSchemeUuid, String drmLicenseUrl, public UriSample(String name, boolean preferExtensionDecoders, DrmInfo drmInfo, String uri,
String[] drmKeyRequestProperties, boolean preferExtensionDecoders, String uri,
String extension, String adTagUri) { String extension, String adTagUri) {
super(name, drmSchemeUuid, drmLicenseUrl, drmKeyRequestProperties, preferExtensionDecoders); super(name, preferExtensionDecoders, drmInfo);
this.uri = uri; this.uri = uri;
this.extension = extension; this.extension = extension;
this.adTagUri = adTagUri; this.adTagUri = adTagUri;
...@@ -432,10 +452,9 @@ public class SampleChooserActivity extends Activity { ...@@ -432,10 +452,9 @@ public class SampleChooserActivity extends Activity {
public final UriSample[] children; public final UriSample[] children;
public PlaylistSample(String name, UUID drmSchemeUuid, String drmLicenseUrl, public PlaylistSample(String name, boolean preferExtensionDecoders, DrmInfo drmInfo,
String[] drmKeyRequestProperties, boolean preferExtensionDecoders,
UriSample... children) { UriSample... children) {
super(name, drmSchemeUuid, drmLicenseUrl, drmKeyRequestProperties, preferExtensionDecoders); super(name, preferExtensionDecoders, drmInfo);
this.children = children; this.children = children;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment