Commit c46c6f18 by olly Committed by Oliver Woodman

Add DRM request headers to exolist.json format

Plus misc fixes related to the added samples.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=132891534
parent 26e13066
...@@ -69,6 +69,8 @@ import com.google.android.exoplayer2.util.Util; ...@@ -69,6 +69,8 @@ import com.google.android.exoplayer2.util.Util;
import java.net.CookieHandler; import java.net.CookieHandler;
import java.net.CookieManager; import java.net.CookieManager;
import java.net.CookiePolicy; import java.net.CookiePolicy;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID; import java.util.UUID;
/** /**
...@@ -79,6 +81,7 @@ public class PlayerActivity extends Activity implements OnClickListener, ExoPlay ...@@ -79,6 +81,7 @@ public class PlayerActivity extends Activity implements OnClickListener, ExoPlay
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 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";
...@@ -222,8 +225,20 @@ public class PlayerActivity extends Activity implements OnClickListener, ExoPlay ...@@ -222,8 +225,20 @@ public class PlayerActivity extends Activity implements OnClickListener, ExoPlay
DrmSessionManager drmSessionManager = null; DrmSessionManager drmSessionManager = null;
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);
Map<String, String> keyRequestProperties;
if (keyRequestPropertiesArray == null || keyRequestPropertiesArray.length < 2) {
keyRequestProperties = null;
} else {
keyRequestProperties = new HashMap<>();
for (int i = 0; i < keyRequestPropertiesArray.length - 1; i += 2) {
keyRequestProperties.put(keyRequestPropertiesArray[i],
keyRequestPropertiesArray[i + 1]);
}
}
try { try {
drmSessionManager = buildDrmSessionManager(drmSchemeUuid, drmLicenseUrl); drmSessionManager = buildDrmSessionManager(drmSchemeUuid, drmLicenseUrl,
keyRequestProperties);
} catch (UnsupportedDrmException e) { } catch (UnsupportedDrmException e) {
int errorStringId = Util.SDK_INT < 18 ? R.string.error_drm_not_supported int errorStringId = Util.SDK_INT < 18 ? R.string.error_drm_not_supported
: (e.reason == UnsupportedDrmException.REASON_UNSUPPORTED_SCHEME : (e.reason == UnsupportedDrmException.REASON_UNSUPPORTED_SCHEME
...@@ -318,13 +333,14 @@ public class PlayerActivity extends Activity implements OnClickListener, ExoPlay ...@@ -318,13 +333,14 @@ public class PlayerActivity extends Activity implements OnClickListener, ExoPlay
} }
} }
private DrmSessionManager buildDrmSessionManager(UUID uuid, String licenseUrl) private DrmSessionManager buildDrmSessionManager(UUID uuid, String licenseUrl,
Map<String, String> keyRequestProperties)
throws UnsupportedDrmException { throws UnsupportedDrmException {
if (Util.SDK_INT < 18) { if (Util.SDK_INT < 18) {
return null; return null;
} }
HttpMediaDrmCallback drmCallback = new HttpMediaDrmCallback(licenseUrl, HttpMediaDrmCallback drmCallback = new HttpMediaDrmCallback(licenseUrl,
buildHttpDataSourceFactory(false)); buildHttpDataSourceFactory(false), keyRequestProperties);
return new StreamingDrmSessionManager<>(uuid, return new StreamingDrmSessionManager<>(uuid,
FrameworkMediaDrm.newInstance(uuid), drmCallback, null, mainHandler, eventLogger); FrameworkMediaDrm.newInstance(uuid), drmCallback, null, mainHandler, eventLogger);
} }
......
...@@ -167,6 +167,7 @@ public class SampleChooserActivity extends Activity { ...@@ -167,6 +167,7 @@ public class SampleChooserActivity extends Activity {
String extension = null; String extension = null;
UUID drmUuid = null; UUID drmUuid = null;
String drmLicenseUrl = null; String drmLicenseUrl = null;
String[] drmKeyRequestProperties = null;
boolean preferExtensionDecoders = false; boolean preferExtensionDecoders = false;
ArrayList<UriSample> playlistSamples = null; ArrayList<UriSample> playlistSamples = null;
...@@ -192,6 +193,18 @@ public class SampleChooserActivity extends Activity { ...@@ -192,6 +193,18 @@ public class SampleChooserActivity extends Activity {
"Invalid attribute on nested item: drm_license_url"); "Invalid attribute on nested item: drm_license_url");
drmLicenseUrl = reader.nextString(); drmLicenseUrl = reader.nextString();
break; break;
case "drm_key_request_properties":
Assertions.checkState(!insidePlaylist,
"Invalid attribute on nested item: drm_key_request_properties");
ArrayList<String> drmKeyRequestPropertiesList = new ArrayList<>();
reader.beginObject();
while (reader.hasNext()) {
drmKeyRequestPropertiesList.add(reader.nextName());
drmKeyRequestPropertiesList.add(reader.nextString());
}
reader.endObject();
drmKeyRequestProperties = drmKeyRequestPropertiesList.toArray(new String[0]);
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");
...@@ -215,11 +228,11 @@ public class SampleChooserActivity extends Activity { ...@@ -215,11 +228,11 @@ public class SampleChooserActivity extends Activity {
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, preferExtensionDecoders, return new PlaylistSample(sampleName, drmUuid, drmLicenseUrl, drmKeyRequestProperties,
playlistSamplesArray); preferExtensionDecoders, playlistSamplesArray);
} else { } else {
return new UriSample(sampleName, drmUuid, drmLicenseUrl, preferExtensionDecoders, uri, return new UriSample(sampleName, drmUuid, drmLicenseUrl, drmKeyRequestProperties,
extension); preferExtensionDecoders, uri, extension);
} }
} }
...@@ -345,12 +358,14 @@ public class SampleChooserActivity extends Activity { ...@@ -345,12 +358,14 @@ public class SampleChooserActivity extends Activity {
public final boolean preferExtensionDecoders; 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 Sample(String name, UUID drmSchemeUuid, String drmLicenseUrl, public Sample(String name, UUID drmSchemeUuid, String drmLicenseUrl,
boolean preferExtensionDecoders) { String[] drmKeyRequestProperties, boolean preferExtensionDecoders) {
this.name = name; this.name = name;
this.drmSchemeUuid = drmSchemeUuid; this.drmSchemeUuid = drmSchemeUuid;
this.drmLicenseUrl = drmLicenseUrl; this.drmLicenseUrl = drmLicenseUrl;
this.drmKeyRequestProperties = drmKeyRequestProperties;
this.preferExtensionDecoders = preferExtensionDecoders; this.preferExtensionDecoders = preferExtensionDecoders;
} }
...@@ -360,6 +375,7 @@ public class SampleChooserActivity extends Activity { ...@@ -360,6 +375,7 @@ public class SampleChooserActivity extends Activity {
if (drmSchemeUuid != null) { if (drmSchemeUuid != null) {
intent.putExtra(PlayerActivity.DRM_SCHEME_UUID_EXTRA, drmSchemeUuid.toString()); intent.putExtra(PlayerActivity.DRM_SCHEME_UUID_EXTRA, drmSchemeUuid.toString());
intent.putExtra(PlayerActivity.DRM_LICENSE_URL, drmLicenseUrl); intent.putExtra(PlayerActivity.DRM_LICENSE_URL, drmLicenseUrl);
intent.putExtra(PlayerActivity.DRM_KEY_REQUEST_PROPERTIES, drmKeyRequestProperties);
} }
return intent; return intent;
} }
...@@ -372,8 +388,9 @@ public class SampleChooserActivity extends Activity { ...@@ -372,8 +388,9 @@ public class SampleChooserActivity extends Activity {
public final String extension; public final String extension;
public UriSample(String name, UUID drmSchemeUuid, String drmLicenseUrl, public UriSample(String name, UUID drmSchemeUuid, String drmLicenseUrl,
boolean preferExtensionDecoders, String uri, String extension) { String[] drmKeyRequestProperties, boolean preferExtensionDecoders, String uri,
super(name, drmSchemeUuid, drmLicenseUrl, preferExtensionDecoders); String extension) {
super(name, drmSchemeUuid, drmLicenseUrl, drmKeyRequestProperties, preferExtensionDecoders);
this.uri = uri; this.uri = uri;
this.extension = extension; this.extension = extension;
} }
...@@ -393,8 +410,9 @@ public class SampleChooserActivity extends Activity { ...@@ -393,8 +410,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, UUID drmSchemeUuid, String drmLicenseUrl,
boolean preferExtensionDecoders, UriSample... children) { String[] drmKeyRequestProperties, boolean preferExtensionDecoders,
super(name, drmSchemeUuid, drmLicenseUrl, preferExtensionDecoders); UriSample... children) {
super(name, drmSchemeUuid, drmLicenseUrl, drmKeyRequestProperties, preferExtensionDecoders);
this.children = children; this.children = children;
} }
......
...@@ -233,7 +233,8 @@ import java.util.Locale; ...@@ -233,7 +233,8 @@ import java.util.Locale;
Pair<Integer, Integer> tag = (Pair<Integer, Integer>) view.getTag(); Pair<Integer, Integer> tag = (Pair<Integer, Integer>) view.getTag();
int groupIndex = tag.first; int groupIndex = tag.first;
int trackIndex = tag.second; int trackIndex = tag.second;
if (!trackGroupsAdaptive[groupIndex] || override == null) { if (!trackGroupsAdaptive[groupIndex] || override == null
|| override.groupIndex != groupIndex) {
override = new SelectionOverride(FIXED_FACTORY, groupIndex, trackIndex); override = new SelectionOverride(FIXED_FACTORY, groupIndex, trackIndex);
} else { } else {
// The group being modified is adaptive and we already have a non-null override. // The group being modified is adaptive and we already have a non-null override.
......
...@@ -38,23 +38,34 @@ public final class HttpMediaDrmCallback implements MediaDrmCallback { ...@@ -38,23 +38,34 @@ public final class HttpMediaDrmCallback implements MediaDrmCallback {
private static final Map<String, String> PLAYREADY_KEY_REQUEST_PROPERTIES; private static final Map<String, String> PLAYREADY_KEY_REQUEST_PROPERTIES;
static { static {
HashMap<String, String> keyRequestProperties = new HashMap<>(); PLAYREADY_KEY_REQUEST_PROPERTIES = new HashMap<>();
keyRequestProperties.put("Content-Type", "text/xml"); PLAYREADY_KEY_REQUEST_PROPERTIES.put("Content-Type", "text/xml");
keyRequestProperties.put("SOAPAction", PLAYREADY_KEY_REQUEST_PROPERTIES.put("SOAPAction",
"http://schemas.microsoft.com/DRM/2007/03/protocols/AcquireLicense"); "http://schemas.microsoft.com/DRM/2007/03/protocols/AcquireLicense");
PLAYREADY_KEY_REQUEST_PROPERTIES = keyRequestProperties;
} }
private final HttpDataSource.Factory dataSourceFactory; private final HttpDataSource.Factory dataSourceFactory;
private final String defaultUrl; private final String defaultUrl;
private final Map<String, String> keyRequestProperties;
/** /**
* @param defaultUrl The default license URL. * @param defaultUrl The default license URL.
* @param dataSourceFactory A factory from which to obtain {@link HttpDataSource} instances. * @param dataSourceFactory A factory from which to obtain {@link HttpDataSource} instances.
*/ */
public HttpMediaDrmCallback(String defaultUrl, HttpDataSource.Factory dataSourceFactory) { public HttpMediaDrmCallback(String defaultUrl, HttpDataSource.Factory dataSourceFactory) {
this(defaultUrl, dataSourceFactory, null);
}
/**
* @param defaultUrl The default license URL.
* @param dataSourceFactory A factory from which to obtain {@link HttpDataSource} instances.
* @param keyRequestProperties Request properties to set when making key requests, or null.
*/
public HttpMediaDrmCallback(String defaultUrl, HttpDataSource.Factory dataSourceFactory,
Map<String, String> keyRequestProperties) {
this.dataSourceFactory = dataSourceFactory; this.dataSourceFactory = dataSourceFactory;
this.defaultUrl = defaultUrl; this.defaultUrl = defaultUrl;
this.keyRequestProperties = keyRequestProperties;
} }
@Override @Override
...@@ -69,9 +80,14 @@ public final class HttpMediaDrmCallback implements MediaDrmCallback { ...@@ -69,9 +80,14 @@ public final class HttpMediaDrmCallback implements MediaDrmCallback {
if (TextUtils.isEmpty(url)) { if (TextUtils.isEmpty(url)) {
url = defaultUrl; url = defaultUrl;
} }
Map<String, String> keyRequestProperties = C.PLAYREADY_UUID.equals(uuid) Map<String, String> requestProperties = new HashMap<>();
? PLAYREADY_KEY_REQUEST_PROPERTIES : null; if (C.PLAYREADY_UUID.equals(uuid)) {
return executePost(url, request.getData(), keyRequestProperties); requestProperties.putAll(PLAYREADY_KEY_REQUEST_PROPERTIES);
}
if (keyRequestProperties != null) {
requestProperties.putAll(keyRequestProperties);
}
return executePost(url, request.getData(), requestProperties);
} }
private byte[] executePost(String url, byte[] data, Map<String, String> requestProperties) private byte[] executePost(String url, byte[] data, Map<String, String> requestProperties)
......
...@@ -286,20 +286,16 @@ public class DefaultTrackSelector extends MappingTrackSelector { ...@@ -286,20 +286,16 @@ public class DefaultTrackSelector extends MappingTrackSelector {
: RendererCapabilities.ADAPTIVE_SEAMLESS; : RendererCapabilities.ADAPTIVE_SEAMLESS;
boolean allowMixedMimeTypes = allowMixedMimeAdaptiveness boolean allowMixedMimeTypes = allowMixedMimeAdaptiveness
&& (rendererCapabilities.supportsMixedMimeTypeAdaptation() & requiredAdaptiveSupport) != 0; && (rendererCapabilities.supportsMixedMimeTypeAdaptation() & requiredAdaptiveSupport) != 0;
TrackGroup largestAdaptiveGroup = null;
int[] largestAdaptiveGroupTracks = NO_TRACKS;
for (int i = 0; i < groups.length; i++) { for (int i = 0; i < groups.length; i++) {
TrackGroup group = groups.get(i); TrackGroup group = groups.get(i);
int[] adaptiveTracks = getAdaptiveTracksForGroup(group, formatSupport[i], int[] adaptiveTracks = getAdaptiveTracksForGroup(group, formatSupport[i],
allowMixedMimeTypes, requiredAdaptiveSupport, maxVideoWidth, maxVideoHeight, allowMixedMimeTypes, requiredAdaptiveSupport, maxVideoWidth, maxVideoHeight,
viewportWidth, viewportHeight, orientationMayChange); viewportWidth, viewportHeight, orientationMayChange);
if (adaptiveTracks.length > largestAdaptiveGroupTracks.length) { if (adaptiveTracks.length > 0) {
largestAdaptiveGroup = group; return adaptiveVideoTrackSelectionFactory.createTrackSelection(group, adaptiveTracks);
largestAdaptiveGroupTracks = adaptiveTracks;
} }
} }
return largestAdaptiveGroup == null ? null : adaptiveVideoTrackSelectionFactory return null;
.createTrackSelection(largestAdaptiveGroup, largestAdaptiveGroupTracks);
} }
private static int[] getAdaptiveTracksForGroup(TrackGroup group, int[] formatSupport, private static int[] getAdaptiveTracksForGroup(TrackGroup group, int[] formatSupport,
......
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