From 34a08e13fcb019255308b1a6645bdecefa8aa094 Mon Sep 17 00:00:00 2001 From: ibaker Date: Thu, 18 Jan 2024 10:19:23 -0800 Subject: [PATCH] Rollback of https://github.com/androidx/media/commit/406c0a15be6f0937fe53df0b44097ccd5c8ef9a0 PiperOrigin-RevId: 599546140 --- .../source/CompositeSequenceableLoader.java | 110 ++-------------- .../CompositeSequenceableLoaderFactory.java | 18 +-- ...ultCompositeSequenceableLoaderFactory.java | 17 --- .../exoplayer/source/MergingMediaPeriod.java | 8 +- .../exoplayer/source/TrackGroupArray.java | 6 - .../CompositeSequenceableLoaderTest.java | 122 ++---------------- .../exoplayer/dash/DashMediaPeriod.java | 8 +- .../media3/exoplayer/hls/HlsMediaPeriod.java | 14 +- .../smoothstreaming/SsMediaPeriod.java | 9 +- .../test/utils/FakeAdaptiveMediaPeriod.java | 16 +-- 10 files changed, 42 insertions(+), 286 deletions(-) diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/CompositeSequenceableLoader.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/CompositeSequenceableLoader.java index cae78b43af..ae8cd9dc71 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/CompositeSequenceableLoader.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/CompositeSequenceableLoader.java @@ -15,80 +15,39 @@ */ package androidx.media3.exoplayer.source; -import static androidx.media3.common.util.Assertions.checkArgument; import static java.lang.Math.min; import androidx.media3.common.C; import androidx.media3.common.util.UnstableApi; import androidx.media3.exoplayer.LoadingInfo; -import com.google.common.collect.ImmutableList; -import java.util.Collections; -import java.util.List; /** A {@link SequenceableLoader} that encapsulates multiple other {@link SequenceableLoader}s. */ @UnstableApi public final class CompositeSequenceableLoader implements SequenceableLoader { - private final ImmutableList loadersWithTrackTypes; + private final SequenceableLoader[] loaders; - /** - * @deprecated Use {@link CompositeSequenceableLoader#CompositeSequenceableLoader(List, List)} - * instead. - */ - @Deprecated public CompositeSequenceableLoader(SequenceableLoader[] loaders) { - this( - ImmutableList.copyOf(loaders), - Collections.nCopies(loaders.length, ImmutableList.of(C.TRACK_TYPE_UNKNOWN))); - } - - public CompositeSequenceableLoader( - List loaders, - List> loaderTrackTypes) { - ImmutableList.Builder loaderAndTrackTypes = - ImmutableList.builder(); - checkArgument(loaders.size() == loaderTrackTypes.size()); - for (int i = 0; i < loaders.size(); i++) { - loaderAndTrackTypes.add( - new SequenceableLoaderWithTrackTypes(loaders.get(i), loaderTrackTypes.get(i))); - } - this.loadersWithTrackTypes = loaderAndTrackTypes.build(); + this.loaders = loaders; } @Override public long getBufferedPositionUs() { long bufferedPositionUs = Long.MAX_VALUE; - boolean hasAudioVideoTracks = false; - long bufferedPositionAudioVideoUs = Long.MAX_VALUE; - for (int i = 0; i < loadersWithTrackTypes.size(); i++) { - SequenceableLoaderWithTrackTypes loader = loadersWithTrackTypes.get(i); + for (SequenceableLoader loader : loaders) { long loaderBufferedPositionUs = loader.getBufferedPositionUs(); - if (loader.getTrackTypes().contains(C.TRACK_TYPE_AUDIO) - || loader.getTrackTypes().contains(C.TRACK_TYPE_VIDEO)) { - hasAudioVideoTracks = true; - if (loaderBufferedPositionUs != C.TIME_END_OF_SOURCE) { - bufferedPositionAudioVideoUs = - min(bufferedPositionAudioVideoUs, loaderBufferedPositionUs); - } - } if (loaderBufferedPositionUs != C.TIME_END_OF_SOURCE) { bufferedPositionUs = min(bufferedPositionUs, loaderBufferedPositionUs); } } - if (hasAudioVideoTracks) { - return bufferedPositionAudioVideoUs != Long.MAX_VALUE - ? bufferedPositionAudioVideoUs - : C.TIME_END_OF_SOURCE; - } else { - return bufferedPositionUs != Long.MAX_VALUE ? bufferedPositionUs : C.TIME_END_OF_SOURCE; - } + return bufferedPositionUs == Long.MAX_VALUE ? C.TIME_END_OF_SOURCE : bufferedPositionUs; } @Override public long getNextLoadPositionUs() { long nextLoadPositionUs = Long.MAX_VALUE; - for (int i = 0; i < loadersWithTrackTypes.size(); i++) { - long loaderNextLoadPositionUs = loadersWithTrackTypes.get(i).getNextLoadPositionUs(); + for (SequenceableLoader loader : loaders) { + long loaderNextLoadPositionUs = loader.getNextLoadPositionUs(); if (loaderNextLoadPositionUs != C.TIME_END_OF_SOURCE) { nextLoadPositionUs = min(nextLoadPositionUs, loaderNextLoadPositionUs); } @@ -98,8 +57,8 @@ public final class CompositeSequenceableLoader implements SequenceableLoader { @Override public void reevaluateBuffer(long positionUs) { - for (int i = 0; i < loadersWithTrackTypes.size(); i++) { - loadersWithTrackTypes.get(i).reevaluateBuffer(positionUs); + for (SequenceableLoader loader : loaders) { + loader.reevaluateBuffer(positionUs); } } @@ -113,13 +72,13 @@ public final class CompositeSequenceableLoader implements SequenceableLoader { if (nextLoadPositionUs == C.TIME_END_OF_SOURCE) { break; } - for (int i = 0; i < loadersWithTrackTypes.size(); i++) { - long loaderNextLoadPositionUs = loadersWithTrackTypes.get(i).getNextLoadPositionUs(); + for (SequenceableLoader loader : loaders) { + long loaderNextLoadPositionUs = loader.getNextLoadPositionUs(); boolean isLoaderBehind = loaderNextLoadPositionUs != C.TIME_END_OF_SOURCE && loaderNextLoadPositionUs <= loadingInfo.playbackPositionUs; if (loaderNextLoadPositionUs == nextLoadPositionUs || isLoaderBehind) { - madeProgressThisIteration |= loadersWithTrackTypes.get(i).continueLoading(loadingInfo); + madeProgressThisIteration |= loader.continueLoading(loadingInfo); } } madeProgress |= madeProgressThisIteration; @@ -129,54 +88,11 @@ public final class CompositeSequenceableLoader implements SequenceableLoader { @Override public boolean isLoading() { - for (int i = 0; i < loadersWithTrackTypes.size(); i++) { - if (loadersWithTrackTypes.get(i).isLoading()) { + for (SequenceableLoader loader : loaders) { + if (loader.isLoading()) { return true; } } return false; } - - private static final class SequenceableLoaderWithTrackTypes implements SequenceableLoader { - - private final SequenceableLoader loader; - private final ImmutableList<@C.TrackType Integer> trackTypes; - - public SequenceableLoaderWithTrackTypes( - SequenceableLoader loader, List<@C.TrackType Integer> trackTypes) { - this.loader = loader; - this.trackTypes = ImmutableList.copyOf(trackTypes); - } - - public ImmutableList<@C.TrackType Integer> getTrackTypes() { - return trackTypes; - } - - // SequenceableLoader implementation - - @Override - public long getBufferedPositionUs() { - return loader.getBufferedPositionUs(); - } - - @Override - public long getNextLoadPositionUs() { - return loader.getNextLoadPositionUs(); - } - - @Override - public boolean continueLoading(LoadingInfo loadingInfo) { - return loader.continueLoading(loadingInfo); - } - - @Override - public boolean isLoading() { - return loader.isLoading(); - } - - @Override - public void reevaluateBuffer(long positionUs) { - loader.reevaluateBuffer(positionUs); - } - } } diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/CompositeSequenceableLoaderFactory.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/CompositeSequenceableLoaderFactory.java index 2230418ed0..3d53692284 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/CompositeSequenceableLoaderFactory.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/CompositeSequenceableLoaderFactory.java @@ -15,33 +15,17 @@ */ package androidx.media3.exoplayer.source; -import androidx.media3.common.C; import androidx.media3.common.util.UnstableApi; -import java.util.List; /** A factory to create composite {@link SequenceableLoader}s. */ @UnstableApi public interface CompositeSequenceableLoaderFactory { - /** Returns an empty composite {@link SequenceableLoader}, with no delegate loaders. */ - SequenceableLoader empty(); - - /** - * @deprecated Use {@link #empty()} for an empty composite loader, or {@link #create(List, List)} - * for a non-empty one. - */ - @Deprecated - SequenceableLoader createCompositeSequenceableLoader(SequenceableLoader... loaders); - /** * Creates a composite {@link SequenceableLoader}. * * @param loaders The sub-loaders that make up the {@link SequenceableLoader} to be built. - * @param loaderTrackTypes The track types handled by each entry in {@code loaders}. Must be the - * same as {@code loaders}. * @return A composite {@link SequenceableLoader} that comprises the given loaders. */ - SequenceableLoader create( - List loaders, - List> loaderTrackTypes); + SequenceableLoader createCompositeSequenceableLoader(SequenceableLoader... loaders); } diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/DefaultCompositeSequenceableLoaderFactory.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/DefaultCompositeSequenceableLoaderFactory.java index 7d79aac8da..aa342971fe 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/DefaultCompositeSequenceableLoaderFactory.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/DefaultCompositeSequenceableLoaderFactory.java @@ -15,10 +15,7 @@ */ package androidx.media3.exoplayer.source; -import androidx.media3.common.C; import androidx.media3.common.util.UnstableApi; -import com.google.common.collect.ImmutableList; -import java.util.List; /** Default implementation of {@link CompositeSequenceableLoaderFactory}. */ @UnstableApi @@ -26,21 +23,7 @@ public final class DefaultCompositeSequenceableLoaderFactory implements CompositeSequenceableLoaderFactory { @Override - public SequenceableLoader empty() { - return new CompositeSequenceableLoader(ImmutableList.of(), ImmutableList.of()); - } - - @Deprecated - @Override - @SuppressWarnings("deprecation") // Calling deprecated constructor public SequenceableLoader createCompositeSequenceableLoader(SequenceableLoader... loaders) { return new CompositeSequenceableLoader(loaders); } - - @Override - public SequenceableLoader create( - List loaders, - List> loaderTrackTypes) { - return new CompositeSequenceableLoader(loaders, loaderTrackTypes); - } } diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MergingMediaPeriod.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MergingMediaPeriod.java index 41da775394..6e910e4b4a 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MergingMediaPeriod.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MergingMediaPeriod.java @@ -29,7 +29,6 @@ import androidx.media3.exoplayer.source.chunk.Chunk; import androidx.media3.exoplayer.source.chunk.MediaChunk; import androidx.media3.exoplayer.source.chunk.MediaChunkIterator; import androidx.media3.exoplayer.trackselection.ExoTrackSelection; -import com.google.common.collect.Lists; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; @@ -59,7 +58,8 @@ import java.util.List; this.periods = periods; childrenPendingPreparation = new ArrayList<>(); childTrackGroupByMergedTrackGroup = new HashMap<>(); - compositeSequenceableLoader = compositeSequenceableLoaderFactory.empty(); + compositeSequenceableLoader = + compositeSequenceableLoaderFactory.createCompositeSequenceableLoader(); streamPeriodIndices = new IdentityHashMap<>(); enabledPeriods = new MediaPeriod[0]; for (int i = 0; i < periods.length; i++) { @@ -172,9 +172,7 @@ import java.util.List; // Update the local state. enabledPeriods = enabledPeriodsList.toArray(new MediaPeriod[0]); compositeSequenceableLoader = - compositeSequenceableLoaderFactory.create( - enabledPeriodsList, - Lists.transform(enabledPeriodsList, period -> period.getTrackGroups().getTrackTypes())); + compositeSequenceableLoaderFactory.createCompositeSequenceableLoader(enabledPeriods); return positionUs; } diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/TrackGroupArray.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/TrackGroupArray.java index 5c7e6c2c0b..2018bb0612 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/TrackGroupArray.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/TrackGroupArray.java @@ -25,7 +25,6 @@ import androidx.media3.common.util.Log; import androidx.media3.common.util.UnstableApi; import androidx.media3.common.util.Util; import com.google.common.collect.ImmutableList; -import com.google.common.collect.Lists; import java.util.List; /** @@ -91,11 +90,6 @@ public final class TrackGroupArray implements Bundleable { return length == 0; } - /** Returns the {@link TrackGroup#type} of each track group in this array. */ - public ImmutableList<@C.TrackType Integer> getTrackTypes() { - return ImmutableList.copyOf(Lists.transform(trackGroups, t -> t.type)); - } - @Override public int hashCode() { if (hashCode == 0) { diff --git a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/source/CompositeSequenceableLoaderTest.java b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/source/CompositeSequenceableLoaderTest.java index 8ba44aec7a..436d8c0b3f 100644 --- a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/source/CompositeSequenceableLoaderTest.java +++ b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/source/CompositeSequenceableLoaderTest.java @@ -20,7 +20,6 @@ import static com.google.common.truth.Truth.assertThat; import androidx.media3.common.C; import androidx.media3.exoplayer.LoadingInfo; import androidx.test.ext.junit.runners.AndroidJUnit4; -import com.google.common.collect.ImmutableList; import org.junit.Test; import org.junit.runner.RunWith; @@ -39,10 +38,7 @@ public final class CompositeSequenceableLoaderTest { FakeSequenceableLoader loader2 = new FakeSequenceableLoader(/* bufferedPositionUs */ 1001, /* nextLoadPositionUs */ 2001); CompositeSequenceableLoader compositeSequenceableLoader = - new CompositeSequenceableLoader( - ImmutableList.of(loader1, loader2), - ImmutableList.of( - ImmutableList.of(C.TRACK_TYPE_AUDIO), ImmutableList.of(C.TRACK_TYPE_VIDEO))); + new CompositeSequenceableLoader(new SequenceableLoader[] {loader1, loader2}); assertThat(compositeSequenceableLoader.getBufferedPositionUs()).isEqualTo(1000); } @@ -61,12 +57,7 @@ public final class CompositeSequenceableLoaderTest { /* bufferedPositionUs */ C.TIME_END_OF_SOURCE, /* nextLoadPositionUs */ C.TIME_END_OF_SOURCE); CompositeSequenceableLoader compositeSequenceableLoader = - new CompositeSequenceableLoader( - ImmutableList.of(loader1, loader2, loader3), - ImmutableList.of( - ImmutableList.of(C.TRACK_TYPE_AUDIO), - ImmutableList.of(C.TRACK_TYPE_VIDEO), - ImmutableList.of(C.TRACK_TYPE_AUDIO, C.TRACK_TYPE_VIDEO))); + new CompositeSequenceableLoader(new SequenceableLoader[] {loader1, loader2, loader3}); assertThat(compositeSequenceableLoader.getBufferedPositionUs()).isEqualTo(1000); } @@ -85,73 +76,10 @@ public final class CompositeSequenceableLoaderTest { /* bufferedPositionUs */ C.TIME_END_OF_SOURCE, /* nextLoadPositionUs */ C.TIME_END_OF_SOURCE); CompositeSequenceableLoader compositeSequenceableLoader = - new CompositeSequenceableLoader( - ImmutableList.of(loader1, loader2), - ImmutableList.of( - ImmutableList.of(C.TRACK_TYPE_AUDIO), ImmutableList.of(C.TRACK_TYPE_VIDEO))); + new CompositeSequenceableLoader(new SequenceableLoader[] {loader1, loader2}); assertThat(compositeSequenceableLoader.getBufferedPositionUs()).isEqualTo(C.TIME_END_OF_SOURCE); } - /** - * Tests that {@link CompositeSequenceableLoader#getBufferedPositionUs()} returns the minimum - * buffered position of loaders with audio or video tracks (if at least one loader has tracks of - * these types). - */ - @Test - public void getBufferedPositionUs_prefersLoadersWithAudioAndVideoTracks() { - FakeSequenceableLoader loaderWithTextOnly = - new FakeSequenceableLoader(/* bufferedPositionUs= */ 999, /* nextLoadPositionUs= */ 2000); - FakeSequenceableLoader loaderWithAudioVideoAndText = - new FakeSequenceableLoader(/* bufferedPositionUs= */ 1000, /* nextLoadPositionUs= */ 2000); - CompositeSequenceableLoader compositeSequenceableLoader = - new CompositeSequenceableLoader( - ImmutableList.of(loaderWithTextOnly, loaderWithAudioVideoAndText), - ImmutableList.of( - ImmutableList.of(C.TRACK_TYPE_TEXT), - ImmutableList.of(C.TRACK_TYPE_AUDIO, C.TRACK_TYPE_VIDEO, C.TRACK_TYPE_TEXT))); - assertThat(compositeSequenceableLoader.getBufferedPositionUs()).isEqualTo(1000); - } - - /** - * Tests that {@link CompositeSequenceableLoader#getBufferedPositionUs()} returns the minimum - * buffered position of loaders with audio or video tracks (if at least one loader has tracks of - * these types). - */ - @Test - public void getBufferedPositionUs_prefersLoadersWithAudioAndVideoTracks_endOfSource() { - FakeSequenceableLoader loaderWithTextOnly = - new FakeSequenceableLoader(/* bufferedPositionUs= */ 999, /* nextLoadPositionUs= */ 2000); - FakeSequenceableLoader loaderWithAudioVideoAndText = - new FakeSequenceableLoader( - /* bufferedPositionUs */ C.TIME_END_OF_SOURCE, /* nextLoadPositionUs */ - C.TIME_END_OF_SOURCE); - CompositeSequenceableLoader compositeSequenceableLoader = - new CompositeSequenceableLoader( - ImmutableList.of(loaderWithTextOnly, loaderWithAudioVideoAndText), - ImmutableList.of( - ImmutableList.of(C.TRACK_TYPE_TEXT), - ImmutableList.of(C.TRACK_TYPE_AUDIO, C.TRACK_TYPE_VIDEO, C.TRACK_TYPE_TEXT))); - assertThat(compositeSequenceableLoader.getBufferedPositionUs()).isEqualTo(C.TIME_END_OF_SOURCE); - } - - /** - * Tests that {@link CompositeSequenceableLoader#getBufferedPositionUs()} returns the minimum - * buffered position of all loaders if no loader has audio or video tracks. - */ - @Test - public void getBufferedPositionUs_considersAllTracksIfNoneAreAudioOrVideo() { - FakeSequenceableLoader loaderWithTextOnly = - new FakeSequenceableLoader(/* bufferedPositionUs= */ 999, /* nextLoadPositionUs= */ 2000); - FakeSequenceableLoader loaderWithMetadataOnly = - new FakeSequenceableLoader(/* bufferedPositionUs= */ 1000, /* nextLoadPositionUs= */ 2000); - CompositeSequenceableLoader compositeSequenceableLoader = - new CompositeSequenceableLoader( - ImmutableList.of(loaderWithTextOnly, loaderWithMetadataOnly), - ImmutableList.of( - ImmutableList.of(C.TRACK_TYPE_TEXT), ImmutableList.of(C.TRACK_TYPE_METADATA))); - assertThat(compositeSequenceableLoader.getBufferedPositionUs()).isEqualTo(999); - } - /** * Tests that {@link CompositeSequenceableLoader#getNextLoadPositionUs()} returns minimum next * load position among all sub-loaders. @@ -163,10 +91,7 @@ public final class CompositeSequenceableLoaderTest { FakeSequenceableLoader loader2 = new FakeSequenceableLoader(/* bufferedPositionUs */ 1001, /* nextLoadPositionUs */ 2000); CompositeSequenceableLoader compositeSequenceableLoader = - new CompositeSequenceableLoader( - ImmutableList.of(loader1, loader2), - ImmutableList.of( - ImmutableList.of(C.TRACK_TYPE_AUDIO), ImmutableList.of(C.TRACK_TYPE_VIDEO))); + new CompositeSequenceableLoader(new SequenceableLoader[] {loader1, loader2}); assertThat(compositeSequenceableLoader.getNextLoadPositionUs()).isEqualTo(2000); } @@ -184,12 +109,7 @@ public final class CompositeSequenceableLoaderTest { new FakeSequenceableLoader( /* bufferedPositionUs */ 1001, /* nextLoadPositionUs */ C.TIME_END_OF_SOURCE); CompositeSequenceableLoader compositeSequenceableLoader = - new CompositeSequenceableLoader( - ImmutableList.of(loader1, loader2, loader3), - ImmutableList.of( - ImmutableList.of(C.TRACK_TYPE_AUDIO), - ImmutableList.of(C.TRACK_TYPE_VIDEO), - ImmutableList.of(C.TRACK_TYPE_AUDIO, C.TRACK_TYPE_VIDEO))); + new CompositeSequenceableLoader(new SequenceableLoader[] {loader1, loader2, loader3}); assertThat(compositeSequenceableLoader.getNextLoadPositionUs()).isEqualTo(2000); } @@ -206,10 +126,7 @@ public final class CompositeSequenceableLoaderTest { new FakeSequenceableLoader( /* bufferedPositionUs */ 1001, /* nextLoadPositionUs */ C.TIME_END_OF_SOURCE); CompositeSequenceableLoader compositeSequenceableLoader = - new CompositeSequenceableLoader( - ImmutableList.of(loader1, loader2), - ImmutableList.of( - ImmutableList.of(C.TRACK_TYPE_AUDIO), ImmutableList.of(C.TRACK_TYPE_VIDEO))); + new CompositeSequenceableLoader(new SequenceableLoader[] {loader1, loader2}); assertThat(compositeSequenceableLoader.getNextLoadPositionUs()).isEqualTo(C.TIME_END_OF_SOURCE); } @@ -225,10 +142,7 @@ public final class CompositeSequenceableLoaderTest { FakeSequenceableLoader loader2 = new FakeSequenceableLoader(/* bufferedPositionUs */ 1001, /* nextLoadPositionUs */ 2001); CompositeSequenceableLoader compositeSequenceableLoader = - new CompositeSequenceableLoader( - ImmutableList.of(loader1, loader2), - ImmutableList.of( - ImmutableList.of(C.TRACK_TYPE_AUDIO), ImmutableList.of(C.TRACK_TYPE_VIDEO))); + new CompositeSequenceableLoader(new SequenceableLoader[] {loader1, loader2}); compositeSequenceableLoader.continueLoading( new LoadingInfo.Builder().setPlaybackPositionUs(100).build()); @@ -249,12 +163,7 @@ public final class CompositeSequenceableLoaderTest { FakeSequenceableLoader loader3 = new FakeSequenceableLoader(/* bufferedPositionUs */ 1002, /* nextLoadPositionUs */ 2002); CompositeSequenceableLoader compositeSequenceableLoader = - new CompositeSequenceableLoader( - ImmutableList.of(loader1, loader2, loader3), - ImmutableList.of( - ImmutableList.of(C.TRACK_TYPE_AUDIO), - ImmutableList.of(C.TRACK_TYPE_VIDEO), - ImmutableList.of(C.TRACK_TYPE_AUDIO, C.TRACK_TYPE_VIDEO))); + new CompositeSequenceableLoader(new SequenceableLoader[] {loader1, loader2, loader3}); compositeSequenceableLoader.continueLoading( new LoadingInfo.Builder().setPlaybackPositionUs(3000).build()); @@ -276,10 +185,7 @@ public final class CompositeSequenceableLoaderTest { new FakeSequenceableLoader( /* bufferedPositionUs */ 1001, /* nextLoadPositionUs */ C.TIME_END_OF_SOURCE); CompositeSequenceableLoader compositeSequenceableLoader = - new CompositeSequenceableLoader( - ImmutableList.of(loader1, loader2), - ImmutableList.of( - ImmutableList.of(C.TRACK_TYPE_AUDIO), ImmutableList.of(C.TRACK_TYPE_VIDEO))); + new CompositeSequenceableLoader(new SequenceableLoader[] {loader1, loader2}); compositeSequenceableLoader.continueLoading( new LoadingInfo.Builder().setPlaybackPositionUs(3000).build()); @@ -301,10 +207,7 @@ public final class CompositeSequenceableLoaderTest { loader1.setNextChunkDurationUs(1000); CompositeSequenceableLoader compositeSequenceableLoader = - new CompositeSequenceableLoader( - ImmutableList.of(loader1, loader2), - ImmutableList.of( - ImmutableList.of(C.TRACK_TYPE_AUDIO), ImmutableList.of(C.TRACK_TYPE_VIDEO))); + new CompositeSequenceableLoader(new SequenceableLoader[] {loader1, loader2}); assertThat( compositeSequenceableLoader.continueLoading( @@ -327,10 +230,7 @@ public final class CompositeSequenceableLoaderTest { loader2.setNextChunkDurationUs(1000); CompositeSequenceableLoader compositeSequenceableLoader = - new CompositeSequenceableLoader( - ImmutableList.of(loader1, loader2), - ImmutableList.of( - ImmutableList.of(C.TRACK_TYPE_AUDIO), ImmutableList.of(C.TRACK_TYPE_VIDEO))); + new CompositeSequenceableLoader(new SequenceableLoader[] {loader1, loader2}); assertThat( compositeSequenceableLoader.continueLoading( 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 258d33fd38..e2089d8a32 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 @@ -60,7 +60,6 @@ import androidx.media3.exoplayer.upstream.LoadErrorHandlingPolicy; import androidx.media3.exoplayer.upstream.LoaderErrorThrower; import androidx.media3.extractor.text.SubtitleParser; import com.google.common.collect.ImmutableList; -import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.primitives.Ints; import java.io.IOException; @@ -155,7 +154,8 @@ import java.util.regex.Pattern; sampleStreams = newSampleStreamArray(0); eventSampleStreams = new EventSampleStream[0]; trackEmsgHandlerBySampleStream = new IdentityHashMap<>(); - compositeSequenceableLoader = compositeSequenceableLoaderFactory.empty(); + compositeSequenceableLoader = + compositeSequenceableLoaderFactory.createCompositeSequenceableLoader(sampleStreams); Period period = manifest.getPeriod(periodIndex); eventStreams = period.eventStreams; Pair result = @@ -304,9 +304,7 @@ import java.util.regex.Pattern; eventSampleStreamList.toArray(eventSampleStreams); compositeSequenceableLoader = - compositeSequenceableLoaderFactory.create( - sampleStreamList, - Lists.transform(sampleStreamList, s -> ImmutableList.of(s.primaryTrackType))); + compositeSequenceableLoaderFactory.createCompositeSequenceableLoader(sampleStreams); return positionUs; } diff --git a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsMediaPeriod.java b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsMediaPeriod.java index 1ba478bbf2..f61c34e578 100644 --- a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsMediaPeriod.java +++ b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsMediaPeriod.java @@ -52,8 +52,6 @@ import androidx.media3.exoplayer.upstream.CmcdConfiguration; import androidx.media3.exoplayer.upstream.LoadErrorHandlingPolicy; import androidx.media3.extractor.Extractor; import androidx.media3.extractor.text.SubtitleParser; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Lists; import com.google.common.primitives.Ints; import java.io.IOException; import java.util.ArrayList; @@ -162,7 +160,8 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; this.playerId = playerId; this.timestampAdjusterInitializationTimeoutMs = timestampAdjusterInitializationTimeoutMs; sampleStreamWrapperCallback = new SampleStreamWrapperCallback(); - compositeSequenceableLoader = compositeSequenceableLoaderFactory.empty(); + compositeSequenceableLoader = + compositeSequenceableLoaderFactory.createCompositeSequenceableLoader(); streamWrapperIndices = new IdentityHashMap<>(); timestampAdjusterProvider = new TimestampAdjusterProvider(); sampleStreamWrappers = new HlsSampleStreamWrapper[0]; @@ -377,14 +376,9 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; // Update the local state. enabledSampleStreamWrappers = Util.nullSafeArrayCopy(newEnabledSampleStreamWrappers, newEnabledSampleStreamWrapperCount); - ImmutableList enabledSampleStreamWrappersList = - ImmutableList.copyOf(enabledSampleStreamWrappers); compositeSequenceableLoader = - compositeSequenceableLoaderFactory.create( - enabledSampleStreamWrappersList, - Lists.transform( - enabledSampleStreamWrappersList, - sampleStreamWrapper -> sampleStreamWrapper.getTrackGroups().getTrackTypes())); + compositeSequenceableLoaderFactory.createCompositeSequenceableLoader( + enabledSampleStreamWrappers); return positionUs; } diff --git a/libraries/exoplayer_smoothstreaming/src/main/java/androidx/media3/exoplayer/smoothstreaming/SsMediaPeriod.java b/libraries/exoplayer_smoothstreaming/src/main/java/androidx/media3/exoplayer/smoothstreaming/SsMediaPeriod.java index b6c8f22488..759e9e86e2 100644 --- a/libraries/exoplayer_smoothstreaming/src/main/java/androidx/media3/exoplayer/smoothstreaming/SsMediaPeriod.java +++ b/libraries/exoplayer_smoothstreaming/src/main/java/androidx/media3/exoplayer/smoothstreaming/SsMediaPeriod.java @@ -43,8 +43,6 @@ import androidx.media3.exoplayer.upstream.CmcdConfiguration; import androidx.media3.exoplayer.upstream.LoadErrorHandlingPolicy; import androidx.media3.exoplayer.upstream.LoaderErrorThrower; import androidx.media3.extractor.text.SubtitleParser; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Lists; import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -96,7 +94,8 @@ import java.util.List; this.compositeSequenceableLoaderFactory = compositeSequenceableLoaderFactory; trackGroups = buildTrackGroups(manifest, drmSessionManager, subtitleParserFactory); sampleStreams = newSampleStreamArray(0); - compositeSequenceableLoader = compositeSequenceableLoaderFactory.empty(); + compositeSequenceableLoader = + compositeSequenceableLoaderFactory.createCompositeSequenceableLoader(sampleStreams); } public void updateManifest(SsManifest manifest) { @@ -162,9 +161,7 @@ import java.util.List; sampleStreams = newSampleStreamArray(sampleStreamsList.size()); sampleStreamsList.toArray(sampleStreams); compositeSequenceableLoader = - compositeSequenceableLoaderFactory.create( - sampleStreamsList, - Lists.transform(sampleStreamsList, s -> ImmutableList.of(s.primaryTrackType))); + compositeSequenceableLoaderFactory.createCompositeSequenceableLoader(sampleStreams); return positionUs; } diff --git a/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeAdaptiveMediaPeriod.java b/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeAdaptiveMediaPeriod.java index 5d3a4f839b..804234c446 100644 --- a/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeAdaptiveMediaPeriod.java +++ b/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeAdaptiveMediaPeriod.java @@ -44,9 +44,7 @@ import androidx.media3.exoplayer.source.chunk.ChunkSampleStream; import androidx.media3.exoplayer.trackselection.ExoTrackSelection; import androidx.media3.exoplayer.upstream.Allocator; import androidx.media3.exoplayer.upstream.DefaultLoadErrorHandlingPolicy; -import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Lists; import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -88,9 +86,7 @@ public class FakeAdaptiveMediaPeriod this.durationUs = durationUs; this.transferListener = transferListener; sampleStreams = new ArrayList<>(); - sequenceableLoader = - new CompositeSequenceableLoader( - /* loaders= */ ImmutableList.of(), /* loaderTrackTypes= */ ImmutableList.of()); + sequenceableLoader = new CompositeSequenceableLoader(new SequenceableLoader[0]); fakePreparationLoadTaskId = LoadEventInfo.getNewId(); } @@ -101,9 +97,7 @@ public class FakeAdaptiveMediaPeriod sampleStream.release(); } sampleStreams.clear(); - sequenceableLoader = - new CompositeSequenceableLoader( - /* loaders= */ ImmutableList.of(), /* loaderTrackTypes= */ ImmutableList.of()); + sequenceableLoader = new CompositeSequenceableLoader(new SequenceableLoader[0]); } @Override @@ -149,7 +143,7 @@ public class FakeAdaptiveMediaPeriod return trackGroupArray; } - @SuppressWarnings({"unchecked"}) // Casting sample streams created by this class. + @SuppressWarnings({"unchecked", "rawtypes"}) // Casting sample streams created by this class. @Override public long selectTracks( @NullableType ExoTrackSelection[] selections, @@ -194,9 +188,7 @@ public class FakeAdaptiveMediaPeriod } } sequenceableLoader = - new CompositeSequenceableLoader( - sampleStreams, - Lists.transform(sampleStreams, s -> ImmutableList.of(s.primaryTrackType))); + new CompositeSequenceableLoader(sampleStreams.toArray(new ChunkSampleStream[0])); return seekToUs(positionUs); }