diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java index 83854ffca9..96e7703559 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java @@ -51,7 +51,7 @@ import java.util.concurrent.CopyOnWriteArraySet; * This empty track selector result can only be used for {@link PlaybackInfo#trackSelectorResult} * when the player does not have any track selection made (such as when player is reset, or when * player seeks to an unprepared period). It will not be used as result of any {@link - * TrackSelector#selectTracks(RendererCapabilities[], TrackGroupArray)} operation. + * TrackSelector#selectTracks(RendererCapabilities[], TrackGroupArray, MediaPeriodId)} operation. */ /* package */ final TrackSelectorResult emptyTrackSelectorResult; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/MediaPeriodHolder.java b/library/core/src/main/java/com/google/android/exoplayer2/MediaPeriodHolder.java index 4941b4efc6..70c9354e71 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/MediaPeriodHolder.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/MediaPeriodHolder.java @@ -162,7 +162,7 @@ import com.google.android.exoplayer2.util.Log; public boolean selectTracks(float playbackSpeed) throws ExoPlaybackException { TrackSelectorResult selectorResult = - trackSelector.selectTracks(rendererCapabilities, trackGroups); + trackSelector.selectTracks(rendererCapabilities, trackGroups, info.id); if (selectorResult.isEquivalent(periodTrackSelectorResult)) { return false; } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/MappingTrackSelector.java b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/MappingTrackSelector.java index c2fda67728..ce5dff8556 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/MappingTrackSelector.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/MappingTrackSelector.java @@ -23,6 +23,7 @@ import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.RendererCapabilities; import com.google.android.exoplayer2.RendererConfiguration; +import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId; import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.util.Util; @@ -326,8 +327,11 @@ public abstract class MappingTrackSelector extends TrackSelector { } @Override - public final TrackSelectorResult selectTracks(RendererCapabilities[] rendererCapabilities, - TrackGroupArray trackGroups) throws ExoPlaybackException { + public final TrackSelectorResult selectTracks( + RendererCapabilities[] rendererCapabilities, + TrackGroupArray trackGroups, + MediaPeriodId periodId) + 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 // any renderer. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelector.java b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelector.java index 3bb603318f..bc2460036c 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelector.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelector.java @@ -21,6 +21,7 @@ import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.RendererCapabilities; import com.google.android.exoplayer2.RendererConfiguration; +import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId; import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.upstream.BandwidthMeter; import com.google.android.exoplayer2.util.Assertions; @@ -40,9 +41,9 @@ import com.google.android.exoplayer2.util.Assertions; *
  • When the player is created it will initialize the track selector by calling {@link * #init(InvalidationListener, BandwidthMeter)}. *
  • When the player needs to make a track selection it will call {@link - * #selectTracks(RendererCapabilities[], TrackGroupArray)}. This typically occurs at the start - * of playback, when the player starts to buffer a new period of the media being played, and - * when the track selector invalidates its previous selections. + * #selectTracks(RendererCapabilities[], TrackGroupArray, MediaPeriodId)}. This typically + * occurs at the start of playback, when the player starts to buffer a new period of the media + * being played, and when the track selector invalidates its previous selections. *
  • The player may perform a track selection well in advance of the selected tracks becoming * active, where active is defined to mean that the renderers are actually consuming media * corresponding to the selection that was made. For example when playing media containing @@ -66,14 +67,14 @@ import com.google.android.exoplayer2.util.Assertions; *

    Renderer configuration

    * * The {@link TrackSelectorResult} returned by {@link #selectTracks(RendererCapabilities[], - * TrackGroupArray)} contains not only {@link TrackSelection}s for each renderer, but also {@link - * RendererConfiguration}s defining configuration parameters that the renderers should apply when - * consuming the corresponding media. Whilst it may seem counter-intuitive for a track selector to - * also specify renderer configuration information, in practice the two are tightly bound together. - * It may only be possible to play a certain combination tracks if the renderers are configured in a - * particular way. Equally, it may only be possible to configure renderers in a particular way if - * certain tracks are selected. Hence it makes sense to determined the track selection and - * corresponding renderer configurations in a single step. + * TrackGroupArray, MediaPeriodId)} contains not only {@link TrackSelection}s for each renderer, but + * also {@link RendererConfiguration}s defining configuration parameters that the renderers should + * apply when consuming the corresponding media. Whilst it may seem counter-intuitive for a track + * selector to also specify renderer configuration information, in practice the two are tightly + * bound together. It may only be possible to play a certain combination tracks if the renderers are + * configured in a particular way. Equally, it may only be possible to configure renderers in a + * particular way if certain tracks are selected. Hence it makes sense to determined the track + * selection and corresponding renderer configurations in a single step. * *

    Threading model

    * @@ -117,15 +118,19 @@ public abstract class TrackSelector { * @param rendererCapabilities The {@link RendererCapabilities} of the renderers for which tracks * are to be selected. * @param trackGroups The available track groups. + * @param periodId The {@link MediaPeriodId} of the period for which tracks are to be selected. * @return A {@link TrackSelectorResult} describing the track selections. * @throws ExoPlaybackException If an error occurs selecting tracks. */ - public abstract TrackSelectorResult selectTracks(RendererCapabilities[] rendererCapabilities, - TrackGroupArray trackGroups) throws ExoPlaybackException; + public abstract TrackSelectorResult selectTracks( + RendererCapabilities[] rendererCapabilities, + TrackGroupArray trackGroups, + MediaPeriodId periodId) + throws ExoPlaybackException; /** - * Called by the player when a {@link TrackSelectorResult} previously generated by - * {@link #selectTracks(RendererCapabilities[], TrackGroupArray)} is activated. + * Called by the player when a {@link TrackSelectorResult} previously generated by {@link + * #selectTracks(RendererCapabilities[], TrackGroupArray, MediaPeriodId)} is activated. * * @param info The value of {@link TrackSelectorResult#info} in the activated selection. */ diff --git a/library/core/src/test/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelectorTest.java b/library/core/src/test/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelectorTest.java index 94f6abd87b..4b1357c1a6 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelectorTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelectorTest.java @@ -37,6 +37,7 @@ import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.RendererCapabilities; import com.google.android.exoplayer2.RendererConfiguration; +import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId; import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters; @@ -90,6 +91,7 @@ public final class DefaultTrackSelectorTest { }; private static final TrackSelection[] TRACK_SELECTIONS_WITH_NO_SAMPLE_RENDERER = new TrackSelection[] {new FixedTrackSelection(VIDEO_TRACK_GROUP, 0), null}; + private static final MediaPeriodId PERIOD_ID = new MediaPeriodId(/* periodUid= */ new Object()); @Mock private InvalidationListener invalidationListener; @@ -176,7 +178,8 @@ public final class DefaultTrackSelectorTest { trackSelector .buildUponParameters() .setSelectionOverride(0, new TrackGroupArray(VIDEO_TRACK_GROUP), null)); - TrackSelectorResult result = trackSelector.selectTracks(RENDERER_CAPABILITIES, TRACK_GROUPS); + TrackSelectorResult result = + trackSelector.selectTracks(RENDERER_CAPABILITIES, TRACK_GROUPS, PERIOD_ID); assertTrackSelections(result, new TrackSelection[] {null, TRACK_SELECTIONS[1]}); assertThat(result.rendererConfigurations) .isEqualTo(new RendererConfiguration[] {null, DEFAULT}); @@ -192,7 +195,8 @@ public final class DefaultTrackSelectorTest { .buildUponParameters() .setSelectionOverride(0, new TrackGroupArray(VIDEO_TRACK_GROUP), null) .clearSelectionOverride(0, new TrackGroupArray(VIDEO_TRACK_GROUP))); - TrackSelectorResult result = trackSelector.selectTracks(RENDERER_CAPABILITIES, TRACK_GROUPS); + TrackSelectorResult result = + trackSelector.selectTracks(RENDERER_CAPABILITIES, TRACK_GROUPS, PERIOD_ID); assertTrackSelections(result, TRACK_SELECTIONS); assertThat(result.rendererConfigurations) .isEqualTo(new RendererConfiguration[] {DEFAULT, DEFAULT}); @@ -210,7 +214,8 @@ public final class DefaultTrackSelectorTest { TrackSelectorResult result = trackSelector.selectTracks( RENDERER_CAPABILITIES, - new TrackGroupArray(VIDEO_TRACK_GROUP, AUDIO_TRACK_GROUP, VIDEO_TRACK_GROUP)); + new TrackGroupArray(VIDEO_TRACK_GROUP, AUDIO_TRACK_GROUP, VIDEO_TRACK_GROUP), + PERIOD_ID); assertTrackSelections(result, TRACK_SELECTIONS); assertThat(result.rendererConfigurations) .isEqualTo(new RendererConfiguration[] {DEFAULT, DEFAULT}); @@ -222,7 +227,8 @@ public final class DefaultTrackSelectorTest { DefaultTrackSelector trackSelector = new DefaultTrackSelector(); trackSelector.init(invalidationListener, bandwidthMeter); trackSelector.setParameters(trackSelector.buildUponParameters().setRendererDisabled(1, true)); - TrackSelectorResult result = trackSelector.selectTracks(RENDERER_CAPABILITIES, TRACK_GROUPS); + TrackSelectorResult result = + trackSelector.selectTracks(RENDERER_CAPABILITIES, TRACK_GROUPS, PERIOD_ID); assertTrackSelections(result, new TrackSelection[] {TRACK_SELECTIONS[0], null}); assertThat(new RendererConfiguration[] {DEFAULT, null}) .isEqualTo(result.rendererConfigurations); @@ -238,7 +244,8 @@ public final class DefaultTrackSelectorTest { .buildUponParameters() .setRendererDisabled(1, true) .setRendererDisabled(1, false)); - TrackSelectorResult result = trackSelector.selectTracks(RENDERER_CAPABILITIES, TRACK_GROUPS); + TrackSelectorResult result = + trackSelector.selectTracks(RENDERER_CAPABILITIES, TRACK_GROUPS, PERIOD_ID); assertTrackSelections(result, TRACK_SELECTIONS); assertThat(new RendererConfiguration[] {DEFAULT, DEFAULT}) .isEqualTo(result.rendererConfigurations); @@ -250,7 +257,8 @@ public final class DefaultTrackSelectorTest { DefaultTrackSelector trackSelector = new DefaultTrackSelector(); trackSelector.init(invalidationListener, bandwidthMeter); TrackSelectorResult result = - trackSelector.selectTracks(RENDERER_CAPABILITIES_WITH_NO_SAMPLE_RENDERER, TRACK_GROUPS); + trackSelector.selectTracks( + RENDERER_CAPABILITIES_WITH_NO_SAMPLE_RENDERER, TRACK_GROUPS, PERIOD_ID); assertTrackSelections(result, TRACK_SELECTIONS_WITH_NO_SAMPLE_RENDERER); assertThat(new RendererConfiguration[] {DEFAULT, DEFAULT}) .isEqualTo(result.rendererConfigurations); @@ -263,7 +271,8 @@ public final class DefaultTrackSelectorTest { trackSelector.init(invalidationListener, bandwidthMeter); trackSelector.setParameters(trackSelector.buildUponParameters().setRendererDisabled(1, true)); TrackSelectorResult result = - trackSelector.selectTracks(RENDERER_CAPABILITIES_WITH_NO_SAMPLE_RENDERER, TRACK_GROUPS); + trackSelector.selectTracks( + RENDERER_CAPABILITIES_WITH_NO_SAMPLE_RENDERER, TRACK_GROUPS, PERIOD_ID); assertTrackSelections(result, TRACK_SELECTIONS_WITH_NO_SAMPLE_RENDERER); assertThat(new RendererConfiguration[] {DEFAULT, null}) .isEqualTo(result.rendererConfigurations); @@ -322,9 +331,11 @@ public final class DefaultTrackSelectorTest { Format formatWithSelectionFlag = buildAudioFormat("audio", /* language= */ null, C.SELECTION_FLAG_DEFAULT); - TrackSelectorResult result = trackSelector.selectTracks( - new RendererCapabilities[] {ALL_AUDIO_FORMAT_SUPPORTED_RENDERER_CAPABILITIES}, - singleTrackGroup(formatWithSelectionFlag, audioFormat)); + TrackSelectorResult result = + trackSelector.selectTracks( + new RendererCapabilities[] {ALL_AUDIO_FORMAT_SUPPORTED_RENDERER_CAPABILITIES}, + singleTrackGroup(formatWithSelectionFlag, audioFormat), + PERIOD_ID); assertThat(result.selections.get(0).getSelectedFormat()).isEqualTo(formatWithSelectionFlag); } @@ -347,7 +358,8 @@ public final class DefaultTrackSelectorTest { TrackSelectorResult result = trackSelector.selectTracks( new RendererCapabilities[] {ALL_AUDIO_FORMAT_SUPPORTED_RENDERER_CAPABILITIES}, - wrapFormats(frAudioFormat, enAudioFormat)); + wrapFormats(frAudioFormat, enAudioFormat), + PERIOD_ID); assertThat(result.selections.get(0).getSelectedFormat()).isEqualTo(enAudioFormat); } @@ -368,9 +380,11 @@ public final class DefaultTrackSelectorTest { Format.createAudioSampleFormat("audio", MimeTypes.AUDIO_AAC, null, Format.NO_VALUE, Format.NO_VALUE, 2, 44100, null, null, 0, "eng"); - TrackSelectorResult result = trackSelector.selectTracks( - new RendererCapabilities[] {ALL_AUDIO_FORMAT_SUPPORTED_RENDERER_CAPABILITIES}, - wrapFormats(frAudioFormat, enAudioFormat)); + TrackSelectorResult result = + trackSelector.selectTracks( + new RendererCapabilities[] {ALL_AUDIO_FORMAT_SUPPORTED_RENDERER_CAPABILITIES}, + wrapFormats(frAudioFormat, enAudioFormat), + PERIOD_ID); assertThat(result.selections.get(0).getSelectedFormat()).isEqualTo(enAudioFormat); } @@ -390,9 +404,11 @@ public final class DefaultTrackSelectorTest { RendererCapabilities mappedAudioRendererCapabilities = new FakeMappedRendererCapabilities(C.TRACK_TYPE_AUDIO, mappedCapabilities); - TrackSelectorResult result = trackSelector.selectTracks( - new RendererCapabilities[] {mappedAudioRendererCapabilities}, - singleTrackGroup(exceededFormat, supportedFormat)); + TrackSelectorResult result = + trackSelector.selectTracks( + new RendererCapabilities[] {mappedAudioRendererCapabilities}, + singleTrackGroup(exceededFormat, supportedFormat), + PERIOD_ID); assertThat(result.selections.get(0).getSelectedFormat()).isEqualTo(supportedFormat); } @@ -407,9 +423,11 @@ public final class DefaultTrackSelectorTest { Format audioFormat = Format.createAudioSampleFormat("audio", MimeTypes.AUDIO_AAC, null, Format.NO_VALUE, Format.NO_VALUE, 2, 44100, null, null, 0, null); - TrackSelectorResult result = trackSelector.selectTracks( - new RendererCapabilities[] {ALL_AUDIO_FORMAT_EXCEEDED_RENDERER_CAPABILITIES}, - singleTrackGroup(audioFormat)); + TrackSelectorResult result = + trackSelector.selectTracks( + new RendererCapabilities[] {ALL_AUDIO_FORMAT_EXCEEDED_RENDERER_CAPABILITIES}, + singleTrackGroup(audioFormat), + PERIOD_ID); assertThat(result.selections.get(0).getSelectedFormat()).isEqualTo(audioFormat); } @@ -428,9 +446,11 @@ public final class DefaultTrackSelectorTest { Format audioFormat = Format.createAudioSampleFormat("audio", MimeTypes.AUDIO_AAC, null, Format.NO_VALUE, Format.NO_VALUE, 2, 44100, null, null, 0, null); - TrackSelectorResult result = trackSelector.selectTracks( - new RendererCapabilities[] {ALL_AUDIO_FORMAT_EXCEEDED_RENDERER_CAPABILITIES}, - singleTrackGroup(audioFormat)); + TrackSelectorResult result = + trackSelector.selectTracks( + new RendererCapabilities[] {ALL_AUDIO_FORMAT_EXCEEDED_RENDERER_CAPABILITIES}, + singleTrackGroup(audioFormat), + PERIOD_ID); assertThat(result.selections.get(0)).isNull(); } @@ -455,9 +475,11 @@ public final class DefaultTrackSelectorTest { RendererCapabilities mappedAudioRendererCapabilities = new FakeMappedRendererCapabilities(C.TRACK_TYPE_AUDIO, mappedCapabilities); - TrackSelectorResult result = trackSelector.selectTracks( - new RendererCapabilities[] {mappedAudioRendererCapabilities}, - singleTrackGroup(exceededWithSelectionFlagFormat, supportedFormat)); + TrackSelectorResult result = + trackSelector.selectTracks( + new RendererCapabilities[] {mappedAudioRendererCapabilities}, + singleTrackGroup(exceededWithSelectionFlagFormat, supportedFormat), + PERIOD_ID); assertThat(result.selections.get(0).getSelectedFormat()).isEqualTo(supportedFormat); } @@ -485,9 +507,11 @@ public final class DefaultTrackSelectorTest { RendererCapabilities mappedAudioRendererCapabilities = new FakeMappedRendererCapabilities(C.TRACK_TYPE_AUDIO, mappedCapabilities); - TrackSelectorResult result = trackSelector.selectTracks( - new RendererCapabilities[] {mappedAudioRendererCapabilities}, - singleTrackGroup(exceededEnFormat, supportedFrFormat)); + TrackSelectorResult result = + trackSelector.selectTracks( + new RendererCapabilities[] {mappedAudioRendererCapabilities}, + singleTrackGroup(exceededEnFormat, supportedFrFormat), + PERIOD_ID); assertThat(result.selections.get(0).getSelectedFormat()).isEqualTo(supportedFrFormat); } @@ -515,9 +539,11 @@ public final class DefaultTrackSelectorTest { RendererCapabilities mappedAudioRendererCapabilities = new FakeMappedRendererCapabilities(C.TRACK_TYPE_AUDIO, mappedCapabilities); - TrackSelectorResult result = trackSelector.selectTracks( - new RendererCapabilities[] {mappedAudioRendererCapabilities}, - singleTrackGroup(exceededDefaultSelectionEnFormat, supportedFrFormat)); + TrackSelectorResult result = + trackSelector.selectTracks( + new RendererCapabilities[] {mappedAudioRendererCapabilities}, + singleTrackGroup(exceededDefaultSelectionEnFormat, supportedFrFormat), + PERIOD_ID); assertThat(result.selections.get(0).getSelectedFormat()).isEqualTo(supportedFrFormat); } @@ -536,9 +562,11 @@ public final class DefaultTrackSelectorTest { Format.createAudioSampleFormat("audioFormat", MimeTypes.AUDIO_AAC, null, Format.NO_VALUE, Format.NO_VALUE, 6, 44100, null, null, 0, null); - TrackSelectorResult result = trackSelector.selectTracks( - new RendererCapabilities[] {ALL_AUDIO_FORMAT_SUPPORTED_RENDERER_CAPABILITIES}, - singleTrackGroup(higherChannelFormat, lowerChannelFormat)); + TrackSelectorResult result = + trackSelector.selectTracks( + new RendererCapabilities[] {ALL_AUDIO_FORMAT_SUPPORTED_RENDERER_CAPABILITIES}, + singleTrackGroup(higherChannelFormat, lowerChannelFormat), + PERIOD_ID); assertThat(result.selections.get(0).getSelectedFormat()).isEqualTo(higherChannelFormat); } @@ -557,9 +585,11 @@ public final class DefaultTrackSelectorTest { Format.createAudioSampleFormat("audioFormat", MimeTypes.AUDIO_AAC, null, Format.NO_VALUE, Format.NO_VALUE, 2, 22050, null, null, 0, null); - TrackSelectorResult result = trackSelector.selectTracks( - new RendererCapabilities[] {ALL_AUDIO_FORMAT_SUPPORTED_RENDERER_CAPABILITIES}, - singleTrackGroup(higherSampleRateFormat, lowerSampleRateFormat)); + TrackSelectorResult result = + trackSelector.selectTracks( + new RendererCapabilities[] {ALL_AUDIO_FORMAT_SUPPORTED_RENDERER_CAPABILITIES}, + singleTrackGroup(higherSampleRateFormat, lowerSampleRateFormat), + PERIOD_ID); assertThat(result.selections.get(0).getSelectedFormat()).isEqualTo(higherSampleRateFormat); } @@ -578,9 +608,11 @@ public final class DefaultTrackSelectorTest { Format.createAudioSampleFormat("audioFormat", MimeTypes.AUDIO_AAC, null, 30000, Format.NO_VALUE, 2, 44100, null, null, 0, null); - TrackSelectorResult result = trackSelector.selectTracks( - new RendererCapabilities[] {ALL_AUDIO_FORMAT_SUPPORTED_RENDERER_CAPABILITIES}, - singleTrackGroup(lowerBitrateFormat, higherBitrateFormat)); + TrackSelectorResult result = + trackSelector.selectTracks( + new RendererCapabilities[] {ALL_AUDIO_FORMAT_SUPPORTED_RENDERER_CAPABILITIES}, + singleTrackGroup(lowerBitrateFormat, higherBitrateFormat), + PERIOD_ID); assertThat(result.selections.get(0).getSelectedFormat()).isEqualTo(higherBitrateFormat); } @@ -600,9 +632,12 @@ public final class DefaultTrackSelectorTest { Format.createAudioSampleFormat("audioFormat", MimeTypes.AUDIO_AAC, null, Format.NO_VALUE, Format.NO_VALUE, 6, 22050, null, null, 0, null); - TrackSelectorResult result = trackSelector.selectTracks( - new RendererCapabilities[] {ALL_AUDIO_FORMAT_SUPPORTED_RENDERER_CAPABILITIES}, - singleTrackGroup(higherChannelLowerSampleRateFormat, lowerChannelHigherSampleRateFormat)); + TrackSelectorResult result = + trackSelector.selectTracks( + new RendererCapabilities[] {ALL_AUDIO_FORMAT_SUPPORTED_RENDERER_CAPABILITIES}, + singleTrackGroup( + higherChannelLowerSampleRateFormat, lowerChannelHigherSampleRateFormat), + PERIOD_ID); assertThat(result.selections.get(0).getSelectedFormat()) .isEqualTo(higherChannelLowerSampleRateFormat); @@ -623,9 +658,12 @@ public final class DefaultTrackSelectorTest { Format.createAudioSampleFormat("audioFormat", MimeTypes.AUDIO_AAC, null, 30000, Format.NO_VALUE, 2, 22050, null, null, 0, null); - TrackSelectorResult result = trackSelector.selectTracks( - new RendererCapabilities[] {ALL_AUDIO_FORMAT_SUPPORTED_RENDERER_CAPABILITIES}, - singleTrackGroup(higherSampleRateLowerBitrateFormat, lowerSampleRateHigherBitrateFormat)); + TrackSelectorResult result = + trackSelector.selectTracks( + new RendererCapabilities[] {ALL_AUDIO_FORMAT_SUPPORTED_RENDERER_CAPABILITIES}, + singleTrackGroup( + higherSampleRateLowerBitrateFormat, lowerSampleRateHigherBitrateFormat), + PERIOD_ID); assertThat(result.selections.get(0).getSelectedFormat()) .isEqualTo(higherSampleRateLowerBitrateFormat); @@ -645,9 +683,11 @@ public final class DefaultTrackSelectorTest { Format.createAudioSampleFormat("audioFormat", MimeTypes.AUDIO_AAC, null, Format.NO_VALUE, Format.NO_VALUE, 6, 44100, null, null, 0, null); - TrackSelectorResult result = trackSelector.selectTracks( - new RendererCapabilities[] {ALL_AUDIO_FORMAT_EXCEEDED_RENDERER_CAPABILITIES}, - singleTrackGroup(higherChannelFormat, lowerChannelFormat)); + TrackSelectorResult result = + trackSelector.selectTracks( + new RendererCapabilities[] {ALL_AUDIO_FORMAT_EXCEEDED_RENDERER_CAPABILITIES}, + singleTrackGroup(higherChannelFormat, lowerChannelFormat), + PERIOD_ID); assertThat(result.selections.get(0).getSelectedFormat()).isEqualTo(lowerChannelFormat); } @@ -666,9 +706,11 @@ public final class DefaultTrackSelectorTest { Format.createAudioSampleFormat("audioFormat", MimeTypes.AUDIO_AAC, null, Format.NO_VALUE, Format.NO_VALUE, 2, 44100, null, null, 0, null); - TrackSelectorResult result = trackSelector.selectTracks( - new RendererCapabilities[] {ALL_AUDIO_FORMAT_EXCEEDED_RENDERER_CAPABILITIES}, - singleTrackGroup(higherSampleRateFormat, lowerSampleRateFormat)); + TrackSelectorResult result = + trackSelector.selectTracks( + new RendererCapabilities[] {ALL_AUDIO_FORMAT_EXCEEDED_RENDERER_CAPABILITIES}, + singleTrackGroup(higherSampleRateFormat, lowerSampleRateFormat), + PERIOD_ID); assertThat(result.selections.get(0).getSelectedFormat()).isEqualTo(lowerSampleRateFormat); } @@ -687,9 +729,11 @@ public final class DefaultTrackSelectorTest { Format.createAudioSampleFormat("audioFormat", MimeTypes.AUDIO_AAC, null, 30000, Format.NO_VALUE, 2, 44100, null, null, 0, null); - TrackSelectorResult result = trackSelector.selectTracks( - new RendererCapabilities[] {ALL_AUDIO_FORMAT_EXCEEDED_RENDERER_CAPABILITIES}, - singleTrackGroup(lowerBitrateFormat, higherBitrateFormat)); + TrackSelectorResult result = + trackSelector.selectTracks( + new RendererCapabilities[] {ALL_AUDIO_FORMAT_EXCEEDED_RENDERER_CAPABILITIES}, + singleTrackGroup(lowerBitrateFormat, higherBitrateFormat), + PERIOD_ID); assertThat(result.selections.get(0).getSelectedFormat()).isEqualTo(lowerBitrateFormat); } @@ -709,9 +753,12 @@ public final class DefaultTrackSelectorTest { Format.createAudioSampleFormat("audioFormat", MimeTypes.AUDIO_AAC, null, Format.NO_VALUE, Format.NO_VALUE, 6, 22050, null, null, 0, null); - TrackSelectorResult result = trackSelector.selectTracks( - new RendererCapabilities[] {ALL_AUDIO_FORMAT_EXCEEDED_RENDERER_CAPABILITIES}, - singleTrackGroup(higherChannelLowerSampleRateFormat, lowerChannelHigherSampleRateFormat)); + TrackSelectorResult result = + trackSelector.selectTracks( + new RendererCapabilities[] {ALL_AUDIO_FORMAT_EXCEEDED_RENDERER_CAPABILITIES}, + singleTrackGroup( + higherChannelLowerSampleRateFormat, lowerChannelHigherSampleRateFormat), + PERIOD_ID); assertThat(result.selections.get(0).getSelectedFormat()) .isEqualTo(lowerChannelHigherSampleRateFormat); @@ -732,9 +779,12 @@ public final class DefaultTrackSelectorTest { Format.createAudioSampleFormat("audioFormat", MimeTypes.AUDIO_AAC, null, 30000, Format.NO_VALUE, 2, 22050, null, null, 0, null); - TrackSelectorResult result = trackSelector.selectTracks( - new RendererCapabilities[] {ALL_AUDIO_FORMAT_EXCEEDED_RENDERER_CAPABILITIES}, - singleTrackGroup(higherSampleRateLowerBitrateFormat, lowerSampleRateHigherBitrateFormat)); + TrackSelectorResult result = + trackSelector.selectTracks( + new RendererCapabilities[] {ALL_AUDIO_FORMAT_EXCEEDED_RENDERER_CAPABILITIES}, + singleTrackGroup( + higherSampleRateLowerBitrateFormat, lowerSampleRateHigherBitrateFormat), + PERIOD_ID); assertThat(result.selections.get(0).getSelectedFormat()) .isEqualTo(lowerSampleRateHigherBitrateFormat); @@ -756,18 +806,22 @@ public final class DefaultTrackSelectorTest { // There is no text language preference, the first track flagged as default should be selected. TrackSelectorResult result = trackSelector.selectTracks( - textRendererCapabilities, wrapFormats(forcedOnly, forcedDefault, defaultOnly, noFlag)); + textRendererCapabilities, + wrapFormats(forcedOnly, forcedDefault, defaultOnly, noFlag), + PERIOD_ID); assertThat(result.selections.get(0).getFormat(0)).isSameAs(forcedDefault); // Ditto. result = trackSelector.selectTracks( - textRendererCapabilities, wrapFormats(forcedOnly, noFlag, defaultOnly)); + textRendererCapabilities, wrapFormats(forcedOnly, noFlag, defaultOnly), PERIOD_ID); assertThat(result.selections.get(0).getFormat(0)).isSameAs(defaultOnly); // With no language preference and no text track flagged as default, the first forced should be // selected. - result = trackSelector.selectTracks(textRendererCapabilities, wrapFormats(forcedOnly, noFlag)); + result = + trackSelector.selectTracks( + textRendererCapabilities, wrapFormats(forcedOnly, noFlag), PERIOD_ID); assertThat(result.selections.get(0).getFormat(0)).isSameAs(forcedOnly); trackSelector.setParameters( @@ -779,7 +833,9 @@ public final class DefaultTrackSelectorTest { // Default flags are disabled, so the first track flagged as forced should be selected. result = trackSelector.selectTracks( - textRendererCapabilities, wrapFormats(defaultOnly, noFlag, forcedOnly, forcedDefault)); + textRendererCapabilities, + wrapFormats(defaultOnly, noFlag, forcedOnly, forcedDefault), + PERIOD_ID); assertThat(result.selections.get(0).getFormat(0)).isSameAs(forcedOnly); trackSelector.setParameters( @@ -790,7 +846,8 @@ public final class DefaultTrackSelectorTest { result = trackSelector.selectTracks( textRendererCapabilities, - wrapFormats(forcedDefault, forcedOnly, defaultOnly, noFlag, forcedOnlySpanish)); + wrapFormats(forcedDefault, forcedOnly, defaultOnly, noFlag, forcedOnlySpanish), + PERIOD_ID); assertThat(result.selections.get(0).getFormat(0)).isSameAs(forcedOnlySpanish); trackSelector.setParameters( @@ -804,7 +861,9 @@ public final class DefaultTrackSelectorTest { // selected. result = trackSelector.selectTracks( - textRendererCapabilities, wrapFormats(forcedOnly, forcedDefault, defaultOnly, noFlag)); + textRendererCapabilities, + wrapFormats(forcedOnly, forcedDefault, defaultOnly, noFlag), + PERIOD_ID); assertThat(result.selections.get(0)).isNull(); trackSelector.setParameters( @@ -814,7 +873,9 @@ public final class DefaultTrackSelectorTest { // be selected. result = trackSelector.selectTracks( - textRendererCapabilities, wrapFormats(forcedOnly, forcedDefault, defaultOnly, noFlag)); + textRendererCapabilities, + wrapFormats(forcedOnly, forcedDefault, defaultOnly, noFlag), + PERIOD_ID); assertThat(result.selections.get(0).getFormat(0)).isSameAs(forcedDefault); trackSelector.setParameters( @@ -829,7 +890,9 @@ public final class DefaultTrackSelectorTest { // forced subtitles. result = trackSelector.selectTracks( - textRendererCapabilities, wrapFormats(noFlag, forcedOnly, forcedDefault, defaultOnly)); + textRendererCapabilities, + wrapFormats(noFlag, forcedOnly, forcedDefault, defaultOnly), + PERIOD_ID); assertThat(result.selections.get(0).getFormat(0)).isSameAs(noFlag); } @@ -851,35 +914,49 @@ public final class DefaultTrackSelectorTest { TrackSelectorResult result = trackSelector.selectTracks( textRendererCapabilites, - wrapFormats(spanish, german, undeterminedUnd, undeterminedNull)); + wrapFormats(spanish, german, undeterminedUnd, undeterminedNull), + PERIOD_ID); assertThat(result.selections.get(0)).isNull(); trackSelector.setParameters( new ParametersBuilder().setSelectUndeterminedTextLanguage(true).build()); - result = trackSelector.selectTracks(textRendererCapabilites, - wrapFormats(spanish, german, undeterminedUnd, undeterminedNull)); + result = + trackSelector.selectTracks( + textRendererCapabilites, + wrapFormats(spanish, german, undeterminedUnd, undeterminedNull), + PERIOD_ID); assertThat(result.selections.get(0).getFormat(0)).isSameAs(undeterminedUnd); ParametersBuilder builder = new ParametersBuilder().setPreferredTextLanguage("spa"); trackSelector.setParameters(builder.build()); - result = trackSelector.selectTracks(textRendererCapabilites, - wrapFormats(spanish, german, undeterminedUnd, undeterminedNull)); + result = + trackSelector.selectTracks( + textRendererCapabilites, + wrapFormats(spanish, german, undeterminedUnd, undeterminedNull), + PERIOD_ID); assertThat(result.selections.get(0).getFormat(0)).isSameAs(spanish); - result = trackSelector.selectTracks(textRendererCapabilites, - wrapFormats(german, undeterminedUnd, undeterminedNull)); + result = + trackSelector.selectTracks( + textRendererCapabilites, + wrapFormats(german, undeterminedUnd, undeterminedNull), + PERIOD_ID); assertThat(result.selections.get(0)).isNull(); trackSelector.setParameters(builder.setSelectUndeterminedTextLanguage(true).build()); - result = trackSelector.selectTracks(textRendererCapabilites, - wrapFormats(german, undeterminedUnd, undeterminedNull)); + result = + trackSelector.selectTracks( + textRendererCapabilites, + wrapFormats(german, undeterminedUnd, undeterminedNull), + PERIOD_ID); assertThat(result.selections.get(0).getFormat(0)).isSameAs(undeterminedUnd); - result = trackSelector.selectTracks(textRendererCapabilites, - wrapFormats(german, undeterminedNull)); + result = + trackSelector.selectTracks( + textRendererCapabilites, wrapFormats(german, undeterminedNull), PERIOD_ID); assertThat(result.selections.get(0).getFormat(0)).isSameAs(undeterminedNull); - result = trackSelector.selectTracks(textRendererCapabilites, wrapFormats(german)); + result = trackSelector.selectTracks(textRendererCapabilites, wrapFormats(german), PERIOD_ID); assertThat(result.selections.get(0)).isNull(); } @@ -908,19 +985,21 @@ public final class DefaultTrackSelectorTest { // Without an explicit language preference, nothing should be selected. TrackSelectorResult result = - trackSelector.selectTracks(rendererCapabilities, wrapFormats(english, german)); + trackSelector.selectTracks(rendererCapabilities, wrapFormats(english, german), PERIOD_ID); assertThat(result.selections.get(0)).isNull(); assertThat(result.selections.get(1)).isNull(); // Explicit language preference for english. First renderer should be used. trackSelector.setParameters(trackSelector.buildUponParameters().setPreferredTextLanguage("en")); - result = trackSelector.selectTracks(rendererCapabilities, wrapFormats(english, german)); + result = + trackSelector.selectTracks(rendererCapabilities, wrapFormats(english, german), PERIOD_ID); assertThat(result.selections.get(0).getFormat(0)).isSameAs(english); assertThat(result.selections.get(1)).isNull(); // Explicit language preference for German. Second renderer should be used. trackSelector.setParameters(trackSelector.buildUponParameters().setPreferredTextLanguage("de")); - result = trackSelector.selectTracks(rendererCapabilities, wrapFormats(english, german)); + result = + trackSelector.selectTracks(rendererCapabilities, wrapFormats(english, german), PERIOD_ID); assertThat(result.selections.get(0)).isNull(); assertThat(result.selections.get(1).getFormat(0)).isSameAs(german); } @@ -941,9 +1020,11 @@ public final class DefaultTrackSelectorTest { Format.createAudioSampleFormat("audioFormat", MimeTypes.AUDIO_AAC, null, 30000, Format.NO_VALUE, 2, 44100, null, null, 0, null); - TrackSelectorResult result = trackSelector.selectTracks( - new RendererCapabilities[] {ALL_AUDIO_FORMAT_SUPPORTED_RENDERER_CAPABILITIES}, - singleTrackGroup(lowerBitrateFormat, higherBitrateFormat)); + TrackSelectorResult result = + trackSelector.selectTracks( + new RendererCapabilities[] {ALL_AUDIO_FORMAT_SUPPORTED_RENDERER_CAPABILITIES}, + singleTrackGroup(lowerBitrateFormat, higherBitrateFormat), + PERIOD_ID); assertThat(result.selections.get(0).getSelectedFormat()).isEqualTo(lowerBitrateFormat); } @@ -962,7 +1043,7 @@ public final class DefaultTrackSelectorTest { TrackGroupArray trackGroupArray = singleTrackGroup(AUDIO_FORMAT, AUDIO_FORMAT); TrackSelectorResult result = trackSelector.selectTracks( - new RendererCapabilities[] {AUDIO_CAPABILITIES}, trackGroupArray); + new RendererCapabilities[] {AUDIO_CAPABILITIES}, trackGroupArray, PERIOD_ID); assertThat(result.length).isEqualTo(1); assertThat(result.selections.get(0)).isEqualTo(adaptiveTrackSelection); @@ -991,7 +1072,7 @@ public final class DefaultTrackSelectorTest { new SelectionOverride(/* groupIndex= */ 0, /* tracks= */ 1, 2))); TrackSelectorResult result = trackSelector.selectTracks( - new RendererCapabilities[] {AUDIO_CAPABILITIES}, trackGroupArray); + new RendererCapabilities[] {AUDIO_CAPABILITIES}, trackGroupArray, PERIOD_ID); assertThat(result.length).isEqualTo(1); assertThat(result.selections.get(0)).isEqualTo(adaptiveTrackSelection); @@ -1024,21 +1105,23 @@ public final class DefaultTrackSelectorTest { // Without an explicit language preference, prefer the first renderer. TrackSelectorResult result = - trackSelector.selectTracks(rendererCapabilities, wrapFormats(english, german)); + trackSelector.selectTracks(rendererCapabilities, wrapFormats(english, german), PERIOD_ID); assertThat(result.selections.get(0).getFormat(0)).isSameAs(english); assertThat(result.selections.get(1)).isNull(); // Explicit language preference for english. First renderer should be used. trackSelector.setParameters( trackSelector.buildUponParameters().setPreferredAudioLanguage("en")); - result = trackSelector.selectTracks(rendererCapabilities, wrapFormats(english, german)); + result = + trackSelector.selectTracks(rendererCapabilities, wrapFormats(english, german), PERIOD_ID); assertThat(result.selections.get(0).getFormat(0)).isSameAs(english); assertThat(result.selections.get(1)).isNull(); // Explicit language preference for German. Second renderer should be used. trackSelector.setParameters( trackSelector.buildUponParameters().setPreferredAudioLanguage("de")); - result = trackSelector.selectTracks(rendererCapabilities, wrapFormats(english, german)); + result = + trackSelector.selectTracks(rendererCapabilities, wrapFormats(english, german), PERIOD_ID); assertThat(result.selections.get(0)).isNull(); assertThat(result.selections.get(1).getFormat(0)).isSameAs(german); } @@ -1057,7 +1140,7 @@ public final class DefaultTrackSelectorTest { TrackGroupArray trackGroupArray = singleTrackGroup(VIDEO_FORMAT, VIDEO_FORMAT); TrackSelectorResult result = trackSelector.selectTracks( - new RendererCapabilities[] {VIDEO_CAPABILITIES}, trackGroupArray); + new RendererCapabilities[] {VIDEO_CAPABILITIES}, trackGroupArray, PERIOD_ID); assertThat(result.length).isEqualTo(1); assertThat(result.selections.get(0)).isEqualTo(adaptiveTrackSelection); @@ -1086,7 +1169,7 @@ public final class DefaultTrackSelectorTest { new SelectionOverride(/* groupIndex= */ 0, /* tracks= */ 1, 2))); TrackSelectorResult result = trackSelector.selectTracks( - new RendererCapabilities[] {VIDEO_CAPABILITIES}, trackGroupArray); + new RendererCapabilities[] {VIDEO_CAPABILITIES}, trackGroupArray, PERIOD_ID); assertThat(result.length).isEqualTo(1); assertThat(result.selections.get(0)).isEqualTo(adaptiveTrackSelection); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/trackselection/MappingTrackSelectorTest.java b/library/core/src/test/java/com/google/android/exoplayer2/trackselection/MappingTrackSelectorTest.java index fa3d74b15f..3899ebfd37 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/trackselection/MappingTrackSelectorTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/trackselection/MappingTrackSelectorTest.java @@ -23,6 +23,7 @@ import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.RendererCapabilities; import com.google.android.exoplayer2.RendererConfiguration; +import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId; import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.util.MimeTypes; @@ -51,6 +52,7 @@ public final class MappingTrackSelectorTest { Format.NO_VALUE, 2, 44100, null, null, 0, null)); private static final TrackGroupArray TRACK_GROUPS = new TrackGroupArray( VIDEO_TRACK_GROUP, AUDIO_TRACK_GROUP); + private static final MediaPeriodId PERIOD_ID = new MediaPeriodId(/* periodUid= */ new Object()); /** * Tests that the video and audio track groups are mapped onto the correct renderers. @@ -58,7 +60,7 @@ public final class MappingTrackSelectorTest { @Test public void testMapping() throws ExoPlaybackException { FakeMappingTrackSelector trackSelector = new FakeMappingTrackSelector(); - trackSelector.selectTracks(RENDERER_CAPABILITIES, TRACK_GROUPS); + trackSelector.selectTracks(RENDERER_CAPABILITIES, TRACK_GROUPS, PERIOD_ID); trackSelector.assertMappedTrackGroups(0, VIDEO_TRACK_GROUP); trackSelector.assertMappedTrackGroups(1, AUDIO_TRACK_GROUP); } @@ -72,7 +74,7 @@ public final class MappingTrackSelectorTest { FakeMappingTrackSelector trackSelector = new FakeMappingTrackSelector(); RendererCapabilities[] reverseOrderRendererCapabilities = new RendererCapabilities[] { AUDIO_CAPABILITIES, VIDEO_CAPABILITIES}; - trackSelector.selectTracks(reverseOrderRendererCapabilities, TRACK_GROUPS); + trackSelector.selectTracks(reverseOrderRendererCapabilities, TRACK_GROUPS, PERIOD_ID); trackSelector.assertMappedTrackGroups(0, AUDIO_TRACK_GROUP); trackSelector.assertMappedTrackGroups(1, VIDEO_TRACK_GROUP); } @@ -86,7 +88,7 @@ public final class MappingTrackSelectorTest { FakeMappingTrackSelector trackSelector = new FakeMappingTrackSelector(); TrackGroupArray multiTrackGroups = new TrackGroupArray(VIDEO_TRACK_GROUP, AUDIO_TRACK_GROUP, VIDEO_TRACK_GROUP); - trackSelector.selectTracks(RENDERER_CAPABILITIES, multiTrackGroups); + trackSelector.selectTracks(RENDERER_CAPABILITIES, multiTrackGroups, PERIOD_ID); trackSelector.assertMappedTrackGroups(0, VIDEO_TRACK_GROUP, VIDEO_TRACK_GROUP); trackSelector.assertMappedTrackGroups(1, AUDIO_TRACK_GROUP); } diff --git a/library/core/src/test/java/com/google/android/exoplayer2/trackselection/TrackSelectorTest.java b/library/core/src/test/java/com/google/android/exoplayer2/trackselection/TrackSelectorTest.java index 615f680bb5..781f2b4fc9 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/trackselection/TrackSelectorTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/trackselection/TrackSelectorTest.java @@ -20,6 +20,7 @@ import static org.junit.Assert.fail; import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.RendererCapabilities; +import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId; import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.trackselection.TrackSelector.InvalidationListener; import com.google.android.exoplayer2.upstream.BandwidthMeter; @@ -37,16 +38,20 @@ public class TrackSelectorTest { @Before public void setUp() { - trackSelector = new TrackSelector() { - @Override - public TrackSelectorResult selectTracks(RendererCapabilities[] rendererCapabilities, - TrackGroupArray trackGroups) throws ExoPlaybackException { - throw new UnsupportedOperationException(); - } + trackSelector = + new TrackSelector() { + @Override + public TrackSelectorResult selectTracks( + RendererCapabilities[] rendererCapabilities, + TrackGroupArray trackGroups, + MediaPeriodId periodId) + throws ExoPlaybackException { + throw new UnsupportedOperationException(); + } - @Override - public void onSelectionActivated(Object info) {} - }; + @Override + public void onSelectionActivated(Object info) {} + }; } @Test