Skip to content

Commit 3cf9c08

Browse files
microkatzcopybara-github
authored andcommitted
Create AudioOffloadPreferences class
Move audio offload mode related interfaces and definitions from `TrackSelectionParameters` to a new `AudioOffloadModePreferences` class. PiperOrigin-RevId: 566905017
1 parent 08c72b9 commit 3cf9c08

File tree

8 files changed

+422
-212
lines changed

8 files changed

+422
-212
lines changed

api.txt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1076,13 +1076,10 @@ package androidx.media3.common {
10761076
method public static androidx.media3.common.TrackSelectionParameters fromBundle(android.os.Bundle);
10771077
method public static androidx.media3.common.TrackSelectionParameters getDefaults(android.content.Context);
10781078
method public android.os.Bundle toBundle();
1079-
field public final int audioOffloadModePreference;
10801079
field public final com.google.common.collect.ImmutableSet<java.lang.Integer> disabledTrackTypes;
10811080
field public final boolean forceHighestSupportedBitrate;
10821081
field public final boolean forceLowestBitrate;
10831082
field @androidx.media3.common.C.SelectionFlags public final int ignoredTextSelectionFlags;
1084-
field public final boolean isGaplessSupportRequired;
1085-
field public final boolean isSpeedChangeSupportRequired;
10861083
field public final int maxAudioBitrate;
10871084
field public final int maxAudioChannelCount;
10881085
field public final int maxVideoBitrate;
@@ -1116,7 +1113,6 @@ package androidx.media3.common {
11161113
method public androidx.media3.common.TrackSelectionParameters.Builder clearOverridesOfType(@androidx.media3.common.C.TrackType int);
11171114
method public androidx.media3.common.TrackSelectionParameters.Builder clearVideoSizeConstraints();
11181115
method public androidx.media3.common.TrackSelectionParameters.Builder clearViewportSizeConstraints();
1119-
method public androidx.media3.common.TrackSelectionParameters.Builder setAudioOffloadPreference(int, boolean, boolean);
11201116
method public androidx.media3.common.TrackSelectionParameters.Builder setForceHighestSupportedBitrate(boolean);
11211117
method public androidx.media3.common.TrackSelectionParameters.Builder setForceLowestBitrate(boolean);
11221118
method public androidx.media3.common.TrackSelectionParameters.Builder setIgnoredTextSelectionFlags(@androidx.media3.common.C.SelectionFlags int);

libraries/common/src/main/java/androidx/media3/common/TrackSelectionParameters.java

Lines changed: 237 additions & 97 deletions
Large diffs are not rendered by default.

libraries/common/src/test/java/androidx/media3/common/TrackSelectionParametersTest.java

Lines changed: 67 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,14 @@
1515
*/
1616
package androidx.media3.common;
1717

18+
import static androidx.media3.common.TrackSelectionParameters.AudioOffloadPreferences.AUDIO_OFFLOAD_MODE_DISABLED;
19+
import static androidx.media3.common.TrackSelectionParameters.AudioOffloadPreferences.AUDIO_OFFLOAD_MODE_ENABLED;
1820
import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
1921
import static com.google.common.truth.Truth.assertThat;
2022

23+
import android.os.Bundle;
24+
import androidx.media3.common.TrackSelectionParameters.AudioOffloadPreferences;
25+
import androidx.media3.common.util.Util;
2126
import androidx.test.ext.junit.runners.AndroidJUnit4;
2227
import com.google.common.collect.ImmutableList;
2328
import org.junit.Test;
@@ -29,6 +34,9 @@ public final class TrackSelectionParametersTest {
2934

3035
private static final TrackGroup AAC_TRACK_GROUP =
3136
new TrackGroup(new Format.Builder().setSampleMimeType(MimeTypes.AUDIO_AAC).build());
37+
private static final String BUNDLE_FIELD_AUDIO_OFFLOAD_MODE_PREFERENCE =
38+
Util.intToStringMaxRadix(27);
39+
private static final String BUNDLE_FIELD_AUDIO_OFFLOAD_PREFERENCES = Util.intToStringMaxRadix(30);
3240

3341
@Test
3442
public void defaultValue_withoutChange_isAsExpected() {
@@ -52,10 +60,10 @@ public void defaultValue_withoutChange_isAsExpected() {
5260
assertThat(parameters.preferredAudioRoleFlags).isEqualTo(0);
5361
assertThat(parameters.maxAudioChannelCount).isEqualTo(Integer.MAX_VALUE);
5462
assertThat(parameters.maxAudioBitrate).isEqualTo(Integer.MAX_VALUE);
55-
assertThat(parameters.audioOffloadModePreference)
56-
.isEqualTo(TrackSelectionParameters.AUDIO_OFFLOAD_MODE_PREFERENCE_DISABLED);
57-
assertThat(parameters.isGaplessSupportRequired).isFalse();
58-
assertThat(parameters.isSpeedChangeSupportRequired).isFalse();
63+
assertThat(parameters.audioOffloadPreferences.audioOffloadMode)
64+
.isEqualTo(AudioOffloadPreferences.AUDIO_OFFLOAD_MODE_DISABLED);
65+
assertThat(parameters.audioOffloadPreferences.isGaplessSupportRequired).isFalse();
66+
assertThat(parameters.audioOffloadPreferences.isSpeedChangeSupportRequired).isFalse();
5967
// Text
6068
assertThat(parameters.preferredAudioMimeTypes).isEmpty();
6169
assertThat(parameters.preferredTextLanguages).isEmpty();
@@ -100,10 +108,11 @@ public void parametersSet_fromDefault_isAsExpected() {
100108
.setMaxAudioChannelCount(10)
101109
.setMaxAudioBitrate(11)
102110
.setPreferredAudioMimeTypes(MimeTypes.AUDIO_AC3, MimeTypes.AUDIO_E_AC3)
103-
.setAudioOffloadPreference(
104-
TrackSelectionParameters.AUDIO_OFFLOAD_MODE_PREFERENCE_ENABLED,
105-
/* isGaplessSupportRequired= */ false,
106-
/* isSpeedChangeSupportRequired= */ true)
111+
.setAudioOffloadPreferences(
112+
new AudioOffloadPreferences.Builder()
113+
.setAudioOffloadMode(AudioOffloadPreferences.AUDIO_OFFLOAD_MODE_ENABLED)
114+
.setIsSpeedChangeSupportRequired(true)
115+
.build())
107116
// Text
108117
.setPreferredTextLanguages("de", "en")
109118
.setPreferredTextRoleFlags(C.ROLE_FLAG_CAPTION)
@@ -148,10 +157,10 @@ public void parametersSet_fromDefault_isAsExpected() {
148157
assertThat(parameters.preferredAudioMimeTypes)
149158
.containsExactly(MimeTypes.AUDIO_AC3, MimeTypes.AUDIO_E_AC3)
150159
.inOrder();
151-
assertThat(parameters.audioOffloadModePreference)
152-
.isEqualTo(TrackSelectionParameters.AUDIO_OFFLOAD_MODE_PREFERENCE_ENABLED);
153-
assertThat(parameters.isGaplessSupportRequired).isFalse();
154-
assertThat(parameters.isSpeedChangeSupportRequired).isTrue();
160+
assertThat(parameters.audioOffloadPreferences.audioOffloadMode)
161+
.isEqualTo(AudioOffloadPreferences.AUDIO_OFFLOAD_MODE_ENABLED);
162+
assertThat(parameters.audioOffloadPreferences.isGaplessSupportRequired).isFalse();
163+
assertThat(parameters.audioOffloadPreferences.isSpeedChangeSupportRequired).isTrue();
155164
// Text
156165
assertThat(parameters.preferredTextLanguages).containsExactly("de", "en").inOrder();
157166
assertThat(parameters.preferredTextRoleFlags).isEqualTo(C.ROLE_FLAG_CAPTION);
@@ -220,6 +229,29 @@ public void roundTripViaBundle_withOverride_yieldsEqualInstance() {
220229
.containsExactly(override.mediaTrackGroup, override);
221230
}
222231

232+
@Test
233+
public void roundTripViaBundle_withLegacyPreferenceFields_yieldsEqualInstance() {
234+
TrackSelectionParameters trackSelectionParameters =
235+
new TrackSelectionParameters.Builder(getApplicationContext())
236+
.setAudioOffloadPreferences(
237+
new AudioOffloadPreferences.Builder()
238+
.setAudioOffloadMode(AudioOffloadPreferences.AUDIO_OFFLOAD_MODE_ENABLED)
239+
.setIsGaplessSupportRequired(true)
240+
.build())
241+
.build();
242+
Bundle bundle = trackSelectionParameters.toBundle();
243+
// By removing AudioOffloadPreferences, bundle is a model of one initially created without
244+
// AudioOffloadPreferences but containing AudioOffloadPreferences sub-fields(ex:
245+
// isGaplessSupportRequired). Prod system should not be removing fields from the bundle.
246+
bundle.remove(BUNDLE_FIELD_AUDIO_OFFLOAD_PREFERENCES);
247+
248+
TrackSelectionParameters trackSelectionParametersfromBundle =
249+
TrackSelectionParameters.fromBundle(bundle);
250+
251+
assertThat(bundle.containsKey(BUNDLE_FIELD_AUDIO_OFFLOAD_MODE_PREFERENCE)).isTrue();
252+
assertThat(trackSelectionParametersfromBundle).isEqualTo(trackSelectionParameters);
253+
}
254+
223255
@Test
224256
public void addOverride_onDifferentGroups_addsOverride() {
225257
TrackSelectionOverride override1 =
@@ -307,6 +339,29 @@ public void clearOverride_ofTypeGroup_removesOverride() {
307339
.containsExactly(override1.mediaTrackGroup, override1);
308340
}
309341

342+
@Test
343+
public void audioOffloadPreferences_checkDefault_allFieldsAreDisabledOrFalse() {
344+
AudioOffloadPreferences audioOffloadPreferences = AudioOffloadPreferences.DEFAULT;
345+
346+
assertThat(audioOffloadPreferences.audioOffloadMode).isEqualTo(AUDIO_OFFLOAD_MODE_DISABLED);
347+
assertThat(audioOffloadPreferences.isGaplessSupportRequired).isFalse();
348+
assertThat(audioOffloadPreferences.isSpeedChangeSupportRequired).isFalse();
349+
}
350+
351+
@Test
352+
public void audioOffloadPreferences_buildUponWithIndividualSetters_equalsToOriginal() {
353+
AudioOffloadPreferences audioOffloadPreferences =
354+
new AudioOffloadPreferences.Builder()
355+
.setAudioOffloadMode(AUDIO_OFFLOAD_MODE_ENABLED)
356+
.setIsGaplessSupportRequired(true)
357+
.setIsSpeedChangeSupportRequired(false)
358+
.build();
359+
360+
AudioOffloadPreferences copy = audioOffloadPreferences.buildUpon().build();
361+
362+
assertThat(copy).isEqualTo(audioOffloadPreferences);
363+
}
364+
310365
private static TrackGroup newTrackGroupWithIds(int... ids) {
311366
Format[] formats = new Format[ids.length];
312367
for (int i = 0; i < ids.length; i++) {

libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1801,7 +1801,7 @@ void setVideoChangeFrameRateStrategy(
18011801
*
18021802
* <ul>
18031803
* <li>Audio offload rendering is enabled through {@link
1804-
* TrackSelectionParameters.Builder#setAudioOffloadPreference}.
1804+
* TrackSelectionParameters.Builder#setAudioOffloadPreferences}.
18051805
* <li>An audio track is playing in a format that the device supports offloading (for example,
18061806
* MP3 or AAC).
18071807
* <li>The {@link AudioSink} is playing with an offload {@link AudioTrack}.

libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/DefaultTrackSelector.java

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@
1515
*/
1616
package androidx.media3.exoplayer.trackselection;
1717

18-
import static androidx.media3.common.TrackSelectionParameters.AUDIO_OFFLOAD_MODE_PREFERENCE_DISABLED;
19-
import static androidx.media3.common.TrackSelectionParameters.AUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED;
18+
import static androidx.media3.common.TrackSelectionParameters.AudioOffloadPreferences.AUDIO_OFFLOAD_MODE_DISABLED;
19+
import static androidx.media3.common.TrackSelectionParameters.AudioOffloadPreferences.AUDIO_OFFLOAD_MODE_REQUIRED;
2020
import static androidx.media3.common.util.Assertions.checkStateNotNull;
2121
import static androidx.media3.common.util.Util.castNonNull;
2222
import static androidx.media3.exoplayer.RendererCapabilities.AUDIO_OFFLOAD_GAPLESS_SUPPORTED;
@@ -53,6 +53,7 @@
5353
import androidx.media3.common.TrackGroup;
5454
import androidx.media3.common.TrackSelectionOverride;
5555
import androidx.media3.common.TrackSelectionParameters;
56+
import androidx.media3.common.TrackSelectionParameters.AudioOffloadPreferences;
5657
import androidx.media3.common.util.Assertions;
5758
import androidx.media3.common.util.BundleableUtil;
5859
import androidx.media3.common.util.Log;
@@ -463,12 +464,9 @@ public ParametersBuilder setPreferredAudioMimeTypes(String... mimeTypes) {
463464

464465
@CanIgnoreReturnValue
465466
@Override
466-
public ParametersBuilder setAudioOffloadPreference(
467-
@TrackSelectionParameters.AudioOffloadModePreference int audioOffloadModePreference,
468-
boolean isGaplessSupportRequired,
469-
boolean isSpeedChangeSupportRequired) {
470-
delegate.setAudioOffloadPreference(
471-
audioOffloadModePreference, isGaplessSupportRequired, isSpeedChangeSupportRequired);
467+
public ParametersBuilder setAudioOffloadPreferences(
468+
AudioOffloadPreferences audioOffloadPreferences) {
469+
delegate.setAudioOffloadPreferences(audioOffloadPreferences);
472470
return this;
473471
}
474472

@@ -2507,7 +2505,7 @@ public void onRendererCapabilitiesChanged(Renderer renderer) {
25072505
}
25082506

25092507
// Configure audio renderer to use offload if appropriate.
2510-
if (parameters.audioOffloadModePreference != AUDIO_OFFLOAD_MODE_PREFERENCE_DISABLED) {
2508+
if (parameters.audioOffloadPreferences.audioOffloadMode != AUDIO_OFFLOAD_MODE_DISABLED) {
25112509
maybeConfigureRendererForOffload(
25122510
parameters,
25132511
mappedTrackInfo,
@@ -2529,9 +2527,10 @@ public void onRendererCapabilitiesChanged(Renderer renderer) {
25292527
* <p>The implementation should not account for overrides and disabled flags. Track selections
25302528
* generated by this method will be overridden to account for these properties.
25312529
*
2532-
* <p>If selection parameters include {@link Parameters#audioOffloadModePreference} with {@link
2533-
* TrackSelectionParameters#AUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED}, then only audio tracks will
2534-
* be selected. If no audio track is supported in offload, then no track will be selected.
2530+
* <p>If selection parameters include {@link Parameters#audioOffloadPreferences} with {@link
2531+
* AudioOffloadPreferences#audioOffloadMode} set to {@link
2532+
* AudioOffloadPreferences#AUDIO_OFFLOAD_MODE_REQUIRED} then only audio tracks will be selected.
2533+
* If no audio track is supported in offload, then no track will be selected.
25352534
*
25362535
* @param mappedTrackInfo Mapped track information.
25372536
* @param rendererFormatSupports The {@link Capabilities} for each mapped track, indexed by
@@ -2623,7 +2622,7 @@ protected Pair<ExoTrackSelection.Definition, Integer> selectVideoTrack(
26232622
@AdaptiveSupport int[] mixedMimeTypeSupports,
26242623
Parameters params)
26252624
throws ExoPlaybackException {
2626-
if (params.audioOffloadModePreference == AUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED) {
2625+
if (params.audioOffloadPreferences.audioOffloadMode == AUDIO_OFFLOAD_MODE_REQUIRED) {
26272626
return null;
26282627
}
26292628
return selectTracksForType(
@@ -2741,7 +2740,7 @@ protected Pair<ExoTrackSelection.Definition, Integer> selectTextTrack(
27412740
Parameters params,
27422741
@Nullable String selectedAudioLanguage)
27432742
throws ExoPlaybackException {
2744-
if (params.audioOffloadModePreference == AUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED) {
2743+
if (params.audioOffloadPreferences.audioOffloadMode == AUDIO_OFFLOAD_MODE_REQUIRED) {
27452744
return null;
27462745
}
27472746
return selectTracksForType(
@@ -2772,7 +2771,7 @@ protected Pair<ExoTrackSelection.Definition, Integer> selectTextTrack(
27722771
protected ExoTrackSelection.Definition selectOtherTrack(
27732772
int trackType, TrackGroupArray groups, @Capabilities int[][] formatSupport, Parameters params)
27742773
throws ExoPlaybackException {
2775-
if (params.audioOffloadModePreference == AUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED) {
2774+
if (params.audioOffloadPreferences.audioOffloadMode == AUDIO_OFFLOAD_MODE_REQUIRED) {
27762775
return null;
27772776
}
27782777
@Nullable TrackGroup selectedGroup = null;
@@ -3077,7 +3076,7 @@ private static void maybeConfigureRendererForOffload(
30773076
// Check whether we can enable offload. To enable offload we require exactly one audio track
30783077
// and a renderer with support matching the requirements set by
30793078
// setAudioOffloadPreference. There also cannot be other non-audio renderers with their own
3080-
// selected tracks.
3079+
// selected tracks unless the selection parameters say audio-only is not required.
30813080
int audioRendererIndex = C.INDEX_UNSET;
30823081
int audioRenderersSupportingOffload = 0;
30833082
boolean hasNonAudioRendererWithSelectedTracks = false;
@@ -3106,7 +3105,7 @@ private static void maybeConfigureRendererForOffload(
31063105
if (!hasNonAudioRendererWithSelectedTracks && audioRenderersSupportingOffload == 1) {
31073106
RendererConfiguration offloadRendererConfiguration =
31083107
new RendererConfiguration(
3109-
parameters.isGaplessSupportRequired
3108+
parameters.audioOffloadPreferences.isGaplessSupportRequired
31103109
? AudioSink.OFFLOAD_MODE_ENABLED_GAPLESS_REQUIRED
31113110
: AudioSink.OFFLOAD_MODE_ENABLED_GAPLESS_NOT_REQUIRED,
31123111
/* tunneling= */ rendererConfigurations[audioRendererIndex] != null
@@ -3128,14 +3127,14 @@ private static boolean rendererSupportsOffload(
31283127
if (RendererCapabilities.getAudioOffloadSupport(formatSupport) == AUDIO_OFFLOAD_NOT_SUPPORTED) {
31293128
return false;
31303129
}
3131-
if (parameters.isSpeedChangeSupportRequired
3130+
if (parameters.audioOffloadPreferences.isSpeedChangeSupportRequired
31323131
&& (RendererCapabilities.getAudioOffloadSupport(formatSupport)
31333132
& AUDIO_OFFLOAD_SPEED_CHANGE_SUPPORTED)
31343133
== 0) {
31353134
return false;
31363135
}
31373136
// TODO(b/235883373): Add check for OPUS where gapless info is in initialization data
3138-
if (parameters.isGaplessSupportRequired) {
3137+
if (parameters.audioOffloadPreferences.isGaplessSupportRequired) {
31393138
boolean isGapless = format.encoderDelay != 0 || format.encoderPadding != 0;
31403139
boolean isGaplessSupported =
31413140
(RendererCapabilities.getAudioOffloadSupport(formatSupport)
@@ -3751,7 +3750,7 @@ public int compareTo(AudioTrackInfo other) {
37513750
if (!isWithinConstraints && !parameters.exceedAudioConstraintsIfNecessary) {
37523751
return SELECTION_ELIGIBILITY_NO;
37533752
}
3754-
if (params.audioOffloadModePreference == AUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED
3753+
if (params.audioOffloadPreferences.audioOffloadMode == AUDIO_OFFLOAD_MODE_REQUIRED
37553754
&& !rendererSupportsOffload(params, rendererSupport, format)) {
37563755
return SELECTION_ELIGIBILITY_NO;
37573756
}
@@ -3761,7 +3760,7 @@ public int compareTo(AudioTrackInfo other) {
37613760
&& !parameters.forceHighestSupportedBitrate
37623761
&& !parameters.forceLowestBitrate
37633762
&& (parameters.allowMultipleAdaptiveSelections || !hasMappedVideoTracks)
3764-
&& params.audioOffloadModePreference != AUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED
3763+
&& params.audioOffloadPreferences.audioOffloadMode != AUDIO_OFFLOAD_MODE_REQUIRED
37653764
? SELECTION_ELIGIBILITY_ADAPTIVE
37663765
: SELECTION_ELIGIBILITY_FIXED;
37673766
}

0 commit comments

Comments
 (0)