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