Switch DRM and download components from HttpDataSource to DataSource
All the (Http)DataSource interactions can be done with the DataSource interface and don't need HttpDataSource. PiperOrigin-RevId: 436520898
This commit is contained in:
parent
d57958e86d
commit
54d3e45473
@ -34,7 +34,7 @@ import androidx.media3.common.TrackSelectionParameters;
|
||||
import androidx.media3.common.TracksInfo;
|
||||
import androidx.media3.common.util.Log;
|
||||
import androidx.media3.common.util.Util;
|
||||
import androidx.media3.datasource.HttpDataSource;
|
||||
import androidx.media3.datasource.DataSource;
|
||||
import androidx.media3.exoplayer.RenderersFactory;
|
||||
import androidx.media3.exoplayer.drm.DrmSession;
|
||||
import androidx.media3.exoplayer.drm.DrmSessionEventListener;
|
||||
@ -66,7 +66,7 @@ public class DownloadTracker {
|
||||
private static final String TAG = "DownloadTracker";
|
||||
|
||||
private final Context context;
|
||||
private final HttpDataSource.Factory httpDataSourceFactory;
|
||||
private final DataSource.Factory dataSourceFactory;
|
||||
private final CopyOnWriteArraySet<Listener> listeners;
|
||||
private final HashMap<Uri, Download> downloads;
|
||||
private final DownloadIndex downloadIndex;
|
||||
@ -74,11 +74,9 @@ public class DownloadTracker {
|
||||
@Nullable private StartDownloadDialogHelper startDownloadDialogHelper;
|
||||
|
||||
public DownloadTracker(
|
||||
Context context,
|
||||
HttpDataSource.Factory httpDataSourceFactory,
|
||||
DownloadManager downloadManager) {
|
||||
Context context, DataSource.Factory dataSourceFactory, DownloadManager downloadManager) {
|
||||
this.context = context.getApplicationContext();
|
||||
this.httpDataSourceFactory = httpDataSourceFactory;
|
||||
this.dataSourceFactory = dataSourceFactory;
|
||||
listeners = new CopyOnWriteArraySet<>();
|
||||
downloads = new HashMap<>();
|
||||
downloadIndex = downloadManager.getDownloadIndex();
|
||||
@ -119,8 +117,7 @@ public class DownloadTracker {
|
||||
startDownloadDialogHelper =
|
||||
new StartDownloadDialogHelper(
|
||||
fragmentManager,
|
||||
DownloadHelper.forMediaItem(
|
||||
context, mediaItem, renderersFactory, httpDataSourceFactory),
|
||||
DownloadHelper.forMediaItem(context, mediaItem, renderersFactory, dataSourceFactory),
|
||||
mediaItem);
|
||||
}
|
||||
}
|
||||
@ -218,7 +215,7 @@ public class DownloadTracker {
|
||||
new WidevineOfflineLicenseFetchTask(
|
||||
format,
|
||||
mediaItem.localConfiguration.drmConfiguration,
|
||||
httpDataSourceFactory,
|
||||
dataSourceFactory,
|
||||
/* dialogHelper= */ this,
|
||||
helper);
|
||||
widevineOfflineLicenseFetchTask.execute();
|
||||
@ -361,7 +358,7 @@ public class DownloadTracker {
|
||||
|
||||
private final Format format;
|
||||
private final MediaItem.DrmConfiguration drmConfiguration;
|
||||
private final HttpDataSource.Factory httpDataSourceFactory;
|
||||
private final DataSource.Factory dataSourceFactory;
|
||||
private final StartDownloadDialogHelper dialogHelper;
|
||||
private final DownloadHelper downloadHelper;
|
||||
|
||||
@ -371,12 +368,12 @@ public class DownloadTracker {
|
||||
public WidevineOfflineLicenseFetchTask(
|
||||
Format format,
|
||||
MediaItem.DrmConfiguration drmConfiguration,
|
||||
HttpDataSource.Factory httpDataSourceFactory,
|
||||
DataSource.Factory dataSourceFactory,
|
||||
StartDownloadDialogHelper dialogHelper,
|
||||
DownloadHelper downloadHelper) {
|
||||
this.format = format;
|
||||
this.drmConfiguration = drmConfiguration;
|
||||
this.httpDataSourceFactory = httpDataSourceFactory;
|
||||
this.dataSourceFactory = dataSourceFactory;
|
||||
this.dialogHelper = dialogHelper;
|
||||
this.downloadHelper = downloadHelper;
|
||||
}
|
||||
@ -387,7 +384,7 @@ public class DownloadTracker {
|
||||
OfflineLicenseHelper.newWidevineInstance(
|
||||
drmConfiguration.licenseUri.toString(),
|
||||
drmConfiguration.forceDefaultLicenseUri,
|
||||
httpDataSourceFactory,
|
||||
dataSourceFactory,
|
||||
drmConfiguration.licenseRequestHeaders,
|
||||
new DrmSessionEventListener.EventDispatcher());
|
||||
try {
|
||||
|
@ -24,8 +24,8 @@ import androidx.annotation.RequiresApi;
|
||||
import androidx.media3.common.MediaItem;
|
||||
import androidx.media3.common.util.UnstableApi;
|
||||
import androidx.media3.common.util.Util;
|
||||
import androidx.media3.datasource.DataSource;
|
||||
import androidx.media3.datasource.DefaultHttpDataSource;
|
||||
import androidx.media3.datasource.HttpDataSource;
|
||||
import com.google.common.primitives.Ints;
|
||||
import java.util.Map;
|
||||
import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
||||
@ -42,7 +42,7 @@ public final class DefaultDrmSessionManagerProvider implements DrmSessionManager
|
||||
@GuardedBy("lock")
|
||||
private @MonotonicNonNull DrmSessionManager manager;
|
||||
|
||||
@Nullable private HttpDataSource.Factory drmHttpDataSourceFactory;
|
||||
@Nullable private DataSource.Factory drmHttpDataSourceFactory;
|
||||
@Nullable private String userAgent;
|
||||
|
||||
public DefaultDrmSessionManagerProvider() {
|
||||
@ -50,23 +50,21 @@ public final class DefaultDrmSessionManagerProvider implements DrmSessionManager
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the {@link HttpDataSource.Factory} to be used for creating {@link HttpMediaDrmCallback
|
||||
* HttpMediaDrmCallbacks} which executes key and provisioning requests over HTTP. If {@code null}
|
||||
* is passed the {@link DefaultHttpDataSource.Factory} is used.
|
||||
* Sets the {@link DataSource.Factory} which is used to create {@link HttpMediaDrmCallback}
|
||||
* instances. If {@code null} is passed a {@link DefaultHttpDataSource.Factory} is used.
|
||||
*
|
||||
* @param drmHttpDataSourceFactory The HTTP data source factory or {@code null} to use {@link
|
||||
* @param drmDataSourceFactory The data source factory or {@code null} to use {@link
|
||||
* DefaultHttpDataSource.Factory}.
|
||||
*/
|
||||
public void setDrmHttpDataSourceFactory(
|
||||
@Nullable HttpDataSource.Factory drmHttpDataSourceFactory) {
|
||||
this.drmHttpDataSourceFactory = drmHttpDataSourceFactory;
|
||||
public void setDrmHttpDataSourceFactory(@Nullable DataSource.Factory drmDataSourceFactory) {
|
||||
this.drmHttpDataSourceFactory = drmDataSourceFactory;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the optional user agent to be used for DRM requests.
|
||||
*
|
||||
* <p>In case a factory has been set by {@link
|
||||
* #setDrmHttpDataSourceFactory(HttpDataSource.Factory)}, this user agent is ignored.
|
||||
* <p>In case a factory has been set by {@link #setDrmHttpDataSourceFactory(DataSource.Factory)},
|
||||
* this user agent is ignored.
|
||||
*
|
||||
* @param userAgent The user agent to be used for DRM requests.
|
||||
*/
|
||||
@ -94,7 +92,7 @@ public final class DefaultDrmSessionManagerProvider implements DrmSessionManager
|
||||
|
||||
@RequiresApi(18)
|
||||
private DrmSessionManager createManager(MediaItem.DrmConfiguration drmConfiguration) {
|
||||
HttpDataSource.Factory dataSourceFactory =
|
||||
DataSource.Factory dataSourceFactory =
|
||||
drmHttpDataSourceFactory != null
|
||||
? drmHttpDataSourceFactory
|
||||
: new DefaultHttpDataSource.Factory().setUserAgent(userAgent);
|
||||
|
@ -22,9 +22,9 @@ import androidx.media3.common.C;
|
||||
import androidx.media3.common.util.Assertions;
|
||||
import androidx.media3.common.util.UnstableApi;
|
||||
import androidx.media3.common.util.Util;
|
||||
import androidx.media3.datasource.DataSource;
|
||||
import androidx.media3.datasource.DataSourceInputStream;
|
||||
import androidx.media3.datasource.DataSpec;
|
||||
import androidx.media3.datasource.HttpDataSource;
|
||||
import androidx.media3.datasource.HttpDataSource.InvalidResponseCodeException;
|
||||
import androidx.media3.datasource.StatsDataSource;
|
||||
import androidx.media3.exoplayer.drm.ExoMediaDrm.KeyRequest;
|
||||
@ -36,41 +36,47 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
|
||||
/** A {@link MediaDrmCallback} that makes requests using {@link HttpDataSource} instances. */
|
||||
/** A {@link MediaDrmCallback} that makes requests using {@link DataSource} instances. */
|
||||
@UnstableApi
|
||||
public final class HttpMediaDrmCallback implements MediaDrmCallback {
|
||||
|
||||
private static final int MAX_MANUAL_REDIRECTS = 5;
|
||||
|
||||
private final HttpDataSource.Factory dataSourceFactory;
|
||||
private final DataSource.Factory dataSourceFactory;
|
||||
@Nullable private final String defaultLicenseUrl;
|
||||
private final boolean forceDefaultLicenseUrl;
|
||||
private final Map<String, String> keyRequestProperties;
|
||||
|
||||
/**
|
||||
* Constructs an instance.
|
||||
*
|
||||
* @param defaultLicenseUrl The default license URL. Used for key requests that do not specify
|
||||
* their own license URL. May be {@code null} if it's known that all key requests will specify
|
||||
* their own URLs.
|
||||
* @param dataSourceFactory A factory from which to obtain {@link HttpDataSource} instances.
|
||||
* @param dataSourceFactory A factory from which to obtain {@link DataSource} instances. This will
|
||||
* usually be an HTTP-based {@link DataSource}.
|
||||
*/
|
||||
public HttpMediaDrmCallback(
|
||||
@Nullable String defaultLicenseUrl, HttpDataSource.Factory dataSourceFactory) {
|
||||
@Nullable String defaultLicenseUrl, DataSource.Factory dataSourceFactory) {
|
||||
this(defaultLicenseUrl, /* forceDefaultLicenseUrl= */ false, dataSourceFactory);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs an instance.
|
||||
*
|
||||
* @param defaultLicenseUrl The default license URL. Used for key requests that do not specify
|
||||
* their own license URL, or for all key requests if {@code forceDefaultLicenseUrl} is set to
|
||||
* true. May be {@code null} if {@code forceDefaultLicenseUrl} is {@code false} and if it's
|
||||
* known that all key requests will specify their own URLs.
|
||||
* @param forceDefaultLicenseUrl Whether to force use of {@code defaultLicenseUrl} for key
|
||||
* requests that include their own license URL.
|
||||
* @param dataSourceFactory A factory from which to obtain {@link HttpDataSource} instances.
|
||||
* @param dataSourceFactory A factory from which to obtain {@link DataSource} instances. This will
|
||||
* * usually be an HTTP-based {@link DataSource}.
|
||||
*/
|
||||
public HttpMediaDrmCallback(
|
||||
@Nullable String defaultLicenseUrl,
|
||||
boolean forceDefaultLicenseUrl,
|
||||
HttpDataSource.Factory dataSourceFactory) {
|
||||
DataSource.Factory dataSourceFactory) {
|
||||
Assertions.checkArgument(!(forceDefaultLicenseUrl && TextUtils.isEmpty(defaultLicenseUrl)));
|
||||
this.dataSourceFactory = dataSourceFactory;
|
||||
this.defaultLicenseUrl = defaultLicenseUrl;
|
||||
@ -156,7 +162,7 @@ public final class HttpMediaDrmCallback implements MediaDrmCallback {
|
||||
}
|
||||
|
||||
private static byte[] executePost(
|
||||
HttpDataSource.Factory dataSourceFactory,
|
||||
DataSource.Factory dataSourceFactory,
|
||||
String url,
|
||||
@Nullable byte[] httpBody,
|
||||
Map<String, String> requestProperties)
|
||||
|
@ -26,7 +26,7 @@ import androidx.media3.common.DrmInitData;
|
||||
import androidx.media3.common.Format;
|
||||
import androidx.media3.common.util.Assertions;
|
||||
import androidx.media3.common.util.UnstableApi;
|
||||
import androidx.media3.datasource.HttpDataSource;
|
||||
import androidx.media3.datasource.DataSource;
|
||||
import androidx.media3.exoplayer.analytics.PlayerId;
|
||||
import androidx.media3.exoplayer.drm.DefaultDrmSessionManager.Mode;
|
||||
import androidx.media3.exoplayer.drm.DrmSession.DrmSessionException;
|
||||
@ -53,20 +53,17 @@ public final class OfflineLicenseHelper {
|
||||
*
|
||||
* @param defaultLicenseUrl The default license URL. Used for key requests that do not specify
|
||||
* their own license URL.
|
||||
* @param httpDataSourceFactory A factory from which to obtain {@link HttpDataSource} instances.
|
||||
* @param dataSourceFactory A factory from which to obtain {@link DataSource} instances.
|
||||
* @param eventDispatcher A {@link DrmSessionEventListener.EventDispatcher} used to distribute
|
||||
* DRM-related events.
|
||||
* @return A new instance which uses Widevine CDM.
|
||||
*/
|
||||
public static OfflineLicenseHelper newWidevineInstance(
|
||||
String defaultLicenseUrl,
|
||||
HttpDataSource.Factory httpDataSourceFactory,
|
||||
DataSource.Factory dataSourceFactory,
|
||||
DrmSessionEventListener.EventDispatcher eventDispatcher) {
|
||||
return newWidevineInstance(
|
||||
defaultLicenseUrl,
|
||||
/* forceDefaultLicenseUrl= */ false,
|
||||
httpDataSourceFactory,
|
||||
eventDispatcher);
|
||||
defaultLicenseUrl, /* forceDefaultLicenseUrl= */ false, dataSourceFactory, eventDispatcher);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -77,7 +74,7 @@ public final class OfflineLicenseHelper {
|
||||
* their own license URL.
|
||||
* @param forceDefaultLicenseUrl Whether to use {@code defaultLicenseUrl} for key requests that
|
||||
* include their own license URL.
|
||||
* @param httpDataSourceFactory A factory from which to obtain {@link HttpDataSource} instances.
|
||||
* @param dataSourceFactory A factory from which to obtain {@link DataSource} instances.
|
||||
* @param eventDispatcher A {@link DrmSessionEventListener.EventDispatcher} used to distribute
|
||||
* DRM-related events.
|
||||
* @return A new instance which uses Widevine CDM.
|
||||
@ -85,12 +82,12 @@ public final class OfflineLicenseHelper {
|
||||
public static OfflineLicenseHelper newWidevineInstance(
|
||||
String defaultLicenseUrl,
|
||||
boolean forceDefaultLicenseUrl,
|
||||
HttpDataSource.Factory httpDataSourceFactory,
|
||||
DataSource.Factory dataSourceFactory,
|
||||
DrmSessionEventListener.EventDispatcher eventDispatcher) {
|
||||
return newWidevineInstance(
|
||||
defaultLicenseUrl,
|
||||
forceDefaultLicenseUrl,
|
||||
httpDataSourceFactory,
|
||||
dataSourceFactory,
|
||||
/* optionalKeyRequestParameters= */ null,
|
||||
eventDispatcher);
|
||||
}
|
||||
@ -113,7 +110,7 @@ public final class OfflineLicenseHelper {
|
||||
public static OfflineLicenseHelper newWidevineInstance(
|
||||
String defaultLicenseUrl,
|
||||
boolean forceDefaultLicenseUrl,
|
||||
HttpDataSource.Factory httpDataSourceFactory,
|
||||
DataSource.Factory dataSourceFactory,
|
||||
@Nullable Map<String, String> optionalKeyRequestParameters,
|
||||
DrmSessionEventListener.EventDispatcher eventDispatcher) {
|
||||
return new OfflineLicenseHelper(
|
||||
@ -121,7 +118,7 @@ public final class OfflineLicenseHelper {
|
||||
.setKeyRequestParameters(optionalKeyRequestParameters)
|
||||
.build(
|
||||
new HttpMediaDrmCallback(
|
||||
defaultLicenseUrl, forceDefaultLicenseUrl, httpDataSourceFactory)),
|
||||
defaultLicenseUrl, forceDefaultLicenseUrl, dataSourceFactory)),
|
||||
eventDispatcher);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user