Default viewport constraints to match primary display
PiperOrigin-RevId: 260479923
This commit is contained in:
parent
7703676c87
commit
d77d661e52
@ -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;
|
|||||||
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);
|
||||||
|
|
||||||
|
@ -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 =
|
||||||
|
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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 {
|
|||||||
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 {
|
|||||||
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 {
|
|||||||
* @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 @@
|
|||||||
*/
|
*/
|
||||||
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();
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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();
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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(
|
||||||
|
@ -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(
|
||||||
|
@ -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();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user