From d4d1640808be2216a75afa57e3a085251e0034e7 Mon Sep 17 00:00:00 2001 From: olly Date: Tue, 12 Jul 2016 07:12:28 -0700 Subject: [PATCH] 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 --- .../android/exoplayer2/demo/EventLogger.java | 10 +- .../exoplayer2/demo/PlayerActivity.java | 14 +- .../exoplayer2/demo/TrackSelectionHelper.java | 10 +- .../ext/ffmpeg/FfmpegAudioRenderer.java | 2 +- .../exoplayer2/ext/flac/FlacPlaybackTest.java | 6 +- .../ext/flac/LibflacAudioRenderer.java | 2 +- .../exoplayer2/ext/opus/OpusPlaybackTest.java | 6 +- .../ext/opus/LibopusAudioRenderer.java | 2 +- .../exoplayer2/ext/vp9/VpxPlaybackTest.java | 6 +- .../ext/vp9/LibvpxVideoRenderer.java | 2 +- .../exoplayer2/DefaultLoadControl.java | 1 + .../android/exoplayer2/ExoPlayerFactory.java | 1 + .../android/exoplayer2/ExoPlayerImpl.java | 1 + .../exoplayer2/ExoPlayerImplInternal.java | 5 +- .../android/exoplayer2/LoadControl.java | 2 + .../exoplayer2/MediaCodecRenderer.java | 4 +- .../google/android/exoplayer2/Renderer.java | 4 +- .../android/exoplayer2/SimpleExoPlayer.java | 1 + .../exoplayer2/TrackSelectionPolicy.java | 70 ---- .../VideoFrameReleaseTimeHelper.java | 2 - .../exoplayer2/chunk/ChunkSampleStream.java | 345 ------------------ .../exoplayer2/metadata/MetadataRenderer.java | 2 +- .../source/ExtractorMediaSource.java | 2 +- .../exoplayer2/source/MediaPeriod.java | 2 +- .../exoplayer2/source/MergingMediaPeriod.java | 2 +- .../source/SingleSampleMediaSource.java | 2 +- .../source/dash/DashMediaSource.java | 4 +- .../exoplayer2/source/hls/HlsMediaSource.java | 2 +- .../source/hls/HlsSampleStreamWrapper.java | 2 +- .../SmoothStreamingMediaSource.java | 4 +- .../android/exoplayer2/text/TextRenderer.java | 2 +- .../DefaultTrackSelector.java} | 17 +- .../MappingTrackSelector.java} | 71 ++-- .../{ => trackselection}/TrackSelection.java | 2 +- .../TrackSelectionArray.java | 2 +- .../{ => trackselection}/TrackSelector.java | 33 +- .../playbacktests/gts/DashTest.java | 19 +- .../exoplayer2/playbacktests/util/Action.java | 18 +- .../playbacktests/util/ActionSchedule.java | 10 +- .../playbacktests/util/ExoHostedTest.java | 16 +- 40 files changed, 157 insertions(+), 551 deletions(-) delete mode 100644 library/src/main/java/com/google/android/exoplayer2/TrackSelectionPolicy.java delete mode 100644 library/src/main/java/com/google/android/exoplayer2/chunk/ChunkSampleStream.java rename library/src/main/java/com/google/android/exoplayer2/{DefaultTrackSelectionPolicy.java => trackselection/DefaultTrackSelector.java} (96%) rename library/src/main/java/com/google/android/exoplayer2/{DefaultTrackSelector.java => trackselection/MappingTrackSelector.java} (91%) rename library/src/main/java/com/google/android/exoplayer2/{ => trackselection}/TrackSelection.java (98%) rename library/src/main/java/com/google/android/exoplayer2/{ => trackselection}/TrackSelectionArray.java (97%) rename library/src/main/java/com/google/android/exoplayer2/{ => trackselection}/TrackSelector.java (82%) diff --git a/demo/src/main/java/com/google/android/exoplayer2/demo/EventLogger.java b/demo/src/main/java/com/google/android/exoplayer2/demo/EventLogger.java index 6eab6cbd4b..433cc46e3b 100644 --- a/demo/src/main/java/com/google/android/exoplayer2/demo/EventLogger.java +++ b/demo/src/main/java/com/google/android/exoplayer2/demo/EventLogger.java @@ -16,19 +16,19 @@ package com.google.android.exoplayer2.demo; 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.ExoPlayer; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.SimpleExoPlayer; -import com.google.android.exoplayer2.TrackSelection; import com.google.android.exoplayer2.drm.StreamingDrmSessionManager; import com.google.android.exoplayer2.source.AdaptiveMediaSourceEventListener; import com.google.android.exoplayer2.source.ExtractorMediaSource; import com.google.android.exoplayer2.source.TrackGroup; 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 android.os.SystemClock; @@ -43,7 +43,7 @@ import java.util.Locale; */ public class EventLogger implements ExoPlayer.EventListener, SimpleExoPlayer.DebugListener, AdaptiveMediaSourceEventListener, ExtractorMediaSource.EventListener, - StreamingDrmSessionManager.EventListener, DefaultTrackSelector.EventListener { + StreamingDrmSessionManager.EventListener, MappingTrackSelector.EventListener { private static final String TAG = "EventLogger"; private static final NumberFormat TIME_FORMAT; @@ -92,7 +92,7 @@ public class EventLogger implements ExoPlayer.EventListener, SimpleExoPlayer.Deb Log.e(TAG, "playerFailed [" + getSessionTimeString() + "]", e); } - // DefaultTrackSelector.EventListener + // MappingTrackSelector.EventListener @Override public void onTracksChanged(TrackInfo trackInfo) { diff --git a/demo/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java b/demo/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java index 166cc4c6b2..e0388aa909 100644 --- a/demo/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java +++ b/demo/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java @@ -17,9 +17,6 @@ package com.google.android.exoplayer2.demo; import com.google.android.exoplayer2.C; 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.ExoPlayer; import com.google.android.exoplayer2.ExoPlayerFactory; @@ -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.Cue; 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.PlayerControl; import com.google.android.exoplayer2.upstream.BandwidthMeter; @@ -92,7 +92,7 @@ import java.util.UUID; */ public class PlayerActivity extends Activity implements SurfaceHolder.Callback, OnClickListener, 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_CONTENT_ID_EXTRA = "drm_content_id"; @@ -130,7 +130,7 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback, private DataSourceFactory dataSourceFactory; private SimpleExoPlayer player; - private DefaultTrackSelector trackSelector; + private MappingTrackSelector trackSelector; private TrackSelectionHelper trackSelectionHelper; private DebugTextViewHelper debugViewHelper; private BandwidthMeter bandwidthMeter; @@ -272,7 +272,7 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback, } eventLogger = new EventLogger(); eventLogger.startSession(); - trackSelector = new DefaultTrackSelector(new DefaultTrackSelectionPolicy(), mainHandler); + trackSelector = new DefaultTrackSelector(mainHandler); trackSelector.addListener(this); trackSelector.addListener(eventLogger); trackSelectionHelper = new TrackSelectionHelper(trackSelector); @@ -490,7 +490,7 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback, shutterView.setVisibility(View.GONE); } - // DefaultTrackSelector.EventListener implementation + // MappingTrackSelector.EventListener implementation @Override public void onTracksChanged(TrackInfo trackInfo) { diff --git a/demo/src/main/java/com/google/android/exoplayer2/demo/TrackSelectionHelper.java b/demo/src/main/java/com/google/android/exoplayer2/demo/TrackSelectionHelper.java index 82482cd22d..433d45023f 100644 --- a/demo/src/main/java/com/google/android/exoplayer2/demo/TrackSelectionHelper.java +++ b/demo/src/main/java/com/google/android/exoplayer2/demo/TrackSelectionHelper.java @@ -15,13 +15,13 @@ */ 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.Renderer; -import com.google.android.exoplayer2.TrackSelection; import com.google.android.exoplayer2.source.TrackGroup; 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 android.annotation.SuppressLint; @@ -44,7 +44,7 @@ import java.util.Locale; /* package */ final class TrackSelectionHelper implements View.OnClickListener, DialogInterface.OnClickListener { - private final DefaultTrackSelector selector; + private final MappingTrackSelector selector; private TrackInfo trackInfo; private int rendererIndex; @@ -60,7 +60,7 @@ import java.util.Locale; /** * @param selector The track selector. */ - public TrackSelectionHelper(DefaultTrackSelector selector) { + public TrackSelectionHelper(MappingTrackSelector selector) { this.selector = selector; } diff --git a/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegAudioRenderer.java b/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegAudioRenderer.java index 73f7afebfb..e7062a7046 100644 --- a/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegAudioRenderer.java +++ b/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegAudioRenderer.java @@ -62,7 +62,7 @@ public final class FfmpegAudioRenderer extends AudioDecoderRenderer { } @Override - protected int supportsFormat(Format format) { + public int supportsFormat(Format format) { if (!FfmpegDecoder.IS_AVAILABLE) { return FORMAT_UNSUPPORTED_TYPE; } diff --git a/extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacPlaybackTest.java b/extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacPlaybackTest.java index 1ad3a79b38..0af7adfc2a 100644 --- a/extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacPlaybackTest.java +++ b/extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacPlaybackTest.java @@ -15,14 +15,13 @@ */ 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.ExoPlayer; import com.google.android.exoplayer2.ExoPlayerFactory; import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.extractor.mkv.MatroskaExtractor; import com.google.android.exoplayer2.source.ExtractorMediaSource; +import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; import android.content.Context; @@ -72,8 +71,7 @@ public class FlacPlaybackTest extends InstrumentationTestCase { public void run() { Looper.prepare(); LibflacAudioRenderer audioRenderer = new LibflacAudioRenderer(); - DefaultTrackSelector trackSelector = new DefaultTrackSelector( - new DefaultTrackSelectionPolicy(), null); + DefaultTrackSelector trackSelector = new DefaultTrackSelector(null); player = ExoPlayerFactory.newInstance(new Renderer[] {audioRenderer}, trackSelector); player.addListener(this); ExtractorMediaSource mediaSource = new ExtractorMediaSource( diff --git a/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/LibflacAudioRenderer.java b/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/LibflacAudioRenderer.java index bee5ef2866..728f64bbc9 100644 --- a/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/LibflacAudioRenderer.java +++ b/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/LibflacAudioRenderer.java @@ -65,7 +65,7 @@ public class LibflacAudioRenderer extends AudioDecoderRenderer { } @Override - protected int supportsFormat(Format format) { + public int supportsFormat(Format format) { return isLibflacAvailable() && MimeTypes.AUDIO_FLAC.equalsIgnoreCase(format.sampleMimeType) ? FORMAT_HANDLED : FORMAT_UNSUPPORTED_TYPE; } diff --git a/extensions/opus/src/androidTest/java/com/google/android/exoplayer2/ext/opus/OpusPlaybackTest.java b/extensions/opus/src/androidTest/java/com/google/android/exoplayer2/ext/opus/OpusPlaybackTest.java index 2bea7c44ab..6e4082cfb0 100644 --- a/extensions/opus/src/androidTest/java/com/google/android/exoplayer2/ext/opus/OpusPlaybackTest.java +++ b/extensions/opus/src/androidTest/java/com/google/android/exoplayer2/ext/opus/OpusPlaybackTest.java @@ -15,14 +15,13 @@ */ 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.ExoPlayer; import com.google.android.exoplayer2.ExoPlayerFactory; import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.extractor.mkv.MatroskaExtractor; import com.google.android.exoplayer2.source.ExtractorMediaSource; +import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; import android.content.Context; @@ -72,8 +71,7 @@ public class OpusPlaybackTest extends InstrumentationTestCase { public void run() { Looper.prepare(); LibopusAudioRenderer audioRenderer = new LibopusAudioRenderer(); - DefaultTrackSelector trackSelector = new DefaultTrackSelector( - new DefaultTrackSelectionPolicy(), null); + DefaultTrackSelector trackSelector = new DefaultTrackSelector(null); player = ExoPlayerFactory.newInstance(new Renderer[] {audioRenderer}, trackSelector); player.addListener(this); ExtractorMediaSource mediaSource = new ExtractorMediaSource( diff --git a/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/LibopusAudioRenderer.java b/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/LibopusAudioRenderer.java index a9f71bc66c..9f7c8780a5 100644 --- a/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/LibopusAudioRenderer.java +++ b/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/LibopusAudioRenderer.java @@ -73,7 +73,7 @@ public final class LibopusAudioRenderer extends AudioDecoderRenderer { } @Override - protected int supportsFormat(Format format) { + public int supportsFormat(Format format) { return isLibopusAvailable() && MimeTypes.AUDIO_OPUS.equalsIgnoreCase(format.sampleMimeType) ? FORMAT_HANDLED : FORMAT_UNSUPPORTED_TYPE; } diff --git a/extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java b/extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java index b3555d8c7c..45efed2a79 100644 --- a/extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java +++ b/extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java @@ -15,14 +15,13 @@ */ 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.ExoPlayer; import com.google.android.exoplayer2.ExoPlayerFactory; import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.extractor.mkv.MatroskaExtractor; import com.google.android.exoplayer2.source.ExtractorMediaSource; +import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; import android.content.Context; @@ -88,8 +87,7 @@ public class VpxPlaybackTest extends InstrumentationTestCase { public void run() { Looper.prepare(); LibvpxVideoRenderer videoRenderer = new LibvpxVideoRenderer(true, 0); - DefaultTrackSelector trackSelector = new DefaultTrackSelector( - new DefaultTrackSelectionPolicy(), null); + DefaultTrackSelector trackSelector = new DefaultTrackSelector(null); player = ExoPlayerFactory.newInstance(new Renderer[] {videoRenderer}, trackSelector); player.addListener(this); ExtractorMediaSource mediaSource = new ExtractorMediaSource( diff --git a/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/LibvpxVideoRenderer.java b/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/LibvpxVideoRenderer.java index 9652766ec5..5d4c171adc 100644 --- a/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/LibvpxVideoRenderer.java +++ b/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/LibvpxVideoRenderer.java @@ -137,7 +137,7 @@ public final class LibvpxVideoRenderer extends Renderer { } @Override - protected int supportsFormat(Format format) { + public int supportsFormat(Format format) { return isLibvpxAvailable() && MimeTypes.VIDEO_VP9.equalsIgnoreCase(format.sampleMimeType) ? (FORMAT_HANDLED | ADAPTIVE_SEAMLESS) : FORMAT_UNSUPPORTED_TYPE; } diff --git a/library/src/main/java/com/google/android/exoplayer2/DefaultLoadControl.java b/library/src/main/java/com/google/android/exoplayer2/DefaultLoadControl.java index 8d2a9fa060..69dde98578 100644 --- a/library/src/main/java/com/google/android/exoplayer2/DefaultLoadControl.java +++ b/library/src/main/java/com/google/android/exoplayer2/DefaultLoadControl.java @@ -16,6 +16,7 @@ package com.google.android.exoplayer2; 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.DefaultAllocator; import com.google.android.exoplayer2.util.Util; diff --git a/library/src/main/java/com/google/android/exoplayer2/ExoPlayerFactory.java b/library/src/main/java/com/google/android/exoplayer2/ExoPlayerFactory.java index 09a8d69705..9cc0b467c0 100644 --- a/library/src/main/java/com/google/android/exoplayer2/ExoPlayerFactory.java +++ b/library/src/main/java/com/google/android/exoplayer2/ExoPlayerFactory.java @@ -16,6 +16,7 @@ package com.google.android.exoplayer2; import com.google.android.exoplayer2.drm.DrmSessionManager; +import com.google.android.exoplayer2.trackselection.TrackSelector; import android.content.Context; import android.os.Looper; diff --git a/library/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java b/library/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java index 61ab4db115..ab17539adf 100644 --- a/library/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java +++ b/library/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java @@ -17,6 +17,7 @@ package com.google.android.exoplayer2; import com.google.android.exoplayer2.ExoPlayerImplInternal.PlaybackInfo; import com.google.android.exoplayer2.source.MediaSource; +import com.google.android.exoplayer2.trackselection.TrackSelector; import com.google.android.exoplayer2.util.Assertions; import android.annotation.SuppressLint; diff --git a/library/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java b/library/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java index c6c3fef4ff..ac4ea78749 100644 --- a/library/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java +++ b/library/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java @@ -16,11 +16,14 @@ package com.google.android.exoplayer2; 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.MediaSource; import com.google.android.exoplayer2.source.SampleStream; 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.TraceUtil; import com.google.android.exoplayer2.util.Util; diff --git a/library/src/main/java/com/google/android/exoplayer2/LoadControl.java b/library/src/main/java/com/google/android/exoplayer2/LoadControl.java index ab661d1a11..e500a06895 100644 --- a/library/src/main/java/com/google/android/exoplayer2/LoadControl.java +++ b/library/src/main/java/com/google/android/exoplayer2/LoadControl.java @@ -17,6 +17,8 @@ package com.google.android.exoplayer2; import com.google.android.exoplayer2.source.TrackGroup; 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; /** diff --git a/library/src/main/java/com/google/android/exoplayer2/MediaCodecRenderer.java b/library/src/main/java/com/google/android/exoplayer2/MediaCodecRenderer.java index a9cf8790ec..af3a258226 100644 --- a/library/src/main/java/com/google/android/exoplayer2/MediaCodecRenderer.java +++ b/library/src/main/java/com/google/android/exoplayer2/MediaCodecRenderer.java @@ -222,12 +222,12 @@ public abstract class MediaCodecRenderer extends Renderer { } @Override - protected final int supportsMixedMimeTypeAdaptation() throws ExoPlaybackException { + public final int supportsMixedMimeTypeAdaptation() throws ExoPlaybackException { return ADAPTIVE_NOT_SEAMLESS; } @Override - protected final int supportsFormat(Format format) throws ExoPlaybackException { + public final int supportsFormat(Format format) throws ExoPlaybackException { try { return supportsFormat(mediaCodecSelector, format); } catch (DecoderQueryException e) { diff --git a/library/src/main/java/com/google/android/exoplayer2/Renderer.java b/library/src/main/java/com/google/android/exoplayer2/Renderer.java index 357c92fca2..c6616aa79b 100644 --- a/library/src/main/java/com/google/android/exoplayer2/Renderer.java +++ b/library/src/main/java/com/google/android/exoplayer2/Renderer.java @@ -165,7 +165,7 @@ public abstract class Renderer implements ExoPlayerComponent { * {@link #ADAPTIVE_NOT_SUPPORTED}. * @throws ExoPlaybackException If an error occurs. */ - protected int supportsMixedMimeTypeAdaptation() throws ExoPlaybackException { + public int supportsMixedMimeTypeAdaptation() throws ExoPlaybackException { return ADAPTIVE_NOT_SUPPORTED; } @@ -408,7 +408,7 @@ public abstract class Renderer implements ExoPlayerComponent { * @return The extent to which the renderer is capable of supporting the given format. * @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}. diff --git a/library/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java b/library/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java index c05d58dc46..db7554b8e2 100644 --- a/library/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java +++ b/library/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java @@ -23,6 +23,7 @@ import com.google.android.exoplayer2.metadata.id3.Id3Parser; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.text.Cue; 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.DefaultBandwidthMeter; diff --git a/library/src/main/java/com/google/android/exoplayer2/TrackSelectionPolicy.java b/library/src/main/java/com/google/android/exoplayer2/TrackSelectionPolicy.java deleted file mode 100644 index 57f73475db..0000000000 --- a/library/src/main/java/com/google/android/exoplayer2/TrackSelectionPolicy.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * 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; - -} - diff --git a/library/src/main/java/com/google/android/exoplayer2/VideoFrameReleaseTimeHelper.java b/library/src/main/java/com/google/android/exoplayer2/VideoFrameReleaseTimeHelper.java index 5ed9190963..bf98117dc2 100644 --- a/library/src/main/java/com/google/android/exoplayer2/VideoFrameReleaseTimeHelper.java +++ b/library/src/main/java/com/google/android/exoplayer2/VideoFrameReleaseTimeHelper.java @@ -279,7 +279,6 @@ public final class VideoFrameReleaseTimeHelper { } } - private void createChoreographerInstanceInternal() { choreographer = Choreographer.getInstance(); } @@ -299,7 +298,6 @@ public final class VideoFrameReleaseTimeHelper { } } - } } diff --git a/library/src/main/java/com/google/android/exoplayer2/chunk/ChunkSampleStream.java b/library/src/main/java/com/google/android/exoplayer2/chunk/ChunkSampleStream.java deleted file mode 100644 index 39963426b6..0000000000 --- a/library/src/main/java/com/google/android/exoplayer2/chunk/ChunkSampleStream.java +++ /dev/null @@ -1,345 +0,0 @@ -/* - * 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.chunk; - -import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.DecoderInputBuffer; -import com.google.android.exoplayer2.Format; -import com.google.android.exoplayer2.FormatHolder; -import com.google.android.exoplayer2.extractor.DefaultTrackOutput; -import com.google.android.exoplayer2.source.AdaptiveMediaSourceEventListener.EventDispatcher; -import com.google.android.exoplayer2.source.SampleStream; -import com.google.android.exoplayer2.source.SequenceableLoader; -import com.google.android.exoplayer2.source.chunk.BaseMediaChunk; -import com.google.android.exoplayer2.source.chunk.Chunk; -import com.google.android.exoplayer2.source.chunk.ChunkHolder; -import com.google.android.exoplayer2.source.chunk.ChunkSource; -import com.google.android.exoplayer2.upstream.Allocator; -import com.google.android.exoplayer2.upstream.Loader; -import com.google.android.exoplayer2.util.Assertions; - -import java.io.IOException; -import java.util.Collections; -import java.util.LinkedList; -import java.util.List; - -/** - * A {@link SampleStream} that loads media in {@link Chunk}s, obtained from a {@link ChunkSource}. - */ -public class ChunkSampleStream implements SampleStream, SequenceableLoader, - Loader.Callback { - - private final int trackType; - private final T chunkSource; - private final SequenceableLoader.Callback> callback; - private final EventDispatcher eventDispatcher; - private final int minLoadableRetryCount; - private final LinkedList mediaChunks; - private final List readOnlyMediaChunks; - private final DefaultTrackOutput sampleQueue; - private final ChunkHolder nextChunkHolder; - private final Loader loader; - - private Format downstreamFormat; - - private long lastSeekPositionUs; - private long pendingResetPositionUs; - - private boolean loadingFinished; - - /** - * @param trackType The type of the track. One of the {@link C} {@code TRACK_TYPE_*} constants. - * @param chunkSource A {@link ChunkSource} from which chunks to load are obtained. - * @param callback An {@link Callback} for the stream. - * @param allocator An {@link Allocator} from which allocations can be obtained. - * @param positionUs The position from which to start loading media. - * @param minLoadableRetryCount The minimum number of times that the source should retry a load - * before propagating an error. - * @param eventDispatcher A dispatcher to notify of events. - */ - public ChunkSampleStream(int trackType, T chunkSource, - SequenceableLoader.Callback> callback, Allocator allocator, - long positionUs, int minLoadableRetryCount, EventDispatcher eventDispatcher) { - this.trackType = trackType; - this.chunkSource = chunkSource; - this.callback = callback; - this.eventDispatcher = eventDispatcher; - this.minLoadableRetryCount = minLoadableRetryCount; - loader = new Loader("Loader:ChunkSampleStream"); - nextChunkHolder = new ChunkHolder(); - mediaChunks = new LinkedList<>(); - readOnlyMediaChunks = Collections.unmodifiableList(mediaChunks); - sampleQueue = new DefaultTrackOutput(allocator); - pendingResetPositionUs = C.UNSET_TIME_US; - lastSeekPositionUs = positionUs; - pendingResetPositionUs = positionUs; - } - - /** - * Returns the {@link ChunkSource} used by this stream. - * - * @return The {@link ChunkSource}. - */ - public T getChunkSource() { - return chunkSource; - } - - /** - * Returns an estimate of the position up to which data is buffered. - * - * @return An estimate of the absolute position in microseconds up to which data is buffered, or - * {@link C#END_OF_SOURCE_US} if the track is fully buffered. - */ - public long getBufferedPositionUs() { - if (loadingFinished) { - return C.END_OF_SOURCE_US; - } else if (isPendingReset()) { - return pendingResetPositionUs; - } else { - long bufferedPositionUs = lastSeekPositionUs; - BaseMediaChunk lastMediaChunk = mediaChunks.getLast(); - BaseMediaChunk lastCompletedMediaChunk = lastMediaChunk.isLoadCompleted() ? lastMediaChunk - : mediaChunks.size() > 1 ? mediaChunks.get(mediaChunks.size() - 2) : null; - if (lastCompletedMediaChunk != null) { - bufferedPositionUs = Math.max(bufferedPositionUs, lastCompletedMediaChunk.endTimeUs); - } - return Math.max(bufferedPositionUs, sampleQueue.getLargestQueuedTimestampUs()); - } - } - - /** - * Seeks to the specified position in microseconds. - * - * @param positionUs The seek position in microseconds. - */ - public void seekToUs(long positionUs) { - lastSeekPositionUs = positionUs; - // If we're not pending a reset, see if we can seek within the sample queue. - boolean seekInsideBuffer = !isPendingReset() && sampleQueue.skipToKeyframeBefore(positionUs); - if (seekInsideBuffer) { - // We succeeded. All we need to do is discard any chunks that we've moved past. - while (mediaChunks.size() > 1 - && mediaChunks.get(1).getFirstSampleIndex() <= sampleQueue.getReadIndex()) { - mediaChunks.removeFirst(); - } - } else { - // We failed, and need to restart. - pendingResetPositionUs = positionUs; - loadingFinished = false; - mediaChunks.clear(); - if (loader.isLoading()) { - loader.cancelLoading(); - } else { - sampleQueue.reset(true); - } - } - } - - /** - * Releases the stream. - *

- * This method should be called when the stream is no longer required. - */ - public void release() { - chunkSource.release(); - sampleQueue.disable(); - loader.release(); - } - - // SampleStream implementation. - - @Override - public boolean isReady() { - return loadingFinished || (!isPendingReset() && !sampleQueue.isEmpty()); - } - - @Override - public void maybeThrowError() throws IOException { - loader.maybeThrowError(); - if (!loader.isLoading()) { - chunkSource.maybeThrowError(); - } - } - - @Override - public int readData(FormatHolder formatHolder, DecoderInputBuffer buffer) { - if (isPendingReset()) { - return C.RESULT_NOTHING_READ; - } - - while (mediaChunks.size() > 1 - && mediaChunks.get(1).getFirstSampleIndex() <= sampleQueue.getReadIndex()) { - mediaChunks.removeFirst(); - } - BaseMediaChunk currentChunk = mediaChunks.getFirst(); - - Format format = currentChunk.format; - if (!format.equals(downstreamFormat)) { - eventDispatcher.downstreamFormatChanged(trackType, format, - currentChunk.formatEvaluatorTrigger, currentChunk.formatEvaluatorData, - currentChunk.startTimeUs); - } - downstreamFormat = format; - - return sampleQueue.readData(formatHolder, buffer, loadingFinished, lastSeekPositionUs); - } - - // Loader.Callback implementation. - - @Override - public void onLoadCompleted(Chunk loadable, long elapsedRealtimeMs, long loadDurationMs) { - chunkSource.onChunkLoadCompleted(loadable); - eventDispatcher.loadCompleted(loadable.dataSpec, loadable.type, trackType, loadable.format, - loadable.formatEvaluatorTrigger, loadable.formatEvaluatorData, loadable.startTimeUs, - loadable.endTimeUs, elapsedRealtimeMs, loadDurationMs, loadable.bytesLoaded()); - callback.onContinueLoadingRequested(this); - } - - @Override - public void onLoadCanceled(Chunk loadable, long elapsedRealtimeMs, long loadDurationMs, - boolean released) { - eventDispatcher.loadCanceled(loadable.dataSpec, loadable.type, trackType, loadable.format, - loadable.formatEvaluatorTrigger, loadable.formatEvaluatorData, loadable.startTimeUs, - loadable.endTimeUs, elapsedRealtimeMs, loadDurationMs, loadable.bytesLoaded()); - if (!released) { - sampleQueue.reset(true); - callback.onContinueLoadingRequested(this); - } - } - - @Override - public int onLoadError(Chunk loadable, long elapsedRealtimeMs, long loadDurationMs, - IOException error) { - long bytesLoaded = loadable.bytesLoaded(); - boolean isMediaChunk = isMediaChunk(loadable); - boolean cancelable = !isMediaChunk || bytesLoaded == 0 || mediaChunks.size() > 1; - boolean canceled = false; - if (chunkSource.onChunkLoadError(loadable, cancelable, error)) { - canceled = true; - if (isMediaChunk) { - BaseMediaChunk removed = mediaChunks.removeLast(); - Assertions.checkState(removed == loadable); - sampleQueue.discardUpstreamSamples(removed.getFirstSampleIndex()); - if (mediaChunks.isEmpty()) { - pendingResetPositionUs = lastSeekPositionUs; - } - } - } - eventDispatcher.loadError(loadable.dataSpec, loadable.type, trackType, loadable.format, - loadable.formatEvaluatorTrigger, loadable.formatEvaluatorData, loadable.startTimeUs, - loadable.endTimeUs, elapsedRealtimeMs, loadDurationMs, bytesLoaded, error, - canceled); - if (canceled) { - callback.onContinueLoadingRequested(this); - return Loader.DONT_RETRY; - } else { - return Loader.RETRY; - } - } - - // SequenceableLoader implementation - - @Override - public boolean continueLoading(long positionUs) { - if (loader.isLoading()) { - return false; - } - - chunkSource.getNextChunk(mediaChunks.isEmpty() ? null : mediaChunks.getLast(), - pendingResetPositionUs != C.UNSET_TIME_US ? pendingResetPositionUs : positionUs, - nextChunkHolder); - boolean endOfStream = nextChunkHolder.endOfStream; - Chunk loadable = nextChunkHolder.chunk; - nextChunkHolder.clear(); - - if (endOfStream) { - loadingFinished = true; - return true; - } - - if (loadable == null) { - return false; - } - - if (isMediaChunk(loadable)) { - pendingResetPositionUs = C.UNSET_TIME_US; - BaseMediaChunk mediaChunk = (BaseMediaChunk) loadable; - mediaChunk.init(sampleQueue); - mediaChunks.add(mediaChunk); - } - long elapsedRealtimeMs = loader.startLoading(loadable, this, minLoadableRetryCount); - eventDispatcher.loadStarted(loadable.dataSpec, loadable.type, trackType, loadable.format, - loadable.formatEvaluatorTrigger, loadable.formatEvaluatorData, loadable.startTimeUs, - loadable.endTimeUs, elapsedRealtimeMs); - return true; - } - - @Override - public long getNextLoadPositionUs() { - if (isPendingReset()) { - return pendingResetPositionUs; - } else { - return loadingFinished ? C.END_OF_SOURCE_US : mediaChunks.getLast().endTimeUs; - } - } - - // Internal methods - - // TODO[REFACTOR]: Call maybeDiscardUpstream for DASH and SmoothStreaming. - /** - * Discards media chunks from the back of the buffer if conditions have changed such that it's - * preferable to re-buffer the media at a different quality. - * - * @param positionUs The current playback position in microseconds. - */ - private void maybeDiscardUpstream(long positionUs) { - int queueSize = chunkSource.getPreferredQueueSize(positionUs, readOnlyMediaChunks); - discardUpstreamMediaChunks(Math.max(1, queueSize)); - } - - private boolean isMediaChunk(Chunk chunk) { - return chunk instanceof BaseMediaChunk; - } - - private boolean isPendingReset() { - return pendingResetPositionUs != C.UNSET_TIME_US; - } - - /** - * Discard upstream media chunks until the queue length is equal to the length specified. - * - * @param queueLength The desired length of the queue. - * @return True if chunks were discarded. False otherwise. - */ - private boolean discardUpstreamMediaChunks(int queueLength) { - if (mediaChunks.size() <= queueLength) { - return false; - } - long startTimeUs = 0; - long endTimeUs = mediaChunks.getLast().endTimeUs; - - BaseMediaChunk removed = null; - while (mediaChunks.size() > queueLength) { - removed = mediaChunks.removeLast(); - startTimeUs = removed.startTimeUs; - loadingFinished = false; - } - sampleQueue.discardUpstreamSamples(removed.getFirstSampleIndex()); - eventDispatcher.upstreamDiscarded(trackType, startTimeUs, endTimeUs); - return true; - } - -} diff --git a/library/src/main/java/com/google/android/exoplayer2/metadata/MetadataRenderer.java b/library/src/main/java/com/google/android/exoplayer2/metadata/MetadataRenderer.java index 4aebbbba10..1707705a60 100644 --- a/library/src/main/java/com/google/android/exoplayer2/metadata/MetadataRenderer.java +++ b/library/src/main/java/com/google/android/exoplayer2/metadata/MetadataRenderer.java @@ -89,7 +89,7 @@ public final class MetadataRenderer extends Renderer implements Callback { } @Override - protected int supportsFormat(Format format) { + public int supportsFormat(Format format) { return metadataParser.canParse(format.sampleMimeType) ? Renderer.FORMAT_HANDLED : Renderer.FORMAT_UNSUPPORTED_TYPE; } diff --git a/library/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaSource.java b/library/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaSource.java index 2765821b1c..a741d11de1 100644 --- a/library/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaSource.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaSource.java @@ -20,7 +20,6 @@ import com.google.android.exoplayer2.DecoderInputBuffer; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.FormatHolder; 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.DefaultExtractorsFactory; import com.google.android.exoplayer2.extractor.DefaultTrackOutput; @@ -32,6 +31,7 @@ import com.google.android.exoplayer2.extractor.ExtractorsFactory; import com.google.android.exoplayer2.extractor.PositionHolder; import com.google.android.exoplayer2.extractor.SeekMap; 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.BandwidthMeter; import com.google.android.exoplayer2.upstream.DataSource; diff --git a/library/src/main/java/com/google/android/exoplayer2/source/MediaPeriod.java b/library/src/main/java/com/google/android/exoplayer2/source/MediaPeriod.java index 1e4dc95d1f..cc7effab73 100644 --- a/library/src/main/java/com/google/android/exoplayer2/source/MediaPeriod.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/MediaPeriod.java @@ -16,7 +16,7 @@ package com.google.android.exoplayer2.source; 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 java.io.IOException; diff --git a/library/src/main/java/com/google/android/exoplayer2/source/MergingMediaPeriod.java b/library/src/main/java/com/google/android/exoplayer2/source/MergingMediaPeriod.java index f48fa708fd..62f2ef1291 100644 --- a/library/src/main/java/com/google/android/exoplayer2/source/MergingMediaPeriod.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/MergingMediaPeriod.java @@ -16,7 +16,7 @@ package com.google.android.exoplayer2.source; 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 android.util.Pair; diff --git a/library/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaSource.java b/library/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaSource.java index 9b894f3d2e..61b9c64aac 100644 --- a/library/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaSource.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaSource.java @@ -19,7 +19,7 @@ import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.DecoderInputBuffer; import com.google.android.exoplayer2.Format; 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.DataSource; import com.google.android.exoplayer2.upstream.DataSourceFactory; diff --git a/library/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java b/library/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java index cf267ac585..4a6dc4ee75 100644 --- a/library/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java @@ -18,8 +18,6 @@ package com.google.android.exoplayer2.source.dash; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; 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.EventDispatcher; import com.google.android.exoplayer2.source.CompositeSequenceableLoader; @@ -29,6 +27,7 @@ import com.google.android.exoplayer2.source.SampleStream; import com.google.android.exoplayer2.source.SequenceableLoader; import com.google.android.exoplayer2.source.TrackGroup; 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.AdaptiveEvaluator; import com.google.android.exoplayer2.source.dash.mpd.AdaptationSet; @@ -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.Representation; 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.BandwidthMeter; import com.google.android.exoplayer2.upstream.DataSource; diff --git a/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java b/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java index 08048a358a..71596eae7f 100644 --- a/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java @@ -18,7 +18,6 @@ package com.google.android.exoplayer2.source.hls; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; 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.EventDispatcher; import com.google.android.exoplayer2.source.CompositeSequenceableLoader; @@ -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.HlsPlaylistParser; 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.BandwidthMeter; import com.google.android.exoplayer2.upstream.DataSource; diff --git a/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java b/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java index 7b758a4cc0..a864265afe 100644 --- a/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java @@ -19,7 +19,6 @@ import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.DecoderInputBuffer; import com.google.android.exoplayer2.Format; 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.UpstreamFormatChangedListener; import com.google.android.exoplayer2.extractor.ExtractorOutput; @@ -31,6 +30,7 @@ import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.source.chunk.Chunk; 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.Loader; import com.google.android.exoplayer2.util.Assertions; diff --git a/library/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SmoothStreamingMediaSource.java b/library/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SmoothStreamingMediaSource.java index 1c9cd658b0..d900ca5779 100644 --- a/library/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SmoothStreamingMediaSource.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SmoothStreamingMediaSource.java @@ -18,8 +18,6 @@ package com.google.android.exoplayer2.source.smoothstreaming; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; 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.source.AdaptiveMediaSourceEventListener; import com.google.android.exoplayer2.source.AdaptiveMediaSourceEventListener.EventDispatcher; @@ -30,10 +28,12 @@ import com.google.android.exoplayer2.source.SampleStream; import com.google.android.exoplayer2.source.SequenceableLoader; import com.google.android.exoplayer2.source.TrackGroup; 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.AdaptiveEvaluator; import com.google.android.exoplayer2.source.smoothstreaming.SmoothStreamingManifest.ProtectionElement; 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.BandwidthMeter; import com.google.android.exoplayer2.upstream.DataSource; diff --git a/library/src/main/java/com/google/android/exoplayer2/text/TextRenderer.java b/library/src/main/java/com/google/android/exoplayer2/text/TextRenderer.java index b90b391344..56eab2e8cd 100644 --- a/library/src/main/java/com/google/android/exoplayer2/text/TextRenderer.java +++ b/library/src/main/java/com/google/android/exoplayer2/text/TextRenderer.java @@ -108,7 +108,7 @@ public final class TextRenderer extends Renderer implements Callback { } @Override - protected int supportsFormat(Format format) { + public int supportsFormat(Format format) { return parserFactory.supportsFormat(format) ? Renderer.FORMAT_HANDLED : (MimeTypes.isText(format.sampleMimeType) ? FORMAT_UNSUPPORTED_SUBTYPE : FORMAT_UNSUPPORTED_TYPE); diff --git a/library/src/main/java/com/google/android/exoplayer2/DefaultTrackSelectionPolicy.java b/library/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java similarity index 96% rename from library/src/main/java/com/google/android/exoplayer2/DefaultTrackSelectionPolicy.java rename to library/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java index 43518c1ef7..c823e68284 100644 --- a/library/src/main/java/com/google/android/exoplayer2/DefaultTrackSelectionPolicy.java +++ b/library/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java @@ -13,18 +13,24 @@ * See the License for the specific language governing permissions and * 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.TrackGroupArray; import com.google.android.exoplayer2.util.Util; +import android.os.Handler; + 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]; @@ -35,7 +41,8 @@ public class DefaultTrackSelectionPolicy extends TrackSelectionPolicy { private int maxVideoHeight; private boolean exceedVideoConstraintsIfNecessary; - public DefaultTrackSelectionPolicy() { + public DefaultTrackSelector(Handler eventHandler) { + super(eventHandler); allowNonSeamlessAdaptiveness = true; exceedVideoConstraintsIfNecessary = true; maxVideoWidth = Integer.MAX_VALUE; @@ -124,7 +131,7 @@ public class DefaultTrackSelectionPolicy extends TrackSelectionPolicy { // TrackSelectionPolicy implementation. @Override - public TrackSelection[] selectTracks(Renderer[] renderers, + protected TrackSelection[] selectTracks(Renderer[] renderers, TrackGroupArray[] rendererTrackGroupArrays, int[][][] rendererFormatSupports) throws ExoPlaybackException { // Make a track selection for each renderer. diff --git a/library/src/main/java/com/google/android/exoplayer2/DefaultTrackSelector.java b/library/src/main/java/com/google/android/exoplayer2/trackselection/MappingTrackSelector.java similarity index 91% rename from library/src/main/java/com/google/android/exoplayer2/DefaultTrackSelector.java rename to library/src/main/java/com/google/android/exoplayer2/trackselection/MappingTrackSelector.java index 553519eb58..76d953404e 100644 --- a/library/src/main/java/com/google/android/exoplayer2/DefaultTrackSelector.java +++ b/library/src/main/java/com/google/android/exoplayer2/trackselection/MappingTrackSelector.java @@ -13,8 +13,11 @@ * See the License for the specific language governing permissions and * 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.TrackGroupArray; import com.google.android.exoplayer2.util.Assertions; @@ -31,13 +34,14 @@ import java.util.Map; 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 - TrackSelectionPolicy.InvalidationListener{ +public abstract class MappingTrackSelector extends TrackSelector { /** - * 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 { @@ -54,22 +58,18 @@ public final class DefaultTrackSelector extends TrackSelector implements private final CopyOnWriteArraySet listeners; private final SparseArray> trackSelectionOverrides; private final SparseBooleanArray rendererDisabledFlags; - private final TrackSelectionPolicy trackSelectionPolicy; private TrackInfo activeTrackInfo; /** - * @param trackSelectionPolicy Defines the policy for track selection. * @param eventHandler A handler to use when delivering events to listeners added via * {@link #addListener(EventListener)}. */ - public DefaultTrackSelector(TrackSelectionPolicy trackSelectionPolicy, Handler eventHandler) { - this.trackSelectionPolicy = Assertions.checkNotNull(trackSelectionPolicy); + public MappingTrackSelector(Handler eventHandler) { this.eventHandler = eventHandler; this.listeners = new CopyOnWriteArraySet<>(); trackSelectionOverrides = new SparseArray<>(); rendererDisabledFlags = new SparseBooleanArray(); - trackSelectionPolicy.init(this); } /** @@ -78,7 +78,7 @@ public final class DefaultTrackSelector extends TrackSelector implements * * @param listener The listener to register. */ - public void addListener(EventListener listener) { + public final void addListener(EventListener listener) { Assertions.checkState(eventHandler != null); listeners.add(listener); } @@ -88,7 +88,7 @@ public final class DefaultTrackSelector extends TrackSelector implements * * @param listener The listener to unregister. */ - public void removeListener(EventListener listener) { + public final void removeListener(EventListener listener) { listeners.remove(listener); } @@ -97,7 +97,7 @@ public final class DefaultTrackSelector extends TrackSelector implements * * @return Contains the current tracks and track selection information. */ - public TrackInfo getTrackInfo() { + public final TrackInfo getTrackInfo() { return activeTrackInfo; } @@ -107,7 +107,7 @@ public final class DefaultTrackSelector extends TrackSelector implements * @param rendererIndex The renderer index. * @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) { // The disabled flag is unchanged. return; @@ -122,7 +122,7 @@ public final class DefaultTrackSelector extends TrackSelector implements * @param rendererIndex The renderer index. * @return True if the renderer is disabled. False otherwise. */ - public boolean getRendererDisabled(int rendererIndex) { + public final boolean getRendererDisabled(int rendererIndex) { return rendererDisabledFlags.get(rendererIndex); } @@ -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 // 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) { Map overrides = trackSelectionOverrides.get(rendererIndex); if (overrides == null) { @@ -166,7 +166,7 @@ public final class DefaultTrackSelector extends TrackSelector implements * @param groups The {@link TrackGroupArray}. * @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 overrides = trackSelectionOverrides.get(rendererIndex); return overrides != null && overrides.containsKey(groups); } @@ -177,7 +177,7 @@ public final class DefaultTrackSelector extends TrackSelector implements * @param rendererIndex The renderer index. * @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 overrides = trackSelectionOverrides.get(rendererIndex); if (overrides == null || !overrides.containsKey(groups)) { // Nothing to clear. @@ -195,7 +195,7 @@ public final class DefaultTrackSelector extends TrackSelector implements * * @param rendererIndex The renderer index. */ - public void clearSelectionOverrides(int rendererIndex) { + public final void clearSelectionOverrides(int rendererIndex) { Map overrides = trackSelectionOverrides.get(rendererIndex); if (overrides == null || overrides.isEmpty()) { // Nothing to clear. @@ -208,7 +208,7 @@ public final class DefaultTrackSelector extends TrackSelector implements /** * Clears all track selection overrides. */ - public void clearSelectionOverrides() { + public final void clearSelectionOverrides() { if (trackSelectionOverrides.size() == 0) { // Nothing to clear. return; @@ -217,24 +217,16 @@ public final class DefaultTrackSelector extends TrackSelector implements invalidate(); } - /** - * Invoked when the {@link TrackSelectionPolicy} has changed. - */ - @Override - public void invalidatePolicySelections() { - invalidate(); - } - // TrackSelector implementation. @Override - protected void onSelectionActivated(Object selectionInfo) { + public final void onSelectionActivated(Object selectionInfo) { activeTrackInfo = (TrackInfo) selectionInfo; notifyTrackInfoChanged(activeTrackInfo); } @Override - protected Pair selectTracks(Renderer[] renderers, + public final Pair selectTracks(Renderer[] renderers, TrackGroupArray trackGroups) throws ExoPlaybackException { // 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 @@ -280,8 +272,8 @@ public final class DefaultTrackSelector extends TrackSelector implements TrackGroupArray unassociatedTrackGroupArray = new TrackGroupArray( Arrays.copyOf(rendererTrackGroups[renderers.length], unassociatedTrackGroupCount)); - TrackSelection[] rendererTrackSelections = trackSelectionPolicy.selectTracks(renderers, - rendererTrackGroupArrays, rendererFormatSupports); + TrackSelection[] rendererTrackSelections = selectTracks(renderers, rendererTrackGroupArrays, + rendererFormatSupports); // Apply track disabling and overriding. for (int i = 0; i < renderers.length; i++) { @@ -317,6 +309,21 @@ public final class DefaultTrackSelector extends TrackSelector implements return Pair.create(trackSelectionArray, trackInfo); } + /** + * 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. *

diff --git a/library/src/main/java/com/google/android/exoplayer2/TrackSelection.java b/library/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelection.java similarity index 98% rename from library/src/main/java/com/google/android/exoplayer2/TrackSelection.java rename to library/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelection.java index 42b4b972fd..c1ff14487b 100644 --- a/library/src/main/java/com/google/android/exoplayer2/TrackSelection.java +++ b/library/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelection.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * 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.util.Assertions; diff --git a/library/src/main/java/com/google/android/exoplayer2/TrackSelectionArray.java b/library/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionArray.java similarity index 97% rename from library/src/main/java/com/google/android/exoplayer2/TrackSelectionArray.java rename to library/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionArray.java index 16b2498ec2..d099e7e696 100644 --- a/library/src/main/java/com/google/android/exoplayer2/TrackSelectionArray.java +++ b/library/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionArray.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2; +package com.google.android.exoplayer2.trackselection; import java.util.Arrays; diff --git a/library/src/main/java/com/google/android/exoplayer2/TrackSelector.java b/library/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelector.java similarity index 82% rename from library/src/main/java/com/google/android/exoplayer2/TrackSelector.java rename to library/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelector.java index c02b77054e..b5b2a37c68 100644 --- a/library/src/main/java/com/google/android/exoplayer2/TrackSelector.java +++ b/library/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelector.java @@ -13,8 +13,10 @@ * See the License for the specific language governing permissions and * 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 android.util.Pair; @@ -27,7 +29,7 @@ public abstract class TrackSelector { /** * 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. @@ -38,17 +40,13 @@ public abstract class TrackSelector { 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() { - if (listener != null) { - listener.onTrackSelectionsInvalidated(); - } + public final void init(InvalidationListener listener) { + this.listener = listener; } /** @@ -65,7 +63,7 @@ public abstract class TrackSelector { * if the selection is activated. * @throws ExoPlaybackException If an error occurs selecting tracks. */ - protected abstract Pair selectTracks(Renderer[] renderers, + public abstract Pair selectTracks(Renderer[] renderers, TrackGroupArray trackGroups) throws ExoPlaybackException; /** @@ -74,6 +72,15 @@ public abstract class TrackSelector { * * @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(); + } + } } diff --git a/playbacktests/src/main/java/com/google/android/exoplayer2/playbacktests/gts/DashTest.java b/playbacktests/src/main/java/com/google/android/exoplayer2/playbacktests/gts/DashTest.java index efea1f932b..a171d9a49c 100644 --- a/playbacktests/src/main/java/com/google/android/exoplayer2/playbacktests/gts/DashTest.java +++ b/playbacktests/src/main/java/com/google/android/exoplayer2/playbacktests/gts/DashTest.java @@ -23,8 +23,6 @@ import com.google.android.exoplayer2.MediaCodecDecoderInfo; import com.google.android.exoplayer2.MediaCodecUtil; import com.google.android.exoplayer2.MediaCodecUtil.DecoderQueryException; 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.CodecCountersUtil; import com.google.android.exoplayer2.playbacktests.util.ExoHostedTest; @@ -34,6 +32,8 @@ import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroupArray; 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.DataSourceFactory; import com.google.android.exoplayer2.util.Assertions; @@ -381,7 +381,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2