diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/DefaultTrackSelector.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/DefaultTrackSelector.java index dbf4d794cca..256d9dd8abc 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/DefaultTrackSelector.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/DefaultTrackSelector.java @@ -1561,7 +1561,7 @@ private void setParametersInternal(Parameters parameters) { || params.disabledTrackTypes.contains(rendererType)) { return null; } - // Per TrackGroupArray override + // Per TrackGroupArray overrides. TrackGroupArray rendererTrackGroups = mappedTrackInfo.getTrackGroups(rendererIndex); if (params.hasSelectionOverride(rendererIndex, rendererTrackGroups)) { @Nullable @@ -1572,18 +1572,27 @@ private void setParametersInternal(Parameters parameters) { return new ExoTrackSelection.Definition( rendererTrackGroups.get(override.groupIndex), override.tracks, override.type); } - // Per TrackGroup override + // Per TrackGroup overrides. for (int j = 0; j < rendererTrackGroups.length; j++) { TrackGroup trackGroup = rendererTrackGroups.get(j); @Nullable TrackSelectionOverride overrideTracks = params.trackSelectionOverrides.getOverride(trackGroup); if (overrideTracks != null) { - return new ExoTrackSelection.Definition( - trackGroup, Ints.toArray(overrideTracks.trackIndexes)); + if (overrideTracks.trackIndexes.isEmpty()) { + // TrackGroup is disabled. Deselect the currentDefinition if applicable. Otherwise ignore. + if (currentDefinition != null && currentDefinition.group.equals(trackGroup)) { + currentDefinition = null; + } + } else { + // Override current definition with new selection. + currentDefinition = + new ExoTrackSelection.Definition( + trackGroup, Ints.toArray(overrideTracks.trackIndexes)); + } } } - return currentDefinition; // No override + return currentDefinition; } // Track selection prior to overrides and disabled flags being applied. diff --git a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/trackselection/DefaultTrackSelectorTest.java b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/trackselection/DefaultTrackSelectorTest.java index 6a61eea7f3a..865686aae00 100644 --- a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/trackselection/DefaultTrackSelectorTest.java +++ b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/trackselection/DefaultTrackSelectorTest.java @@ -206,6 +206,43 @@ public void selectTracksWithClearedNullOverride() throws ExoPlaybackException { .isEqualTo(new RendererConfiguration[] {DEFAULT, DEFAULT}); } + @Test + public void selectTrack_withMixedEmptyAndNonEmptyTrackOverrides_appliesNonEmptyOverride() + throws Exception { + TrackGroup videoGroupHighBitrate = + new TrackGroup(VIDEO_FORMAT.buildUpon().setAverageBitrate(1_000_000).build()); + TrackGroup videoGroupMidBitrate = + new TrackGroup(VIDEO_FORMAT.buildUpon().setAverageBitrate(500_000).build()); + TrackGroup videoGroupLowBitrate = + new TrackGroup(VIDEO_FORMAT.buildUpon().setAverageBitrate(100_000).build()); + trackSelector.setParameters( + trackSelector + .buildUponParameters() + .setTrackSelectionOverrides( + new TrackSelectionOverrides.Builder() + .addOverride( + new TrackSelectionOverride( + videoGroupHighBitrate, /* trackIndexes= */ ImmutableList.of())) + .addOverride( + new TrackSelectionOverride( + videoGroupMidBitrate, /* trackIndexes= */ ImmutableList.of(0))) + .addOverride( + new TrackSelectionOverride( + videoGroupLowBitrate, /* trackIndexes= */ ImmutableList.of())) + .build())); + + TrackSelectorResult result = + trackSelector.selectTracks( + RENDERER_CAPABILITIES, + new TrackGroupArray(videoGroupHighBitrate, videoGroupMidBitrate, videoGroupLowBitrate), + periodId, + TIMELINE); + + assertThat(result.selections) + .asList() + .containsExactly(new FixedTrackSelection(videoGroupMidBitrate, /* track= */ 0), null); + } + /** Tests that an empty override is not applied for a different set of available track groups. */ @Test public void selectTracks_withEmptyTrackOverrideForDifferentTracks_hasNoEffect()