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