Commit d77d661e by olly Committed by Oliver Woodman

Default viewport constraints to match primary display

PiperOrigin-RevId: 260479923
parent 7703676c
Showing with 199 additions and 64 deletions
...@@ -2,6 +2,8 @@ ...@@ -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.
......
...@@ -21,13 +21,11 @@ import androidx.annotation.Nullable; ...@@ -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; ...@@ -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; ...@@ -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);
......
...@@ -35,7 +35,6 @@ import com.google.android.exoplayer2.source.TrackGroupArray; ...@@ -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 ...@@ -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 =
......
...@@ -30,6 +30,7 @@ import com.google.android.exoplayer2.offline.DownloadIndex; ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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));
} }
} }
......
...@@ -195,7 +195,7 @@ public class PlayerActivity extends AppCompatActivity ...@@ -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 ...@@ -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;
......
...@@ -82,7 +82,7 @@ public class FlacPlaybackTest { ...@@ -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 =
......
...@@ -82,7 +82,7 @@ public class OpusPlaybackTest { ...@@ -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 =
......
...@@ -115,7 +115,7 @@ public class VpxPlaybackTest { ...@@ -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 =
......
...@@ -102,7 +102,7 @@ public final class ExoPlayerFactory { ...@@ -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));
} }
/** /**
......
...@@ -15,6 +15,7 @@ ...@@ -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; ...@@ -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,36 +134,70 @@ public final class DownloadHelper { ...@@ -120,36 +134,70 @@ 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)} */
@Deprecated
@SuppressWarnings("deprecation")
public static DownloadHelper forProgressive(Uri uri) {
return forProgressive(uri, /* cacheKey= */ null);
}
/** /**
* 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}.
* @return A {@link DownloadHelper} for progressive streams. * @return A {@link DownloadHelper} for progressive streams.
*/ */
public static DownloadHelper forProgressive(Uri uri) { public static DownloadHelper forProgressive(Context context, Uri uri) {
return forProgressive(uri, /* cacheKey= */ null); return forProgressive(context, uri, /* cacheKey= */ null);
}
/** @deprecated Use {@link #forProgressive(Context, Uri, String)} */
@Deprecated
public static DownloadHelper forProgressive(Uri uri, @Nullable String cacheKey) {
return new DownloadHelper(
DownloadRequest.TYPE_PROGRESSIVE,
uri,
cacheKey,
/* mediaSource= */ null,
DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT,
/* rendererCapabilities= */ new RendererCapabilities[0]);
} }
/** /**
* 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. * @param cacheKey An optional cache key.
* @return A {@link DownloadHelper} for progressive streams. * @return A {@link DownloadHelper} for progressive streams.
*/ */
public static DownloadHelper forProgressive(Uri uri, @Nullable String cacheKey) { public static DownloadHelper forProgressive(Context context, 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, getDefaultTrackSelectorParameters(context),
/* rendererCapabilities= */ new RendererCapabilities[0]); /* 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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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();
......
...@@ -186,9 +186,22 @@ public class DefaultTrackSelector extends MappingTrackSelector { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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);
} }
/** /**
......
...@@ -19,6 +19,7 @@ import static com.google.common.truth.Truth.assertThat; ...@@ -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; ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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();
......
...@@ -16,6 +16,7 @@ ...@@ -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 { ...@@ -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 { ...@@ -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);
} }
} }
...@@ -16,6 +16,7 @@ ...@@ -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 { ...@@ -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 { ...@@ -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);
} }
} }
...@@ -16,6 +16,7 @@ ...@@ -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 { ...@@ -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 { ...@@ -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);
} }
} }
...@@ -24,7 +24,6 @@ import android.net.Uri; ...@@ -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 { ...@@ -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(
......
...@@ -37,7 +37,6 @@ import com.google.android.exoplayer2.drm.DrmSessionManager; ...@@ -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 { ...@@ -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(
......
...@@ -284,7 +284,7 @@ public final class ExoPlayerTestRunner implements Player.EventListener, ActionSc ...@@ -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();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment