diff --git a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/BaseUrlExclusionList.java b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/BaseUrlExclusionList.java index ebf923e23bd..2047e6ba41f 100644 --- a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/BaseUrlExclusionList.java +++ b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/BaseUrlExclusionList.java @@ -126,7 +126,11 @@ public int getPriorityCountAfterExclusion(List baseUrls) { Set priorities = new HashSet<>(); List includedBaseUrls = applyExclusions(baseUrls); for (int i = 0; i < includedBaseUrls.size(); i++) { - priorities.add(includedBaseUrls.get(i).priority); + int priority = includedBaseUrls.get(i).priority; + if (priority == BaseUrl.PRIORITY_UNSET) { + return includedBaseUrls.size(); + } + priorities.add(priority); } return priorities.size(); } @@ -140,7 +144,11 @@ public int getPriorityCountAfterExclusion(List baseUrls) { public static int getPriorityCount(List baseUrls) { Set priorities = new HashSet<>(); for (int i = 0; i < baseUrls.size(); i++) { - priorities.add(baseUrls.get(i).priority); + int priority = baseUrls.get(i).priority; + if (priority == BaseUrl.PRIORITY_UNSET) { + return baseUrls.size(); + } + priorities.add(priority); } return priorities.size(); } diff --git a/libraries/exoplayer_dash/src/test/java/androidx/media3/exoplayer/dash/BaseUrlExclusionListTest.java b/libraries/exoplayer_dash/src/test/java/androidx/media3/exoplayer/dash/BaseUrlExclusionListTest.java index 4e98d8b6cad..05c8333732a 100644 --- a/libraries/exoplayer_dash/src/test/java/androidx/media3/exoplayer/dash/BaseUrlExclusionListTest.java +++ b/libraries/exoplayer_dash/src/test/java/androidx/media3/exoplayer/dash/BaseUrlExclusionListTest.java @@ -17,6 +17,7 @@ import static androidx.media3.exoplayer.dash.manifest.BaseUrl.DEFAULT_DVB_PRIORITY; import static androidx.media3.exoplayer.dash.manifest.BaseUrl.DEFAULT_WEIGHT; +import static androidx.media3.exoplayer.dash.manifest.BaseUrl.PRIORITY_UNSET; import static androidx.media3.exoplayer.upstream.DefaultLoadErrorHandlingPolicy.DEFAULT_LOCATION_EXCLUSION_MS; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.anyInt; @@ -274,4 +275,85 @@ public void getPriorityCount_correctPriorityCount() { assertThat(BaseUrlExclusionList.getPriorityCount(baseUrls)).isEqualTo(3); assertThat(BaseUrlExclusionList.getPriorityCount(ImmutableList.of())).isEqualTo(0); } + + @Test + public void getPriorityCountAfterExclusion_priorityUnset_correctPriorityCount() { + List baseUrls = + ImmutableList.of( + new BaseUrl( + /* url= */ "a", + /* serviceLocation= */ "a", + /* priority= */ PRIORITY_UNSET, + /* weight= */ 1), + new BaseUrl( + /* url= */ "b", + /* serviceLocation= */ "b", + /* priority= */ PRIORITY_UNSET, + /* weight= */ 1), + new BaseUrl( + /* url= */ "c", + /* serviceLocation= */ "c", + /* priority= */ PRIORITY_UNSET, + /* weight= */ 1), + new BaseUrl( + /* url= */ "d", + /* serviceLocation= */ "d", + /* priority= */ PRIORITY_UNSET, + /* weight= */ 1), + new BaseUrl( + /* url= */ "e", + /* serviceLocation= */ "e", + /* priority= */ PRIORITY_UNSET, + /* weight= */ 1)); + BaseUrlExclusionList baseUrlExclusionList = new BaseUrlExclusionList(); + + // Empty base URL list. + assertThat(baseUrlExclusionList.getPriorityCountAfterExclusion(ImmutableList.of())) + .isEqualTo(0); + + assertThat(baseUrlExclusionList.getPriorityCountAfterExclusion(baseUrls)).isEqualTo(5); + // Exclude base urls. + baseUrlExclusionList.exclude(baseUrls.get(0), DEFAULT_LOCATION_EXCLUSION_MS); + assertThat(baseUrlExclusionList.getPriorityCountAfterExclusion(baseUrls)).isEqualTo(4); + baseUrlExclusionList.exclude(baseUrls.get(1), 2 * DEFAULT_LOCATION_EXCLUSION_MS); + assertThat(baseUrlExclusionList.getPriorityCountAfterExclusion(baseUrls)).isEqualTo(3); + baseUrlExclusionList.exclude(baseUrls.get(3), 3 * DEFAULT_LOCATION_EXCLUSION_MS); + assertThat(baseUrlExclusionList.getPriorityCountAfterExclusion(baseUrls)).isEqualTo(2); + // Time passes. + ShadowSystemClock.advanceBy(Duration.ofMillis(DEFAULT_LOCATION_EXCLUSION_MS)); + assertThat(baseUrlExclusionList.getPriorityCountAfterExclusion(baseUrls)).isEqualTo(3); + ShadowSystemClock.advanceBy(Duration.ofMillis(DEFAULT_LOCATION_EXCLUSION_MS)); + assertThat(baseUrlExclusionList.getPriorityCountAfterExclusion(baseUrls)).isEqualTo(4); + ShadowSystemClock.advanceBy(Duration.ofMillis(DEFAULT_LOCATION_EXCLUSION_MS)); + assertThat(baseUrlExclusionList.getPriorityCountAfterExclusion(baseUrls)).isEqualTo(5); + } + + @Test + public void getPriorityCount_priorityUnset_correctPriorityCount() { + List baseUrls = + ImmutableList.of( + new BaseUrl( + /* url= */ "a", + /* serviceLocation= */ "a", + /* priority= */ PRIORITY_UNSET, + /* weight= */ 1), + new BaseUrl( + /* url= */ "b", + /* serviceLocation= */ "b", + /* priority= */ PRIORITY_UNSET, + /* weight= */ 1), + new BaseUrl( + /* url= */ "c", + /* serviceLocation= */ "c", + /* priority= */ PRIORITY_UNSET, + /* weight= */ 1), + new BaseUrl( + /* url= */ "d", + /* serviceLocation= */ "d", + /* priority= */ PRIORITY_UNSET, + /* weight= */ 1)); + + assertThat(BaseUrlExclusionList.getPriorityCount(baseUrls)).isEqualTo(4); + assertThat(BaseUrlExclusionList.getPriorityCount(ImmutableList.of())).isEqualTo(0); + } }