Default viewport constraints to match primary display

PiperOrigin-RevId: 260479923
This commit is contained in:
olly 2019-07-29 13:41:48 +01:00 committed by Oliver Woodman
parent 7703676c87
commit d77d661e52
19 changed files with 259 additions and 131 deletions

View File

@ -2,6 +2,8 @@
### dev-v2 (not yet released) ### ### dev-v2 (not yet released) ###
* Update `DefaultTrackSelector` to apply a viewport constraint for the default
display by default.
* Add `PlaybackStatsListener` to collect `PlaybackStats` for playbacks analysis * Add `PlaybackStatsListener` to collect `PlaybackStats` for playbacks analysis
and analytics reporting (TODO: link to developer guide page/blog post). and analytics reporting (TODO: link to developer guide page/blog post).
* Add basic DRM support to the Cast demo app. * Add basic DRM support to the Cast demo app.

View File

@ -21,13 +21,11 @@ import androidx.annotation.Nullable;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.View; import android.view.View;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.DefaultRenderersFactory;
import com.google.android.exoplayer2.ExoPlayerFactory; import com.google.android.exoplayer2.ExoPlayerFactory;
import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Player;
import com.google.android.exoplayer2.Player.DiscontinuityReason; import com.google.android.exoplayer2.Player.DiscontinuityReason;
import com.google.android.exoplayer2.Player.EventListener; import com.google.android.exoplayer2.Player.EventListener;
import com.google.android.exoplayer2.Player.TimelineChangeReason; import com.google.android.exoplayer2.Player.TimelineChangeReason;
import com.google.android.exoplayer2.RenderersFactory;
import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.SimpleExoPlayer;
import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.Timeline;
import com.google.android.exoplayer2.Timeline.Period; import com.google.android.exoplayer2.Timeline.Period;
@ -40,7 +38,6 @@ import com.google.android.exoplayer2.source.ProgressiveMediaSource;
import com.google.android.exoplayer2.source.dash.DashMediaSource; import com.google.android.exoplayer2.source.dash.DashMediaSource;
import com.google.android.exoplayer2.source.hls.HlsMediaSource; import com.google.android.exoplayer2.source.hls.HlsMediaSource;
import com.google.android.exoplayer2.source.smoothstreaming.SsMediaSource; import com.google.android.exoplayer2.source.smoothstreaming.SsMediaSource;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
import com.google.android.exoplayer2.ui.PlayerControlView; import com.google.android.exoplayer2.ui.PlayerControlView;
import com.google.android.exoplayer2.ui.PlayerView; import com.google.android.exoplayer2.ui.PlayerView;
import com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory; import com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory;
@ -99,9 +96,7 @@ import org.json.JSONObject;
currentItemIndex = C.INDEX_UNSET; currentItemIndex = C.INDEX_UNSET;
concatenatingMediaSource = new ConcatenatingMediaSource(); concatenatingMediaSource = new ConcatenatingMediaSource();
DefaultTrackSelector trackSelector = new DefaultTrackSelector(); exoPlayer = ExoPlayerFactory.newSimpleInstance(context);
RenderersFactory renderersFactory = new DefaultRenderersFactory(context);
exoPlayer = ExoPlayerFactory.newSimpleInstance(context, renderersFactory, trackSelector);
exoPlayer.addListener(this); exoPlayer.addListener(this);
localPlayerView.setPlayer(exoPlayer); localPlayerView.setPlayer(exoPlayer);

View File

@ -35,7 +35,6 @@ import com.google.android.exoplayer2.source.TrackGroupArray;
import com.google.android.exoplayer2.source.dash.DashMediaSource; import com.google.android.exoplayer2.source.dash.DashMediaSource;
import com.google.android.exoplayer2.source.hls.HlsMediaSource; import com.google.android.exoplayer2.source.hls.HlsMediaSource;
import com.google.android.exoplayer2.source.smoothstreaming.SsMediaSource; import com.google.android.exoplayer2.source.smoothstreaming.SsMediaSource;
import com.google.android.exoplayer2.trackselection.AdaptiveTrackSelection;
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.TrackSelectionArray; import com.google.android.exoplayer2.trackselection.TrackSelectionArray;
@ -135,7 +134,7 @@ public class PlayerActivity extends GvrPlayerActivity implements PlaybackPrepare
DefaultRenderersFactory renderersFactory = new DefaultRenderersFactory(this); DefaultRenderersFactory renderersFactory = new DefaultRenderersFactory(this);
trackSelector = new DefaultTrackSelector(new AdaptiveTrackSelection.Factory()); trackSelector = new DefaultTrackSelector(/* context= */ this);
lastSeenTrackGroupArray = null; lastSeenTrackGroupArray = null;
player = player =

View File

@ -30,6 +30,7 @@ import com.google.android.exoplayer2.offline.DownloadIndex;
import com.google.android.exoplayer2.offline.DownloadManager; import com.google.android.exoplayer2.offline.DownloadManager;
import com.google.android.exoplayer2.offline.DownloadRequest; import com.google.android.exoplayer2.offline.DownloadRequest;
import com.google.android.exoplayer2.offline.DownloadService; import com.google.android.exoplayer2.offline.DownloadService;
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.upstream.DataSource; import com.google.android.exoplayer2.upstream.DataSource;
import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.Log;
@ -55,6 +56,7 @@ public class DownloadTracker {
private final CopyOnWriteArraySet<Listener> listeners; private final CopyOnWriteArraySet<Listener> listeners;
private final HashMap<Uri, Download> downloads; private final HashMap<Uri, Download> downloads;
private final DownloadIndex downloadIndex; private final DownloadIndex downloadIndex;
private final DefaultTrackSelector.Parameters trackSelectorParameters;
@Nullable private StartDownloadDialogHelper startDownloadDialogHelper; @Nullable private StartDownloadDialogHelper startDownloadDialogHelper;
@ -65,6 +67,7 @@ public class DownloadTracker {
listeners = new CopyOnWriteArraySet<>(); listeners = new CopyOnWriteArraySet<>();
downloads = new HashMap<>(); downloads = new HashMap<>();
downloadIndex = downloadManager.getDownloadIndex(); downloadIndex = downloadManager.getDownloadIndex();
trackSelectorParameters = DownloadHelper.getDefaultTrackSelectorParameters(context);
downloadManager.addListener(new DownloadManagerListener()); downloadManager.addListener(new DownloadManagerListener());
loadDownloads(); loadDownloads();
} }
@ -123,13 +126,13 @@ public class DownloadTracker {
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 DownloadHelper.forDash(uri, dataSourceFactory, renderersFactory); return DownloadHelper.forDash(context, uri, dataSourceFactory, renderersFactory);
case C.TYPE_SS: case C.TYPE_SS:
return DownloadHelper.forSmoothStreaming(uri, dataSourceFactory, renderersFactory); return DownloadHelper.forSmoothStreaming(context, uri, dataSourceFactory, renderersFactory);
case C.TYPE_HLS: case C.TYPE_HLS:
return DownloadHelper.forHls(uri, dataSourceFactory, renderersFactory); return DownloadHelper.forHls(context, uri, dataSourceFactory, renderersFactory);
case C.TYPE_OTHER: case C.TYPE_OTHER:
return DownloadHelper.forProgressive(uri); return DownloadHelper.forProgressive(context, uri);
default: default:
throw new IllegalStateException("Unsupported type: " + type); throw new IllegalStateException("Unsupported type: " + type);
} }
@ -202,7 +205,7 @@ public class DownloadTracker {
TrackSelectionDialog.createForMappedTrackInfoAndParameters( TrackSelectionDialog.createForMappedTrackInfoAndParameters(
/* titleId= */ R.string.exo_download_description, /* titleId= */ R.string.exo_download_description,
mappedTrackInfo, mappedTrackInfo,
/* initialParameters= */ DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS, trackSelectorParameters,
/* allowAdaptiveSelections =*/ false, /* allowAdaptiveSelections =*/ false,
/* allowMultipleOverrides= */ true, /* allowMultipleOverrides= */ true,
/* onClickListener= */ this, /* onClickListener= */ this,
@ -212,9 +215,7 @@ public class DownloadTracker {
@Override @Override
public void onPrepareError(DownloadHelper helper, IOException e) { public void onPrepareError(DownloadHelper helper, IOException e) {
Toast.makeText( Toast.makeText(context, R.string.download_start_error, Toast.LENGTH_LONG).show();
context.getApplicationContext(), R.string.download_start_error, Toast.LENGTH_LONG)
.show();
Log.e(TAG, "Failed to start download", e); Log.e(TAG, "Failed to start download", e);
} }
@ -229,7 +230,7 @@ public class DownloadTracker {
downloadHelper.addTrackSelectionForSingleRenderer( downloadHelper.addTrackSelectionForSingleRenderer(
periodIndex, periodIndex,
/* rendererIndex= */ i, /* rendererIndex= */ i,
DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS, trackSelectorParameters,
trackSelectionDialog.getOverrides(/* rendererIndex= */ i)); trackSelectionDialog.getOverrides(/* rendererIndex= */ i));
} }
} }

View File

@ -195,7 +195,7 @@ public class PlayerActivity extends AppCompatActivity
startWindow = savedInstanceState.getInt(KEY_WINDOW); startWindow = savedInstanceState.getInt(KEY_WINDOW);
startPosition = savedInstanceState.getLong(KEY_POSITION); startPosition = savedInstanceState.getLong(KEY_POSITION);
} else { } else {
trackSelectorParameters = new DefaultTrackSelector.ParametersBuilder().build(); trackSelectorParameters = DefaultTrackSelector.Parameters.getDefaults(/* context= */ this);
clearStartPosition(); clearStartPosition();
} }
} }
@ -411,7 +411,7 @@ public class PlayerActivity extends AppCompatActivity
RenderersFactory renderersFactory = RenderersFactory renderersFactory =
((DemoApplication) getApplication()).buildRenderersFactory(preferExtensionDecoders); ((DemoApplication) getApplication()).buildRenderersFactory(preferExtensionDecoders);
trackSelector = new DefaultTrackSelector(trackSelectionFactory); trackSelector = new DefaultTrackSelector(/* context= */ this, trackSelectionFactory);
trackSelector.setParameters(trackSelectorParameters); trackSelector.setParameters(trackSelectorParameters);
lastSeenTrackGroupArray = null; lastSeenTrackGroupArray = null;

View File

@ -82,7 +82,7 @@ public class FlacPlaybackTest {
public void run() { public void run() {
Looper.prepare(); Looper.prepare();
LibflacAudioRenderer audioRenderer = new LibflacAudioRenderer(); LibflacAudioRenderer audioRenderer = new LibflacAudioRenderer();
DefaultTrackSelector trackSelector = new DefaultTrackSelector(); DefaultTrackSelector trackSelector = new DefaultTrackSelector(context);
player = ExoPlayerFactory.newInstance(context, new Renderer[] {audioRenderer}, trackSelector); player = ExoPlayerFactory.newInstance(context, new Renderer[] {audioRenderer}, trackSelector);
player.addListener(this); player.addListener(this);
MediaSource mediaSource = MediaSource mediaSource =

View File

@ -82,7 +82,7 @@ public class OpusPlaybackTest {
public void run() { public void run() {
Looper.prepare(); Looper.prepare();
LibopusAudioRenderer audioRenderer = new LibopusAudioRenderer(); LibopusAudioRenderer audioRenderer = new LibopusAudioRenderer();
DefaultTrackSelector trackSelector = new DefaultTrackSelector(); DefaultTrackSelector trackSelector = new DefaultTrackSelector(context);
player = ExoPlayerFactory.newInstance(context, new Renderer[] {audioRenderer}, trackSelector); player = ExoPlayerFactory.newInstance(context, new Renderer[] {audioRenderer}, trackSelector);
player.addListener(this); player.addListener(this);
MediaSource mediaSource = MediaSource mediaSource =

View File

@ -115,7 +115,7 @@ public class VpxPlaybackTest {
public void run() { public void run() {
Looper.prepare(); Looper.prepare();
LibvpxVideoRenderer videoRenderer = new LibvpxVideoRenderer(0); LibvpxVideoRenderer videoRenderer = new LibvpxVideoRenderer(0);
DefaultTrackSelector trackSelector = new DefaultTrackSelector(); DefaultTrackSelector trackSelector = new DefaultTrackSelector(context);
player = ExoPlayerFactory.newInstance(context, new Renderer[] {videoRenderer}, trackSelector); player = ExoPlayerFactory.newInstance(context, new Renderer[] {videoRenderer}, trackSelector);
player.addListener(this); player.addListener(this);
MediaSource mediaSource = MediaSource mediaSource =

View File

@ -102,7 +102,7 @@ public final class ExoPlayerFactory {
* @param context A {@link Context}. * @param context A {@link Context}.
*/ */
public static SimpleExoPlayer newSimpleInstance(Context context) { public static SimpleExoPlayer newSimpleInstance(Context context) {
return newSimpleInstance(context, new DefaultTrackSelector()); return newSimpleInstance(context, new DefaultTrackSelector(context));
} }
/** /**

View File

@ -15,6 +15,7 @@
*/ */
package com.google.android.exoplayer2.offline; package com.google.android.exoplayer2.offline;
import android.content.Context;
import android.net.Uri; import android.net.Uri;
import android.os.Handler; import android.os.Handler;
import android.os.HandlerThread; import android.os.HandlerThread;
@ -82,12 +83,25 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
*/ */
public final class DownloadHelper { public final class DownloadHelper {
/** Default track selection parameters for downloading, but without any viewport constraints. */
public static final Parameters DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT =
Parameters.DEFAULT_WITHOUT_VIEWPORT.buildUpon().setForceHighestSupportedBitrate(true).build();
/** /**
* The default parameters used for track selection for downloading. This default selects the * @deprecated This instance does not have viewport constraints configured for the primary
* highest bitrate audio and video tracks which are supported by the renderers. * display. Use {@link #getDefaultTrackSelectorParameters(Context)} instead.
*/ */
@Deprecated
public static final DefaultTrackSelector.Parameters DEFAULT_TRACK_SELECTOR_PARAMETERS = public static final DefaultTrackSelector.Parameters DEFAULT_TRACK_SELECTOR_PARAMETERS =
new DefaultTrackSelector.ParametersBuilder().setForceHighestSupportedBitrate(true).build(); DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT;
/** Returns the default parameters used for track selection for downloading. */
public static DefaultTrackSelector.Parameters getDefaultTrackSelectorParameters(Context context) {
return Parameters.getDefaults(context)
.buildUpon()
.setForceHighestSupportedBitrate(true)
.build();
}
/** A callback to be notified when the {@link DownloadHelper} is prepared. */ /** A callback to be notified when the {@link DownloadHelper} is prepared. */
public interface Callback { public interface Callback {
@ -120,12 +134,9 @@ public final class DownloadHelper {
private static final Constructor<? extends MediaSourceFactory> HLS_FACTORY_CONSTRUCTOR = private static final Constructor<? extends MediaSourceFactory> HLS_FACTORY_CONSTRUCTOR =
getConstructor("com.google.android.exoplayer2.source.hls.HlsMediaSource$Factory"); getConstructor("com.google.android.exoplayer2.source.hls.HlsMediaSource$Factory");
/** /** @deprecated Use {@link #forProgressive(Context, Uri)} */
* Creates a {@link DownloadHelper} for progressive streams. @Deprecated
* @SuppressWarnings("deprecation")
* @param uri A stream {@link Uri}.
* @return A {@link DownloadHelper} for progressive streams.
*/
public static DownloadHelper forProgressive(Uri uri) { public static DownloadHelper forProgressive(Uri uri) {
return forProgressive(uri, /* cacheKey= */ null); return forProgressive(uri, /* cacheKey= */ null);
} }
@ -133,23 +144,60 @@ public final class DownloadHelper {
/** /**
* Creates a {@link DownloadHelper} for progressive streams. * Creates a {@link DownloadHelper} for progressive streams.
* *
* @param context Any {@link Context}.
* @param uri A stream {@link Uri}. * @param uri A stream {@link Uri}.
* @param cacheKey An optional cache key.
* @return A {@link DownloadHelper} for progressive streams. * @return A {@link DownloadHelper} for progressive streams.
*/ */
public static DownloadHelper forProgressive(Context context, Uri uri) {
return forProgressive(context, uri, /* cacheKey= */ null);
}
/** @deprecated Use {@link #forProgressive(Context, Uri, String)} */
@Deprecated
public static DownloadHelper forProgressive(Uri uri, @Nullable String cacheKey) { public static DownloadHelper forProgressive(Uri uri, @Nullable String cacheKey) {
return new DownloadHelper( return new DownloadHelper(
DownloadRequest.TYPE_PROGRESSIVE, DownloadRequest.TYPE_PROGRESSIVE,
uri, uri,
cacheKey, cacheKey,
/* mediaSource= */ null, /* mediaSource= */ null,
DEFAULT_TRACK_SELECTOR_PARAMETERS, DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT,
/* rendererCapabilities= */ new RendererCapabilities[0]); /* rendererCapabilities= */ new RendererCapabilities[0]);
} }
/**
* Creates a {@link DownloadHelper} for progressive streams.
*
* @param context Any {@link Context}.
* @param uri A stream {@link Uri}.
* @param cacheKey An optional cache key.
* @return A {@link DownloadHelper} for progressive streams.
*/
public static DownloadHelper forProgressive(Context context, Uri uri, @Nullable String cacheKey) {
return new DownloadHelper(
DownloadRequest.TYPE_PROGRESSIVE,
uri,
cacheKey,
/* mediaSource= */ null,
getDefaultTrackSelectorParameters(context),
/* rendererCapabilities= */ new RendererCapabilities[0]);
}
/** @deprecated Use {@link #forDash(Context, Uri, Factory, RenderersFactory)} */
@Deprecated
public static DownloadHelper forDash(
Uri uri, DataSource.Factory dataSourceFactory, RenderersFactory renderersFactory) {
return forDash(
uri,
dataSourceFactory,
renderersFactory,
/* drmSessionManager= */ null,
DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT);
}
/** /**
* Creates a {@link DownloadHelper} for DASH streams. * Creates a {@link DownloadHelper} for DASH streams.
* *
* @param context Any {@link Context}.
* @param uri A manifest {@link Uri}. * @param uri A manifest {@link Uri}.
* @param dataSourceFactory A {@link DataSource.Factory} used to load the manifest. * @param dataSourceFactory A {@link DataSource.Factory} used to load the manifest.
* @param renderersFactory A {@link RenderersFactory} creating the renderers for which tracks are * @param renderersFactory A {@link RenderersFactory} creating the renderers for which tracks are
@ -158,13 +206,16 @@ public final class DownloadHelper {
* @throws IllegalStateException If the DASH module is missing. * @throws IllegalStateException If the DASH module is missing.
*/ */
public static DownloadHelper forDash( public static DownloadHelper forDash(
Uri uri, DataSource.Factory dataSourceFactory, RenderersFactory renderersFactory) { Context context,
Uri uri,
DataSource.Factory dataSourceFactory,
RenderersFactory renderersFactory) {
return forDash( return forDash(
uri, uri,
dataSourceFactory, dataSourceFactory,
renderersFactory, renderersFactory,
/* drmSessionManager= */ null, /* drmSessionManager= */ null,
DEFAULT_TRACK_SELECTOR_PARAMETERS); getDefaultTrackSelectorParameters(context));
} }
/** /**
@ -197,9 +248,22 @@ public final class DownloadHelper {
Util.getRendererCapabilities(renderersFactory, drmSessionManager)); Util.getRendererCapabilities(renderersFactory, drmSessionManager));
} }
/** @deprecated Use {@link #forHls(Context, Uri, Factory, RenderersFactory)} */
@Deprecated
public static DownloadHelper forHls(
Uri uri, DataSource.Factory dataSourceFactory, RenderersFactory renderersFactory) {
return forHls(
uri,
dataSourceFactory,
renderersFactory,
/* drmSessionManager= */ null,
DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT);
}
/** /**
* Creates a {@link DownloadHelper} for HLS streams. * Creates a {@link DownloadHelper} for HLS streams.
* *
* @param context Any {@link Context}.
* @param uri A playlist {@link Uri}. * @param uri A playlist {@link Uri}.
* @param dataSourceFactory A {@link DataSource.Factory} used to load the playlist. * @param dataSourceFactory A {@link DataSource.Factory} used to load the playlist.
* @param renderersFactory A {@link RenderersFactory} creating the renderers for which tracks are * @param renderersFactory A {@link RenderersFactory} creating the renderers for which tracks are
@ -208,13 +272,16 @@ public final class DownloadHelper {
* @throws IllegalStateException If the HLS module is missing. * @throws IllegalStateException If the HLS module is missing.
*/ */
public static DownloadHelper forHls( public static DownloadHelper forHls(
Uri uri, DataSource.Factory dataSourceFactory, RenderersFactory renderersFactory) { Context context,
Uri uri,
DataSource.Factory dataSourceFactory,
RenderersFactory renderersFactory) {
return forHls( return forHls(
uri, uri,
dataSourceFactory, dataSourceFactory,
renderersFactory, renderersFactory,
/* drmSessionManager= */ null, /* drmSessionManager= */ null,
DEFAULT_TRACK_SELECTOR_PARAMETERS); getDefaultTrackSelectorParameters(context));
} }
/** /**
@ -247,9 +314,22 @@ public final class DownloadHelper {
Util.getRendererCapabilities(renderersFactory, drmSessionManager)); Util.getRendererCapabilities(renderersFactory, drmSessionManager));
} }
/** @deprecated Use {@link #forSmoothStreaming(Context, Uri, Factory, RenderersFactory)} */
@Deprecated
public static DownloadHelper forSmoothStreaming(
Uri uri, DataSource.Factory dataSourceFactory, RenderersFactory renderersFactory) {
return forSmoothStreaming(
uri,
dataSourceFactory,
renderersFactory,
/* drmSessionManager= */ null,
DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT);
}
/** /**
* Creates a {@link DownloadHelper} for SmoothStreaming streams. * Creates a {@link DownloadHelper} for SmoothStreaming streams.
* *
* @param context Any {@link Context}.
* @param uri A manifest {@link Uri}. * @param uri A manifest {@link Uri}.
* @param dataSourceFactory A {@link DataSource.Factory} used to load the manifest. * @param dataSourceFactory A {@link DataSource.Factory} used to load the manifest.
* @param renderersFactory A {@link RenderersFactory} creating the renderers for which tracks are * @param renderersFactory A {@link RenderersFactory} creating the renderers for which tracks are
@ -258,13 +338,16 @@ public final class DownloadHelper {
* @throws IllegalStateException If the SmoothStreaming module is missing. * @throws IllegalStateException If the SmoothStreaming module is missing.
*/ */
public static DownloadHelper forSmoothStreaming( public static DownloadHelper forSmoothStreaming(
Uri uri, DataSource.Factory dataSourceFactory, RenderersFactory renderersFactory) { Context context,
Uri uri,
DataSource.Factory dataSourceFactory,
RenderersFactory renderersFactory) {
return forSmoothStreaming( return forSmoothStreaming(
uri, uri,
dataSourceFactory, dataSourceFactory,
renderersFactory, renderersFactory,
/* drmSessionManager= */ null, /* drmSessionManager= */ null,
DEFAULT_TRACK_SELECTOR_PARAMETERS); getDefaultTrackSelectorParameters(context));
} }
/** /**
@ -370,10 +453,10 @@ public final class DownloadHelper {
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(trackSelectorParameters, new DownloadTrackSelection.Factory());
this.rendererCapabilities = rendererCapabilities; this.rendererCapabilities = rendererCapabilities;
this.scratchSet = new SparseIntArray(); this.scratchSet = new SparseIntArray();
trackSelector.setParameters(trackSelectorParameters);
trackSelector.init(/* listener= */ () -> {}, new DummyBandwidthMeter()); trackSelector.init(/* listener= */ () -> {}, new DummyBandwidthMeter());
callbackHandler = new Handler(Util.getLooper()); callbackHandler = new Handler(Util.getLooper());
window = new Timeline.Window(); window = new Timeline.Window();

View File

@ -186,9 +186,22 @@ public class DefaultTrackSelector extends MappingTrackSelector {
private final SparseArray<Map<TrackGroupArray, SelectionOverride>> selectionOverrides; private final SparseArray<Map<TrackGroupArray, SelectionOverride>> selectionOverrides;
private final SparseBooleanArray rendererDisabledFlags; private final SparseBooleanArray rendererDisabledFlags;
/** Creates a builder with default initial values. */ /**
* @deprecated Initial viewport constraints will not be set based on the primary display when
* using this constructor. Use {@link #ParametersBuilder(Context)} instead.
*/
@Deprecated
public ParametersBuilder() { public ParametersBuilder() {
this(Parameters.DEFAULT); this(Parameters.DEFAULT_WITHOUT_VIEWPORT);
}
/**
* Creates a builder with default initial values.
*
* @param context Any context.
*/
public ParametersBuilder(Context context) {
this(Parameters.getDefaults(context));
} }
/** /**
@ -656,8 +669,22 @@ public class DefaultTrackSelector extends MappingTrackSelector {
*/ */
public static final class Parameters extends TrackSelectionParameters { public static final class Parameters extends TrackSelectionParameters {
/** An instance with default values. */ /** An instance with default values, except without any viewport constraints. */
public static final Parameters DEFAULT = new Parameters(); public static final Parameters DEFAULT_WITHOUT_VIEWPORT = new Parameters();
/**
* @deprecated This instance does not have viewport constraints configured for the primary
* display. Use {@link #getDefaults(Context)} instead.
*/
@Deprecated public static final Parameters DEFAULT = DEFAULT_WITHOUT_VIEWPORT;
/** Returns an instance configured with default values. */
public static Parameters getDefaults(Context context) {
return DEFAULT_WITHOUT_VIEWPORT
.buildUpon()
.setViewportSizeToPhysicalDisplaySize(context, /* viewportOrientationMayChange= */ true)
.build();
}
// Video // Video
/** /**
@ -707,14 +734,14 @@ public class DefaultTrackSelector extends MappingTrackSelector {
public final boolean allowVideoNonSeamlessAdaptiveness; public final boolean allowVideoNonSeamlessAdaptiveness;
/** /**
* Viewport width in pixels. Constrains video track selections for adaptive content so that only * Viewport width in pixels. Constrains video track selections for adaptive content so that only
* tracks suitable for the viewport are selected. The default value is {@link Integer#MAX_VALUE} * tracks suitable for the viewport are selected. The default value is the physical width of the
* (i.e. no constraint). * primary display, in pixels.
*/ */
public final int viewportWidth; public final int viewportWidth;
/** /**
* Viewport height in pixels. Constrains video track selections for adaptive content so that * Viewport height in pixels. Constrains video track selections for adaptive content so that
* only tracks suitable for the viewport are selected. The default value is {@link * only tracks suitable for the viewport are selected. The default value is the physical height
* Integer#MAX_VALUE} (i.e. no constraint). * of the primary display, in pixels.
*/ */
public final int viewportHeight; public final int viewportHeight;
/** /**
@ -1284,13 +1311,16 @@ public class DefaultTrackSelector extends MappingTrackSelector {
private boolean allowMultipleAdaptiveSelections; private boolean allowMultipleAdaptiveSelections;
/** @deprecated Use {@link #DefaultTrackSelector(Context)} instead. */
@Deprecated
@SuppressWarnings("deprecation")
public DefaultTrackSelector() { public DefaultTrackSelector() {
this(new AdaptiveTrackSelection.Factory()); this(new AdaptiveTrackSelection.Factory());
} }
/** /**
* @deprecated Use {@link #DefaultTrackSelector()} instead. Custom bandwidth meter should be * @deprecated Use {@link #DefaultTrackSelector(Context)} instead. The bandwidth meter should be
* directly passed to the player in {@link ExoPlayerFactory}. * passed directly to the player in {@link ExoPlayerFactory}.
*/ */
@Deprecated @Deprecated
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
@ -1298,10 +1328,32 @@ public class DefaultTrackSelector extends MappingTrackSelector {
this(new AdaptiveTrackSelection.Factory(bandwidthMeter)); this(new AdaptiveTrackSelection.Factory(bandwidthMeter));
} }
/** @param trackSelectionFactory A factory for {@link TrackSelection}s. */ /** @deprecated Use {@link #DefaultTrackSelector(Context, TrackSelection.Factory)}. */
@Deprecated
public DefaultTrackSelector(TrackSelection.Factory trackSelectionFactory) { public DefaultTrackSelector(TrackSelection.Factory trackSelectionFactory) {
this(Parameters.DEFAULT_WITHOUT_VIEWPORT, trackSelectionFactory);
}
/** @param context Any {@link Context}. */
public DefaultTrackSelector(Context context) {
this(context, new AdaptiveTrackSelection.Factory());
}
/**
* @param context Any {@link Context}.
* @param trackSelectionFactory A factory for {@link TrackSelection}s.
*/
public DefaultTrackSelector(Context context, TrackSelection.Factory trackSelectionFactory) {
this(Parameters.getDefaults(context), trackSelectionFactory);
}
/**
* @param parameters Initial {@link Parameters}.
* @param trackSelectionFactory A factory for {@link TrackSelection}s.
*/
public DefaultTrackSelector(Parameters parameters, TrackSelection.Factory trackSelectionFactory) {
this.trackSelectionFactory = trackSelectionFactory; this.trackSelectionFactory = trackSelectionFactory;
parametersReference = new AtomicReference<>(Parameters.DEFAULT); parametersReference = new AtomicReference<>(parameters);
} }
/** /**

View File

@ -19,6 +19,7 @@ import static com.google.common.truth.Truth.assertThat;
import static org.robolectric.shadows.ShadowBaseLooper.shadowMainLooper; import static org.robolectric.shadows.ShadowBaseLooper.shadowMainLooper;
import android.net.Uri; import android.net.Uri;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
@ -36,7 +37,6 @@ import com.google.android.exoplayer2.testutil.FakeRenderer;
import com.google.android.exoplayer2.testutil.FakeTimeline; import com.google.android.exoplayer2.testutil.FakeTimeline;
import com.google.android.exoplayer2.testutil.FakeTimeline.TimelineWindowDefinition; import com.google.android.exoplayer2.testutil.FakeTimeline.TimelineWindowDefinition;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder;
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;
import com.google.android.exoplayer2.upstream.Allocator; import com.google.android.exoplayer2.upstream.Allocator;
@ -113,7 +113,7 @@ public class DownloadHelperTest {
testUri, testUri,
TEST_CACHE_KEY, TEST_CACHE_KEY,
new TestMediaSource(), new TestMediaSource(),
DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS, DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT,
Util.getRendererCapabilities(renderersFactory, /* drmSessionManager= */ null)); Util.getRendererCapabilities(renderersFactory, /* drmSessionManager= */ null));
} }
@ -244,7 +244,7 @@ public class DownloadHelperTest {
throws Exception { throws Exception {
prepareDownloadHelper(downloadHelper); prepareDownloadHelper(downloadHelper);
DefaultTrackSelector.Parameters parameters = DefaultTrackSelector.Parameters parameters =
new ParametersBuilder() new DefaultTrackSelector.ParametersBuilder(ApplicationProvider.getApplicationContext())
.setPreferredAudioLanguage("ZH") .setPreferredAudioLanguage("ZH")
.setPreferredTextLanguage("ZH") .setPreferredTextLanguage("ZH")
.setRendererDisabled(/* rendererIndex= */ 2, true) .setRendererDisabled(/* rendererIndex= */ 2, true)
@ -281,7 +281,7 @@ public class DownloadHelperTest {
// Select parameters to require some merging of track groups because the new parameters add // Select parameters to require some merging of track groups because the new parameters add
// all video tracks to initial video single track selection. // all video tracks to initial video single track selection.
DefaultTrackSelector.Parameters parameters = DefaultTrackSelector.Parameters parameters =
new ParametersBuilder() new DefaultTrackSelector.ParametersBuilder(ApplicationProvider.getApplicationContext())
.setPreferredAudioLanguage("ZH") .setPreferredAudioLanguage("ZH")
.setPreferredTextLanguage("US") .setPreferredTextLanguage("US")
.build(); .build();
@ -385,7 +385,7 @@ public class DownloadHelperTest {
// Ensure we have track groups with multiple indices, renderers with multiple track groups and // Ensure we have track groups with multiple indices, renderers with multiple track groups and
// also renderers without any track groups. // also renderers without any track groups.
DefaultTrackSelector.Parameters parameters = DefaultTrackSelector.Parameters parameters =
new ParametersBuilder() new DefaultTrackSelector.ParametersBuilder(ApplicationProvider.getApplicationContext())
.setPreferredAudioLanguage("ZH") .setPreferredAudioLanguage("ZH")
.setPreferredTextLanguage("US") .setPreferredTextLanguage("US")
.build(); .build();

View File

@ -27,9 +27,11 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import static org.mockito.MockitoAnnotations.initMocks; import static org.mockito.MockitoAnnotations.initMocks;
import android.content.Context;
import android.os.Parcel; import android.os.Parcel;
import android.util.SparseArray; import android.util.SparseArray;
import android.util.SparseBooleanArray; import android.util.SparseBooleanArray;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.ExoPlaybackException;
@ -97,6 +99,7 @@ public final class DefaultTrackSelectorTest {
@Mock private InvalidationListener invalidationListener; @Mock private InvalidationListener invalidationListener;
@Mock private BandwidthMeter bandwidthMeter; @Mock private BandwidthMeter bandwidthMeter;
private Parameters defaultParameters;
private DefaultTrackSelector trackSelector; private DefaultTrackSelector trackSelector;
@BeforeClass @BeforeClass
@ -108,7 +111,9 @@ public final class DefaultTrackSelectorTest {
public void setUp() { public void setUp() {
initMocks(this); initMocks(this);
when(bandwidthMeter.getBitrateEstimate()).thenReturn(1000000L); when(bandwidthMeter.getBitrateEstimate()).thenReturn(1000000L);
trackSelector = new DefaultTrackSelector(); Context context = ApplicationProvider.getApplicationContext();
defaultParameters = Parameters.getDefaults(context);
trackSelector = new DefaultTrackSelector(context);
trackSelector.init(invalidationListener, bandwidthMeter); trackSelector.init(invalidationListener, bandwidthMeter);
} }
@ -234,7 +239,7 @@ public final class DefaultTrackSelectorTest {
/** Tests disabling a renderer. */ /** Tests disabling a renderer. */
@Test @Test
public void testSelectTracksWithDisabledRenderer() throws ExoPlaybackException { public void testSelectTracksWithDisabledRenderer() throws ExoPlaybackException {
trackSelector.setParameters(Parameters.DEFAULT.buildUpon().setRendererDisabled(1, true)); trackSelector.setParameters(defaultParameters.buildUpon().setRendererDisabled(1, true));
TrackSelectorResult result = TrackSelectorResult result =
trackSelector.selectTracks(RENDERER_CAPABILITIES, TRACK_GROUPS, periodId, TIMELINE); trackSelector.selectTracks(RENDERER_CAPABILITIES, TRACK_GROUPS, periodId, TIMELINE);
assertSelections(result, new TrackSelection[] {TRACK_SELECTIONS[0], null}); assertSelections(result, new TrackSelection[] {TRACK_SELECTIONS[0], null});
@ -271,7 +276,7 @@ public final class DefaultTrackSelectorTest {
/** Tests disabling a no-sample renderer. */ /** Tests disabling a no-sample renderer. */
@Test @Test
public void testSelectTracksWithDisabledNoSampleRenderer() throws ExoPlaybackException { public void testSelectTracksWithDisabledNoSampleRenderer() throws ExoPlaybackException {
trackSelector.setParameters(Parameters.DEFAULT.buildUpon().setRendererDisabled(1, true)); trackSelector.setParameters(defaultParameters.buildUpon().setRendererDisabled(1, true));
TrackSelectorResult result = TrackSelectorResult result =
trackSelector.selectTracks( trackSelector.selectTracks(
RENDERER_CAPABILITIES_WITH_NO_SAMPLE_RENDERER, TRACK_GROUPS, periodId, TIMELINE); RENDERER_CAPABILITIES_WITH_NO_SAMPLE_RENDERER, TRACK_GROUPS, periodId, TIMELINE);
@ -281,14 +286,13 @@ public final class DefaultTrackSelectorTest {
} }
/** /**
* Tests that track selector will not call * Tests that track selector will not call {@link
* {@link InvalidationListener#onTrackSelectionsInvalidated()} when it's set with default * InvalidationListener#onTrackSelectionsInvalidated()} when it's set with default values of
* values of {@link Parameters}. * {@link Parameters}.
*/ */
@Test @Test
public void testSetParameterWithDefaultParametersDoesNotNotifyInvalidationListener() public void testSetParameterWithDefaultParametersDoesNotNotifyInvalidationListener() {
throws Exception { trackSelector.setParameters(defaultParameters);
trackSelector.setParameters(Parameters.DEFAULT);
verify(invalidationListener, never()).onTrackSelectionsInvalidated(); verify(invalidationListener, never()).onTrackSelectionsInvalidated();
} }
@ -297,24 +301,22 @@ public final class DefaultTrackSelectorTest {
* when it's set with non-default values of {@link Parameters}. * when it's set with non-default values of {@link Parameters}.
*/ */
@Test @Test
public void testSetParameterWithNonDefaultParameterNotifyInvalidationListener() public void testSetParameterWithNonDefaultParameterNotifyInvalidationListener() {
throws Exception { ParametersBuilder builder = defaultParameters.buildUpon().setPreferredAudioLanguage("eng");
Parameters parameters = Parameters.DEFAULT.buildUpon().setPreferredAudioLanguage("eng").build(); trackSelector.setParameters(builder);
trackSelector.setParameters(parameters);
verify(invalidationListener).onTrackSelectionsInvalidated(); verify(invalidationListener).onTrackSelectionsInvalidated();
} }
/** /**
* Tests that track selector will not call * Tests that track selector will not call {@link
* {@link InvalidationListener#onTrackSelectionsInvalidated()} again when it's set with * InvalidationListener#onTrackSelectionsInvalidated()} again when it's set with the same values
* the same values of {@link Parameters}. * of {@link Parameters}.
*/ */
@Test @Test
public void testSetParameterWithSameParametersDoesNotNotifyInvalidationListenerAgain() public void testSetParameterWithSameParametersDoesNotNotifyInvalidationListenerAgain() {
throws Exception { ParametersBuilder builder = defaultParameters.buildUpon().setPreferredAudioLanguage("eng");
ParametersBuilder builder = Parameters.DEFAULT.buildUpon().setPreferredAudioLanguage("eng"); trackSelector.setParameters(builder);
trackSelector.setParameters(builder.build()); trackSelector.setParameters(builder);
trackSelector.setParameters(builder.build());
verify(invalidationListener, times(1)).onTrackSelectionsInvalidated(); verify(invalidationListener, times(1)).onTrackSelectionsInvalidated();
} }
@ -426,8 +428,7 @@ public final class DefaultTrackSelectorTest {
Format.NO_VALUE, 2, 44100, null, null, 0, "eng"); Format.NO_VALUE, 2, 44100, null, null, 0, "eng");
TrackGroupArray trackGroups = wrapFormats(frAudioFormat, enAudioFormat); TrackGroupArray trackGroups = wrapFormats(frAudioFormat, enAudioFormat);
trackSelector.setParameters( trackSelector.setParameters(defaultParameters.buildUpon().setPreferredAudioLanguage("eng"));
Parameters.DEFAULT.buildUpon().setPreferredAudioLanguage("eng").build());
TrackSelectorResult result = TrackSelectorResult result =
trackSelector.selectTracks( trackSelector.selectTracks(
new RendererCapabilities[] {ALL_AUDIO_FORMAT_SUPPORTED_RENDERER_CAPABILITIES}, new RendererCapabilities[] {ALL_AUDIO_FORMAT_SUPPORTED_RENDERER_CAPABILITIES},
@ -452,8 +453,7 @@ public final class DefaultTrackSelectorTest {
Format.NO_VALUE, 2, 44100, null, null, 0, "eng"); Format.NO_VALUE, 2, 44100, null, null, 0, "eng");
TrackGroupArray trackGroups = wrapFormats(frAudioFormat, enAudioFormat); TrackGroupArray trackGroups = wrapFormats(frAudioFormat, enAudioFormat);
trackSelector.setParameters( trackSelector.setParameters(defaultParameters.buildUpon().setPreferredAudioLanguage("eng"));
Parameters.DEFAULT.buildUpon().setPreferredAudioLanguage("eng").build());
TrackSelectorResult result = TrackSelectorResult result =
trackSelector.selectTracks( trackSelector.selectTracks(
new RendererCapabilities[] {ALL_AUDIO_FORMAT_SUPPORTED_RENDERER_CAPABILITIES}, new RendererCapabilities[] {ALL_AUDIO_FORMAT_SUPPORTED_RENDERER_CAPABILITIES},
@ -523,7 +523,7 @@ public final class DefaultTrackSelectorTest {
TrackGroupArray trackGroups = singleTrackGroup(audioFormat); TrackGroupArray trackGroups = singleTrackGroup(audioFormat);
trackSelector.setParameters( trackSelector.setParameters(
Parameters.DEFAULT.buildUpon().setExceedRendererCapabilitiesIfNecessary(false).build()); defaultParameters.buildUpon().setExceedRendererCapabilitiesIfNecessary(false));
TrackSelectorResult result = TrackSelectorResult result =
trackSelector.selectTracks( trackSelector.selectTracks(
new RendererCapabilities[] {ALL_AUDIO_FORMAT_EXCEEDED_RENDERER_CAPABILITIES}, new RendererCapabilities[] {ALL_AUDIO_FORMAT_EXCEEDED_RENDERER_CAPABILITIES},
@ -605,8 +605,7 @@ public final class DefaultTrackSelectorTest {
RendererCapabilities mappedAudioRendererCapabilities = RendererCapabilities mappedAudioRendererCapabilities =
new FakeMappedRendererCapabilities(C.TRACK_TYPE_AUDIO, mappedCapabilities); new FakeMappedRendererCapabilities(C.TRACK_TYPE_AUDIO, mappedCapabilities);
trackSelector.setParameters( trackSelector.setParameters(defaultParameters.buildUpon().setPreferredAudioLanguage("eng"));
Parameters.DEFAULT.buildUpon().setPreferredAudioLanguage("eng").build());
TrackSelectorResult result = TrackSelectorResult result =
trackSelector.selectTracks( trackSelector.selectTracks(
new RendererCapabilities[] {mappedAudioRendererCapabilities}, new RendererCapabilities[] {mappedAudioRendererCapabilities},
@ -648,8 +647,7 @@ public final class DefaultTrackSelectorTest {
RendererCapabilities mappedAudioRendererCapabilities = RendererCapabilities mappedAudioRendererCapabilities =
new FakeMappedRendererCapabilities(C.TRACK_TYPE_AUDIO, mappedCapabilities); new FakeMappedRendererCapabilities(C.TRACK_TYPE_AUDIO, mappedCapabilities);
trackSelector.setParameters( trackSelector.setParameters(defaultParameters.buildUpon().setPreferredAudioLanguage("eng"));
Parameters.DEFAULT.buildUpon().setPreferredAudioLanguage("eng").build());
TrackSelectorResult result = TrackSelectorResult result =
trackSelector.selectTracks( trackSelector.selectTracks(
new RendererCapabilities[] {mappedAudioRendererCapabilities}, new RendererCapabilities[] {mappedAudioRendererCapabilities},
@ -983,10 +981,7 @@ public final class DefaultTrackSelectorTest {
// selected. // selected.
trackGroups = wrapFormats(defaultOnly, noFlag, forcedOnly, forcedDefault); trackGroups = wrapFormats(defaultOnly, noFlag, forcedOnly, forcedDefault);
trackSelector.setParameters( trackSelector.setParameters(
Parameters.DEFAULT defaultParameters.buildUpon().setDisabledTextTrackSelectionFlags(C.SELECTION_FLAG_DEFAULT));
.buildUpon()
.setDisabledTextTrackSelectionFlags(C.SELECTION_FLAG_DEFAULT)
.build());
result = trackSelector.selectTracks(textRendererCapabilities, trackGroups, periodId, TIMELINE); result = trackSelector.selectTracks(textRendererCapabilities, trackGroups, periodId, TIMELINE);
assertNoSelection(result.selections.get(0)); assertNoSelection(result.selections.get(0));
@ -997,15 +992,14 @@ public final class DefaultTrackSelectorTest {
trackSelector trackSelector
.getParameters() .getParameters()
.buildUpon() .buildUpon()
.setDisabledTextTrackSelectionFlags(C.SELECTION_FLAG_DEFAULT | C.SELECTION_FLAG_FORCED) .setDisabledTextTrackSelectionFlags(
.build()); C.SELECTION_FLAG_DEFAULT | C.SELECTION_FLAG_FORCED));
result = trackSelector.selectTracks(textRendererCapabilities, trackGroups, periodId, TIMELINE); result = trackSelector.selectTracks(textRendererCapabilities, trackGroups, periodId, TIMELINE);
assertNoSelection(result.selections.get(0)); assertNoSelection(result.selections.get(0));
// There is a preferred language, so a language-matching track flagged as default should // There is a preferred language, so a language-matching track flagged as default should
// be selected, and the one without forced flag should be preferred. // be selected, and the one without forced flag should be preferred.
trackSelector.setParameters( trackSelector.setParameters(defaultParameters.buildUpon().setPreferredTextLanguage("eng"));
Parameters.DEFAULT.buildUpon().setPreferredTextLanguage("eng").build());
result = trackSelector.selectTracks(textRendererCapabilities, trackGroups, periodId, TIMELINE); result = trackSelector.selectTracks(textRendererCapabilities, trackGroups, periodId, TIMELINE);
assertFixedSelection(result.selections.get(0), trackGroups, defaultOnly); assertFixedSelection(result.selections.get(0), trackGroups, defaultOnly);
@ -1017,8 +1011,7 @@ public final class DefaultTrackSelectorTest {
trackSelector trackSelector
.getParameters() .getParameters()
.buildUpon() .buildUpon()
.setDisabledTextTrackSelectionFlags(C.SELECTION_FLAG_DEFAULT) .setDisabledTextTrackSelectionFlags(C.SELECTION_FLAG_DEFAULT));
.build());
result = trackSelector.selectTracks(textRendererCapabilities, trackGroups, periodId, TIMELINE); result = trackSelector.selectTracks(textRendererCapabilities, trackGroups, periodId, TIMELINE);
assertFixedSelection(result.selections.get(0), trackGroups, noFlag); assertFixedSelection(result.selections.get(0), trackGroups, noFlag);
} }
@ -1100,12 +1093,12 @@ public final class DefaultTrackSelectorTest {
assertNoSelection(result.selections.get(0)); assertNoSelection(result.selections.get(0));
trackSelector.setParameters( trackSelector.setParameters(
Parameters.DEFAULT.buildUpon().setSelectUndeterminedTextLanguage(true).build()); defaultParameters.buildUpon().setSelectUndeterminedTextLanguage(true));
result = trackSelector.selectTracks(textRendererCapabilites, trackGroups, periodId, TIMELINE); result = trackSelector.selectTracks(textRendererCapabilites, trackGroups, periodId, TIMELINE);
assertFixedSelection(result.selections.get(0), trackGroups, undeterminedUnd); assertFixedSelection(result.selections.get(0), trackGroups, undeterminedUnd);
ParametersBuilder builder = Parameters.DEFAULT.buildUpon().setPreferredTextLanguage("spa"); ParametersBuilder builder = defaultParameters.buildUpon().setPreferredTextLanguage("spa");
trackSelector.setParameters(builder.build()); trackSelector.setParameters(builder);
result = trackSelector.selectTracks(textRendererCapabilites, trackGroups, periodId, TIMELINE); result = trackSelector.selectTracks(textRendererCapabilites, trackGroups, periodId, TIMELINE);
assertFixedSelection(result.selections.get(0), trackGroups, spanish); assertFixedSelection(result.selections.get(0), trackGroups, spanish);
@ -1114,7 +1107,7 @@ public final class DefaultTrackSelectorTest {
result = trackSelector.selectTracks(textRendererCapabilites, trackGroups, periodId, TIMELINE); result = trackSelector.selectTracks(textRendererCapabilites, trackGroups, periodId, TIMELINE);
assertNoSelection(result.selections.get(0)); assertNoSelection(result.selections.get(0));
trackSelector.setParameters(builder.setSelectUndeterminedTextLanguage(true).build()); trackSelector.setParameters(builder.setSelectUndeterminedTextLanguage(true));
result = trackSelector.selectTracks(textRendererCapabilites, trackGroups, periodId, TIMELINE); result = trackSelector.selectTracks(textRendererCapabilites, trackGroups, periodId, TIMELINE);
assertFixedSelection(result.selections.get(0), trackGroups, undeterminedUnd); assertFixedSelection(result.selections.get(0), trackGroups, undeterminedUnd);
@ -1158,13 +1151,13 @@ public final class DefaultTrackSelectorTest {
assertNoSelection(result.selections.get(1)); assertNoSelection(result.selections.get(1));
// Explicit language preference for english. First renderer should be used. // Explicit language preference for english. First renderer should be used.
trackSelector.setParameters(Parameters.DEFAULT.buildUpon().setPreferredTextLanguage("en")); trackSelector.setParameters(defaultParameters.buildUpon().setPreferredTextLanguage("en"));
result = trackSelector.selectTracks(rendererCapabilities, trackGroups, periodId, TIMELINE); result = trackSelector.selectTracks(rendererCapabilities, trackGroups, periodId, TIMELINE);
assertFixedSelection(result.selections.get(0), trackGroups, english); assertFixedSelection(result.selections.get(0), trackGroups, english);
assertNoSelection(result.selections.get(1)); assertNoSelection(result.selections.get(1));
// Explicit language preference for German. Second renderer should be used. // Explicit language preference for German. Second renderer should be used.
trackSelector.setParameters(Parameters.DEFAULT.buildUpon().setPreferredTextLanguage("de")); trackSelector.setParameters(defaultParameters.buildUpon().setPreferredTextLanguage("de"));
result = trackSelector.selectTracks(rendererCapabilities, trackGroups, periodId, TIMELINE); result = trackSelector.selectTracks(rendererCapabilities, trackGroups, periodId, TIMELINE);
assertNoSelection(result.selections.get(0)); assertNoSelection(result.selections.get(0));
assertFixedSelection(result.selections.get(1), trackGroups, german); assertFixedSelection(result.selections.get(1), trackGroups, german);
@ -1190,7 +1183,7 @@ public final class DefaultTrackSelectorTest {
RendererCapabilities mappedAudioRendererCapabilities = RendererCapabilities mappedAudioRendererCapabilities =
new FakeMappedRendererCapabilities(C.TRACK_TYPE_AUDIO, mappedCapabilities); new FakeMappedRendererCapabilities(C.TRACK_TYPE_AUDIO, mappedCapabilities);
trackSelector.setParameters(Parameters.DEFAULT.buildUpon().setForceLowestBitrate(true).build()); trackSelector.setParameters(defaultParameters.buildUpon().setForceLowestBitrate(true));
TrackSelectorResult result = TrackSelectorResult result =
trackSelector.selectTracks( trackSelector.selectTracks(
new RendererCapabilities[] {mappedAudioRendererCapabilities}, new RendererCapabilities[] {mappedAudioRendererCapabilities},
@ -1221,7 +1214,7 @@ public final class DefaultTrackSelectorTest {
new FakeMappedRendererCapabilities(C.TRACK_TYPE_AUDIO, mappedCapabilities); new FakeMappedRendererCapabilities(C.TRACK_TYPE_AUDIO, mappedCapabilities);
trackSelector.setParameters( trackSelector.setParameters(
new ParametersBuilder().setForceHighestSupportedBitrate(true).build()); defaultParameters.buildUpon().setForceHighestSupportedBitrate(true));
TrackSelectorResult result = TrackSelectorResult result =
trackSelector.selectTracks( trackSelector.selectTracks(
new RendererCapabilities[] {mappedAudioRendererCapabilities}, new RendererCapabilities[] {mappedAudioRendererCapabilities},
@ -1269,7 +1262,7 @@ public final class DefaultTrackSelectorTest {
// If we explicitly enable mixed sample rate adaptiveness, expect an adaptive selection. // If we explicitly enable mixed sample rate adaptiveness, expect an adaptive selection.
trackSelector.setParameters( trackSelector.setParameters(
Parameters.DEFAULT.buildUpon().setAllowAudioMixedSampleRateAdaptiveness(true)); defaultParameters.buildUpon().setAllowAudioMixedSampleRateAdaptiveness(true));
result = result =
trackSelector.selectTracks( trackSelector.selectTracks(
new RendererCapabilities[] {AUDIO_CAPABILITIES}, trackGroups, periodId, TIMELINE); new RendererCapabilities[] {AUDIO_CAPABILITIES}, trackGroups, periodId, TIMELINE);
@ -1301,7 +1294,7 @@ public final class DefaultTrackSelectorTest {
// If we explicitly enable mixed mime type adaptiveness, expect an adaptive selection. // If we explicitly enable mixed mime type adaptiveness, expect an adaptive selection.
trackSelector.setParameters( trackSelector.setParameters(
Parameters.DEFAULT.buildUpon().setAllowAudioMixedMimeTypeAdaptiveness(true)); defaultParameters.buildUpon().setAllowAudioMixedMimeTypeAdaptiveness(true));
result = result =
trackSelector.selectTracks( trackSelector.selectTracks(
new RendererCapabilities[] {AUDIO_CAPABILITIES}, trackGroups, periodId, TIMELINE); new RendererCapabilities[] {AUDIO_CAPABILITIES}, trackGroups, periodId, TIMELINE);
@ -1335,7 +1328,7 @@ public final class DefaultTrackSelectorTest {
// If we constrain the channel count to 4 we expect a fixed selection containing the track with // If we constrain the channel count to 4 we expect a fixed selection containing the track with
// fewer channels. // fewer channels.
trackSelector.setParameters(Parameters.DEFAULT.buildUpon().setMaxAudioChannelCount(4)); trackSelector.setParameters(defaultParameters.buildUpon().setMaxAudioChannelCount(4));
result = result =
trackSelector.selectTracks( trackSelector.selectTracks(
new RendererCapabilities[] {AUDIO_CAPABILITIES}, trackGroups, periodId, TIMELINE); new RendererCapabilities[] {AUDIO_CAPABILITIES}, trackGroups, periodId, TIMELINE);
@ -1344,7 +1337,7 @@ public final class DefaultTrackSelectorTest {
// If we constrain the channel count to 2 we expect a fixed selection containing the track with // If we constrain the channel count to 2 we expect a fixed selection containing the track with
// fewer channels. // fewer channels.
trackSelector.setParameters(Parameters.DEFAULT.buildUpon().setMaxAudioChannelCount(2)); trackSelector.setParameters(defaultParameters.buildUpon().setMaxAudioChannelCount(2));
result = result =
trackSelector.selectTracks( trackSelector.selectTracks(
new RendererCapabilities[] {AUDIO_CAPABILITIES}, trackGroups, periodId, TIMELINE); new RendererCapabilities[] {AUDIO_CAPABILITIES}, trackGroups, periodId, TIMELINE);
@ -1353,7 +1346,7 @@ public final class DefaultTrackSelectorTest {
// If we constrain the channel count to 1 we expect a fixed selection containing the track with // If we constrain the channel count to 1 we expect a fixed selection containing the track with
// fewer channels. // fewer channels.
trackSelector.setParameters(Parameters.DEFAULT.buildUpon().setMaxAudioChannelCount(1)); trackSelector.setParameters(defaultParameters.buildUpon().setMaxAudioChannelCount(1));
result = result =
trackSelector.selectTracks( trackSelector.selectTracks(
new RendererCapabilities[] {AUDIO_CAPABILITIES}, trackGroups, periodId, TIMELINE); new RendererCapabilities[] {AUDIO_CAPABILITIES}, trackGroups, periodId, TIMELINE);
@ -1362,7 +1355,7 @@ public final class DefaultTrackSelectorTest {
// If we disable exceeding of constraints we expect no selection. // If we disable exceeding of constraints we expect no selection.
trackSelector.setParameters( trackSelector.setParameters(
Parameters.DEFAULT defaultParameters
.buildUpon() .buildUpon()
.setMaxAudioChannelCount(1) .setMaxAudioChannelCount(1)
.setExceedAudioConstraintsIfNecessary(false)); .setExceedAudioConstraintsIfNecessary(false));
@ -1424,13 +1417,13 @@ public final class DefaultTrackSelectorTest {
assertNoSelection(result.selections.get(1)); assertNoSelection(result.selections.get(1));
// Explicit language preference for english. First renderer should be used. // Explicit language preference for english. First renderer should be used.
trackSelector.setParameters(Parameters.DEFAULT.buildUpon().setPreferredAudioLanguage("en")); trackSelector.setParameters(defaultParameters.buildUpon().setPreferredAudioLanguage("en"));
result = trackSelector.selectTracks(rendererCapabilities, trackGroups, periodId, TIMELINE); result = trackSelector.selectTracks(rendererCapabilities, trackGroups, periodId, TIMELINE);
assertFixedSelection(result.selections.get(0), trackGroups, english); assertFixedSelection(result.selections.get(0), trackGroups, english);
assertNoSelection(result.selections.get(1)); assertNoSelection(result.selections.get(1));
// Explicit language preference for German. Second renderer should be used. // Explicit language preference for German. Second renderer should be used.
trackSelector.setParameters(Parameters.DEFAULT.buildUpon().setPreferredAudioLanguage("de")); trackSelector.setParameters(defaultParameters.buildUpon().setPreferredAudioLanguage("de"));
result = trackSelector.selectTracks(rendererCapabilities, trackGroups, periodId, TIMELINE); result = trackSelector.selectTracks(rendererCapabilities, trackGroups, periodId, TIMELINE);
assertNoSelection(result.selections.get(0)); assertNoSelection(result.selections.get(0));
assertFixedSelection(result.selections.get(1), trackGroups, german); assertFixedSelection(result.selections.get(1), trackGroups, german);
@ -1456,7 +1449,7 @@ public final class DefaultTrackSelectorTest {
// Should do non-seamless adaptiveness by default, so expect an adaptive selection. // Should do non-seamless adaptiveness by default, so expect an adaptive selection.
TrackGroupArray trackGroups = singleTrackGroup(buildVideoFormat("0"), buildVideoFormat("1")); TrackGroupArray trackGroups = singleTrackGroup(buildVideoFormat("0"), buildVideoFormat("1"));
trackSelector.setParameters( trackSelector.setParameters(
Parameters.DEFAULT.buildUpon().setAllowVideoNonSeamlessAdaptiveness(true)); defaultParameters.buildUpon().setAllowVideoNonSeamlessAdaptiveness(true));
TrackSelectorResult result = TrackSelectorResult result =
trackSelector.selectTracks( trackSelector.selectTracks(
new RendererCapabilities[] {nonSeamlessVideoCapabilities}, new RendererCapabilities[] {nonSeamlessVideoCapabilities},
@ -1468,7 +1461,7 @@ public final class DefaultTrackSelectorTest {
// If we explicitly disable non-seamless adaptiveness, expect a fixed selection. // If we explicitly disable non-seamless adaptiveness, expect a fixed selection.
trackSelector.setParameters( trackSelector.setParameters(
Parameters.DEFAULT.buildUpon().setAllowVideoNonSeamlessAdaptiveness(false)); defaultParameters.buildUpon().setAllowVideoNonSeamlessAdaptiveness(false));
result = result =
trackSelector.selectTracks( trackSelector.selectTracks(
new RendererCapabilities[] {nonSeamlessVideoCapabilities}, new RendererCapabilities[] {nonSeamlessVideoCapabilities},
@ -1503,7 +1496,7 @@ public final class DefaultTrackSelectorTest {
// If we explicitly enable mixed mime type adaptiveness, expect an adaptive selection. // If we explicitly enable mixed mime type adaptiveness, expect an adaptive selection.
trackSelector.setParameters( trackSelector.setParameters(
Parameters.DEFAULT.buildUpon().setAllowVideoMixedMimeTypeAdaptiveness(true)); defaultParameters.buildUpon().setAllowVideoMixedMimeTypeAdaptiveness(true));
result = result =
trackSelector.selectTracks( trackSelector.selectTracks(
new RendererCapabilities[] {VIDEO_CAPABILITIES}, trackGroups, periodId, TIMELINE); new RendererCapabilities[] {VIDEO_CAPABILITIES}, trackGroups, periodId, TIMELINE);
@ -1760,13 +1753,13 @@ public final class DefaultTrackSelectorTest {
} }
@Override @Override
public int supportsFormat(Format format) throws ExoPlaybackException { public int supportsFormat(Format format) {
return MimeTypes.getTrackType(format.sampleMimeType) == trackType return MimeTypes.getTrackType(format.sampleMimeType) == trackType
? (supportValue) : FORMAT_UNSUPPORTED_TYPE; ? (supportValue) : FORMAT_UNSUPPORTED_TYPE;
} }
@Override @Override
public int supportsMixedMimeTypeAdaptation() throws ExoPlaybackException { public int supportsMixedMimeTypeAdaptation() {
return ADAPTIVE_SEAMLESS; return ADAPTIVE_SEAMLESS;
} }
@ -1801,14 +1794,14 @@ public final class DefaultTrackSelectorTest {
} }
@Override @Override
public int supportsFormat(Format format) throws ExoPlaybackException { public int supportsFormat(Format format) {
return format.id != null && formatToCapability.containsKey(format.id) return format.id != null && formatToCapability.containsKey(format.id)
? formatToCapability.get(format.id) ? formatToCapability.get(format.id)
: FORMAT_UNSUPPORTED_TYPE; : FORMAT_UNSUPPORTED_TYPE;
} }
@Override @Override
public int supportsMixedMimeTypeAdaptation() throws ExoPlaybackException { public int supportsMixedMimeTypeAdaptation() {
return ADAPTIVE_SEAMLESS; return ADAPTIVE_SEAMLESS;
} }

View File

@ -16,6 +16,7 @@
package com.google.android.exoplayer2.source.dash.offline; package com.google.android.exoplayer2.source.dash.offline;
import android.net.Uri; import android.net.Uri;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.Renderer;
import com.google.android.exoplayer2.drm.DrmSessionManager; import com.google.android.exoplayer2.drm.DrmSessionManager;
@ -31,6 +32,7 @@ public final class DownloadHelperTest {
@Test @Test
public void staticDownloadHelperForDash_doesNotThrow() { public void staticDownloadHelperForDash_doesNotThrow() {
DownloadHelper.forDash( DownloadHelper.forDash(
ApplicationProvider.getApplicationContext(),
Uri.parse("http://uri"), Uri.parse("http://uri"),
new FakeDataSource.Factory(), new FakeDataSource.Factory(),
(handler, videoListener, audioListener, text, metadata, drm) -> new Renderer[0]); (handler, videoListener, audioListener, text, metadata, drm) -> new Renderer[0]);
@ -39,6 +41,6 @@ public final class DownloadHelperTest {
new FakeDataSource.Factory(), new FakeDataSource.Factory(),
(handler, videoListener, audioListener, text, metadata, drm) -> new Renderer[0], (handler, videoListener, audioListener, text, metadata, drm) -> new Renderer[0],
/* drmSessionManager= */ DrmSessionManager.getDummyDrmSessionManager(), /* drmSessionManager= */ DrmSessionManager.getDummyDrmSessionManager(),
DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS); DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT);
} }
} }

View File

@ -16,6 +16,7 @@
package com.google.android.exoplayer2.source.hls.offline; package com.google.android.exoplayer2.source.hls.offline;
import android.net.Uri; import android.net.Uri;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.Renderer;
import com.google.android.exoplayer2.offline.DownloadHelper; import com.google.android.exoplayer2.offline.DownloadHelper;
@ -30,6 +31,7 @@ public final class DownloadHelperTest {
@Test @Test
public void staticDownloadHelperForHls_doesNotThrow() { public void staticDownloadHelperForHls_doesNotThrow() {
DownloadHelper.forHls( DownloadHelper.forHls(
ApplicationProvider.getApplicationContext(),
Uri.parse("http://uri"), Uri.parse("http://uri"),
new FakeDataSource.Factory(), new FakeDataSource.Factory(),
(handler, videoListener, audioListener, text, metadata, drm) -> new Renderer[0]); (handler, videoListener, audioListener, text, metadata, drm) -> new Renderer[0]);
@ -38,6 +40,6 @@ public final class DownloadHelperTest {
new FakeDataSource.Factory(), new FakeDataSource.Factory(),
(handler, videoListener, audioListener, text, metadata, drm) -> new Renderer[0], (handler, videoListener, audioListener, text, metadata, drm) -> new Renderer[0],
/* drmSessionManager= */ null, /* drmSessionManager= */ null,
DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS); DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT);
} }
} }

View File

@ -16,6 +16,7 @@
package com.google.android.exoplayer2.source.smoothstreaming.offline; package com.google.android.exoplayer2.source.smoothstreaming.offline;
import android.net.Uri; import android.net.Uri;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.Renderer;
import com.google.android.exoplayer2.offline.DownloadHelper; import com.google.android.exoplayer2.offline.DownloadHelper;
@ -30,6 +31,7 @@ public final class DownloadHelperTest {
@Test @Test
public void staticDownloadHelperForSmoothStreaming_doesNotThrow() { public void staticDownloadHelperForSmoothStreaming_doesNotThrow() {
DownloadHelper.forSmoothStreaming( DownloadHelper.forSmoothStreaming(
ApplicationProvider.getApplicationContext(),
Uri.parse("http://uri"), Uri.parse("http://uri"),
new FakeDataSource.Factory(), new FakeDataSource.Factory(),
(handler, videoListener, audioListener, text, metadata, drm) -> new Renderer[0]); (handler, videoListener, audioListener, text, metadata, drm) -> new Renderer[0]);
@ -38,6 +40,6 @@ public final class DownloadHelperTest {
new FakeDataSource.Factory(), new FakeDataSource.Factory(),
(handler, videoListener, audioListener, text, metadata, drm) -> new Renderer[0], (handler, videoListener, audioListener, text, metadata, drm) -> new Renderer[0],
/* drmSessionManager= */ null, /* drmSessionManager= */ null,
DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS); DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT);
} }
} }

View File

@ -24,7 +24,6 @@ import android.net.Uri;
import android.view.Surface; import android.view.Surface;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.DefaultLoadControl; import com.google.android.exoplayer2.DefaultLoadControl;
import com.google.android.exoplayer2.ExoPlaybackException;
import com.google.android.exoplayer2.ExoPlayerFactory; import com.google.android.exoplayer2.ExoPlayerFactory;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.RendererCapabilities; import com.google.android.exoplayer2.RendererCapabilities;
@ -385,8 +384,7 @@ public final class DashTestRunner {
MappedTrackInfo mappedTrackInfo, MappedTrackInfo mappedTrackInfo,
int[][][] rendererFormatSupports, int[][][] rendererFormatSupports,
int[] rendererMixedMimeTypeAdaptationSupports, int[] rendererMixedMimeTypeAdaptationSupports,
Parameters parameters) Parameters parameters) {
throws ExoPlaybackException {
Assertions.checkState( Assertions.checkState(
mappedTrackInfo.getRendererType(VIDEO_RENDERER_INDEX) == C.TRACK_TYPE_VIDEO); mappedTrackInfo.getRendererType(VIDEO_RENDERER_INDEX) == C.TRACK_TYPE_VIDEO);
Assertions.checkState( Assertions.checkState(

View File

@ -37,7 +37,6 @@ import com.google.android.exoplayer2.drm.DrmSessionManager;
import com.google.android.exoplayer2.drm.FrameworkMediaCrypto; import com.google.android.exoplayer2.drm.FrameworkMediaCrypto;
import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.testutil.HostActivity.HostedTest; import com.google.android.exoplayer2.testutil.HostActivity.HostedTest;
import com.google.android.exoplayer2.trackselection.AdaptiveTrackSelection;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
import com.google.android.exoplayer2.trackselection.MappingTrackSelector; import com.google.android.exoplayer2.trackselection.MappingTrackSelector;
import com.google.android.exoplayer2.util.Clock; import com.google.android.exoplayer2.util.Clock;
@ -238,7 +237,7 @@ public abstract class ExoHostedTest implements AnalyticsListener, HostedTest {
} }
protected DefaultTrackSelector buildTrackSelector(HostActivity host) { protected DefaultTrackSelector buildTrackSelector(HostActivity host) {
return new DefaultTrackSelector(new AdaptiveTrackSelection.Factory()); return new DefaultTrackSelector(host);
} }
protected SimpleExoPlayer buildExoPlayer( protected SimpleExoPlayer buildExoPlayer(

View File

@ -284,7 +284,7 @@ public final class ExoPlayerTestRunner implements Player.EventListener, ActionSc
supportedFormats = new Format[] {VIDEO_FORMAT}; supportedFormats = new Format[] {VIDEO_FORMAT};
} }
if (trackSelector == null) { if (trackSelector == null) {
trackSelector = new DefaultTrackSelector(); trackSelector = new DefaultTrackSelector(context);
} }
if (bandwidthMeter == null) { if (bandwidthMeter == null) {
bandwidthMeter = new DefaultBandwidthMeter.Builder(context).build(); bandwidthMeter = new DefaultBandwidthMeter.Builder(context).build();