diff --git a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaPeriod.java b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaPeriod.java index 507b06ef50f..5e1485f04cd 100644 --- a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaPeriod.java +++ b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaPeriod.java @@ -20,7 +20,6 @@ import android.util.Pair; import android.util.SparseArray; -import android.util.SparseIntArray; import androidx.annotation.IntDef; import androidx.annotation.Nullable; import androidx.media3.common.C; @@ -58,6 +57,7 @@ import androidx.media3.exoplayer.upstream.CmcdConfiguration; import androidx.media3.exoplayer.upstream.LoadErrorHandlingPolicy; import androidx.media3.exoplayer.upstream.LoaderErrorThrower; +import com.google.common.collect.Maps; import com.google.common.primitives.Ints; import java.io.IOException; import java.lang.annotation.Documented; @@ -66,6 +66,7 @@ import java.lang.annotation.Target; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; import java.util.IdentityHashMap; import java.util.List; import java.util.regex.Matcher; @@ -550,7 +551,8 @@ private static Pair buildTrackGroups( */ private static int[][] getGroupedAdaptationSetIndices(List adaptationSets) { int adaptationSetCount = adaptationSets.size(); - SparseIntArray adaptationSetIdToIndex = new SparseIntArray(adaptationSetCount); + HashMap adaptationSetIdToIndex = + Maps.newHashMapWithExpectedSize(adaptationSetCount); List> adaptationSetGroupedIndices = new ArrayList<>(adaptationSetCount); SparseArray> adaptationSetIndexToGroupedIndices = new SparseArray<>(adaptationSetCount); @@ -578,10 +580,9 @@ private static int[][] getGroupedAdaptationSetIndices(List adapta trickPlayProperty = findTrickPlayProperty(adaptationSet.supplementalProperties); } if (trickPlayProperty != null) { - int mainAdaptationSetId = Integer.parseInt(trickPlayProperty.value); - int mainAdaptationSetIndex = - adaptationSetIdToIndex.get(mainAdaptationSetId, /* valueIfKeyNotFound= */ -1); - if (mainAdaptationSetIndex != -1) { + long mainAdaptationSetId = Long.parseLong(trickPlayProperty.value); + @Nullable Integer mainAdaptationSetIndex = adaptationSetIdToIndex.get(mainAdaptationSetId); + if (mainAdaptationSetIndex != null) { mergedGroupIndex = mainAdaptationSetIndex; } } @@ -595,11 +596,11 @@ private static int[][] getGroupedAdaptationSetIndices(List adapta if (adaptationSetSwitchingProperty != null) { String[] otherAdaptationSetIds = Util.split(adaptationSetSwitchingProperty.value, ","); for (String adaptationSetId : otherAdaptationSetIds) { - int otherAdaptationSetId = - adaptationSetIdToIndex.get( - Integer.parseInt(adaptationSetId), /* valueIfKeyNotFound= */ -1); - if (otherAdaptationSetId != -1) { - mergedGroupIndex = min(mergedGroupIndex, otherAdaptationSetId); + @Nullable + Integer otherAdaptationSetIndex = + adaptationSetIdToIndex.get(Long.parseLong(adaptationSetId)); + if (otherAdaptationSetIndex != null) { + mergedGroupIndex = min(mergedGroupIndex, otherAdaptationSetIndex); } } } @@ -683,7 +684,7 @@ private static int buildPrimaryAndEmbeddedTrackGroupInfos( AdaptationSet firstAdaptationSet = adaptationSets.get(adaptationSetIndices[0]); String trackGroupId = firstAdaptationSet.id != AdaptationSet.ID_UNSET - ? Integer.toString(firstAdaptationSet.id) + ? Long.toString(firstAdaptationSet.id) : ("unset:" + i); int primaryTrackGroupIndex = trackGroupCount++; int eventMessageTrackGroupIndex = diff --git a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/manifest/AdaptationSet.java b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/manifest/AdaptationSet.java index 7e7f73ad3b1..6522052503b 100644 --- a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/manifest/AdaptationSet.java +++ b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/manifest/AdaptationSet.java @@ -25,13 +25,13 @@ public class AdaptationSet { /** Value of {@link #id} indicating no value is set.= */ - public static final int ID_UNSET = -1; + public static final long ID_UNSET = -1; /** * A non-negative identifier for the adaptation set that's unique in the scope of its containing * period, or {@link #ID_UNSET} if not specified. */ - public final int id; + public final long id; /** The {@link C.TrackType track type} of the adaptation set. */ public final @C.TrackType int type; @@ -58,7 +58,7 @@ public class AdaptationSet { * @param supplementalProperties Supplemental properties in the adaptation set. */ public AdaptationSet( - int id, + long id, @C.TrackType int type, List representations, List accessibilityDescriptors, diff --git a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/manifest/DashManifestParser.java b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/manifest/DashManifestParser.java index 4a1e98393b9..2d8b496f799 100644 --- a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/manifest/DashManifestParser.java +++ b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/manifest/DashManifestParser.java @@ -393,7 +393,7 @@ protected AdaptationSet parseAdaptationSet( long timeShiftBufferDepthMs, boolean dvbProfileDeclared) throws XmlPullParserException, IOException { - int id = parseInt(xpp, "id", AdaptationSet.ID_UNSET); + long id = parseLong(xpp, "id", AdaptationSet.ID_UNSET); @C.TrackType int contentType = parseContentType(xpp); String mimeType = xpp.getAttributeValue(null, "mimeType"); @@ -532,7 +532,7 @@ protected AdaptationSet parseAdaptationSet( } protected AdaptationSet buildAdaptationSet( - int id, + long id, @C.TrackType int contentType, List representations, List accessibilityDescriptors, diff --git a/libraries/exoplayer_dash/src/test/java/androidx/media3/exoplayer/dash/DashMediaPeriodTest.java b/libraries/exoplayer_dash/src/test/java/androidx/media3/exoplayer/dash/DashMediaPeriodTest.java index e00560e34c8..59d898be6b9 100644 --- a/libraries/exoplayer_dash/src/test/java/androidx/media3/exoplayer/dash/DashMediaPeriodTest.java +++ b/libraries/exoplayer_dash/src/test/java/androidx/media3/exoplayer/dash/DashMediaPeriodTest.java @@ -80,13 +80,14 @@ public void adaptationSetSwitchingProperty_mergesTrackGroups() throws IOExceptio TrackGroupArray expectedTrackGroups = new TrackGroupArray( new TrackGroup( - /* id= */ "0", + /* id= */ "3000000000", adaptationSets.get(0).representations.get(0).format, adaptationSets.get(0).representations.get(1).format, adaptationSets.get(2).representations.get(0).format, adaptationSets.get(2).representations.get(1).format, adaptationSets.get(3).representations.get(0).format), - new TrackGroup(/* id= */ "3", adaptationSets.get(1).representations.get(0).format)); + new TrackGroup( + /* id= */ "3000000003", adaptationSets.get(1).representations.get(0).format)); MediaPeriodAsserts.assertTrackGroups(dashMediaPeriod, expectedTrackGroups); } @@ -102,12 +103,12 @@ public void trickPlayProperty_mergesTrackGroups() throws IOException { TrackGroupArray expectedTrackGroups = new TrackGroupArray( new TrackGroup( - /* id= */ "0", + /* id= */ "3000000000", adaptationSets.get(0).representations.get(0).format, adaptationSets.get(0).representations.get(1).format, adaptationSets.get(1).representations.get(0).format), new TrackGroup( - /* id= */ "2", + /* id= */ "3000000002", adaptationSets.get(2).representations.get(0).format, adaptationSets.get(2).representations.get(1).format, adaptationSets.get(3).representations.get(0).format)); @@ -127,7 +128,7 @@ public void adaptationSetSwitchingProperty_andTrickPlayProperty_mergesTrackGroup TrackGroupArray expectedTrackGroups = new TrackGroupArray( new TrackGroup( - /* id= */ "0", + /* id= */ "3000000000", adaptationSets.get(0).representations.get(0).format, adaptationSets.get(0).representations.get(1).format, adaptationSets.get(1).representations.get(0).format, diff --git a/libraries/test_data/src/test/assets/media/mpd/sample_mpd_switching_and_trick_play_property b/libraries/test_data/src/test/assets/media/mpd/sample_mpd_switching_and_trick_play_property index 145d0b132ef..609c841d7fa 100644 --- a/libraries/test_data/src/test/assets/media/mpd/sample_mpd_switching_and_trick_play_property +++ b/libraries/test_data/src/test/assets/media/mpd/sample_mpd_switching_and_trick_play_property @@ -1,30 +1,30 @@ - + + value="3000000001"/> - + + value="3000000002"/> - + + value="3000000001"/> - + + value="3000000002"/> diff --git a/libraries/test_data/src/test/assets/media/mpd/sample_mpd_switching_property b/libraries/test_data/src/test/assets/media/mpd/sample_mpd_switching_property index 4f10ee58424..1e236061989 100644 --- a/libraries/test_data/src/test/assets/media/mpd/sample_mpd_switching_property +++ b/libraries/test_data/src/test/assets/media/mpd/sample_mpd_switching_property @@ -1,27 +1,27 @@ - + + value="3000000001,3000000002"/> - + - + + value="3000000000,3000000001"/> - + + value="3000000000,3000000002"/> diff --git a/libraries/test_data/src/test/assets/media/mpd/sample_mpd_trick_play_property b/libraries/test_data/src/test/assets/media/mpd/sample_mpd_trick_play_property index 58841df081c..f8c9a1f1d64 100644 --- a/libraries/test_data/src/test/assets/media/mpd/sample_mpd_trick_play_property +++ b/libraries/test_data/src/test/assets/media/mpd/sample_mpd_trick_play_property @@ -1,24 +1,24 @@ - + + value="3000000001"/> - + - + - + + value="3000000002"/> diff --git a/libraries/test_data/src/test/assets/media/mpd/sample_mpd_vod b/libraries/test_data/src/test/assets/media/mpd/sample_mpd_vod index d95f8fa2962..6ba938e86aa 100644 --- a/libraries/test_data/src/test/assets/media/mpd/sample_mpd_vod +++ b/libraries/test_data/src/test/assets/media/mpd/sample_mpd_vod @@ -7,7 +7,7 @@ type="static" mediaPresentationDuration="PT904S"> - + @@ -20,7 +20,7 @@ - +