mirror of
https://github.com/samsonjs/media.git
synced 2026-04-27 15:07:40 +00:00
Remove DownloadHelper subclasses and use static methods instead.
The subclasses only call specific constructor combinations and can easily replaced by static methods. PiperOrigin-RevId: 231385606
This commit is contained in:
parent
0a8ae74217
commit
71d77d7fa0
11 changed files with 416 additions and 342 deletions
|
|
@ -39,13 +39,9 @@ import com.google.android.exoplayer2.offline.DownloadHelper;
|
||||||
import com.google.android.exoplayer2.offline.DownloadManager;
|
import com.google.android.exoplayer2.offline.DownloadManager;
|
||||||
import com.google.android.exoplayer2.offline.DownloadService;
|
import com.google.android.exoplayer2.offline.DownloadService;
|
||||||
import com.google.android.exoplayer2.offline.DownloadState;
|
import com.google.android.exoplayer2.offline.DownloadState;
|
||||||
import com.google.android.exoplayer2.offline.ProgressiveDownloadHelper;
|
|
||||||
import com.google.android.exoplayer2.offline.StreamKey;
|
import com.google.android.exoplayer2.offline.StreamKey;
|
||||||
import com.google.android.exoplayer2.scheduler.Requirements;
|
import com.google.android.exoplayer2.scheduler.Requirements;
|
||||||
import com.google.android.exoplayer2.source.TrackGroupArray;
|
import com.google.android.exoplayer2.source.TrackGroupArray;
|
||||||
import com.google.android.exoplayer2.source.dash.offline.DashDownloadHelper;
|
|
||||||
import com.google.android.exoplayer2.source.hls.offline.HlsDownloadHelper;
|
|
||||||
import com.google.android.exoplayer2.source.smoothstreaming.offline.SsDownloadHelper;
|
|
||||||
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
|
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
|
||||||
import com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo;
|
import com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo;
|
||||||
import com.google.android.exoplayer2.trackselection.TrackSelection;
|
import com.google.android.exoplayer2.trackselection.TrackSelection;
|
||||||
|
|
@ -215,13 +211,13 @@ public class DownloadTracker implements DownloadManager.Listener {
|
||||||
int type = Util.inferContentType(uri, extension);
|
int type = Util.inferContentType(uri, extension);
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case C.TYPE_DASH:
|
case C.TYPE_DASH:
|
||||||
return new DashDownloadHelper(uri, dataSourceFactory, renderersFactory);
|
return DownloadHelper.forDash(uri, dataSourceFactory, renderersFactory);
|
||||||
case C.TYPE_SS:
|
case C.TYPE_SS:
|
||||||
return new SsDownloadHelper(uri, dataSourceFactory, renderersFactory);
|
return DownloadHelper.forSmoothStreaming(uri, dataSourceFactory, renderersFactory);
|
||||||
case C.TYPE_HLS:
|
case C.TYPE_HLS:
|
||||||
return new HlsDownloadHelper(uri, dataSourceFactory, renderersFactory);
|
return DownloadHelper.forHls(uri, dataSourceFactory, renderersFactory);
|
||||||
case C.TYPE_OTHER:
|
case C.TYPE_OTHER:
|
||||||
return new ProgressiveDownloadHelper(uri);
|
return DownloadHelper.forProgressive(uri);
|
||||||
default:
|
default:
|
||||||
throw new IllegalStateException("Unsupported type: " + type);
|
throw new IllegalStateException("Unsupported type: " + type);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -44,5 +44,22 @@
|
||||||
<init>(android.net.Uri, java.util.List, com.google.android.exoplayer2.offlineDownloaderConstructorHelper);
|
<init>(android.net.Uri, java.util.List, com.google.android.exoplayer2.offlineDownloaderConstructorHelper);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Constructors accessed via reflection in DownloadHelper
|
||||||
|
-dontnote com.google.android.exoplayer2.source.dash.DashMediaSource$Factory
|
||||||
|
-keepclassmembers class com.google.android.exoplayer2.source.dash.DashMediaSource$Factory {
|
||||||
|
<init>(com.google.android.exoplayer2.upstream.DataSource$Factory);
|
||||||
|
DashMediaSource createMediaSource(android.net.Uri);
|
||||||
|
}
|
||||||
|
-dontnote com.google.android.exoplayer2.source.hls.HlsMediaSource$Factory
|
||||||
|
-keepclassmembers class com.google.android.exoplayer2.source.hls.HlsMediaSource$Factory {
|
||||||
|
<init>(com.google.android.exoplayer2.upstream.DataSource$Factory);
|
||||||
|
HlsMediaSource createMediaSource(android.net.Uri);
|
||||||
|
}
|
||||||
|
-dontnote com.google.android.exoplayer2.source.smoothstreaming.SsMediaSource$Factory
|
||||||
|
-keepclassmembers class com.google.android.exoplayer2.source.smoothstreaming.SsMediaSource$Factory {
|
||||||
|
<init>(com.google.android.exoplayer2.upstream.DataSource$Factory);
|
||||||
|
SsMediaSource createMediaSource(android.net.Uri);
|
||||||
|
}
|
||||||
|
|
||||||
# Don't warn about checkerframework
|
# Don't warn about checkerframework
|
||||||
-dontwarn org.checkerframework.**
|
-dontwarn org.checkerframework.**
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@ import android.os.HandlerThread;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
import android.os.Message;
|
import android.os.Message;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
|
import android.util.Pair;
|
||||||
import android.util.SparseIntArray;
|
import android.util.SparseIntArray;
|
||||||
import com.google.android.exoplayer2.C;
|
import com.google.android.exoplayer2.C;
|
||||||
import com.google.android.exoplayer2.ExoPlaybackException;
|
import com.google.android.exoplayer2.ExoPlaybackException;
|
||||||
|
|
@ -42,11 +43,14 @@ import com.google.android.exoplayer2.trackselection.TrackSelection;
|
||||||
import com.google.android.exoplayer2.trackselection.TrackSelectorResult;
|
import com.google.android.exoplayer2.trackselection.TrackSelectorResult;
|
||||||
import com.google.android.exoplayer2.upstream.Allocator;
|
import com.google.android.exoplayer2.upstream.Allocator;
|
||||||
import com.google.android.exoplayer2.upstream.BandwidthMeter;
|
import com.google.android.exoplayer2.upstream.BandwidthMeter;
|
||||||
|
import com.google.android.exoplayer2.upstream.DataSource;
|
||||||
import com.google.android.exoplayer2.upstream.DefaultAllocator;
|
import com.google.android.exoplayer2.upstream.DefaultAllocator;
|
||||||
import com.google.android.exoplayer2.upstream.TransferListener;
|
import com.google.android.exoplayer2.upstream.TransferListener;
|
||||||
import com.google.android.exoplayer2.util.Assertions;
|
import com.google.android.exoplayer2.util.Assertions;
|
||||||
import com.google.android.exoplayer2.util.Util;
|
import com.google.android.exoplayer2.util.Util;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.lang.reflect.Constructor;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
@ -64,9 +68,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
|
||||||
* <p>A typical usage of DownloadHelper follows these steps:
|
* <p>A typical usage of DownloadHelper follows these steps:
|
||||||
*
|
*
|
||||||
* <ol>
|
* <ol>
|
||||||
* <li>Construct the download helper with the {@link MediaSource}, information about the {@link
|
* <li>Build the helper using one of the {@code forXXX} methods.
|
||||||
* RenderersFactory renderers} and {@link DefaultTrackSelector.Parameters parameters} for
|
|
||||||
* track selection.
|
|
||||||
* <li>Prepare the helper using {@link #prepare(Callback)} and wait for the callback.
|
* <li>Prepare the helper using {@link #prepare(Callback)} and wait for the callback.
|
||||||
* <li>Optional: Inspect the selected tracks using {@link #getMappedTrackInfo(int)} and {@link
|
* <li>Optional: Inspect the selected tracks using {@link #getMappedTrackInfo(int)} and {@link
|
||||||
* #getTrackSelections(int, int)}, and make adjustments using {@link
|
* #getTrackSelections(int, int)}, and make adjustments using {@link
|
||||||
|
|
@ -76,7 +78,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
|
||||||
* <li>Release the helper using {@link #release()}.
|
* <li>Release the helper using {@link #release()}.
|
||||||
* </ol>
|
* </ol>
|
||||||
*/
|
*/
|
||||||
public abstract class DownloadHelper {
|
public final class DownloadHelper {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The default parameters used for track selection for downloading. This default selects the
|
* The default parameters used for track selection for downloading. This default selects the
|
||||||
|
|
@ -104,6 +106,207 @@ public abstract class DownloadHelper {
|
||||||
void onPrepareError(DownloadHelper helper, IOException e);
|
void onPrepareError(DownloadHelper helper, IOException e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable private static final Constructor<?> DASH_FACTORY_CONSTRUCTOR;
|
||||||
|
@Nullable private static final Constructor<?> HLS_FACTORY_CONSTRUCTOR;
|
||||||
|
@Nullable private static final Constructor<?> SS_FACTORY_CONSTRUCTOR;
|
||||||
|
@Nullable private static final Method DASH_FACTORY_CREATE_METHOD;
|
||||||
|
@Nullable private static final Method HLS_FACTORY_CREATE_METHOD;
|
||||||
|
@Nullable private static final Method SS_FACTORY_CREATE_METHOD;
|
||||||
|
|
||||||
|
static {
|
||||||
|
Pair<@NullableType Constructor<?>, @NullableType Method> dashFactoryMethods =
|
||||||
|
getMediaSourceFactoryMethods(
|
||||||
|
"com.google.android.exoplayer2.source.dash.DashMediaSource$Factory");
|
||||||
|
DASH_FACTORY_CONSTRUCTOR = dashFactoryMethods.first;
|
||||||
|
DASH_FACTORY_CREATE_METHOD = dashFactoryMethods.second;
|
||||||
|
Pair<@NullableType Constructor<?>, @NullableType Method> hlsFactoryMethods =
|
||||||
|
getMediaSourceFactoryMethods(
|
||||||
|
"com.google.android.exoplayer2.source.hls.HlsMediaSource$Factory");
|
||||||
|
HLS_FACTORY_CONSTRUCTOR = hlsFactoryMethods.first;
|
||||||
|
HLS_FACTORY_CREATE_METHOD = hlsFactoryMethods.second;
|
||||||
|
Pair<@NullableType Constructor<?>, @NullableType Method> ssFactoryMethods =
|
||||||
|
getMediaSourceFactoryMethods(
|
||||||
|
"com.google.android.exoplayer2.source.smoothstreaming.SsMediaSource$Factory");
|
||||||
|
SS_FACTORY_CONSTRUCTOR = ssFactoryMethods.first;
|
||||||
|
SS_FACTORY_CREATE_METHOD = ssFactoryMethods.second;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a {@link DownloadHelper} for progressive streams.
|
||||||
|
*
|
||||||
|
* @param uri A stream {@link Uri}.
|
||||||
|
* @return A {@link DownloadHelper} for progressive streams.
|
||||||
|
*/
|
||||||
|
public static DownloadHelper forProgressive(Uri uri) {
|
||||||
|
return forProgressive(uri, /* cacheKey= */ null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a {@link DownloadHelper} for progressive streams.
|
||||||
|
*
|
||||||
|
* @param uri A stream {@link Uri}.
|
||||||
|
* @param cacheKey An optional cache key.
|
||||||
|
* @return A {@link DownloadHelper} for progressive streams.
|
||||||
|
*/
|
||||||
|
public static DownloadHelper forProgressive(Uri uri, @Nullable String cacheKey) {
|
||||||
|
return new DownloadHelper(
|
||||||
|
DownloadAction.TYPE_PROGRESSIVE,
|
||||||
|
uri,
|
||||||
|
cacheKey,
|
||||||
|
/* mediaSource= */ null,
|
||||||
|
DEFAULT_TRACK_SELECTOR_PARAMETERS,
|
||||||
|
/* rendererCapabilities= */ new RendererCapabilities[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a {@link DownloadHelper} for DASH streams.
|
||||||
|
*
|
||||||
|
* @param uri A manifest {@link Uri}.
|
||||||
|
* @param dataSourceFactory A {@link DataSource.Factory} used to load the manifest.
|
||||||
|
* @param renderersFactory A {@link RenderersFactory} creating the renderers for which tracks are
|
||||||
|
* selected.
|
||||||
|
* @return A {@link DownloadHelper} for DASH streams.
|
||||||
|
* @throws IllegalStateException If the DASH module is missing.
|
||||||
|
*/
|
||||||
|
public static DownloadHelper forDash(
|
||||||
|
Uri uri, DataSource.Factory dataSourceFactory, RenderersFactory renderersFactory) {
|
||||||
|
return forDash(
|
||||||
|
uri,
|
||||||
|
dataSourceFactory,
|
||||||
|
renderersFactory,
|
||||||
|
/* drmSessionManager= */ null,
|
||||||
|
DEFAULT_TRACK_SELECTOR_PARAMETERS);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a {@link DownloadHelper} for DASH streams.
|
||||||
|
*
|
||||||
|
* @param uri A manifest {@link Uri}.
|
||||||
|
* @param dataSourceFactory A {@link DataSource.Factory} used to load the manifest.
|
||||||
|
* @param renderersFactory A {@link RenderersFactory} creating the renderers for which tracks are
|
||||||
|
* selected.
|
||||||
|
* @param drmSessionManager An optional {@link DrmSessionManager} used by the renderers created by
|
||||||
|
* {@code renderersFactory}.
|
||||||
|
* @param trackSelectorParameters {@link DefaultTrackSelector.Parameters} for selecting tracks for
|
||||||
|
* downloading.
|
||||||
|
* @return A {@link DownloadHelper} for DASH streams.
|
||||||
|
* @throws IllegalStateException If the DASH module is missing.
|
||||||
|
*/
|
||||||
|
public static DownloadHelper forDash(
|
||||||
|
Uri uri,
|
||||||
|
DataSource.Factory dataSourceFactory,
|
||||||
|
RenderersFactory renderersFactory,
|
||||||
|
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
|
||||||
|
DefaultTrackSelector.Parameters trackSelectorParameters) {
|
||||||
|
return new DownloadHelper(
|
||||||
|
DownloadAction.TYPE_DASH,
|
||||||
|
uri,
|
||||||
|
/* cacheKey= */ null,
|
||||||
|
createMediaSource(
|
||||||
|
uri, dataSourceFactory, DASH_FACTORY_CONSTRUCTOR, DASH_FACTORY_CREATE_METHOD),
|
||||||
|
trackSelectorParameters,
|
||||||
|
Util.getRendererCapabilities(renderersFactory, drmSessionManager));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a {@link DownloadHelper} for HLS streams.
|
||||||
|
*
|
||||||
|
* @param uri A playlist {@link Uri}.
|
||||||
|
* @param dataSourceFactory A {@link DataSource.Factory} used to load the playlist.
|
||||||
|
* @param renderersFactory A {@link RenderersFactory} creating the renderers for which tracks are
|
||||||
|
* selected.
|
||||||
|
* @return A {@link DownloadHelper} for HLS streams.
|
||||||
|
* @throws IllegalStateException If the HLS module is missing.
|
||||||
|
*/
|
||||||
|
public static DownloadHelper forHls(
|
||||||
|
Uri uri, DataSource.Factory dataSourceFactory, RenderersFactory renderersFactory) {
|
||||||
|
return forHls(
|
||||||
|
uri,
|
||||||
|
dataSourceFactory,
|
||||||
|
renderersFactory,
|
||||||
|
/* drmSessionManager= */ null,
|
||||||
|
DEFAULT_TRACK_SELECTOR_PARAMETERS);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a {@link DownloadHelper} for HLS streams.
|
||||||
|
*
|
||||||
|
* @param uri A playlist {@link Uri}.
|
||||||
|
* @param dataSourceFactory A {@link DataSource.Factory} used to load the playlist.
|
||||||
|
* @param renderersFactory A {@link RenderersFactory} creating the renderers for which tracks are
|
||||||
|
* selected.
|
||||||
|
* @param drmSessionManager An optional {@link DrmSessionManager} used by the renderers created by
|
||||||
|
* {@code renderersFactory}.
|
||||||
|
* @param trackSelectorParameters {@link DefaultTrackSelector.Parameters} for selecting tracks for
|
||||||
|
* downloading.
|
||||||
|
* @return A {@link DownloadHelper} for HLS streams.
|
||||||
|
* @throws IllegalStateException If the HLS module is missing.
|
||||||
|
*/
|
||||||
|
public static DownloadHelper forHls(
|
||||||
|
Uri uri,
|
||||||
|
DataSource.Factory dataSourceFactory,
|
||||||
|
RenderersFactory renderersFactory,
|
||||||
|
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
|
||||||
|
DefaultTrackSelector.Parameters trackSelectorParameters) {
|
||||||
|
return new DownloadHelper(
|
||||||
|
DownloadAction.TYPE_HLS,
|
||||||
|
uri,
|
||||||
|
/* cacheKey= */ null,
|
||||||
|
createMediaSource(
|
||||||
|
uri, dataSourceFactory, HLS_FACTORY_CONSTRUCTOR, HLS_FACTORY_CREATE_METHOD),
|
||||||
|
trackSelectorParameters,
|
||||||
|
Util.getRendererCapabilities(renderersFactory, drmSessionManager));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a {@link DownloadHelper} for SmoothStreaming streams.
|
||||||
|
*
|
||||||
|
* @param uri A manifest {@link Uri}.
|
||||||
|
* @param dataSourceFactory A {@link DataSource.Factory} used to load the manifest.
|
||||||
|
* @param renderersFactory A {@link RenderersFactory} creating the renderers for which tracks are
|
||||||
|
* selected.
|
||||||
|
* @return A {@link DownloadHelper} for SmoothStreaming streams.
|
||||||
|
* @throws IllegalStateException If the SmoothStreaming module is missing.
|
||||||
|
*/
|
||||||
|
public static DownloadHelper forSmoothStreaming(
|
||||||
|
Uri uri, DataSource.Factory dataSourceFactory, RenderersFactory renderersFactory) {
|
||||||
|
return forSmoothStreaming(
|
||||||
|
uri,
|
||||||
|
dataSourceFactory,
|
||||||
|
renderersFactory,
|
||||||
|
/* drmSessionManager= */ null,
|
||||||
|
DEFAULT_TRACK_SELECTOR_PARAMETERS);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a {@link DownloadHelper} for SmoothStreaming streams.
|
||||||
|
*
|
||||||
|
* @param uri A manifest {@link Uri}.
|
||||||
|
* @param dataSourceFactory A {@link DataSource.Factory} used to load the manifest.
|
||||||
|
* @param renderersFactory A {@link RenderersFactory} creating the renderers for which tracks are
|
||||||
|
* selected.
|
||||||
|
* @param drmSessionManager An optional {@link DrmSessionManager} used by the renderers created by
|
||||||
|
* {@code renderersFactory}.
|
||||||
|
* @param trackSelectorParameters {@link DefaultTrackSelector.Parameters} for selecting tracks for
|
||||||
|
* downloading.
|
||||||
|
* @return A {@link DownloadHelper} for SmoothStreaming streams.
|
||||||
|
* @throws IllegalStateException If the SmoothStreaming module is missing.
|
||||||
|
*/
|
||||||
|
public static DownloadHelper forSmoothStreaming(
|
||||||
|
Uri uri,
|
||||||
|
DataSource.Factory dataSourceFactory,
|
||||||
|
RenderersFactory renderersFactory,
|
||||||
|
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
|
||||||
|
DefaultTrackSelector.Parameters trackSelectorParameters) {
|
||||||
|
return new DownloadHelper(
|
||||||
|
DownloadAction.TYPE_SS,
|
||||||
|
uri,
|
||||||
|
/* cacheKey= */ null,
|
||||||
|
createMediaSource(uri, dataSourceFactory, SS_FACTORY_CONSTRUCTOR, SS_FACTORY_CREATE_METHOD),
|
||||||
|
trackSelectorParameters,
|
||||||
|
Util.getRendererCapabilities(renderersFactory, drmSessionManager));
|
||||||
|
}
|
||||||
|
|
||||||
private final String downloadType;
|
private final String downloadType;
|
||||||
private final Uri uri;
|
private final Uri uri;
|
||||||
@Nullable private final String cacheKey;
|
@Nullable private final String cacheKey;
|
||||||
|
|
@ -131,10 +334,8 @@ public abstract class DownloadHelper {
|
||||||
* selection needs to be made.
|
* selection needs to be made.
|
||||||
* @param trackSelectorParameters {@link DefaultTrackSelector.Parameters} for selecting tracks for
|
* @param trackSelectorParameters {@link DefaultTrackSelector.Parameters} for selecting tracks for
|
||||||
* downloading.
|
* downloading.
|
||||||
* @param renderersFactory The {@link RenderersFactory} creating the renderers for which tracks
|
* @param rendererCapabilities The {@link RendererCapabilities} of the renderers for which tracks
|
||||||
* are selected, or null if no track selection needs to be made.
|
* are selected.
|
||||||
* @param drmSessionManager An optional {@link DrmSessionManager} used by the renderers created by
|
|
||||||
* {@code renderersFactory}.
|
|
||||||
*/
|
*/
|
||||||
public DownloadHelper(
|
public DownloadHelper(
|
||||||
String downloadType,
|
String downloadType,
|
||||||
|
|
@ -142,17 +343,13 @@ public abstract class DownloadHelper {
|
||||||
@Nullable String cacheKey,
|
@Nullable String cacheKey,
|
||||||
@Nullable MediaSource mediaSource,
|
@Nullable MediaSource mediaSource,
|
||||||
DefaultTrackSelector.Parameters trackSelectorParameters,
|
DefaultTrackSelector.Parameters trackSelectorParameters,
|
||||||
@Nullable RenderersFactory renderersFactory,
|
RendererCapabilities[] rendererCapabilities) {
|
||||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager) {
|
|
||||||
this.downloadType = downloadType;
|
this.downloadType = downloadType;
|
||||||
this.uri = uri;
|
this.uri = uri;
|
||||||
this.cacheKey = cacheKey;
|
this.cacheKey = cacheKey;
|
||||||
this.mediaSource = mediaSource;
|
this.mediaSource = mediaSource;
|
||||||
this.trackSelector = new DefaultTrackSelector(new DownloadTrackSelection.Factory());
|
this.trackSelector = new DefaultTrackSelector(new DownloadTrackSelection.Factory());
|
||||||
this.rendererCapabilities =
|
this.rendererCapabilities = rendererCapabilities;
|
||||||
renderersFactory == null
|
|
||||||
? new RendererCapabilities[0]
|
|
||||||
: Util.getRendererCapabilities(renderersFactory, drmSessionManager);
|
|
||||||
this.scratchSet = new SparseIntArray();
|
this.scratchSet = new SparseIntArray();
|
||||||
trackSelector.setParameters(trackSelectorParameters);
|
trackSelector.setParameters(trackSelectorParameters);
|
||||||
trackSelector.init(/* listener= */ () -> {}, new DummyBandwidthMeter());
|
trackSelector.init(/* listener= */ () -> {}, new DummyBandwidthMeter());
|
||||||
|
|
@ -166,7 +363,7 @@ public abstract class DownloadHelper {
|
||||||
* Looper}, in which case it will be called on the application's main thread.
|
* Looper}, in which case it will be called on the application's main thread.
|
||||||
* @throws IllegalStateException If the download helper has already been prepared.
|
* @throws IllegalStateException If the download helper has already been prepared.
|
||||||
*/
|
*/
|
||||||
public final void prepare(Callback callback) {
|
public void prepare(Callback callback) {
|
||||||
Assertions.checkState(this.callback == null);
|
Assertions.checkState(this.callback == null);
|
||||||
this.callback = callback;
|
this.callback = callback;
|
||||||
callbackHandler =
|
callbackHandler =
|
||||||
|
|
@ -179,7 +376,7 @@ public abstract class DownloadHelper {
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Releases the helper and all resources it is holding. */
|
/** Releases the helper and all resources it is holding. */
|
||||||
public final void release() {
|
public void release() {
|
||||||
if (mediaPreparer != null) {
|
if (mediaPreparer != null) {
|
||||||
mediaPreparer.release();
|
mediaPreparer.release();
|
||||||
}
|
}
|
||||||
|
|
@ -190,7 +387,7 @@ public abstract class DownloadHelper {
|
||||||
* preparation completes.
|
* preparation completes.
|
||||||
*/
|
*/
|
||||||
@Nullable
|
@Nullable
|
||||||
public final Object getManifest() {
|
public Object getManifest() {
|
||||||
if (mediaSource == null) {
|
if (mediaSource == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
@ -202,7 +399,7 @@ public abstract class DownloadHelper {
|
||||||
* Returns the number of periods for which media is available. Must not be called until after
|
* Returns the number of periods for which media is available. Must not be called until after
|
||||||
* preparation completes.
|
* preparation completes.
|
||||||
*/
|
*/
|
||||||
public final int getPeriodCount() {
|
public int getPeriodCount() {
|
||||||
if (mediaSource == null) {
|
if (mediaSource == null) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -220,7 +417,7 @@ public abstract class DownloadHelper {
|
||||||
* @return The track groups for the period. May be {@link TrackGroupArray#EMPTY} for single stream
|
* @return The track groups for the period. May be {@link TrackGroupArray#EMPTY} for single stream
|
||||||
* content.
|
* content.
|
||||||
*/
|
*/
|
||||||
public final TrackGroupArray getTrackGroups(int periodIndex) {
|
public TrackGroupArray getTrackGroups(int periodIndex) {
|
||||||
assertPreparedWithMedia();
|
assertPreparedWithMedia();
|
||||||
return trackGroupArrays[periodIndex];
|
return trackGroupArrays[periodIndex];
|
||||||
}
|
}
|
||||||
|
|
@ -232,7 +429,7 @@ public abstract class DownloadHelper {
|
||||||
* @param periodIndex The period index.
|
* @param periodIndex The period index.
|
||||||
* @return The {@link MappedTrackInfo} for the period.
|
* @return The {@link MappedTrackInfo} for the period.
|
||||||
*/
|
*/
|
||||||
public final MappedTrackInfo getMappedTrackInfo(int periodIndex) {
|
public MappedTrackInfo getMappedTrackInfo(int periodIndex) {
|
||||||
assertPreparedWithMedia();
|
assertPreparedWithMedia();
|
||||||
return mappedTrackInfos[periodIndex];
|
return mappedTrackInfos[periodIndex];
|
||||||
}
|
}
|
||||||
|
|
@ -245,7 +442,7 @@ public abstract class DownloadHelper {
|
||||||
* @param rendererIndex The renderer index.
|
* @param rendererIndex The renderer index.
|
||||||
* @return A list of selected {@link TrackSelection track selections}.
|
* @return A list of selected {@link TrackSelection track selections}.
|
||||||
*/
|
*/
|
||||||
public final List<TrackSelection> getTrackSelections(int periodIndex, int rendererIndex) {
|
public List<TrackSelection> getTrackSelections(int periodIndex, int rendererIndex) {
|
||||||
assertPreparedWithMedia();
|
assertPreparedWithMedia();
|
||||||
return immutableTrackSelectionsByPeriodAndRenderer[periodIndex][rendererIndex];
|
return immutableTrackSelectionsByPeriodAndRenderer[periodIndex][rendererIndex];
|
||||||
}
|
}
|
||||||
|
|
@ -256,7 +453,7 @@ public abstract class DownloadHelper {
|
||||||
*
|
*
|
||||||
* @param periodIndex The period index for which track selections are cleared.
|
* @param periodIndex The period index for which track selections are cleared.
|
||||||
*/
|
*/
|
||||||
public final void clearTrackSelections(int periodIndex) {
|
public void clearTrackSelections(int periodIndex) {
|
||||||
assertPreparedWithMedia();
|
assertPreparedWithMedia();
|
||||||
for (int i = 0; i < rendererCapabilities.length; i++) {
|
for (int i = 0; i < rendererCapabilities.length; i++) {
|
||||||
trackSelectionsByPeriodAndRenderer[periodIndex][i].clear();
|
trackSelectionsByPeriodAndRenderer[periodIndex][i].clear();
|
||||||
|
|
@ -271,7 +468,7 @@ public abstract class DownloadHelper {
|
||||||
* @param trackSelectorParameters The {@link DefaultTrackSelector.Parameters} to obtain the new
|
* @param trackSelectorParameters The {@link DefaultTrackSelector.Parameters} to obtain the new
|
||||||
* selection of tracks.
|
* selection of tracks.
|
||||||
*/
|
*/
|
||||||
public final void replaceTrackSelections(
|
public void replaceTrackSelections(
|
||||||
int periodIndex, DefaultTrackSelector.Parameters trackSelectorParameters) {
|
int periodIndex, DefaultTrackSelector.Parameters trackSelectorParameters) {
|
||||||
clearTrackSelections(periodIndex);
|
clearTrackSelections(periodIndex);
|
||||||
addTrackSelection(periodIndex, trackSelectorParameters);
|
addTrackSelection(periodIndex, trackSelectorParameters);
|
||||||
|
|
@ -285,7 +482,7 @@ public abstract class DownloadHelper {
|
||||||
* @param trackSelectorParameters The {@link DefaultTrackSelector.Parameters} to obtain the new
|
* @param trackSelectorParameters The {@link DefaultTrackSelector.Parameters} to obtain the new
|
||||||
* selection of tracks.
|
* selection of tracks.
|
||||||
*/
|
*/
|
||||||
public final void addTrackSelection(
|
public void addTrackSelection(
|
||||||
int periodIndex, DefaultTrackSelector.Parameters trackSelectorParameters) {
|
int periodIndex, DefaultTrackSelector.Parameters trackSelectorParameters) {
|
||||||
assertPreparedWithMedia();
|
assertPreparedWithMedia();
|
||||||
trackSelector.setParameters(trackSelectorParameters);
|
trackSelector.setParameters(trackSelectorParameters);
|
||||||
|
|
@ -299,7 +496,7 @@ public abstract class DownloadHelper {
|
||||||
* @param data Application provided data to store in {@link DownloadAction#data}.
|
* @param data Application provided data to store in {@link DownloadAction#data}.
|
||||||
* @return The built {@link DownloadAction}.
|
* @return The built {@link DownloadAction}.
|
||||||
*/
|
*/
|
||||||
public final DownloadAction getDownloadAction(@Nullable byte[] data) {
|
public DownloadAction getDownloadAction(@Nullable byte[] data) {
|
||||||
if (mediaSource == null) {
|
if (mediaSource == null) {
|
||||||
return DownloadAction.createDownloadAction(
|
return DownloadAction.createDownloadAction(
|
||||||
downloadType, uri, /* keys= */ Collections.emptyList(), cacheKey, data);
|
downloadType, uri, /* keys= */ Collections.emptyList(), cacheKey, data);
|
||||||
|
|
@ -324,7 +521,7 @@ public abstract class DownloadHelper {
|
||||||
*
|
*
|
||||||
* @return The built {@link DownloadAction}.
|
* @return The built {@link DownloadAction}.
|
||||||
*/
|
*/
|
||||||
public final DownloadAction getRemoveAction() {
|
public DownloadAction getRemoveAction() {
|
||||||
return DownloadAction.createRemoveAction(downloadType, uri, cacheKey);
|
return DownloadAction.createRemoveAction(downloadType, uri, cacheKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -452,6 +649,38 @@ public abstract class DownloadHelper {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static Pair<@NullableType Constructor<?>, @NullableType Method>
|
||||||
|
getMediaSourceFactoryMethods(String className) {
|
||||||
|
Constructor<?> constructor = null;
|
||||||
|
Method createMethod = null;
|
||||||
|
try {
|
||||||
|
// LINT.IfChange
|
||||||
|
Class<?> factoryClazz = Class.forName(className);
|
||||||
|
constructor = factoryClazz.getConstructor(DataSource.Factory.class);
|
||||||
|
createMethod = factoryClazz.getMethod("createMediaSource", Uri.class);
|
||||||
|
// LINT.ThenChange(../../../../../../../../proguard-rules.txt)
|
||||||
|
} catch (Exception e) {
|
||||||
|
// Expected if the app was built without the respective module.
|
||||||
|
}
|
||||||
|
return Pair.create(constructor, createMethod);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static MediaSource createMediaSource(
|
||||||
|
Uri uri,
|
||||||
|
DataSource.Factory dataSourceFactory,
|
||||||
|
@Nullable Constructor<?> factoryConstructor,
|
||||||
|
@Nullable Method createMediaSourceMethod) {
|
||||||
|
if (factoryConstructor == null || createMediaSourceMethod == null) {
|
||||||
|
throw new IllegalStateException("Module missing to create media source.");
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
Object factory = factoryConstructor.newInstance(dataSourceFactory);
|
||||||
|
return (MediaSource) Assertions.checkNotNull(createMediaSourceMethod.invoke(factory, uri));
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new IllegalStateException("Failed to instantiate media source.", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static final class MediaPreparer
|
private static final class MediaPreparer
|
||||||
implements MediaSource.SourceInfoRefreshListener, MediaPeriod.Callback, Handler.Callback {
|
implements MediaSource.SourceInfoRefreshListener, MediaPeriod.Callback, Handler.Callback {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,49 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2018 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package com.google.android.exoplayer2.offline;
|
|
||||||
|
|
||||||
import android.net.Uri;
|
|
||||||
import android.support.annotation.Nullable;
|
|
||||||
|
|
||||||
/** A {@link DownloadHelper} for progressive streams. */
|
|
||||||
public final class ProgressiveDownloadHelper extends DownloadHelper {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates download helper for progressive streams.
|
|
||||||
*
|
|
||||||
* @param uri The stream {@link Uri}.
|
|
||||||
*/
|
|
||||||
public ProgressiveDownloadHelper(Uri uri) {
|
|
||||||
this(uri, /* cacheKey= */ null);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates download helper for progressive streams.
|
|
||||||
*
|
|
||||||
* @param uri The stream {@link Uri}.
|
|
||||||
* @param cacheKey An optional cache key.
|
|
||||||
*/
|
|
||||||
public ProgressiveDownloadHelper(Uri uri, @Nullable String cacheKey) {
|
|
||||||
super(
|
|
||||||
DownloadAction.TYPE_PROGRESSIVE,
|
|
||||||
uri,
|
|
||||||
cacheKey,
|
|
||||||
/* mediaSource= */ null,
|
|
||||||
/* trackSelectorParameters= */ DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS,
|
|
||||||
/* renderersFactory= */ null,
|
|
||||||
/* drmSessionManager= */ null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -42,6 +42,7 @@ import com.google.android.exoplayer2.trackselection.TrackSelection;
|
||||||
import com.google.android.exoplayer2.upstream.Allocator;
|
import com.google.android.exoplayer2.upstream.Allocator;
|
||||||
import com.google.android.exoplayer2.util.ConditionVariable;
|
import com.google.android.exoplayer2.util.ConditionVariable;
|
||||||
import com.google.android.exoplayer2.util.MimeTypes;
|
import com.google.android.exoplayer2.util.MimeTypes;
|
||||||
|
import com.google.android.exoplayer2.util.Util;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
|
@ -93,7 +94,7 @@ public class DownloadHelperTest {
|
||||||
|
|
||||||
private Uri testUri;
|
private Uri testUri;
|
||||||
|
|
||||||
private FakeDownloadHelper downloadHelper;
|
private DownloadHelper downloadHelper;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
|
|
@ -106,7 +107,14 @@ public class DownloadHelperTest {
|
||||||
(handler, videoListener, audioListener, metadata, text, drm) ->
|
(handler, videoListener, audioListener, metadata, text, drm) ->
|
||||||
new Renderer[] {textRenderer, audioRenderer, videoRenderer};
|
new Renderer[] {textRenderer, audioRenderer, videoRenderer};
|
||||||
|
|
||||||
downloadHelper = new FakeDownloadHelper(testUri, renderersFactory);
|
downloadHelper =
|
||||||
|
new DownloadHelper(
|
||||||
|
TEST_DOWNLOAD_TYPE,
|
||||||
|
testUri,
|
||||||
|
TEST_CACHE_KEY,
|
||||||
|
new TestMediaSource(),
|
||||||
|
DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS,
|
||||||
|
Util.getRendererCapabilities(renderersFactory, /* drmSessionManager= */ null));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
@ -346,7 +354,7 @@ public class DownloadHelperTest {
|
||||||
assertThat(removeAction.isRemoveAction).isTrue();
|
assertThat(removeAction.isRemoveAction).isTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void prepareDownloadHelper(FakeDownloadHelper downloadHelper) throws Exception {
|
private static void prepareDownloadHelper(DownloadHelper downloadHelper) throws Exception {
|
||||||
AtomicReference<Exception> prepareException = new AtomicReference<>(null);
|
AtomicReference<Exception> prepareException = new AtomicReference<>(null);
|
||||||
ConditionVariable preparedCondition = new ConditionVariable();
|
ConditionVariable preparedCondition = new ConditionVariable();
|
||||||
downloadHelper.prepare(
|
downloadHelper.prepare(
|
||||||
|
|
@ -426,20 +434,6 @@ public class DownloadHelperTest {
|
||||||
assertThat(selectedTracksInGroup).isEqualTo(tracks);
|
assertThat(selectedTracksInGroup).isEqualTo(tracks);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final class FakeDownloadHelper extends DownloadHelper {
|
|
||||||
|
|
||||||
public FakeDownloadHelper(Uri testUri, RenderersFactory renderersFactory) {
|
|
||||||
super(
|
|
||||||
TEST_DOWNLOAD_TYPE,
|
|
||||||
testUri,
|
|
||||||
TEST_CACHE_KEY,
|
|
||||||
new TestMediaSource(),
|
|
||||||
DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS,
|
|
||||||
renderersFactory,
|
|
||||||
/* drmSessionManager= */ null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final class TestMediaSource extends FakeMediaSource {
|
private static final class TestMediaSource extends FakeMediaSource {
|
||||||
|
|
||||||
public TestMediaSource() {
|
public TestMediaSource() {
|
||||||
|
|
|
||||||
|
|
@ -1,80 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2018 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package com.google.android.exoplayer2.source.dash.offline;
|
|
||||||
|
|
||||||
import android.net.Uri;
|
|
||||||
import android.support.annotation.Nullable;
|
|
||||||
import com.google.android.exoplayer2.RenderersFactory;
|
|
||||||
import com.google.android.exoplayer2.drm.DrmSessionManager;
|
|
||||||
import com.google.android.exoplayer2.drm.FrameworkMediaCrypto;
|
|
||||||
import com.google.android.exoplayer2.offline.DownloadAction;
|
|
||||||
import com.google.android.exoplayer2.offline.DownloadHelper;
|
|
||||||
import com.google.android.exoplayer2.source.dash.DashMediaSource;
|
|
||||||
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
|
|
||||||
import com.google.android.exoplayer2.upstream.DataSource;
|
|
||||||
|
|
||||||
/** A {@link DownloadHelper} for DASH streams. */
|
|
||||||
public final class DashDownloadHelper extends DownloadHelper {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a DASH download helper.
|
|
||||||
*
|
|
||||||
* <p>The helper uses {@link DownloadHelper#DEFAULT_TRACK_SELECTOR_PARAMETERS} for track selection
|
|
||||||
* and does not support drm protected content.
|
|
||||||
*
|
|
||||||
* @param uri A manifest {@link Uri}.
|
|
||||||
* @param manifestDataSourceFactory A {@link DataSource.Factory} used to load the manifest.
|
|
||||||
* @param renderersFactory The {@link RenderersFactory} creating the renderers for which tracks
|
|
||||||
* are selected.
|
|
||||||
*/
|
|
||||||
public DashDownloadHelper(
|
|
||||||
Uri uri, DataSource.Factory manifestDataSourceFactory, RenderersFactory renderersFactory) {
|
|
||||||
this(
|
|
||||||
uri,
|
|
||||||
manifestDataSourceFactory,
|
|
||||||
DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS,
|
|
||||||
renderersFactory,
|
|
||||||
/* drmSessionManager= */ null);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a DASH download helper.
|
|
||||||
*
|
|
||||||
* @param uri A manifest {@link Uri}.
|
|
||||||
* @param manifestDataSourceFactory A {@link DataSource.Factory} used to load the manifest.
|
|
||||||
* @param trackSelectorParameters {@link DefaultTrackSelector.Parameters} for selecting tracks for
|
|
||||||
* downloading.
|
|
||||||
* @param renderersFactory The {@link RenderersFactory} creating the renderers for which tracks
|
|
||||||
* are selected.
|
|
||||||
* @param drmSessionManager An optional {@link DrmSessionManager} used by the renderers created by
|
|
||||||
* {@code renderersFactory}.
|
|
||||||
*/
|
|
||||||
public DashDownloadHelper(
|
|
||||||
Uri uri,
|
|
||||||
DataSource.Factory manifestDataSourceFactory,
|
|
||||||
DefaultTrackSelector.Parameters trackSelectorParameters,
|
|
||||||
RenderersFactory renderersFactory,
|
|
||||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager) {
|
|
||||||
super(
|
|
||||||
DownloadAction.TYPE_DASH,
|
|
||||||
uri,
|
|
||||||
/* cacheKey= */ null,
|
|
||||||
new DashMediaSource.Factory(manifestDataSourceFactory).createMediaSource(uri),
|
|
||||||
trackSelectorParameters,
|
|
||||||
renderersFactory,
|
|
||||||
drmSessionManager);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -0,0 +1,43 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2018 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.google.android.exoplayer2.source.dash.offline;
|
||||||
|
|
||||||
|
import android.net.Uri;
|
||||||
|
import com.google.android.exoplayer2.Renderer;
|
||||||
|
import com.google.android.exoplayer2.offline.DownloadHelper;
|
||||||
|
import com.google.android.exoplayer2.testutil.FakeDataSource;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.robolectric.RobolectricTestRunner;
|
||||||
|
|
||||||
|
/** Unit test to verify creation of a DASH {@link DownloadHelper}. */
|
||||||
|
@RunWith(RobolectricTestRunner.class)
|
||||||
|
public final class DownloadHelperTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void staticDownloadHelperForDash_doesNotThrow() {
|
||||||
|
DownloadHelper.forDash(
|
||||||
|
Uri.parse("http://uri"),
|
||||||
|
new FakeDataSource.Factory(),
|
||||||
|
(handler, videoListener, audioListener, text, metadata, drm) -> new Renderer[0]);
|
||||||
|
DownloadHelper.forDash(
|
||||||
|
Uri.parse("http://uri"),
|
||||||
|
new FakeDataSource.Factory(),
|
||||||
|
(handler, videoListener, audioListener, text, metadata, drm) -> new Renderer[0],
|
||||||
|
/* drmSessionManager= */ null,
|
||||||
|
DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,82 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2018 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package com.google.android.exoplayer2.source.hls.offline;
|
|
||||||
|
|
||||||
import android.net.Uri;
|
|
||||||
import android.support.annotation.Nullable;
|
|
||||||
import com.google.android.exoplayer2.RenderersFactory;
|
|
||||||
import com.google.android.exoplayer2.drm.DrmSessionManager;
|
|
||||||
import com.google.android.exoplayer2.drm.FrameworkMediaCrypto;
|
|
||||||
import com.google.android.exoplayer2.offline.DownloadAction;
|
|
||||||
import com.google.android.exoplayer2.offline.DownloadHelper;
|
|
||||||
import com.google.android.exoplayer2.source.hls.HlsMediaSource;
|
|
||||||
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
|
|
||||||
import com.google.android.exoplayer2.upstream.DataSource;
|
|
||||||
|
|
||||||
/** A {@link DownloadHelper} for HLS streams. */
|
|
||||||
public final class HlsDownloadHelper extends DownloadHelper {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a HLS download helper.
|
|
||||||
*
|
|
||||||
* <p>The helper uses {@link DownloadHelper#DEFAULT_TRACK_SELECTOR_PARAMETERS} for track selection
|
|
||||||
* and does not support drm protected content.
|
|
||||||
*
|
|
||||||
* @param uri A manifest {@link Uri}.
|
|
||||||
* @param manifestDataSourceFactory A {@link DataSource.Factory} used to load the manifest.
|
|
||||||
* @param renderersFactory The {@link RenderersFactory} creating the renderers for which tracks
|
|
||||||
* are selected.
|
|
||||||
*/
|
|
||||||
public HlsDownloadHelper(
|
|
||||||
Uri uri, DataSource.Factory manifestDataSourceFactory, RenderersFactory renderersFactory) {
|
|
||||||
this(
|
|
||||||
uri,
|
|
||||||
manifestDataSourceFactory,
|
|
||||||
DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS,
|
|
||||||
renderersFactory,
|
|
||||||
/* drmSessionManager= */ null);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a HLS download helper.
|
|
||||||
*
|
|
||||||
* @param uri A manifest {@link Uri}.
|
|
||||||
* @param manifestDataSourceFactory A {@link DataSource.Factory} used to load the manifest.
|
|
||||||
* @param trackSelectorParameters {@link DefaultTrackSelector.Parameters} for selecting tracks for
|
|
||||||
* downloading.
|
|
||||||
* @param renderersFactory The {@link RenderersFactory} creating the renderers for which tracks
|
|
||||||
* are selected.
|
|
||||||
* @param drmSessionManager An optional {@link DrmSessionManager} used by the renderers created by
|
|
||||||
* {@code renderersFactory}.
|
|
||||||
*/
|
|
||||||
public HlsDownloadHelper(
|
|
||||||
Uri uri,
|
|
||||||
DataSource.Factory manifestDataSourceFactory,
|
|
||||||
DefaultTrackSelector.Parameters trackSelectorParameters,
|
|
||||||
RenderersFactory renderersFactory,
|
|
||||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager) {
|
|
||||||
super(
|
|
||||||
DownloadAction.TYPE_HLS,
|
|
||||||
uri,
|
|
||||||
/* cacheKey= */ null,
|
|
||||||
new HlsMediaSource.Factory(manifestDataSourceFactory)
|
|
||||||
.setAllowChunklessPreparation(true)
|
|
||||||
.createMediaSource(uri),
|
|
||||||
trackSelectorParameters,
|
|
||||||
renderersFactory,
|
|
||||||
drmSessionManager);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -0,0 +1,43 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2018 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.google.android.exoplayer2.source.hls.offline;
|
||||||
|
|
||||||
|
import android.net.Uri;
|
||||||
|
import com.google.android.exoplayer2.Renderer;
|
||||||
|
import com.google.android.exoplayer2.offline.DownloadHelper;
|
||||||
|
import com.google.android.exoplayer2.testutil.FakeDataSource;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.robolectric.RobolectricTestRunner;
|
||||||
|
|
||||||
|
/** Unit test to verify creation of a HLS {@link DownloadHelper}. */
|
||||||
|
@RunWith(RobolectricTestRunner.class)
|
||||||
|
public final class DownloadHelperTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void staticDownloadHelperForHls_doesNotThrow() {
|
||||||
|
DownloadHelper.forHls(
|
||||||
|
Uri.parse("http://uri"),
|
||||||
|
new FakeDataSource.Factory(),
|
||||||
|
(handler, videoListener, audioListener, text, metadata, drm) -> new Renderer[0]);
|
||||||
|
DownloadHelper.forHls(
|
||||||
|
Uri.parse("http://uri"),
|
||||||
|
new FakeDataSource.Factory(),
|
||||||
|
(handler, videoListener, audioListener, text, metadata, drm) -> new Renderer[0],
|
||||||
|
/* drmSessionManager= */ null,
|
||||||
|
DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,80 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2018 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package com.google.android.exoplayer2.source.smoothstreaming.offline;
|
|
||||||
|
|
||||||
import android.net.Uri;
|
|
||||||
import android.support.annotation.Nullable;
|
|
||||||
import com.google.android.exoplayer2.RenderersFactory;
|
|
||||||
import com.google.android.exoplayer2.drm.DrmSessionManager;
|
|
||||||
import com.google.android.exoplayer2.drm.FrameworkMediaCrypto;
|
|
||||||
import com.google.android.exoplayer2.offline.DownloadAction;
|
|
||||||
import com.google.android.exoplayer2.offline.DownloadHelper;
|
|
||||||
import com.google.android.exoplayer2.source.smoothstreaming.SsMediaSource;
|
|
||||||
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
|
|
||||||
import com.google.android.exoplayer2.upstream.DataSource;
|
|
||||||
|
|
||||||
/** A {@link DownloadHelper} for SmoothStreaming streams. */
|
|
||||||
public final class SsDownloadHelper extends DownloadHelper {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a SmoothStreaming download helper.
|
|
||||||
*
|
|
||||||
* <p>The helper uses {@link DownloadHelper#DEFAULT_TRACK_SELECTOR_PARAMETERS} for track selection
|
|
||||||
* and does not support drm protected content.
|
|
||||||
*
|
|
||||||
* @param uri A manifest {@link Uri}.
|
|
||||||
* @param manifestDataSourceFactory A {@link DataSource.Factory} used to load the manifest.
|
|
||||||
* @param renderersFactory The {@link RenderersFactory} creating the renderers for which tracks
|
|
||||||
* are selected.
|
|
||||||
*/
|
|
||||||
public SsDownloadHelper(
|
|
||||||
Uri uri, DataSource.Factory manifestDataSourceFactory, RenderersFactory renderersFactory) {
|
|
||||||
this(
|
|
||||||
uri,
|
|
||||||
manifestDataSourceFactory,
|
|
||||||
DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS,
|
|
||||||
renderersFactory,
|
|
||||||
/* drmSessionManager= */ null);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a SmoothStreaming download helper.
|
|
||||||
*
|
|
||||||
* @param uri A manifest {@link Uri}.
|
|
||||||
* @param manifestDataSourceFactory A {@link DataSource.Factory} used to load the manifest.
|
|
||||||
* @param trackSelectorParameters {@link DefaultTrackSelector.Parameters} for selecting tracks for
|
|
||||||
* downloading.
|
|
||||||
* @param renderersFactory The {@link RenderersFactory} creating the renderers for which tracks
|
|
||||||
* are selected.
|
|
||||||
* @param drmSessionManager An optional {@link DrmSessionManager} used by the renderers created by
|
|
||||||
* {@code renderersFactory}.
|
|
||||||
*/
|
|
||||||
public SsDownloadHelper(
|
|
||||||
Uri uri,
|
|
||||||
DataSource.Factory manifestDataSourceFactory,
|
|
||||||
DefaultTrackSelector.Parameters trackSelectorParameters,
|
|
||||||
RenderersFactory renderersFactory,
|
|
||||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager) {
|
|
||||||
super(
|
|
||||||
DownloadAction.TYPE_SS,
|
|
||||||
uri,
|
|
||||||
/* cacheKey= */ null,
|
|
||||||
new SsMediaSource.Factory(manifestDataSourceFactory).createMediaSource(uri),
|
|
||||||
trackSelectorParameters,
|
|
||||||
renderersFactory,
|
|
||||||
drmSessionManager);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -0,0 +1,43 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2018 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.google.android.exoplayer2.source.smoothstreaming.offline;
|
||||||
|
|
||||||
|
import android.net.Uri;
|
||||||
|
import com.google.android.exoplayer2.Renderer;
|
||||||
|
import com.google.android.exoplayer2.offline.DownloadHelper;
|
||||||
|
import com.google.android.exoplayer2.testutil.FakeDataSource;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.robolectric.RobolectricTestRunner;
|
||||||
|
|
||||||
|
/** Unit test to verify creation of a SmoothStreaming {@link DownloadHelper}. */
|
||||||
|
@RunWith(RobolectricTestRunner.class)
|
||||||
|
public final class DownloadHelperTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void staticDownloadHelperForSmoothStreaming_doesNotThrow() {
|
||||||
|
DownloadHelper.forSmoothStreaming(
|
||||||
|
Uri.parse("http://uri"),
|
||||||
|
new FakeDataSource.Factory(),
|
||||||
|
(handler, videoListener, audioListener, text, metadata, drm) -> new Renderer[0]);
|
||||||
|
DownloadHelper.forSmoothStreaming(
|
||||||
|
Uri.parse("http://uri"),
|
||||||
|
new FakeDataSource.Factory(),
|
||||||
|
(handler, videoListener, audioListener, text, metadata, drm) -> new Renderer[0],
|
||||||
|
/* drmSessionManager= */ null,
|
||||||
|
DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS);
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue