Commit d4d16408 by olly Committed by Oliver Woodman

Use extension rather than composition for track selection

It doesn't look like TrackSelectionPolicy is going to be
useful other than with DefaultTrackSelector, and it's kinda
confusing dealing with both "selector" and "policy"
terminology. This change does the following:

DefaultTrackSelector -> selector.MappingTrackSelector
DefaultTrackSelectionPolicy -> selector.DefaultTrackSelector
TrackSelectionPolicy -> [deleted]
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=127196326
parent 67be677d
Showing with 157 additions and 206 deletions
...@@ -16,19 +16,19 @@ ...@@ -16,19 +16,19 @@
package com.google.android.exoplayer2.demo; package com.google.android.exoplayer2.demo;
import com.google.android.exoplayer2.CodecCounters; import com.google.android.exoplayer2.CodecCounters;
import com.google.android.exoplayer2.DefaultTrackSelector;
import com.google.android.exoplayer2.DefaultTrackSelector.TrackInfo;
import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.ExoPlaybackException;
import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.Renderer;
import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.SimpleExoPlayer;
import com.google.android.exoplayer2.TrackSelection;
import com.google.android.exoplayer2.drm.StreamingDrmSessionManager; import com.google.android.exoplayer2.drm.StreamingDrmSessionManager;
import com.google.android.exoplayer2.source.AdaptiveMediaSourceEventListener; import com.google.android.exoplayer2.source.AdaptiveMediaSourceEventListener;
import com.google.android.exoplayer2.source.ExtractorMediaSource; import com.google.android.exoplayer2.source.ExtractorMediaSource;
import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroup;
import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.source.TrackGroupArray;
import com.google.android.exoplayer2.trackselection.MappingTrackSelector;
import com.google.android.exoplayer2.trackselection.MappingTrackSelector.TrackInfo;
import com.google.android.exoplayer2.trackselection.TrackSelection;
import com.google.android.exoplayer2.upstream.DataSpec; import com.google.android.exoplayer2.upstream.DataSpec;
import android.os.SystemClock; import android.os.SystemClock;
...@@ -43,7 +43,7 @@ import java.util.Locale; ...@@ -43,7 +43,7 @@ import java.util.Locale;
*/ */
public class EventLogger implements ExoPlayer.EventListener, SimpleExoPlayer.DebugListener, public class EventLogger implements ExoPlayer.EventListener, SimpleExoPlayer.DebugListener,
AdaptiveMediaSourceEventListener, ExtractorMediaSource.EventListener, AdaptiveMediaSourceEventListener, ExtractorMediaSource.EventListener,
StreamingDrmSessionManager.EventListener, DefaultTrackSelector.EventListener { StreamingDrmSessionManager.EventListener, MappingTrackSelector.EventListener {
private static final String TAG = "EventLogger"; private static final String TAG = "EventLogger";
private static final NumberFormat TIME_FORMAT; private static final NumberFormat TIME_FORMAT;
...@@ -92,7 +92,7 @@ public class EventLogger implements ExoPlayer.EventListener, SimpleExoPlayer.Deb ...@@ -92,7 +92,7 @@ public class EventLogger implements ExoPlayer.EventListener, SimpleExoPlayer.Deb
Log.e(TAG, "playerFailed [" + getSessionTimeString() + "]", e); Log.e(TAG, "playerFailed [" + getSessionTimeString() + "]", e);
} }
// DefaultTrackSelector.EventListener // MappingTrackSelector.EventListener
@Override @Override
public void onTracksChanged(TrackInfo trackInfo) { public void onTracksChanged(TrackInfo trackInfo) {
......
...@@ -17,9 +17,6 @@ package com.google.android.exoplayer2.demo; ...@@ -17,9 +17,6 @@ package com.google.android.exoplayer2.demo;
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.DefaultTrackSelectionPolicy;
import com.google.android.exoplayer2.DefaultTrackSelector;
import com.google.android.exoplayer2.DefaultTrackSelector.TrackInfo;
import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.ExoPlaybackException;
import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.ExoPlayerFactory; import com.google.android.exoplayer2.ExoPlayerFactory;
...@@ -46,6 +43,9 @@ import com.google.android.exoplayer2.source.smoothstreaming.SmoothStreamingMedia ...@@ -46,6 +43,9 @@ import com.google.android.exoplayer2.source.smoothstreaming.SmoothStreamingMedia
import com.google.android.exoplayer2.text.CaptionStyleCompat; import com.google.android.exoplayer2.text.CaptionStyleCompat;
import com.google.android.exoplayer2.text.Cue; import com.google.android.exoplayer2.text.Cue;
import com.google.android.exoplayer2.text.SubtitleLayout; import com.google.android.exoplayer2.text.SubtitleLayout;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
import com.google.android.exoplayer2.trackselection.MappingTrackSelector;
import com.google.android.exoplayer2.trackselection.MappingTrackSelector.TrackInfo;
import com.google.android.exoplayer2.ui.AspectRatioFrameLayout; import com.google.android.exoplayer2.ui.AspectRatioFrameLayout;
import com.google.android.exoplayer2.ui.PlayerControl; import com.google.android.exoplayer2.ui.PlayerControl;
import com.google.android.exoplayer2.upstream.BandwidthMeter; import com.google.android.exoplayer2.upstream.BandwidthMeter;
...@@ -92,7 +92,7 @@ import java.util.UUID; ...@@ -92,7 +92,7 @@ import java.util.UUID;
*/ */
public class PlayerActivity extends Activity implements SurfaceHolder.Callback, OnClickListener, public class PlayerActivity extends Activity implements SurfaceHolder.Callback, OnClickListener,
ExoPlayer.EventListener, SimpleExoPlayer.VideoListener, SimpleExoPlayer.CaptionListener, ExoPlayer.EventListener, SimpleExoPlayer.VideoListener, SimpleExoPlayer.CaptionListener,
SimpleExoPlayer.Id3MetadataListener, DefaultTrackSelector.EventListener { SimpleExoPlayer.Id3MetadataListener, MappingTrackSelector.EventListener {
public static final String DRM_SCHEME_UUID_EXTRA = "drm_scheme_uuid"; public static final String DRM_SCHEME_UUID_EXTRA = "drm_scheme_uuid";
public static final String DRM_CONTENT_ID_EXTRA = "drm_content_id"; public static final String DRM_CONTENT_ID_EXTRA = "drm_content_id";
...@@ -130,7 +130,7 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback, ...@@ -130,7 +130,7 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback,
private DataSourceFactory dataSourceFactory; private DataSourceFactory dataSourceFactory;
private SimpleExoPlayer player; private SimpleExoPlayer player;
private DefaultTrackSelector trackSelector; private MappingTrackSelector trackSelector;
private TrackSelectionHelper trackSelectionHelper; private TrackSelectionHelper trackSelectionHelper;
private DebugTextViewHelper debugViewHelper; private DebugTextViewHelper debugViewHelper;
private BandwidthMeter bandwidthMeter; private BandwidthMeter bandwidthMeter;
...@@ -272,7 +272,7 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback, ...@@ -272,7 +272,7 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback,
} }
eventLogger = new EventLogger(); eventLogger = new EventLogger();
eventLogger.startSession(); eventLogger.startSession();
trackSelector = new DefaultTrackSelector(new DefaultTrackSelectionPolicy(), mainHandler); trackSelector = new DefaultTrackSelector(mainHandler);
trackSelector.addListener(this); trackSelector.addListener(this);
trackSelector.addListener(eventLogger); trackSelector.addListener(eventLogger);
trackSelectionHelper = new TrackSelectionHelper(trackSelector); trackSelectionHelper = new TrackSelectionHelper(trackSelector);
...@@ -490,7 +490,7 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback, ...@@ -490,7 +490,7 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback,
shutterView.setVisibility(View.GONE); shutterView.setVisibility(View.GONE);
} }
// DefaultTrackSelector.EventListener implementation // MappingTrackSelector.EventListener implementation
@Override @Override
public void onTracksChanged(TrackInfo trackInfo) { public void onTracksChanged(TrackInfo trackInfo) {
......
...@@ -15,13 +15,13 @@ ...@@ -15,13 +15,13 @@
*/ */
package com.google.android.exoplayer2.demo; package com.google.android.exoplayer2.demo;
import com.google.android.exoplayer2.DefaultTrackSelector;
import com.google.android.exoplayer2.DefaultTrackSelector.TrackInfo;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.Renderer;
import com.google.android.exoplayer2.TrackSelection;
import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroup;
import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.source.TrackGroupArray;
import com.google.android.exoplayer2.trackselection.MappingTrackSelector;
import com.google.android.exoplayer2.trackselection.MappingTrackSelector.TrackInfo;
import com.google.android.exoplayer2.trackselection.TrackSelection;
import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.MimeTypes;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
...@@ -44,7 +44,7 @@ import java.util.Locale; ...@@ -44,7 +44,7 @@ import java.util.Locale;
/* package */ final class TrackSelectionHelper implements View.OnClickListener, /* package */ final class TrackSelectionHelper implements View.OnClickListener,
DialogInterface.OnClickListener { DialogInterface.OnClickListener {
private final DefaultTrackSelector selector; private final MappingTrackSelector selector;
private TrackInfo trackInfo; private TrackInfo trackInfo;
private int rendererIndex; private int rendererIndex;
...@@ -60,7 +60,7 @@ import java.util.Locale; ...@@ -60,7 +60,7 @@ import java.util.Locale;
/** /**
* @param selector The track selector. * @param selector The track selector.
*/ */
public TrackSelectionHelper(DefaultTrackSelector selector) { public TrackSelectionHelper(MappingTrackSelector selector) {
this.selector = selector; this.selector = selector;
} }
......
...@@ -62,7 +62,7 @@ public final class FfmpegAudioRenderer extends AudioDecoderRenderer { ...@@ -62,7 +62,7 @@ public final class FfmpegAudioRenderer extends AudioDecoderRenderer {
} }
@Override @Override
protected int supportsFormat(Format format) { public int supportsFormat(Format format) {
if (!FfmpegDecoder.IS_AVAILABLE) { if (!FfmpegDecoder.IS_AVAILABLE) {
return FORMAT_UNSUPPORTED_TYPE; return FORMAT_UNSUPPORTED_TYPE;
} }
......
...@@ -15,14 +15,13 @@ ...@@ -15,14 +15,13 @@
*/ */
package com.google.android.exoplayer2.ext.flac; package com.google.android.exoplayer2.ext.flac;
import com.google.android.exoplayer2.DefaultTrackSelectionPolicy;
import com.google.android.exoplayer2.DefaultTrackSelector;
import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.ExoPlaybackException;
import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.ExoPlayerFactory; import com.google.android.exoplayer2.ExoPlayerFactory;
import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.Renderer;
import com.google.android.exoplayer2.extractor.mkv.MatroskaExtractor; import com.google.android.exoplayer2.extractor.mkv.MatroskaExtractor;
import com.google.android.exoplayer2.source.ExtractorMediaSource; import com.google.android.exoplayer2.source.ExtractorMediaSource;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory;
import android.content.Context; import android.content.Context;
...@@ -72,8 +71,7 @@ public class FlacPlaybackTest extends InstrumentationTestCase { ...@@ -72,8 +71,7 @@ public class FlacPlaybackTest extends InstrumentationTestCase {
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(null);
new DefaultTrackSelectionPolicy(), null);
player = ExoPlayerFactory.newInstance(new Renderer[] {audioRenderer}, trackSelector); player = ExoPlayerFactory.newInstance(new Renderer[] {audioRenderer}, trackSelector);
player.addListener(this); player.addListener(this);
ExtractorMediaSource mediaSource = new ExtractorMediaSource( ExtractorMediaSource mediaSource = new ExtractorMediaSource(
......
...@@ -65,7 +65,7 @@ public class LibflacAudioRenderer extends AudioDecoderRenderer { ...@@ -65,7 +65,7 @@ public class LibflacAudioRenderer extends AudioDecoderRenderer {
} }
@Override @Override
protected int supportsFormat(Format format) { public int supportsFormat(Format format) {
return isLibflacAvailable() && MimeTypes.AUDIO_FLAC.equalsIgnoreCase(format.sampleMimeType) return isLibflacAvailable() && MimeTypes.AUDIO_FLAC.equalsIgnoreCase(format.sampleMimeType)
? FORMAT_HANDLED : FORMAT_UNSUPPORTED_TYPE; ? FORMAT_HANDLED : FORMAT_UNSUPPORTED_TYPE;
} }
......
...@@ -15,14 +15,13 @@ ...@@ -15,14 +15,13 @@
*/ */
package com.google.android.exoplayer2.ext.opus; package com.google.android.exoplayer2.ext.opus;
import com.google.android.exoplayer2.DefaultTrackSelectionPolicy;
import com.google.android.exoplayer2.DefaultTrackSelector;
import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.ExoPlaybackException;
import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.ExoPlayerFactory; import com.google.android.exoplayer2.ExoPlayerFactory;
import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.Renderer;
import com.google.android.exoplayer2.extractor.mkv.MatroskaExtractor; import com.google.android.exoplayer2.extractor.mkv.MatroskaExtractor;
import com.google.android.exoplayer2.source.ExtractorMediaSource; import com.google.android.exoplayer2.source.ExtractorMediaSource;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory;
import android.content.Context; import android.content.Context;
...@@ -72,8 +71,7 @@ public class OpusPlaybackTest extends InstrumentationTestCase { ...@@ -72,8 +71,7 @@ public class OpusPlaybackTest extends InstrumentationTestCase {
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(null);
new DefaultTrackSelectionPolicy(), null);
player = ExoPlayerFactory.newInstance(new Renderer[] {audioRenderer}, trackSelector); player = ExoPlayerFactory.newInstance(new Renderer[] {audioRenderer}, trackSelector);
player.addListener(this); player.addListener(this);
ExtractorMediaSource mediaSource = new ExtractorMediaSource( ExtractorMediaSource mediaSource = new ExtractorMediaSource(
......
...@@ -73,7 +73,7 @@ public final class LibopusAudioRenderer extends AudioDecoderRenderer { ...@@ -73,7 +73,7 @@ public final class LibopusAudioRenderer extends AudioDecoderRenderer {
} }
@Override @Override
protected int supportsFormat(Format format) { public int supportsFormat(Format format) {
return isLibopusAvailable() && MimeTypes.AUDIO_OPUS.equalsIgnoreCase(format.sampleMimeType) return isLibopusAvailable() && MimeTypes.AUDIO_OPUS.equalsIgnoreCase(format.sampleMimeType)
? FORMAT_HANDLED : FORMAT_UNSUPPORTED_TYPE; ? FORMAT_HANDLED : FORMAT_UNSUPPORTED_TYPE;
} }
......
...@@ -15,14 +15,13 @@ ...@@ -15,14 +15,13 @@
*/ */
package com.google.android.exoplayer2.ext.vp9; package com.google.android.exoplayer2.ext.vp9;
import com.google.android.exoplayer2.DefaultTrackSelectionPolicy;
import com.google.android.exoplayer2.DefaultTrackSelector;
import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.ExoPlaybackException;
import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.ExoPlayerFactory; import com.google.android.exoplayer2.ExoPlayerFactory;
import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.Renderer;
import com.google.android.exoplayer2.extractor.mkv.MatroskaExtractor; import com.google.android.exoplayer2.extractor.mkv.MatroskaExtractor;
import com.google.android.exoplayer2.source.ExtractorMediaSource; import com.google.android.exoplayer2.source.ExtractorMediaSource;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory;
import android.content.Context; import android.content.Context;
...@@ -88,8 +87,7 @@ public class VpxPlaybackTest extends InstrumentationTestCase { ...@@ -88,8 +87,7 @@ public class VpxPlaybackTest extends InstrumentationTestCase {
public void run() { public void run() {
Looper.prepare(); Looper.prepare();
LibvpxVideoRenderer videoRenderer = new LibvpxVideoRenderer(true, 0); LibvpxVideoRenderer videoRenderer = new LibvpxVideoRenderer(true, 0);
DefaultTrackSelector trackSelector = new DefaultTrackSelector( DefaultTrackSelector trackSelector = new DefaultTrackSelector(null);
new DefaultTrackSelectionPolicy(), null);
player = ExoPlayerFactory.newInstance(new Renderer[] {videoRenderer}, trackSelector); player = ExoPlayerFactory.newInstance(new Renderer[] {videoRenderer}, trackSelector);
player.addListener(this); player.addListener(this);
ExtractorMediaSource mediaSource = new ExtractorMediaSource( ExtractorMediaSource mediaSource = new ExtractorMediaSource(
......
...@@ -137,7 +137,7 @@ public final class LibvpxVideoRenderer extends Renderer { ...@@ -137,7 +137,7 @@ public final class LibvpxVideoRenderer extends Renderer {
} }
@Override @Override
protected int supportsFormat(Format format) { public int supportsFormat(Format format) {
return isLibvpxAvailable() && MimeTypes.VIDEO_VP9.equalsIgnoreCase(format.sampleMimeType) return isLibvpxAvailable() && MimeTypes.VIDEO_VP9.equalsIgnoreCase(format.sampleMimeType)
? (FORMAT_HANDLED | ADAPTIVE_SEAMLESS) : FORMAT_UNSUPPORTED_TYPE; ? (FORMAT_HANDLED | ADAPTIVE_SEAMLESS) : FORMAT_UNSUPPORTED_TYPE;
} }
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
package com.google.android.exoplayer2; package com.google.android.exoplayer2;
import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.source.TrackGroupArray;
import com.google.android.exoplayer2.trackselection.TrackSelectionArray;
import com.google.android.exoplayer2.upstream.Allocator; import com.google.android.exoplayer2.upstream.Allocator;
import com.google.android.exoplayer2.upstream.DefaultAllocator; import com.google.android.exoplayer2.upstream.DefaultAllocator;
import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.util.Util;
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
package com.google.android.exoplayer2; package com.google.android.exoplayer2;
import com.google.android.exoplayer2.drm.DrmSessionManager; import com.google.android.exoplayer2.drm.DrmSessionManager;
import com.google.android.exoplayer2.trackselection.TrackSelector;
import android.content.Context; import android.content.Context;
import android.os.Looper; import android.os.Looper;
......
...@@ -17,6 +17,7 @@ package com.google.android.exoplayer2; ...@@ -17,6 +17,7 @@ package com.google.android.exoplayer2;
import com.google.android.exoplayer2.ExoPlayerImplInternal.PlaybackInfo; import com.google.android.exoplayer2.ExoPlayerImplInternal.PlaybackInfo;
import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.trackselection.TrackSelector;
import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Assertions;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
......
...@@ -16,11 +16,14 @@ ...@@ -16,11 +16,14 @@
package com.google.android.exoplayer2; package com.google.android.exoplayer2;
import com.google.android.exoplayer2.ExoPlayer.ExoPlayerMessage; import com.google.android.exoplayer2.ExoPlayer.ExoPlayerMessage;
import com.google.android.exoplayer2.TrackSelector.InvalidationListener;
import com.google.android.exoplayer2.source.MediaPeriod; import com.google.android.exoplayer2.source.MediaPeriod;
import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.source.SampleStream; import com.google.android.exoplayer2.source.SampleStream;
import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.source.TrackGroupArray;
import com.google.android.exoplayer2.trackselection.TrackSelection;
import com.google.android.exoplayer2.trackselection.TrackSelectionArray;
import com.google.android.exoplayer2.trackselection.TrackSelector;
import com.google.android.exoplayer2.trackselection.TrackSelector.InvalidationListener;
import com.google.android.exoplayer2.util.PriorityHandlerThread; import com.google.android.exoplayer2.util.PriorityHandlerThread;
import com.google.android.exoplayer2.util.TraceUtil; import com.google.android.exoplayer2.util.TraceUtil;
import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.util.Util;
......
...@@ -17,6 +17,8 @@ package com.google.android.exoplayer2; ...@@ -17,6 +17,8 @@ package com.google.android.exoplayer2;
import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroup;
import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.source.TrackGroupArray;
import com.google.android.exoplayer2.trackselection.TrackSelection;
import com.google.android.exoplayer2.trackselection.TrackSelectionArray;
import com.google.android.exoplayer2.upstream.Allocator; import com.google.android.exoplayer2.upstream.Allocator;
/** /**
......
...@@ -222,12 +222,12 @@ public abstract class MediaCodecRenderer extends Renderer { ...@@ -222,12 +222,12 @@ public abstract class MediaCodecRenderer extends Renderer {
} }
@Override @Override
protected final int supportsMixedMimeTypeAdaptation() throws ExoPlaybackException { public final int supportsMixedMimeTypeAdaptation() throws ExoPlaybackException {
return ADAPTIVE_NOT_SEAMLESS; return ADAPTIVE_NOT_SEAMLESS;
} }
@Override @Override
protected final int supportsFormat(Format format) throws ExoPlaybackException { public final int supportsFormat(Format format) throws ExoPlaybackException {
try { try {
return supportsFormat(mediaCodecSelector, format); return supportsFormat(mediaCodecSelector, format);
} catch (DecoderQueryException e) { } catch (DecoderQueryException e) {
......
...@@ -165,7 +165,7 @@ public abstract class Renderer implements ExoPlayerComponent { ...@@ -165,7 +165,7 @@ public abstract class Renderer implements ExoPlayerComponent {
* {@link #ADAPTIVE_NOT_SUPPORTED}. * {@link #ADAPTIVE_NOT_SUPPORTED}.
* @throws ExoPlaybackException If an error occurs. * @throws ExoPlaybackException If an error occurs.
*/ */
protected int supportsMixedMimeTypeAdaptation() throws ExoPlaybackException { public int supportsMixedMimeTypeAdaptation() throws ExoPlaybackException {
return ADAPTIVE_NOT_SUPPORTED; return ADAPTIVE_NOT_SUPPORTED;
} }
...@@ -408,7 +408,7 @@ public abstract class Renderer implements ExoPlayerComponent { ...@@ -408,7 +408,7 @@ public abstract class Renderer implements ExoPlayerComponent {
* @return The extent to which the renderer is capable of supporting the given format. * @return The extent to which the renderer is capable of supporting the given format.
* @throws ExoPlaybackException If an error occurs. * @throws ExoPlaybackException If an error occurs.
*/ */
protected abstract int supportsFormat(Format format) throws ExoPlaybackException; public abstract int supportsFormat(Format format) throws ExoPlaybackException;
/** /**
* Incrementally renders the {@link SampleStream}. * Incrementally renders the {@link SampleStream}.
......
...@@ -23,6 +23,7 @@ import com.google.android.exoplayer2.metadata.id3.Id3Parser; ...@@ -23,6 +23,7 @@ import com.google.android.exoplayer2.metadata.id3.Id3Parser;
import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.text.Cue; import com.google.android.exoplayer2.text.Cue;
import com.google.android.exoplayer2.text.TextRenderer; import com.google.android.exoplayer2.text.TextRenderer;
import com.google.android.exoplayer2.trackselection.TrackSelector;
import com.google.android.exoplayer2.upstream.BandwidthMeter; import com.google.android.exoplayer2.upstream.BandwidthMeter;
import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter; import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter;
......
/*
* Copyright (C) 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.android.exoplayer2;
import com.google.android.exoplayer2.source.TrackGroup;
import com.google.android.exoplayer2.source.TrackGroupArray;
/**
* Defines a policy for selecting the track rendered by each {@link Renderer}.
*/
public abstract class TrackSelectionPolicy {
/**
* Notified when selection parameters have changed.
*/
/* package */ interface InvalidationListener {
/**
* Invoked by a {@link TrackSelectionPolicy} when previous selections are invalidated.
*/
void invalidatePolicySelections();
}
private InvalidationListener listener;
/* package */ final void init(InvalidationListener listener) {
this.listener = listener;
}
/**
* Must be invoked by subclasses when a selection parameter has changed, invalidating previous
* selections.
*/
protected void invalidate() {
if (listener != null) {
listener.invalidatePolicySelections();
}
}
/**
* Given an array of {@link Renderer}s and a set of {@link TrackGroup}s assigned to each of
* them, provides a {@link TrackSelection} per renderer.
*
* @param renderers The available {@link Renderer}s.
* @param rendererTrackGroupArrays An array of {@link TrackGroupArray}s where each entry
* corresponds to the {@link Renderer} of equal index in {@code renderers}.
* @param rendererFormatSupports Maps every available track to a specific level of support as
* defined by the {@link Renderer} {@code FORMAT_*} constants.
* @throws ExoPlaybackException If an error occurs while selecting the tracks.
*/
protected abstract TrackSelection[] selectTracks(Renderer[] renderers,
TrackGroupArray[] rendererTrackGroupArrays, int[][][] rendererFormatSupports)
throws ExoPlaybackException;
}
...@@ -279,7 +279,6 @@ public final class VideoFrameReleaseTimeHelper { ...@@ -279,7 +279,6 @@ public final class VideoFrameReleaseTimeHelper {
} }
} }
private void createChoreographerInstanceInternal() { private void createChoreographerInstanceInternal() {
choreographer = Choreographer.getInstance(); choreographer = Choreographer.getInstance();
} }
...@@ -299,7 +298,6 @@ public final class VideoFrameReleaseTimeHelper { ...@@ -299,7 +298,6 @@ public final class VideoFrameReleaseTimeHelper {
} }
} }
} }
} }
...@@ -89,7 +89,7 @@ public final class MetadataRenderer<T> extends Renderer implements Callback { ...@@ -89,7 +89,7 @@ public final class MetadataRenderer<T> extends Renderer implements Callback {
} }
@Override @Override
protected int supportsFormat(Format format) { public int supportsFormat(Format format) {
return metadataParser.canParse(format.sampleMimeType) ? Renderer.FORMAT_HANDLED return metadataParser.canParse(format.sampleMimeType) ? Renderer.FORMAT_HANDLED
: Renderer.FORMAT_UNSUPPORTED_TYPE; : Renderer.FORMAT_UNSUPPORTED_TYPE;
} }
......
...@@ -20,7 +20,6 @@ import com.google.android.exoplayer2.DecoderInputBuffer; ...@@ -20,7 +20,6 @@ import com.google.android.exoplayer2.DecoderInputBuffer;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.FormatHolder; import com.google.android.exoplayer2.FormatHolder;
import com.google.android.exoplayer2.ParserException; import com.google.android.exoplayer2.ParserException;
import com.google.android.exoplayer2.TrackSelection;
import com.google.android.exoplayer2.extractor.DefaultExtractorInput; import com.google.android.exoplayer2.extractor.DefaultExtractorInput;
import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory; import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory;
import com.google.android.exoplayer2.extractor.DefaultTrackOutput; import com.google.android.exoplayer2.extractor.DefaultTrackOutput;
...@@ -32,6 +31,7 @@ import com.google.android.exoplayer2.extractor.ExtractorsFactory; ...@@ -32,6 +31,7 @@ import com.google.android.exoplayer2.extractor.ExtractorsFactory;
import com.google.android.exoplayer2.extractor.PositionHolder; import com.google.android.exoplayer2.extractor.PositionHolder;
import com.google.android.exoplayer2.extractor.SeekMap; import com.google.android.exoplayer2.extractor.SeekMap;
import com.google.android.exoplayer2.extractor.TrackOutput; import com.google.android.exoplayer2.extractor.TrackOutput;
import com.google.android.exoplayer2.trackselection.TrackSelection;
import com.google.android.exoplayer2.upstream.Allocator; import com.google.android.exoplayer2.upstream.Allocator;
import com.google.android.exoplayer2.upstream.BandwidthMeter; import com.google.android.exoplayer2.upstream.BandwidthMeter;
import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DataSource;
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
package com.google.android.exoplayer2.source; package com.google.android.exoplayer2.source;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.TrackSelection; import com.google.android.exoplayer2.trackselection.TrackSelection;
import com.google.android.exoplayer2.upstream.Allocator; import com.google.android.exoplayer2.upstream.Allocator;
import java.io.IOException; import java.io.IOException;
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
package com.google.android.exoplayer2.source; package com.google.android.exoplayer2.source;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.TrackSelection; import com.google.android.exoplayer2.trackselection.TrackSelection;
import com.google.android.exoplayer2.upstream.Allocator; import com.google.android.exoplayer2.upstream.Allocator;
import android.util.Pair; import android.util.Pair;
......
...@@ -19,7 +19,7 @@ import com.google.android.exoplayer2.C; ...@@ -19,7 +19,7 @@ import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.DecoderInputBuffer; import com.google.android.exoplayer2.DecoderInputBuffer;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.FormatHolder; import com.google.android.exoplayer2.FormatHolder;
import com.google.android.exoplayer2.TrackSelection; import com.google.android.exoplayer2.trackselection.TrackSelection;
import com.google.android.exoplayer2.upstream.Allocator; import com.google.android.exoplayer2.upstream.Allocator;
import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DataSource;
import com.google.android.exoplayer2.upstream.DataSourceFactory; import com.google.android.exoplayer2.upstream.DataSourceFactory;
......
...@@ -18,8 +18,6 @@ package com.google.android.exoplayer2.source.dash; ...@@ -18,8 +18,6 @@ package com.google.android.exoplayer2.source.dash;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.ParserException; import com.google.android.exoplayer2.ParserException;
import com.google.android.exoplayer2.TrackSelection;
import com.google.android.exoplayer2.chunk.ChunkSampleStream;
import com.google.android.exoplayer2.source.AdaptiveMediaSourceEventListener; import com.google.android.exoplayer2.source.AdaptiveMediaSourceEventListener;
import com.google.android.exoplayer2.source.AdaptiveMediaSourceEventListener.EventDispatcher; import com.google.android.exoplayer2.source.AdaptiveMediaSourceEventListener.EventDispatcher;
import com.google.android.exoplayer2.source.CompositeSequenceableLoader; import com.google.android.exoplayer2.source.CompositeSequenceableLoader;
...@@ -29,6 +27,7 @@ import com.google.android.exoplayer2.source.SampleStream; ...@@ -29,6 +27,7 @@ import com.google.android.exoplayer2.source.SampleStream;
import com.google.android.exoplayer2.source.SequenceableLoader; import com.google.android.exoplayer2.source.SequenceableLoader;
import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroup;
import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.source.TrackGroupArray;
import com.google.android.exoplayer2.source.chunk.ChunkSampleStream;
import com.google.android.exoplayer2.source.chunk.FormatEvaluator; import com.google.android.exoplayer2.source.chunk.FormatEvaluator;
import com.google.android.exoplayer2.source.chunk.FormatEvaluator.AdaptiveEvaluator; import com.google.android.exoplayer2.source.chunk.FormatEvaluator.AdaptiveEvaluator;
import com.google.android.exoplayer2.source.dash.mpd.AdaptationSet; import com.google.android.exoplayer2.source.dash.mpd.AdaptationSet;
...@@ -37,6 +36,7 @@ import com.google.android.exoplayer2.source.dash.mpd.MediaPresentationDescriptio ...@@ -37,6 +36,7 @@ import com.google.android.exoplayer2.source.dash.mpd.MediaPresentationDescriptio
import com.google.android.exoplayer2.source.dash.mpd.Period; import com.google.android.exoplayer2.source.dash.mpd.Period;
import com.google.android.exoplayer2.source.dash.mpd.Representation; import com.google.android.exoplayer2.source.dash.mpd.Representation;
import com.google.android.exoplayer2.source.dash.mpd.UtcTimingElement; import com.google.android.exoplayer2.source.dash.mpd.UtcTimingElement;
import com.google.android.exoplayer2.trackselection.TrackSelection;
import com.google.android.exoplayer2.upstream.Allocator; import com.google.android.exoplayer2.upstream.Allocator;
import com.google.android.exoplayer2.upstream.BandwidthMeter; import com.google.android.exoplayer2.upstream.BandwidthMeter;
import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DataSource;
......
...@@ -18,7 +18,6 @@ package com.google.android.exoplayer2.source.hls; ...@@ -18,7 +18,6 @@ package com.google.android.exoplayer2.source.hls;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.ParserException; import com.google.android.exoplayer2.ParserException;
import com.google.android.exoplayer2.TrackSelection;
import com.google.android.exoplayer2.source.AdaptiveMediaSourceEventListener; import com.google.android.exoplayer2.source.AdaptiveMediaSourceEventListener;
import com.google.android.exoplayer2.source.AdaptiveMediaSourceEventListener.EventDispatcher; import com.google.android.exoplayer2.source.AdaptiveMediaSourceEventListener.EventDispatcher;
import com.google.android.exoplayer2.source.CompositeSequenceableLoader; import com.google.android.exoplayer2.source.CompositeSequenceableLoader;
...@@ -33,6 +32,7 @@ import com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist; ...@@ -33,6 +32,7 @@ import com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist;
import com.google.android.exoplayer2.source.hls.playlist.HlsPlaylist; import com.google.android.exoplayer2.source.hls.playlist.HlsPlaylist;
import com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistParser; import com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistParser;
import com.google.android.exoplayer2.source.hls.playlist.Variant; import com.google.android.exoplayer2.source.hls.playlist.Variant;
import com.google.android.exoplayer2.trackselection.TrackSelection;
import com.google.android.exoplayer2.upstream.Allocator; import com.google.android.exoplayer2.upstream.Allocator;
import com.google.android.exoplayer2.upstream.BandwidthMeter; import com.google.android.exoplayer2.upstream.BandwidthMeter;
import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DataSource;
......
...@@ -19,7 +19,6 @@ import com.google.android.exoplayer2.C; ...@@ -19,7 +19,6 @@ import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.DecoderInputBuffer; import com.google.android.exoplayer2.DecoderInputBuffer;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.FormatHolder; import com.google.android.exoplayer2.FormatHolder;
import com.google.android.exoplayer2.TrackSelection;
import com.google.android.exoplayer2.extractor.DefaultTrackOutput; import com.google.android.exoplayer2.extractor.DefaultTrackOutput;
import com.google.android.exoplayer2.extractor.DefaultTrackOutput.UpstreamFormatChangedListener; import com.google.android.exoplayer2.extractor.DefaultTrackOutput.UpstreamFormatChangedListener;
import com.google.android.exoplayer2.extractor.ExtractorOutput; import com.google.android.exoplayer2.extractor.ExtractorOutput;
...@@ -31,6 +30,7 @@ import com.google.android.exoplayer2.source.TrackGroup; ...@@ -31,6 +30,7 @@ import com.google.android.exoplayer2.source.TrackGroup;
import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.source.TrackGroupArray;
import com.google.android.exoplayer2.source.chunk.Chunk; import com.google.android.exoplayer2.source.chunk.Chunk;
import com.google.android.exoplayer2.source.chunk.ChunkHolder; import com.google.android.exoplayer2.source.chunk.ChunkHolder;
import com.google.android.exoplayer2.trackselection.TrackSelection;
import com.google.android.exoplayer2.upstream.Allocator; import com.google.android.exoplayer2.upstream.Allocator;
import com.google.android.exoplayer2.upstream.Loader; import com.google.android.exoplayer2.upstream.Loader;
import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Assertions;
......
...@@ -18,8 +18,6 @@ package com.google.android.exoplayer2.source.smoothstreaming; ...@@ -18,8 +18,6 @@ package com.google.android.exoplayer2.source.smoothstreaming;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.ParserException; import com.google.android.exoplayer2.ParserException;
import com.google.android.exoplayer2.TrackSelection;
import com.google.android.exoplayer2.chunk.ChunkSampleStream;
import com.google.android.exoplayer2.extractor.mp4.TrackEncryptionBox; import com.google.android.exoplayer2.extractor.mp4.TrackEncryptionBox;
import com.google.android.exoplayer2.source.AdaptiveMediaSourceEventListener; import com.google.android.exoplayer2.source.AdaptiveMediaSourceEventListener;
import com.google.android.exoplayer2.source.AdaptiveMediaSourceEventListener.EventDispatcher; import com.google.android.exoplayer2.source.AdaptiveMediaSourceEventListener.EventDispatcher;
...@@ -30,10 +28,12 @@ import com.google.android.exoplayer2.source.SampleStream; ...@@ -30,10 +28,12 @@ import com.google.android.exoplayer2.source.SampleStream;
import com.google.android.exoplayer2.source.SequenceableLoader; import com.google.android.exoplayer2.source.SequenceableLoader;
import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroup;
import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.source.TrackGroupArray;
import com.google.android.exoplayer2.source.chunk.ChunkSampleStream;
import com.google.android.exoplayer2.source.chunk.FormatEvaluator; import com.google.android.exoplayer2.source.chunk.FormatEvaluator;
import com.google.android.exoplayer2.source.chunk.FormatEvaluator.AdaptiveEvaluator; import com.google.android.exoplayer2.source.chunk.FormatEvaluator.AdaptiveEvaluator;
import com.google.android.exoplayer2.source.smoothstreaming.SmoothStreamingManifest.ProtectionElement; import com.google.android.exoplayer2.source.smoothstreaming.SmoothStreamingManifest.ProtectionElement;
import com.google.android.exoplayer2.source.smoothstreaming.SmoothStreamingManifest.StreamElement; import com.google.android.exoplayer2.source.smoothstreaming.SmoothStreamingManifest.StreamElement;
import com.google.android.exoplayer2.trackselection.TrackSelection;
import com.google.android.exoplayer2.upstream.Allocator; import com.google.android.exoplayer2.upstream.Allocator;
import com.google.android.exoplayer2.upstream.BandwidthMeter; import com.google.android.exoplayer2.upstream.BandwidthMeter;
import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DataSource;
......
...@@ -108,7 +108,7 @@ public final class TextRenderer extends Renderer implements Callback { ...@@ -108,7 +108,7 @@ public final class TextRenderer extends Renderer implements Callback {
} }
@Override @Override
protected int supportsFormat(Format format) { public int supportsFormat(Format format) {
return parserFactory.supportsFormat(format) ? Renderer.FORMAT_HANDLED return parserFactory.supportsFormat(format) ? Renderer.FORMAT_HANDLED
: (MimeTypes.isText(format.sampleMimeType) ? FORMAT_UNSUPPORTED_SUBTYPE : (MimeTypes.isText(format.sampleMimeType) ? FORMAT_UNSUPPORTED_SUBTYPE
: FORMAT_UNSUPPORTED_TYPE); : FORMAT_UNSUPPORTED_TYPE);
......
...@@ -13,18 +13,24 @@ ...@@ -13,18 +13,24 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package com.google.android.exoplayer2; package com.google.android.exoplayer2.trackselection;
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.ExoPlaybackException;
import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.Renderer;
import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroup;
import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.source.TrackGroupArray;
import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.util.Util;
import android.os.Handler;
import java.util.Locale; import java.util.Locale;
/** /**
* A {@link TrackSelectionPolicy} that allows configuration of common parameters. * A {@link MappingTrackSelector} that allows configuration of common parameters.
*/ */
public class DefaultTrackSelectionPolicy extends TrackSelectionPolicy { public class DefaultTrackSelector extends MappingTrackSelector {
private static final int[] NO_TRACKS = new int[0]; private static final int[] NO_TRACKS = new int[0];
...@@ -35,7 +41,8 @@ public class DefaultTrackSelectionPolicy extends TrackSelectionPolicy { ...@@ -35,7 +41,8 @@ public class DefaultTrackSelectionPolicy extends TrackSelectionPolicy {
private int maxVideoHeight; private int maxVideoHeight;
private boolean exceedVideoConstraintsIfNecessary; private boolean exceedVideoConstraintsIfNecessary;
public DefaultTrackSelectionPolicy() { public DefaultTrackSelector(Handler eventHandler) {
super(eventHandler);
allowNonSeamlessAdaptiveness = true; allowNonSeamlessAdaptiveness = true;
exceedVideoConstraintsIfNecessary = true; exceedVideoConstraintsIfNecessary = true;
maxVideoWidth = Integer.MAX_VALUE; maxVideoWidth = Integer.MAX_VALUE;
...@@ -124,7 +131,7 @@ public class DefaultTrackSelectionPolicy extends TrackSelectionPolicy { ...@@ -124,7 +131,7 @@ public class DefaultTrackSelectionPolicy extends TrackSelectionPolicy {
// TrackSelectionPolicy implementation. // TrackSelectionPolicy implementation.
@Override @Override
public TrackSelection[] selectTracks(Renderer[] renderers, protected TrackSelection[] selectTracks(Renderer[] renderers,
TrackGroupArray[] rendererTrackGroupArrays, int[][][] rendererFormatSupports) TrackGroupArray[] rendererTrackGroupArrays, int[][][] rendererFormatSupports)
throws ExoPlaybackException { throws ExoPlaybackException {
// Make a track selection for each renderer. // Make a track selection for each renderer.
......
...@@ -13,8 +13,11 @@ ...@@ -13,8 +13,11 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package com.google.android.exoplayer2; package com.google.android.exoplayer2.trackselection;
import com.google.android.exoplayer2.ExoPlaybackException;
import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.Renderer;
import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroup;
import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.source.TrackGroupArray;
import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Assertions;
...@@ -31,13 +34,14 @@ import java.util.Map; ...@@ -31,13 +34,14 @@ import java.util.Map;
import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.CopyOnWriteArraySet;
/** /**
* A {@link TrackSelector} suitable for a wide range of use cases. * Base class for {@link TrackSelector}s that first establish a mapping between {@link TrackGroup}s
* and {@link Renderer}s, and then from the mapping create {@link TrackSelection}s for each of the
* {@link Renderer}s.
*/ */
public final class DefaultTrackSelector extends TrackSelector implements public abstract class MappingTrackSelector extends TrackSelector {
TrackSelectionPolicy.InvalidationListener{
/** /**
* Interface definition for a callback to be notified of {@link DefaultTrackSelector} events. * Interface definition for a callback to be notified of {@link MappingTrackSelector} events.
*/ */
public interface EventListener { public interface EventListener {
...@@ -54,22 +58,18 @@ public final class DefaultTrackSelector extends TrackSelector implements ...@@ -54,22 +58,18 @@ public final class DefaultTrackSelector extends TrackSelector implements
private final CopyOnWriteArraySet<EventListener> listeners; private final CopyOnWriteArraySet<EventListener> listeners;
private final SparseArray<Map<TrackGroupArray, TrackSelection>> trackSelectionOverrides; private final SparseArray<Map<TrackGroupArray, TrackSelection>> trackSelectionOverrides;
private final SparseBooleanArray rendererDisabledFlags; private final SparseBooleanArray rendererDisabledFlags;
private final TrackSelectionPolicy trackSelectionPolicy;
private TrackInfo activeTrackInfo; private TrackInfo activeTrackInfo;
/** /**
* @param trackSelectionPolicy Defines the policy for track selection.
* @param eventHandler A handler to use when delivering events to listeners added via * @param eventHandler A handler to use when delivering events to listeners added via
* {@link #addListener(EventListener)}. * {@link #addListener(EventListener)}.
*/ */
public DefaultTrackSelector(TrackSelectionPolicy trackSelectionPolicy, Handler eventHandler) { public MappingTrackSelector(Handler eventHandler) {
this.trackSelectionPolicy = Assertions.checkNotNull(trackSelectionPolicy);
this.eventHandler = eventHandler; this.eventHandler = eventHandler;
this.listeners = new CopyOnWriteArraySet<>(); this.listeners = new CopyOnWriteArraySet<>();
trackSelectionOverrides = new SparseArray<>(); trackSelectionOverrides = new SparseArray<>();
rendererDisabledFlags = new SparseBooleanArray(); rendererDisabledFlags = new SparseBooleanArray();
trackSelectionPolicy.init(this);
} }
/** /**
...@@ -78,7 +78,7 @@ public final class DefaultTrackSelector extends TrackSelector implements ...@@ -78,7 +78,7 @@ public final class DefaultTrackSelector extends TrackSelector implements
* *
* @param listener The listener to register. * @param listener The listener to register.
*/ */
public void addListener(EventListener listener) { public final void addListener(EventListener listener) {
Assertions.checkState(eventHandler != null); Assertions.checkState(eventHandler != null);
listeners.add(listener); listeners.add(listener);
} }
...@@ -88,7 +88,7 @@ public final class DefaultTrackSelector extends TrackSelector implements ...@@ -88,7 +88,7 @@ public final class DefaultTrackSelector extends TrackSelector implements
* *
* @param listener The listener to unregister. * @param listener The listener to unregister.
*/ */
public void removeListener(EventListener listener) { public final void removeListener(EventListener listener) {
listeners.remove(listener); listeners.remove(listener);
} }
...@@ -97,7 +97,7 @@ public final class DefaultTrackSelector extends TrackSelector implements ...@@ -97,7 +97,7 @@ public final class DefaultTrackSelector extends TrackSelector implements
* *
* @return Contains the current tracks and track selection information. * @return Contains the current tracks and track selection information.
*/ */
public TrackInfo getTrackInfo() { public final TrackInfo getTrackInfo() {
return activeTrackInfo; return activeTrackInfo;
} }
...@@ -107,7 +107,7 @@ public final class DefaultTrackSelector extends TrackSelector implements ...@@ -107,7 +107,7 @@ public final class DefaultTrackSelector extends TrackSelector implements
* @param rendererIndex The renderer index. * @param rendererIndex The renderer index.
* @param disabled True if the renderer is disabled. False otherwise. * @param disabled True if the renderer is disabled. False otherwise.
*/ */
public void setRendererDisabled(int rendererIndex, boolean disabled) { public final void setRendererDisabled(int rendererIndex, boolean disabled) {
if (rendererDisabledFlags.get(rendererIndex) == disabled) { if (rendererDisabledFlags.get(rendererIndex) == disabled) {
// The disabled flag is unchanged. // The disabled flag is unchanged.
return; return;
...@@ -122,7 +122,7 @@ public final class DefaultTrackSelector extends TrackSelector implements ...@@ -122,7 +122,7 @@ public final class DefaultTrackSelector extends TrackSelector implements
* @param rendererIndex The renderer index. * @param rendererIndex The renderer index.
* @return True if the renderer is disabled. False otherwise. * @return True if the renderer is disabled. False otherwise.
*/ */
public boolean getRendererDisabled(int rendererIndex) { public final boolean getRendererDisabled(int rendererIndex) {
return rendererDisabledFlags.get(rendererIndex); return rendererDisabledFlags.get(rendererIndex);
} }
...@@ -144,7 +144,7 @@ public final class DefaultTrackSelector extends TrackSelector implements ...@@ -144,7 +144,7 @@ public final class DefaultTrackSelector extends TrackSelector implements
*/ */
// TODO - Don't allow overrides that select unsupported tracks, unless some flag has been // TODO - Don't allow overrides that select unsupported tracks, unless some flag has been
// explicitly set by the user to indicate that they want this. // explicitly set by the user to indicate that they want this.
public void setSelectionOverride(int rendererIndex, TrackGroupArray groups, public final void setSelectionOverride(int rendererIndex, TrackGroupArray groups,
TrackSelection override) { TrackSelection override) {
Map<TrackGroupArray, TrackSelection> overrides = trackSelectionOverrides.get(rendererIndex); Map<TrackGroupArray, TrackSelection> overrides = trackSelectionOverrides.get(rendererIndex);
if (overrides == null) { if (overrides == null) {
...@@ -166,7 +166,7 @@ public final class DefaultTrackSelector extends TrackSelector implements ...@@ -166,7 +166,7 @@ public final class DefaultTrackSelector extends TrackSelector implements
* @param groups The {@link TrackGroupArray}. * @param groups The {@link TrackGroupArray}.
* @return True if there is an override. False otherwise. * @return True if there is an override. False otherwise.
*/ */
public boolean hasSelectionOverride(int rendererIndex, TrackGroupArray groups) { public final boolean hasSelectionOverride(int rendererIndex, TrackGroupArray groups) {
Map<TrackGroupArray, TrackSelection> overrides = trackSelectionOverrides.get(rendererIndex); Map<TrackGroupArray, TrackSelection> overrides = trackSelectionOverrides.get(rendererIndex);
return overrides != null && overrides.containsKey(groups); return overrides != null && overrides.containsKey(groups);
} }
...@@ -177,7 +177,7 @@ public final class DefaultTrackSelector extends TrackSelector implements ...@@ -177,7 +177,7 @@ public final class DefaultTrackSelector extends TrackSelector implements
* @param rendererIndex The renderer index. * @param rendererIndex The renderer index.
* @param groups The {@link TrackGroupArray} for which the override should be cleared. * @param groups The {@link TrackGroupArray} for which the override should be cleared.
*/ */
public void clearSelectionOverride(int rendererIndex, TrackGroupArray groups) { public final void clearSelectionOverride(int rendererIndex, TrackGroupArray groups) {
Map<TrackGroupArray, TrackSelection> overrides = trackSelectionOverrides.get(rendererIndex); Map<TrackGroupArray, TrackSelection> overrides = trackSelectionOverrides.get(rendererIndex);
if (overrides == null || !overrides.containsKey(groups)) { if (overrides == null || !overrides.containsKey(groups)) {
// Nothing to clear. // Nothing to clear.
...@@ -195,7 +195,7 @@ public final class DefaultTrackSelector extends TrackSelector implements ...@@ -195,7 +195,7 @@ public final class DefaultTrackSelector extends TrackSelector implements
* *
* @param rendererIndex The renderer index. * @param rendererIndex The renderer index.
*/ */
public void clearSelectionOverrides(int rendererIndex) { public final void clearSelectionOverrides(int rendererIndex) {
Map<TrackGroupArray, TrackSelection> overrides = trackSelectionOverrides.get(rendererIndex); Map<TrackGroupArray, TrackSelection> overrides = trackSelectionOverrides.get(rendererIndex);
if (overrides == null || overrides.isEmpty()) { if (overrides == null || overrides.isEmpty()) {
// Nothing to clear. // Nothing to clear.
...@@ -208,7 +208,7 @@ public final class DefaultTrackSelector extends TrackSelector implements ...@@ -208,7 +208,7 @@ public final class DefaultTrackSelector extends TrackSelector implements
/** /**
* Clears all track selection overrides. * Clears all track selection overrides.
*/ */
public void clearSelectionOverrides() { public final void clearSelectionOverrides() {
if (trackSelectionOverrides.size() == 0) { if (trackSelectionOverrides.size() == 0) {
// Nothing to clear. // Nothing to clear.
return; return;
...@@ -217,24 +217,16 @@ public final class DefaultTrackSelector extends TrackSelector implements ...@@ -217,24 +217,16 @@ public final class DefaultTrackSelector extends TrackSelector implements
invalidate(); invalidate();
} }
/**
* Invoked when the {@link TrackSelectionPolicy} has changed.
*/
@Override
public void invalidatePolicySelections() {
invalidate();
}
// TrackSelector implementation. // TrackSelector implementation.
@Override @Override
protected void onSelectionActivated(Object selectionInfo) { public final void onSelectionActivated(Object selectionInfo) {
activeTrackInfo = (TrackInfo) selectionInfo; activeTrackInfo = (TrackInfo) selectionInfo;
notifyTrackInfoChanged(activeTrackInfo); notifyTrackInfoChanged(activeTrackInfo);
} }
@Override @Override
protected Pair<TrackSelectionArray, Object> selectTracks(Renderer[] renderers, public final Pair<TrackSelectionArray, Object> selectTracks(Renderer[] renderers,
TrackGroupArray trackGroups) throws ExoPlaybackException { TrackGroupArray trackGroups) throws ExoPlaybackException {
// Structures into which data will be written during the selection. The extra item at the end // Structures into which data will be written during the selection. The extra item at the end
// of each array is to store data associated with track groups that cannot be associated with // of each array is to store data associated with track groups that cannot be associated with
...@@ -280,8 +272,8 @@ public final class DefaultTrackSelector extends TrackSelector implements ...@@ -280,8 +272,8 @@ public final class DefaultTrackSelector extends TrackSelector implements
TrackGroupArray unassociatedTrackGroupArray = new TrackGroupArray( TrackGroupArray unassociatedTrackGroupArray = new TrackGroupArray(
Arrays.copyOf(rendererTrackGroups[renderers.length], unassociatedTrackGroupCount)); Arrays.copyOf(rendererTrackGroups[renderers.length], unassociatedTrackGroupCount));
TrackSelection[] rendererTrackSelections = trackSelectionPolicy.selectTracks(renderers, TrackSelection[] rendererTrackSelections = selectTracks(renderers, rendererTrackGroupArrays,
rendererTrackGroupArrays, rendererFormatSupports); rendererFormatSupports);
// Apply track disabling and overriding. // Apply track disabling and overriding.
for (int i = 0; i < renderers.length; i++) { for (int i = 0; i < renderers.length; i++) {
...@@ -318,6 +310,21 @@ public final class DefaultTrackSelector extends TrackSelector implements ...@@ -318,6 +310,21 @@ public final class DefaultTrackSelector extends TrackSelector implements
} }
/** /**
* Given an array of {@link Renderer}s and a set of {@link TrackGroup}s mapped to each of
* them, provides a {@link TrackSelection} per renderer.
*
* @param renderers The available {@link Renderer}s.
* @param rendererTrackGroupArrays An array of {@link TrackGroupArray}s where each entry
* corresponds to the {@link Renderer} of equal index in {@code renderers}.
* @param rendererFormatSupports Maps every available track to a specific level of support as
* defined by the {@link Renderer} {@code FORMAT_*} constants.
* @throws ExoPlaybackException If an error occurs while selecting the tracks.
*/
protected abstract TrackSelection[] selectTracks(Renderer[] renderers,
TrackGroupArray[] rendererTrackGroupArrays, int[][][] rendererFormatSupports)
throws ExoPlaybackException;
/**
* Finds the renderer to which the provided {@link TrackGroup} should be associated. * Finds the renderer to which the provided {@link TrackGroup} should be associated.
* <p> * <p>
* A {@link TrackGroup} is associated to a renderer that reports * A {@link TrackGroup} is associated to a renderer that reports
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package com.google.android.exoplayer2; package com.google.android.exoplayer2.trackselection;
import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroup;
import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Assertions;
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package com.google.android.exoplayer2; package com.google.android.exoplayer2.trackselection;
import java.util.Arrays; import java.util.Arrays;
......
...@@ -13,8 +13,10 @@ ...@@ -13,8 +13,10 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package com.google.android.exoplayer2; package com.google.android.exoplayer2.trackselection;
import com.google.android.exoplayer2.ExoPlaybackException;
import com.google.android.exoplayer2.Renderer;
import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.source.TrackGroupArray;
import android.util.Pair; import android.util.Pair;
...@@ -27,7 +29,7 @@ public abstract class TrackSelector { ...@@ -27,7 +29,7 @@ public abstract class TrackSelector {
/** /**
* Notified when previous selections by a {@link TrackSelector} are no longer valid. * Notified when previous selections by a {@link TrackSelector} are no longer valid.
*/ */
/* package */ interface InvalidationListener { public interface InvalidationListener {
/** /**
* Invoked by a {@link TrackSelector} when previous selections are no longer valid. * Invoked by a {@link TrackSelector} when previous selections are no longer valid.
...@@ -38,17 +40,13 @@ public abstract class TrackSelector { ...@@ -38,17 +40,13 @@ public abstract class TrackSelector {
private InvalidationListener listener; private InvalidationListener listener;
/* package */ void init(InvalidationListener listener) {
this.listener = listener;
}
/** /**
* Invalidates all previously generated track selections. * Initializes the selector.
*
* @param listener A listener for the selector.
*/ */
protected final void invalidate() { public final void init(InvalidationListener listener) {
if (listener != null) { this.listener = listener;
listener.onTrackSelectionsInvalidated();
}
} }
/** /**
...@@ -65,7 +63,7 @@ public abstract class TrackSelector { ...@@ -65,7 +63,7 @@ public abstract class TrackSelector {
* if the selection is activated. * if the selection is activated.
* @throws ExoPlaybackException If an error occurs selecting tracks. * @throws ExoPlaybackException If an error occurs selecting tracks.
*/ */
protected abstract Pair<TrackSelectionArray, Object> selectTracks(Renderer[] renderers, public abstract Pair<TrackSelectionArray, Object> selectTracks(Renderer[] renderers,
TrackGroupArray trackGroups) throws ExoPlaybackException; TrackGroupArray trackGroups) throws ExoPlaybackException;
/** /**
...@@ -74,6 +72,15 @@ public abstract class TrackSelector { ...@@ -74,6 +72,15 @@ public abstract class TrackSelector {
* *
* @param selectionInfo The opaque object associated with the selection. * @param selectionInfo The opaque object associated with the selection.
*/ */
protected abstract void onSelectionActivated(Object selectionInfo); public abstract void onSelectionActivated(Object selectionInfo);
/**
* Invalidates all previously generated track selections.
*/
protected final void invalidate() {
if (listener != null) {
listener.onTrackSelectionsInvalidated();
}
}
} }
...@@ -23,8 +23,6 @@ import com.google.android.exoplayer2.MediaCodecDecoderInfo; ...@@ -23,8 +23,6 @@ import com.google.android.exoplayer2.MediaCodecDecoderInfo;
import com.google.android.exoplayer2.MediaCodecUtil; import com.google.android.exoplayer2.MediaCodecUtil;
import com.google.android.exoplayer2.MediaCodecUtil.DecoderQueryException; import com.google.android.exoplayer2.MediaCodecUtil.DecoderQueryException;
import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.Renderer;
import com.google.android.exoplayer2.TrackSelection;
import com.google.android.exoplayer2.TrackSelectionPolicy;
import com.google.android.exoplayer2.playbacktests.util.ActionSchedule; import com.google.android.exoplayer2.playbacktests.util.ActionSchedule;
import com.google.android.exoplayer2.playbacktests.util.CodecCountersUtil; import com.google.android.exoplayer2.playbacktests.util.CodecCountersUtil;
import com.google.android.exoplayer2.playbacktests.util.ExoHostedTest; import com.google.android.exoplayer2.playbacktests.util.ExoHostedTest;
...@@ -34,6 +32,8 @@ import com.google.android.exoplayer2.source.MediaSource; ...@@ -34,6 +32,8 @@ import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroup;
import com.google.android.exoplayer2.source.TrackGroupArray; 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.trackselection.MappingTrackSelector;
import com.google.android.exoplayer2.trackselection.TrackSelection;
import com.google.android.exoplayer2.upstream.BandwidthMeter; import com.google.android.exoplayer2.upstream.BandwidthMeter;
import com.google.android.exoplayer2.upstream.DataSourceFactory; import com.google.android.exoplayer2.upstream.DataSourceFactory;
import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Assertions;
...@@ -381,7 +381,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit ...@@ -381,7 +381,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
private final Uri manifestUri; private final Uri manifestUri;
private final MetricsLogger metricsLogger; private final MetricsLogger metricsLogger;
private final boolean fullPlaybackNoSeeking; private final boolean fullPlaybackNoSeeking;
private final DashTestTrackSelectionPolicy trackSelectionPolicy; private final DashTestTrackSelector trackSelector;
private boolean needsCddLimitedRetry; private boolean needsCddLimitedRetry;
...@@ -406,7 +406,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit ...@@ -406,7 +406,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
this.manifestUri = manifestUri; this.manifestUri = manifestUri;
this.metricsLogger = metricsLogger; this.metricsLogger = metricsLogger;
this.fullPlaybackNoSeeking = fullPlaybackNoSeeking; this.fullPlaybackNoSeeking = fullPlaybackNoSeeking;
trackSelectionPolicy = new DashTestTrackSelectionPolicy(new String[] {audioFormat}, trackSelector = new DashTestTrackSelector(new String[] {audioFormat},
videoFormats, canIncludeAdditionalVideoFormats); videoFormats, canIncludeAdditionalVideoFormats);
if (actionSchedule != null) { if (actionSchedule != null) {
setSchedule(actionSchedule); setSchedule(actionSchedule);
...@@ -414,8 +414,8 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit ...@@ -414,8 +414,8 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
} }
@Override @Override
protected TrackSelectionPolicy buildTrackSelectionPolicy(HostActivity host) { protected MappingTrackSelector buildTrackSelector(HostActivity host) {
return trackSelectionPolicy; return trackSelector;
} }
@Override @Override
...@@ -463,7 +463,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit ...@@ -463,7 +463,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
CodecCountersUtil.assertConsecutiveDroppedOutputBufferLimit(VIDEO_TAG, videoCounters, CodecCountersUtil.assertConsecutiveDroppedOutputBufferLimit(VIDEO_TAG, videoCounters,
MAX_CONSECUTIVE_DROPPED_VIDEO_FRAMES); MAX_CONSECUTIVE_DROPPED_VIDEO_FRAMES);
} catch (AssertionFailedError e) { } catch (AssertionFailedError e) {
if (trackSelectionPolicy.includedAdditionalVideoFormats) { if (trackSelector.includedAdditionalVideoFormats) {
// Retry limiting to CDD mandated formats (b/28220076). // Retry limiting to CDD mandated formats (b/28220076).
Log.e(TAG, "Too many dropped or consecutive dropped frames.", e); Log.e(TAG, "Too many dropped or consecutive dropped frames.", e);
needsCddLimitedRetry = true; needsCddLimitedRetry = true;
...@@ -475,7 +475,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit ...@@ -475,7 +475,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
} }
private static final class DashTestTrackSelectionPolicy extends TrackSelectionPolicy { private static final class DashTestTrackSelector extends MappingTrackSelector {
private final String[] audioFormatIds; private final String[] audioFormatIds;
private final String[] videoFormatIds; private final String[] videoFormatIds;
...@@ -483,8 +483,9 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit ...@@ -483,8 +483,9 @@ public final class DashTest extends ActivityInstrumentationTestCase2<HostActivit
public boolean includedAdditionalVideoFormats; public boolean includedAdditionalVideoFormats;
private DashTestTrackSelectionPolicy(String[] audioFormatIds, String[] videoFormatIds, private DashTestTrackSelector(String[] audioFormatIds, String[] videoFormatIds,
boolean canIncludeAdditionalVideoFormats) { boolean canIncludeAdditionalVideoFormats) {
super(null);
this.audioFormatIds = audioFormatIds; this.audioFormatIds = audioFormatIds;
this.videoFormatIds = videoFormatIds; this.videoFormatIds = videoFormatIds;
this.canIncludeAdditionalVideoFormats = canIncludeAdditionalVideoFormats; this.canIncludeAdditionalVideoFormats = canIncludeAdditionalVideoFormats;
......
...@@ -15,8 +15,8 @@ ...@@ -15,8 +15,8 @@
*/ */
package com.google.android.exoplayer2.playbacktests.util; package com.google.android.exoplayer2.playbacktests.util;
import com.google.android.exoplayer2.DefaultTrackSelector;
import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.trackselection.MappingTrackSelector;
import android.util.Log; import android.util.Log;
...@@ -43,18 +43,18 @@ public abstract class Action { ...@@ -43,18 +43,18 @@ public abstract class Action {
* @param player The player to which the action should be applied. * @param player The player to which the action should be applied.
* @param trackSelector The track selector to which the action should be applied. * @param trackSelector The track selector to which the action should be applied.
*/ */
public final void doAction(ExoPlayer player, DefaultTrackSelector trackSelector) { public final void doAction(ExoPlayer player, MappingTrackSelector trackSelector) {
Log.i(tag, description); Log.i(tag, description);
doActionImpl(player, trackSelector); doActionImpl(player, trackSelector);
} }
/** /**
* Called by {@link #doAction(ExoPlayer, DefaultTrackSelector)} do actually perform the action. * Called by {@link #doAction(ExoPlayer, MappingTrackSelector)} do actually perform the action.
* *
* @param player The player to which the action should be applied. * @param player The player to which the action should be applied.
* @param trackSelector The track selector to which the action should be applied. * @param trackSelector The track selector to which the action should be applied.
*/ */
protected abstract void doActionImpl(ExoPlayer player, DefaultTrackSelector trackSelector); protected abstract void doActionImpl(ExoPlayer player, MappingTrackSelector trackSelector);
/** /**
* Calls {@link ExoPlayer#seekTo(long)}. * Calls {@link ExoPlayer#seekTo(long)}.
...@@ -73,7 +73,7 @@ public abstract class Action { ...@@ -73,7 +73,7 @@ public abstract class Action {
} }
@Override @Override
protected void doActionImpl(ExoPlayer player, DefaultTrackSelector trackSelector) { protected void doActionImpl(ExoPlayer player, MappingTrackSelector trackSelector) {
player.seekTo(positionMs); player.seekTo(positionMs);
} }
...@@ -92,7 +92,7 @@ public abstract class Action { ...@@ -92,7 +92,7 @@ public abstract class Action {
} }
@Override @Override
protected void doActionImpl(ExoPlayer player, DefaultTrackSelector trackSelector) { protected void doActionImpl(ExoPlayer player, MappingTrackSelector trackSelector) {
player.stop(); player.stop();
} }
...@@ -115,14 +115,14 @@ public abstract class Action { ...@@ -115,14 +115,14 @@ public abstract class Action {
} }
@Override @Override
protected void doActionImpl(ExoPlayer player, DefaultTrackSelector trackSelector) { protected void doActionImpl(ExoPlayer player, MappingTrackSelector trackSelector) {
player.setPlayWhenReady(playWhenReady); player.setPlayWhenReady(playWhenReady);
} }
} }
/** /**
* Calls {@link DefaultTrackSelector#setRendererDisabled(int, boolean)}. * Calls {@link MappingTrackSelector#setRendererDisabled(int, boolean)}.
*/ */
public static final class SetRendererDisabled extends Action { public static final class SetRendererDisabled extends Action {
...@@ -141,7 +141,7 @@ public abstract class Action { ...@@ -141,7 +141,7 @@ public abstract class Action {
} }
@Override @Override
protected void doActionImpl(ExoPlayer player, DefaultTrackSelector trackSelector) { protected void doActionImpl(ExoPlayer player, MappingTrackSelector trackSelector) {
trackSelector.setRendererDisabled(rendererIndex, disabled); trackSelector.setRendererDisabled(rendererIndex, disabled);
} }
......
...@@ -15,12 +15,12 @@ ...@@ -15,12 +15,12 @@
*/ */
package com.google.android.exoplayer2.playbacktests.util; package com.google.android.exoplayer2.playbacktests.util;
import com.google.android.exoplayer2.DefaultTrackSelector;
import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.playbacktests.util.Action.Seek; import com.google.android.exoplayer2.playbacktests.util.Action.Seek;
import com.google.android.exoplayer2.playbacktests.util.Action.SetPlayWhenReady; import com.google.android.exoplayer2.playbacktests.util.Action.SetPlayWhenReady;
import com.google.android.exoplayer2.playbacktests.util.Action.SetRendererDisabled; import com.google.android.exoplayer2.playbacktests.util.Action.SetRendererDisabled;
import com.google.android.exoplayer2.playbacktests.util.Action.Stop; import com.google.android.exoplayer2.playbacktests.util.Action.Stop;
import com.google.android.exoplayer2.trackselection.MappingTrackSelector;
import android.os.Handler; import android.os.Handler;
...@@ -45,7 +45,7 @@ public final class ActionSchedule { ...@@ -45,7 +45,7 @@ public final class ActionSchedule {
* @param trackSelector The track selector to which actions should be applied. * @param trackSelector The track selector to which actions should be applied.
* @param mainHandler A handler associated with the main thread of the host activity. * @param mainHandler A handler associated with the main thread of the host activity.
*/ */
/* package */ void start(ExoPlayer player, DefaultTrackSelector trackSelector, /* package */ void start(ExoPlayer player, MappingTrackSelector trackSelector,
Handler mainHandler) { Handler mainHandler) {
rootNode.schedule(player, trackSelector, mainHandler); rootNode.schedule(player, trackSelector, mainHandler);
} }
...@@ -167,7 +167,7 @@ public final class ActionSchedule { ...@@ -167,7 +167,7 @@ public final class ActionSchedule {
private ActionNode next; private ActionNode next;
private ExoPlayer player; private ExoPlayer player;
private DefaultTrackSelector trackSelector; private MappingTrackSelector trackSelector;
private Handler mainHandler; private Handler mainHandler;
/** /**
...@@ -196,7 +196,7 @@ public final class ActionSchedule { ...@@ -196,7 +196,7 @@ public final class ActionSchedule {
* @param trackSelector The track selector to which actions should be applied. * @param trackSelector The track selector to which actions should be applied.
* @param mainHandler A handler associated with the main thread of the host activity. * @param mainHandler A handler associated with the main thread of the host activity.
*/ */
public void schedule(ExoPlayer player, DefaultTrackSelector trackSelector, public void schedule(ExoPlayer player, MappingTrackSelector trackSelector,
Handler mainHandler) { Handler mainHandler) {
this.player = player; this.player = player;
this.trackSelector = trackSelector; this.trackSelector = trackSelector;
...@@ -224,7 +224,7 @@ public final class ActionSchedule { ...@@ -224,7 +224,7 @@ public final class ActionSchedule {
} }
@Override @Override
protected void doActionImpl(ExoPlayer player, DefaultTrackSelector trackSelector) { protected void doActionImpl(ExoPlayer player, MappingTrackSelector trackSelector) {
// Do nothing. // Do nothing.
} }
......
...@@ -16,17 +16,16 @@ ...@@ -16,17 +16,16 @@
package com.google.android.exoplayer2.playbacktests.util; package com.google.android.exoplayer2.playbacktests.util;
import com.google.android.exoplayer2.CodecCounters; import com.google.android.exoplayer2.CodecCounters;
import com.google.android.exoplayer2.DefaultTrackSelectionPolicy;
import com.google.android.exoplayer2.DefaultTrackSelector;
import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.ExoPlaybackException;
import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.ExoPlayer;
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.SimpleExoPlayer; import com.google.android.exoplayer2.SimpleExoPlayer;
import com.google.android.exoplayer2.TrackSelectionPolicy;
import com.google.android.exoplayer2.audio.AudioTrack; import com.google.android.exoplayer2.audio.AudioTrack;
import com.google.android.exoplayer2.playbacktests.util.HostActivity.HostedTest; import com.google.android.exoplayer2.playbacktests.util.HostActivity.HostedTest;
import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
import com.google.android.exoplayer2.trackselection.MappingTrackSelector;
import com.google.android.exoplayer2.upstream.BandwidthMeter; import com.google.android.exoplayer2.upstream.BandwidthMeter;
import com.google.android.exoplayer2.upstream.DataSourceFactory; import com.google.android.exoplayer2.upstream.DataSourceFactory;
import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory;
...@@ -64,7 +63,7 @@ public abstract class ExoHostedTest implements HostedTest, ExoPlayer.EventListen ...@@ -64,7 +63,7 @@ public abstract class ExoHostedTest implements HostedTest, ExoPlayer.EventListen
private ActionSchedule pendingSchedule; private ActionSchedule pendingSchedule;
private Handler actionHandler; private Handler actionHandler;
private DefaultTrackSelector trackSelector; private MappingTrackSelector trackSelector;
private SimpleExoPlayer player; private SimpleExoPlayer player;
private ExoPlaybackException playerError; private ExoPlaybackException playerError;
private boolean playerWasPrepared; private boolean playerWasPrepared;
...@@ -124,8 +123,7 @@ public abstract class ExoHostedTest implements HostedTest, ExoPlayer.EventListen ...@@ -124,8 +123,7 @@ public abstract class ExoHostedTest implements HostedTest, ExoPlayer.EventListen
@Override @Override
public final void onStart(HostActivity host, Surface surface) { public final void onStart(HostActivity host, Surface surface) {
// Build the player. // Build the player.
TrackSelectionPolicy trackSelectionPolicy = buildTrackSelectionPolicy(host); trackSelector = buildTrackSelector(host);
trackSelector = new DefaultTrackSelector(trackSelectionPolicy, null);
player = buildExoPlayer(host, surface, trackSelector); player = buildExoPlayer(host, surface, trackSelector);
DataSourceFactory dataSourceFactory = new DefaultDataSourceFactory(host, Util DataSourceFactory dataSourceFactory = new DefaultDataSourceFactory(host, Util
.getUserAgent(host, "ExoPlayerPlaybackTests")); .getUserAgent(host, "ExoPlayerPlaybackTests"));
...@@ -275,13 +273,13 @@ public abstract class ExoHostedTest implements HostedTest, ExoPlayer.EventListen ...@@ -275,13 +273,13 @@ public abstract class ExoHostedTest implements HostedTest, ExoPlayer.EventListen
// Internal logic // Internal logic
@SuppressWarnings("unused") @SuppressWarnings("unused")
protected TrackSelectionPolicy buildTrackSelectionPolicy(HostActivity host) { protected MappingTrackSelector buildTrackSelector(HostActivity host) {
return new DefaultTrackSelectionPolicy(); return new DefaultTrackSelector(null);
} }
@SuppressWarnings("unused") @SuppressWarnings("unused")
protected SimpleExoPlayer buildExoPlayer(HostActivity host, Surface surface, protected SimpleExoPlayer buildExoPlayer(HostActivity host, Surface surface,
DefaultTrackSelector trackSelector) { MappingTrackSelector trackSelector) {
SimpleExoPlayer player = ExoPlayerFactory.newSimpleInstance(host, trackSelector); SimpleExoPlayer player = ExoPlayerFactory.newSimpleInstance(host, trackSelector);
player.setSurface(surface); player.setSurface(surface);
return player; return player;
......
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