Commit c2d7fae5 by tonihei Committed by Ian Baker

Add preferred MIME type(s) to DefaultTrackSelector parameters.

This allows to set preferences based on MIME type for video and audio.
The MIME type preference is applied after other explicit preferences
and restrictions (e.g. language or max resolution), but before implicit
preferences like bitrate.

Issue: #8320
PiperOrigin-RevId: 350550543
parent 6e8af81d
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
* Deprecate `HttpDataSource.Factory.getDefaultRequestProperties` and add * Deprecate `HttpDataSource.Factory.getDefaultRequestProperties` and add
`HttpDataSource.Factory.setDefaultRequestProperties` instead. `HttpDataSource.Factory.setDefaultRequestProperties` instead.
* Fix playback issues after seeking during an ad * Fix playback issues after seeking during an ad
([#8349](https://github.com/google/ExoPlayer/issues/8349)) ([#8349](https://github.com/google/ExoPlayer/issues/8349)).
* Add `DefaultHttpDataSource.Factory` and deprecate * Add `DefaultHttpDataSource.Factory` and deprecate
`DefaultHttpDataSourceFactory`. `DefaultHttpDataSourceFactory`.
* Populate codecs string for H.264/AVC in MP4, Matroska and FLV streams to * Populate codecs string for H.264/AVC in MP4, Matroska and FLV streams to
...@@ -46,6 +46,8 @@ ...@@ -46,6 +46,8 @@
* Allow parallel adaptation for video and audio * Allow parallel adaptation for video and audio
([#5111](https://github.com/google/ExoPlayer/issues/5111)). ([#5111](https://github.com/google/ExoPlayer/issues/5111)).
* Add option to specify multiple preferred audio or text languages. * Add option to specify multiple preferred audio or text languages.
* Add option to specify preferred MIME type(s) for video and audio
([#8320](https://github.com/google/ExoPlayer/issues/8320)).
* Forward `Timeline` and `MediaPeriodId` to `TrackSelection.Factory`. * Forward `Timeline` and `MediaPeriodId` to `TrackSelection.Factory`.
* DASH: * DASH:
* Support low-latency DASH playback (`availabilityTimeOffset` and * Support low-latency DASH playback (`availabilityTimeOffset` and
......
...@@ -1469,6 +1469,98 @@ public final class DefaultTrackSelectorTest { ...@@ -1469,6 +1469,98 @@ public final class DefaultTrackSelectorTest {
assertFixedSelection(result.selections.get(1), trackGroups.get(1), /* expectedTrack= */ 1); assertFixedSelection(result.selections.get(1), trackGroups.get(1), /* expectedTrack= */ 1);
} }
@Test
public void selectTracks_withPreferredVideoMimeTypes_selectsTrackWithPreferredMimeType()
throws Exception {
Format formatAv1 = new Format.Builder().setSampleMimeType(MimeTypes.VIDEO_AV1).build();
Format formatVp9 = new Format.Builder().setSampleMimeType(MimeTypes.VIDEO_VP9).build();
Format formatH264 = new Format.Builder().setSampleMimeType(MimeTypes.VIDEO_H264).build();
TrackGroupArray trackGroups = wrapFormats(formatAv1, formatVp9, formatH264);
trackSelector.setParameters(
trackSelector.buildUponParameters().setPreferredVideoMimeType(MimeTypes.VIDEO_VP9));
TrackSelectorResult result =
trackSelector.selectTracks(
new RendererCapabilities[] {VIDEO_CAPABILITIES}, trackGroups, periodId, TIMELINE);
assertThat(result.length).isEqualTo(1);
assertFixedSelection(result.selections.get(0), trackGroups, formatVp9);
trackSelector.setParameters(
trackSelector
.buildUponParameters()
.setPreferredVideoMimeTypes(MimeTypes.VIDEO_VP9, MimeTypes.VIDEO_AV1));
result =
trackSelector.selectTracks(
new RendererCapabilities[] {VIDEO_CAPABILITIES}, trackGroups, periodId, TIMELINE);
assertThat(result.length).isEqualTo(1);
assertFixedSelection(result.selections.get(0), trackGroups, formatVp9);
trackSelector.setParameters(
trackSelector
.buildUponParameters()
.setPreferredVideoMimeTypes(MimeTypes.VIDEO_DIVX, MimeTypes.VIDEO_H264));
result =
trackSelector.selectTracks(
new RendererCapabilities[] {VIDEO_CAPABILITIES}, trackGroups, periodId, TIMELINE);
assertThat(result.length).isEqualTo(1);
assertFixedSelection(result.selections.get(0), trackGroups, formatH264);
// Select first in the list if no preference is specified.
trackSelector.setParameters(
trackSelector.buildUponParameters().setPreferredVideoMimeType(null));
result =
trackSelector.selectTracks(
new RendererCapabilities[] {VIDEO_CAPABILITIES}, trackGroups, periodId, TIMELINE);
assertThat(result.length).isEqualTo(1);
assertFixedSelection(result.selections.get(0), trackGroups, formatAv1);
}
@Test
public void selectTracks_withPreferredAudioMimeTypes_selectsTrackWithPreferredMimeType()
throws Exception {
Format formatAac = new Format.Builder().setSampleMimeType(MimeTypes.AUDIO_AAC).build();
Format formatAc4 = new Format.Builder().setSampleMimeType(MimeTypes.AUDIO_AC4).build();
Format formatEAc3 = new Format.Builder().setSampleMimeType(MimeTypes.AUDIO_E_AC3).build();
TrackGroupArray trackGroups = wrapFormats(formatAac, formatAc4, formatEAc3);
trackSelector.setParameters(
trackSelector.buildUponParameters().setPreferredAudioMimeType(MimeTypes.AUDIO_AC4));
TrackSelectorResult result =
trackSelector.selectTracks(
new RendererCapabilities[] {AUDIO_CAPABILITIES}, trackGroups, periodId, TIMELINE);
assertThat(result.length).isEqualTo(1);
assertFixedSelection(result.selections.get(0), trackGroups, formatAc4);
trackSelector.setParameters(
trackSelector
.buildUponParameters()
.setPreferredAudioMimeTypes(MimeTypes.AUDIO_AC4, MimeTypes.AUDIO_AAC));
result =
trackSelector.selectTracks(
new RendererCapabilities[] {AUDIO_CAPABILITIES}, trackGroups, periodId, TIMELINE);
assertThat(result.length).isEqualTo(1);
assertFixedSelection(result.selections.get(0), trackGroups, formatAc4);
trackSelector.setParameters(
trackSelector
.buildUponParameters()
.setPreferredAudioMimeTypes(MimeTypes.AUDIO_AMR, MimeTypes.AUDIO_E_AC3));
result =
trackSelector.selectTracks(
new RendererCapabilities[] {AUDIO_CAPABILITIES}, trackGroups, periodId, TIMELINE);
assertThat(result.length).isEqualTo(1);
assertFixedSelection(result.selections.get(0), trackGroups, formatEAc3);
// Select first in the list if no preference is specified.
trackSelector.setParameters(
trackSelector.buildUponParameters().setPreferredAudioMimeType(null));
result =
trackSelector.selectTracks(
new RendererCapabilities[] {AUDIO_CAPABILITIES}, trackGroups, periodId, TIMELINE);
assertThat(result.length).isEqualTo(1);
assertFixedSelection(result.selections.get(0), trackGroups, formatAac);
}
private static void assertSelections(TrackSelectorResult result, TrackSelection[] expected) { private static void assertSelections(TrackSelectorResult result, TrackSelection[] expected) {
assertThat(result.length).isEqualTo(expected.length); assertThat(result.length).isEqualTo(expected.length);
for (int i = 0; i < expected.length; i++) { for (int i = 0; i < expected.length; i++) {
...@@ -1572,6 +1664,7 @@ public final class DefaultTrackSelectorTest { ...@@ -1572,6 +1664,7 @@ public final class DefaultTrackSelectorTest {
/* viewportWidth= */ 8, /* viewportWidth= */ 8,
/* viewportHeight= */ 9, /* viewportHeight= */ 9,
/* viewportOrientationMayChange= */ true, /* viewportOrientationMayChange= */ true,
/* preferredVideoMimeTypes= */ ImmutableList.of(MimeTypes.VIDEO_AV1, MimeTypes.VIDEO_H264),
// Audio // Audio
/* preferredAudioLanguages= */ ImmutableList.of("zh", "jp"), /* preferredAudioLanguages= */ ImmutableList.of("zh", "jp"),
/* maxAudioChannelCount= */ 10, /* maxAudioChannelCount= */ 10,
...@@ -1580,6 +1673,7 @@ public final class DefaultTrackSelectorTest { ...@@ -1580,6 +1673,7 @@ public final class DefaultTrackSelectorTest {
/* allowAudioMixedMimeTypeAdaptiveness= */ true, /* allowAudioMixedMimeTypeAdaptiveness= */ true,
/* allowAudioMixedSampleRateAdaptiveness= */ false, /* allowAudioMixedSampleRateAdaptiveness= */ false,
/* allowAudioMixedChannelCountAdaptiveness= */ true, /* allowAudioMixedChannelCountAdaptiveness= */ true,
/* preferredAudioMimeTypes= */ ImmutableList.of(MimeTypes.AUDIO_AC3, MimeTypes.AUDIO_E_AC3),
// Text // Text
/* preferredTextLanguages= */ ImmutableList.of("de", "en"), /* preferredTextLanguages= */ ImmutableList.of("de", "en"),
/* preferredTextRoleFlags= */ C.ROLE_FLAG_CAPTION, /* preferredTextRoleFlags= */ C.ROLE_FLAG_CAPTION,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment