Rename PreloadMediaSource.PreloadControl methods

The IntDefs in `DefaultPreloadManager.Stage` are also renamed accordingly.

PiperOrigin-RevId: 638631357
This commit is contained in:
tianyifeng 2024-05-30 06:29:51 -07:00 committed by Copybara-Service
parent 4db9bf92af
commit 1f1897709f
6 changed files with 166 additions and 214 deletions

View File

@ -38,6 +38,9 @@
* Fix bug where playback moved to `STATE_ENDED` when re-preparing a * Fix bug where playback moved to `STATE_ENDED` when re-preparing a
multi-period DASH live stream after the original period was already multi-period DASH live stream after the original period was already
removed from the manifest. removed from the manifest.
* Rename `onTimelineRefreshed` to `onSourcePrepared` and `onPrepared` to
`onTracksSelected` in `PreloadMediaSource.PreloadControl`. Also rename
the IntDefs in `DefaultPreloadManager.Stage` accordingly.
* Transformer: * Transformer:
* Work around a decoder bug where the number of audio channels was capped * Work around a decoder bug where the number of audio channels was capped
at stereo when handling PCM input. at stereo when handling PCM input.

View File

@ -24,7 +24,6 @@ import android.os.Looper;
import androidx.annotation.IntDef; import androidx.annotation.IntDef;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.media3.common.C; import androidx.media3.common.C;
import androidx.media3.common.Timeline;
import androidx.media3.common.util.UnstableApi; import androidx.media3.common.util.UnstableApi;
import androidx.media3.common.util.Util; import androidx.media3.common.util.Util;
import androidx.media3.exoplayer.ExoPlayer; import androidx.media3.exoplayer.ExoPlayer;
@ -57,25 +56,25 @@ public final class DefaultPreloadManager extends BasePreloadManager<Integer> {
public static class Status implements TargetPreloadStatusControl.PreloadStatus { public static class Status implements TargetPreloadStatusControl.PreloadStatus {
/** /**
* Stages that for the preload status. One of {@link #STAGE_TIMELINE_REFRESHED}, {@link * Stages for the preload status. One of {@link #STAGE_SOURCE_PREPARED}, {@link
* #STAGE_SOURCE_PREPARED} or {@link #STAGE_LOADED_TO_POSITION_MS}. * #STAGE_TRACKS_SELECTED} or {@link #STAGE_LOADED_TO_POSITION_MS}.
*/ */
@Documented @Documented
@Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE)
@Target(TYPE_USE) @Target(TYPE_USE)
@IntDef( @IntDef(
value = { value = {
STAGE_TIMELINE_REFRESHED,
STAGE_SOURCE_PREPARED, STAGE_SOURCE_PREPARED,
STAGE_TRACKS_SELECTED,
STAGE_LOADED_TO_POSITION_MS, STAGE_LOADED_TO_POSITION_MS,
}) })
public @interface Stage {} public @interface Stage {}
/** The {@link PreloadMediaSource} has its {@link Timeline} refreshed. */ /** The {@link PreloadMediaSource} has completed preparation. */
public static final int STAGE_TIMELINE_REFRESHED = 0; public static final int STAGE_SOURCE_PREPARED = 0;
/** The {@link PreloadMediaSource} is prepared. */ /** The {@link PreloadMediaSource} has tracks selected. */
public static final int STAGE_SOURCE_PREPARED = 1; public static final int STAGE_TRACKS_SELECTED = 1;
/** The {@link PreloadMediaSource} is loaded to a specific position in microseconds. */ /** The {@link PreloadMediaSource} is loaded to a specific position in microseconds. */
public static final int STAGE_LOADED_TO_POSITION_MS = 2; public static final int STAGE_LOADED_TO_POSITION_MS = 2;
@ -205,25 +204,25 @@ public final class DefaultPreloadManager extends BasePreloadManager<Integer> {
private final class SourcePreloadControl implements PreloadMediaSource.PreloadControl { private final class SourcePreloadControl implements PreloadMediaSource.PreloadControl {
@Override @Override
public boolean onTimelineRefreshed(PreloadMediaSource mediaSource) { public boolean onSourcePrepared(PreloadMediaSource mediaSource) {
// The PreloadMediaSource may have more data preloaded than the target preload status if it // The PreloadMediaSource may have more data preloaded than the target preload status if it
// has been preloaded before, thus we set `clearExceededDataFromTargetPreloadStatus` to // has been preloaded before, thus we set `clearExceededDataFromTargetPreloadStatus` to
// `true` to clear the exceeded data. // `true` to clear the exceeded data.
return continueOrCompletePreloading( return continueOrCompletePreloading(
mediaSource, mediaSource,
/* continueLoadingPredicate= */ status -> /* continueLoadingPredicate= */ status ->
status.getStage() > Status.STAGE_TIMELINE_REFRESHED, status.getStage() > Status.STAGE_SOURCE_PREPARED,
/* clearExceededDataFromTargetPreloadStatus= */ true); /* clearExceededDataFromTargetPreloadStatus= */ true);
} }
@Override @Override
public boolean onPrepared(PreloadMediaSource mediaSource) { public boolean onTracksSelected(PreloadMediaSource mediaSource) {
// Set `clearExceededDataFromTargetPreloadStatus` to `false` as clearing the exceeded data // Set `clearExceededDataFromTargetPreloadStatus` to `false` as clearing the exceeded data
// from the status STAGE_SOURCE_PREPARED is not supported. // from the status STAGE_TRACKS_SELECTED is not supported.
return continueOrCompletePreloading( return continueOrCompletePreloading(
mediaSource, mediaSource,
/* continueLoadingPredicate= */ status -> /* continueLoadingPredicate= */ status ->
status.getStage() > Status.STAGE_SOURCE_PREPARED, status.getStage() > Status.STAGE_TRACKS_SELECTED,
/* clearExceededDataFromTargetPreloadStatus= */ false); /* clearExceededDataFromTargetPreloadStatus= */ false);
} }

View File

@ -63,20 +63,20 @@ public final class PreloadMediaSource extends WrappingMediaSource {
public interface PreloadControl { public interface PreloadControl {
/** /**
* Called from {@link PreloadMediaSource} when the {@link Timeline} is refreshed. * Called from {@link PreloadMediaSource} when it has completed preparation.
* *
* @param mediaSource The {@link PreloadMediaSource} that has its {@link Timeline} refreshed. * @param mediaSource The {@link PreloadMediaSource} that has completed preparation.
* @return True if the {@code mediaSource} should continue preloading, false otherwise. * @return True if the {@code mediaSource} should continue preloading, false otherwise.
*/ */
boolean onTimelineRefreshed(PreloadMediaSource mediaSource); boolean onSourcePrepared(PreloadMediaSource mediaSource);
/** /**
* Called from {@link PreloadMediaSource} when it is prepared. * Called from {@link PreloadMediaSource} when it has tracks selected.
* *
* @param mediaSource The {@link PreloadMediaSource} it is prepared. * @param mediaSource The {@link PreloadMediaSource} that has tracks selected.
* @return True if the {@code mediaSource} should continue preloading, false otherwise. * @return True if the {@code mediaSource} should continue preloading, false otherwise.
*/ */
boolean onPrepared(PreloadMediaSource mediaSource); boolean onTracksSelected(PreloadMediaSource mediaSource);
/** /**
* Called from {@link PreloadMediaSource} when it requests to continue loading. * Called from {@link PreloadMediaSource} when it requests to continue loading.
@ -291,7 +291,7 @@ public final class PreloadMediaSource extends WrappingMediaSource {
protected void onChildSourceInfoRefreshed(Timeline newTimeline) { protected void onChildSourceInfoRefreshed(Timeline newTimeline) {
this.timeline = newTimeline; this.timeline = newTimeline;
refreshSourceInfo(newTimeline); refreshSourceInfo(newTimeline);
if (isUsedByPlayer() || !preloadControl.onTimelineRefreshed(PreloadMediaSource.this)) { if (isUsedByPlayer() || !preloadControl.onSourcePrepared(PreloadMediaSource.this)) {
return; return;
} }
Pair<Object, Long> periodPosition = Pair<Object, Long> periodPosition =
@ -415,7 +415,7 @@ public final class PreloadMediaSource extends WrappingMediaSource {
if (trackSelectorResult != null) { if (trackSelectorResult != null) {
preloadMediaPeriod.selectTracksForPreloading( preloadMediaPeriod.selectTracksForPreloading(
trackSelectorResult.selections, periodStartPositionUs); trackSelectorResult.selections, periodStartPositionUs);
if (preloadControl.onPrepared(PreloadMediaSource.this)) { if (preloadControl.onTracksSelected(PreloadMediaSource.this)) {
preloadMediaPeriod.continueLoading( preloadMediaPeriod.continueLoading(
new LoadingInfo.Builder().setPlaybackPositionUs(periodStartPositionUs).build()); new LoadingInfo.Builder().setPlaybackPositionUs(periodStartPositionUs).build());
} }

View File

@ -17,7 +17,7 @@ package androidx.media3.exoplayer.source.preload;
import static androidx.media3.exoplayer.source.preload.DefaultPreloadManager.Status.STAGE_LOADED_TO_POSITION_MS; import static androidx.media3.exoplayer.source.preload.DefaultPreloadManager.Status.STAGE_LOADED_TO_POSITION_MS;
import static androidx.media3.exoplayer.source.preload.DefaultPreloadManager.Status.STAGE_SOURCE_PREPARED; import static androidx.media3.exoplayer.source.preload.DefaultPreloadManager.Status.STAGE_SOURCE_PREPARED;
import static androidx.media3.exoplayer.source.preload.DefaultPreloadManager.Status.STAGE_TIMELINE_REFRESHED; import static androidx.media3.exoplayer.source.preload.DefaultPreloadManager.Status.STAGE_TRACKS_SELECTED;
import static androidx.media3.test.utils.FakeMediaSourceFactory.DEFAULT_WINDOW_UID; import static androidx.media3.test.utils.FakeMediaSourceFactory.DEFAULT_WINDOW_UID;
import static androidx.media3.test.utils.robolectric.RobolectricUtil.runMainLooperUntil; import static androidx.media3.test.utils.robolectric.RobolectricUtil.runMainLooperUntil;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
@ -192,7 +192,7 @@ public class DefaultPreloadManagerTest {
if (abs(rankingData - currentPlayingItemIndex.get()) == 1) { if (abs(rankingData - currentPlayingItemIndex.get()) == 1) {
return new DefaultPreloadManager.Status(STAGE_LOADED_TO_POSITION_MS, 100L); return new DefaultPreloadManager.Status(STAGE_LOADED_TO_POSITION_MS, 100L);
} else { } else {
return new DefaultPreloadManager.Status(STAGE_TIMELINE_REFRESHED); return new DefaultPreloadManager.Status(STAGE_SOURCE_PREPARED);
} }
}; };
ProgressiveMediaSource.Factory mediaSourceFactory = ProgressiveMediaSource.Factory mediaSourceFactory =
@ -244,7 +244,7 @@ public class DefaultPreloadManagerTest {
if (abs(rankingData - currentPlayingItemIndex.get()) == 1) { if (abs(rankingData - currentPlayingItemIndex.get()) == 1) {
return new DefaultPreloadManager.Status(STAGE_LOADED_TO_POSITION_MS, 100L); return new DefaultPreloadManager.Status(STAGE_LOADED_TO_POSITION_MS, 100L);
} else { } else {
return new DefaultPreloadManager.Status(STAGE_TIMELINE_REFRESHED); return new DefaultPreloadManager.Status(STAGE_SOURCE_PREPARED);
} }
}; };
ProgressiveMediaSource.Factory mediaSourceFactory = ProgressiveMediaSource.Factory mediaSourceFactory =
@ -297,7 +297,7 @@ public class DefaultPreloadManagerTest {
TargetPreloadStatusControl<Integer> targetPreloadStatusControl = TargetPreloadStatusControl<Integer> targetPreloadStatusControl =
rankingData -> { rankingData -> {
targetPreloadStatusControlCallStates.add(rankingData); targetPreloadStatusControlCallStates.add(rankingData);
return new DefaultPreloadManager.Status(STAGE_TIMELINE_REFRESHED); return new DefaultPreloadManager.Status(STAGE_SOURCE_PREPARED);
}; };
FakeMediaSourceFactory fakeMediaSourceFactory = new FakeMediaSourceFactory(); FakeMediaSourceFactory fakeMediaSourceFactory = new FakeMediaSourceFactory();
DefaultPreloadManager preloadManager = DefaultPreloadManager preloadManager =
@ -340,7 +340,7 @@ public class DefaultPreloadManagerTest {
TargetPreloadStatusControl<Integer> targetPreloadStatusControl = TargetPreloadStatusControl<Integer> targetPreloadStatusControl =
rankingData -> { rankingData -> {
targetPreloadStatusControlCallStates.add(rankingData); targetPreloadStatusControlCallStates.add(rankingData);
return new DefaultPreloadManager.Status(STAGE_TIMELINE_REFRESHED); return new DefaultPreloadManager.Status(STAGE_SOURCE_PREPARED);
}; };
FakeMediaSourceFactory fakeMediaSourceFactory = new FakeMediaSourceFactory(); FakeMediaSourceFactory fakeMediaSourceFactory = new FakeMediaSourceFactory();
DefaultPreloadManager preloadManager = DefaultPreloadManager preloadManager =
@ -453,9 +453,9 @@ public class DefaultPreloadManagerTest {
rankingData -> { rankingData -> {
targetPreloadStatusControlCallStates.add(rankingData); targetPreloadStatusControlCallStates.add(rankingData);
if (abs(rankingData - currentPlayingIndex.get()) <= 2) { if (abs(rankingData - currentPlayingIndex.get()) <= 2) {
return new DefaultPreloadManager.Status(STAGE_SOURCE_PREPARED); return new DefaultPreloadManager.Status(STAGE_TRACKS_SELECTED);
} else if (abs(rankingData - currentPlayingIndex.get()) == 3) { } else if (abs(rankingData - currentPlayingIndex.get()) == 3) {
return new DefaultPreloadManager.Status(STAGE_TIMELINE_REFRESHED); return new DefaultPreloadManager.Status(STAGE_SOURCE_PREPARED);
} }
return null; return null;
}; };
@ -573,7 +573,7 @@ public class DefaultPreloadManagerTest {
@Test @Test
public void removeByMediaItems_correspondingHeldSourceRemovedAndReleased() { public void removeByMediaItems_correspondingHeldSourceRemovedAndReleased() {
TargetPreloadStatusControl<Integer> targetPreloadStatusControl = TargetPreloadStatusControl<Integer> targetPreloadStatusControl =
rankingData -> new DefaultPreloadManager.Status(STAGE_TIMELINE_REFRESHED); rankingData -> new DefaultPreloadManager.Status(STAGE_SOURCE_PREPARED);
MediaSource.Factory mockMediaSourceFactory = mock(MediaSource.Factory.class); MediaSource.Factory mockMediaSourceFactory = mock(MediaSource.Factory.class);
DefaultPreloadManager preloadManager = DefaultPreloadManager preloadManager =
new DefaultPreloadManager( new DefaultPreloadManager(
@ -624,7 +624,7 @@ public class DefaultPreloadManagerTest {
@Test @Test
public void removeByMediaSources_heldSourceRemovedAndReleased() { public void removeByMediaSources_heldSourceRemovedAndReleased() {
TargetPreloadStatusControl<Integer> targetPreloadStatusControl = TargetPreloadStatusControl<Integer> targetPreloadStatusControl =
rankingData -> new DefaultPreloadManager.Status(STAGE_TIMELINE_REFRESHED); rankingData -> new DefaultPreloadManager.Status(STAGE_SOURCE_PREPARED);
MediaSource.Factory mockMediaSourceFactory = mock(MediaSource.Factory.class); MediaSource.Factory mockMediaSourceFactory = mock(MediaSource.Factory.class);
DefaultPreloadManager preloadManager = DefaultPreloadManager preloadManager =
new DefaultPreloadManager( new DefaultPreloadManager(
@ -682,7 +682,7 @@ public class DefaultPreloadManagerTest {
@Test @Test
public void reset_returnZeroCount_sourcesButNotRendererCapabilitiesListReleased() { public void reset_returnZeroCount_sourcesButNotRendererCapabilitiesListReleased() {
TargetPreloadStatusControl<Integer> targetPreloadStatusControl = TargetPreloadStatusControl<Integer> targetPreloadStatusControl =
rankingData -> new DefaultPreloadManager.Status(STAGE_TIMELINE_REFRESHED); rankingData -> new DefaultPreloadManager.Status(STAGE_SOURCE_PREPARED);
MediaSource.Factory mockMediaSourceFactory = mock(MediaSource.Factory.class); MediaSource.Factory mockMediaSourceFactory = mock(MediaSource.Factory.class);
List<FakeRenderer> underlyingRenderers = new ArrayList<>(); List<FakeRenderer> underlyingRenderers = new ArrayList<>();
RenderersFactory renderersFactory = RenderersFactory renderersFactory =
@ -753,7 +753,7 @@ public class DefaultPreloadManagerTest {
@Test @Test
public void release_returnZeroCount_sourcesAndRendererCapabilitiesListReleased() { public void release_returnZeroCount_sourcesAndRendererCapabilitiesListReleased() {
TargetPreloadStatusControl<Integer> targetPreloadStatusControl = TargetPreloadStatusControl<Integer> targetPreloadStatusControl =
rankingData -> new DefaultPreloadManager.Status(STAGE_TIMELINE_REFRESHED); rankingData -> new DefaultPreloadManager.Status(STAGE_SOURCE_PREPARED);
MediaSource.Factory mockMediaSourceFactory = mock(MediaSource.Factory.class); MediaSource.Factory mockMediaSourceFactory = mock(MediaSource.Factory.class);
List<FakeRenderer> underlyingRenderers = new ArrayList<>(); List<FakeRenderer> underlyingRenderers = new ArrayList<>();
RenderersFactory renderersFactory = RenderersFactory renderersFactory =

View File

@ -68,8 +68,8 @@ public class PreloadAndPlaybackCoordinationTest {
private final FakeMediaSource wrappedMediaSource; private final FakeMediaSource wrappedMediaSource;
private final MediaSource.MediaSourceCaller playbackMediaSourceCaller; private final MediaSource.MediaSourceCaller playbackMediaSourceCaller;
private final AtomicInteger preloadControlOnSourceInfoRefreshedCalledCounter; private final AtomicInteger preloadControlOnSourcePreparedCalledCounter;
private final AtomicInteger preloadControlOnPreparedCalledCounter; private final AtomicInteger preloadControlOnTracksSelectedCalledCounter;
private final AtomicInteger preloadControlOnUsedByPlayerCounter; private final AtomicInteger preloadControlOnUsedByPlayerCounter;
private final AtomicBoolean playbackSourceCallerOnSourceInfoRefreshedCalled; private final AtomicBoolean playbackSourceCallerOnSourceInfoRefreshedCalled;
private final AtomicBoolean playbackPeriodCallbackOnPreparedCalled; private final AtomicBoolean playbackPeriodCallbackOnPreparedCalled;
@ -93,8 +93,8 @@ public class PreloadAndPlaybackCoordinationTest {
SystemClock.DEFAULT.createHandler(handler.getLooper(), /* callback= */ null), SystemClock.DEFAULT.createHandler(handler.getLooper(), /* callback= */ null),
audioListener) audioListener)
}; };
preloadControlOnSourceInfoRefreshedCalledCounter = new AtomicInteger(); preloadControlOnSourcePreparedCalledCounter = new AtomicInteger();
preloadControlOnPreparedCalledCounter = new AtomicInteger(); preloadControlOnTracksSelectedCalledCounter = new AtomicInteger();
preloadControlOnUsedByPlayerCounter = new AtomicInteger(); preloadControlOnUsedByPlayerCounter = new AtomicInteger();
playbackSourceCallerOnSourceInfoRefreshedCalled = new AtomicBoolean(); playbackSourceCallerOnSourceInfoRefreshedCalled = new AtomicBoolean();
playbackPeriodCallbackOnPreparedCalled = new AtomicBoolean(); playbackPeriodCallbackOnPreparedCalled = new AtomicBoolean();
@ -103,14 +103,14 @@ public class PreloadAndPlaybackCoordinationTest {
PreloadMediaSource.PreloadControl preloadControl = PreloadMediaSource.PreloadControl preloadControl =
new PreloadMediaSource.PreloadControl() { new PreloadMediaSource.PreloadControl() {
@Override @Override
public boolean onTimelineRefreshed(PreloadMediaSource mediaSource) { public boolean onSourcePrepared(PreloadMediaSource mediaSource) {
preloadControlOnSourceInfoRefreshedCalledCounter.addAndGet(1); preloadControlOnSourcePreparedCalledCounter.addAndGet(1);
return true; return true;
} }
@Override @Override
public boolean onPrepared(PreloadMediaSource mediaSource) { public boolean onTracksSelected(PreloadMediaSource mediaSource) {
preloadControlOnPreparedCalledCounter.addAndGet(1); preloadControlOnTracksSelectedCalledCounter.addAndGet(1);
return true; return true;
} }
@ -173,8 +173,8 @@ public class PreloadAndPlaybackCoordinationTest {
playbackMediaSourceCaller, bandwidthMeter.getTransferListener(), PlayerId.UNSET); playbackMediaSourceCaller, bandwidthMeter.getTransferListener(), PlayerId.UNSET);
ShadowLooper.idleMainLooper(); ShadowLooper.idleMainLooper();
assertThat(preloadControlOnSourceInfoRefreshedCalledCounter.get()).isEqualTo(0); assertThat(preloadControlOnSourcePreparedCalledCounter.get()).isEqualTo(0);
assertThat(preloadControlOnPreparedCalledCounter.get()).isEqualTo(0); assertThat(preloadControlOnTracksSelectedCalledCounter.get()).isEqualTo(0);
assertThat(preloadControlOnUsedByPlayerCounter.get()).isEqualTo(1); assertThat(preloadControlOnUsedByPlayerCounter.get()).isEqualTo(1);
assertThat(playbackSourceCallerOnSourceInfoRefreshedCalled.get()).isTrue(); assertThat(playbackSourceCallerOnSourceInfoRefreshedCalled.get()).isTrue();
assertThat(playbackPeriodCallbackOnPreparedCalled.get()).isTrue(); assertThat(playbackPeriodCallbackOnPreparedCalled.get()).isTrue();
@ -187,8 +187,8 @@ public class PreloadAndPlaybackCoordinationTest {
preloadMediaSource.preload(/* startPositionUs= */ 0L); preloadMediaSource.preload(/* startPositionUs= */ 0L);
ShadowLooper.idleMainLooper(); ShadowLooper.idleMainLooper();
assertThat(preloadControlOnSourceInfoRefreshedCalledCounter.get()).isEqualTo(1); assertThat(preloadControlOnSourcePreparedCalledCounter.get()).isEqualTo(1);
assertThat(preloadControlOnPreparedCalledCounter.get()).isEqualTo(1); assertThat(preloadControlOnTracksSelectedCalledCounter.get()).isEqualTo(1);
assertThat(preloadControlOnUsedByPlayerCounter.get()).isEqualTo(1); assertThat(preloadControlOnUsedByPlayerCounter.get()).isEqualTo(1);
} }
@ -199,8 +199,8 @@ public class PreloadAndPlaybackCoordinationTest {
preloadMediaSource.preload(/* startPositionUs= */ 0L); preloadMediaSource.preload(/* startPositionUs= */ 0L);
ShadowLooper.idleMainLooper(); ShadowLooper.idleMainLooper();
assertThat(preloadControlOnSourceInfoRefreshedCalledCounter.get()).isEqualTo(0); assertThat(preloadControlOnSourcePreparedCalledCounter.get()).isEqualTo(0);
assertThat(preloadControlOnPreparedCalledCounter.get()).isEqualTo(0); assertThat(preloadControlOnTracksSelectedCalledCounter.get()).isEqualTo(0);
assertThat(preloadControlOnUsedByPlayerCounter.get()).isEqualTo(2); assertThat(preloadControlOnUsedByPlayerCounter.get()).isEqualTo(2);
assertThat(playbackSourceCallerOnSourceInfoRefreshedCalled.get()).isTrue(); assertThat(playbackSourceCallerOnSourceInfoRefreshedCalled.get()).isTrue();
assertThat(playbackPeriodCallbackOnPreparedCalled.get()).isTrue(); assertThat(playbackPeriodCallbackOnPreparedCalled.get()).isTrue();
@ -213,13 +213,13 @@ public class PreloadAndPlaybackCoordinationTest {
preloadMediaSource.preload(/* startPositionUs= */ 0L); preloadMediaSource.preload(/* startPositionUs= */ 0L);
ShadowLooper.idleMainLooper(); ShadowLooper.idleMainLooper();
assertThat(preloadControlOnSourceInfoRefreshedCalledCounter.get()).isEqualTo(1); assertThat(preloadControlOnSourcePreparedCalledCounter.get()).isEqualTo(1);
assertThat(preloadControlOnPreparedCalledCounter.get()).isEqualTo(1); assertThat(preloadControlOnTracksSelectedCalledCounter.get()).isEqualTo(1);
assertThat(preloadControlOnUsedByPlayerCounter.get()).isEqualTo(2); assertThat(preloadControlOnUsedByPlayerCounter.get()).isEqualTo(2);
} }
@Test @Test
public void playbackBetweenPreloadStartAndTimelineInfoRefreshed_reusableForPreloadAfterRelease() { public void playbackBetweenPreloadStartAndSourcePrepared_reusableForPreloadAfterRelease() {
wrappedMediaSource.setAllowPreparation(false); wrappedMediaSource.setAllowPreparation(false);
preloadMediaSource.preload(/* startPositionUs= */ 0L); preloadMediaSource.preload(/* startPositionUs= */ 0L);
@ -229,8 +229,8 @@ public class PreloadAndPlaybackCoordinationTest {
wrappedMediaSource.setAllowPreparation(true); wrappedMediaSource.setAllowPreparation(true);
ShadowLooper.idleMainLooper(); ShadowLooper.idleMainLooper();
assertThat(preloadControlOnSourceInfoRefreshedCalledCounter.get()).isEqualTo(0); assertThat(preloadControlOnSourcePreparedCalledCounter.get()).isEqualTo(0);
assertThat(preloadControlOnPreparedCalledCounter.get()).isEqualTo(0); assertThat(preloadControlOnTracksSelectedCalledCounter.get()).isEqualTo(0);
assertThat(preloadControlOnUsedByPlayerCounter.get()).isEqualTo(1); assertThat(preloadControlOnUsedByPlayerCounter.get()).isEqualTo(1);
assertThat(playbackSourceCallerOnSourceInfoRefreshedCalled.get()).isTrue(); assertThat(playbackSourceCallerOnSourceInfoRefreshedCalled.get()).isTrue();
assertThat(playbackPeriodCallbackOnPreparedCalled.get()).isTrue(); assertThat(playbackPeriodCallbackOnPreparedCalled.get()).isTrue();
@ -243,14 +243,14 @@ public class PreloadAndPlaybackCoordinationTest {
preloadMediaSource.preload(/* startPositionUs= */ 0L); preloadMediaSource.preload(/* startPositionUs= */ 0L);
ShadowLooper.idleMainLooper(); ShadowLooper.idleMainLooper();
assertThat(preloadControlOnSourceInfoRefreshedCalledCounter.get()).isEqualTo(1); assertThat(preloadControlOnSourcePreparedCalledCounter.get()).isEqualTo(1);
assertThat(preloadControlOnPreparedCalledCounter.get()).isEqualTo(1); assertThat(preloadControlOnTracksSelectedCalledCounter.get()).isEqualTo(1);
assertThat(preloadControlOnUsedByPlayerCounter.get()).isEqualTo(1); assertThat(preloadControlOnUsedByPlayerCounter.get()).isEqualTo(1);
} }
@Test @Test
public void public void
playbackBetweenPreloadTimelineRefreshedAndPeriodPrepared_reusableForPreloadAfterRelease() { playbackBetweenPreloadSourcePreparedAndTracksSelected_reusableForPreloadAfterRelease() {
wrappedMediaSource.setPeriodDefersOnPreparedCallback(true); wrappedMediaSource.setPeriodDefersOnPreparedCallback(true);
preloadMediaSource.preload(/* startPositionUs= */ 0L); preloadMediaSource.preload(/* startPositionUs= */ 0L);
@ -262,8 +262,8 @@ public class PreloadAndPlaybackCoordinationTest {
lastCreatedActiveMediaPeriod.setPreparationComplete(); lastCreatedActiveMediaPeriod.setPreparationComplete();
ShadowLooper.idleMainLooper(); ShadowLooper.idleMainLooper();
assertThat(preloadControlOnSourceInfoRefreshedCalledCounter.get()).isEqualTo(1); assertThat(preloadControlOnSourcePreparedCalledCounter.get()).isEqualTo(1);
assertThat(preloadControlOnPreparedCalledCounter.get()).isEqualTo(0); assertThat(preloadControlOnTracksSelectedCalledCounter.get()).isEqualTo(0);
assertThat(preloadControlOnUsedByPlayerCounter.get()).isEqualTo(1); assertThat(preloadControlOnUsedByPlayerCounter.get()).isEqualTo(1);
assertThat(playbackSourceCallerOnSourceInfoRefreshedCalled.get()).isTrue(); assertThat(playbackSourceCallerOnSourceInfoRefreshedCalled.get()).isTrue();
assertThat(playbackPeriodCallbackOnPreparedCalled.get()).isTrue(); assertThat(playbackPeriodCallbackOnPreparedCalled.get()).isTrue();
@ -277,8 +277,8 @@ public class PreloadAndPlaybackCoordinationTest {
preloadMediaSource.preload(/* startPositionUs= */ 0L); preloadMediaSource.preload(/* startPositionUs= */ 0L);
ShadowLooper.idleMainLooper(); ShadowLooper.idleMainLooper();
assertThat(preloadControlOnSourceInfoRefreshedCalledCounter.get()).isEqualTo(2); assertThat(preloadControlOnSourcePreparedCalledCounter.get()).isEqualTo(2);
assertThat(preloadControlOnPreparedCalledCounter.get()).isEqualTo(1); assertThat(preloadControlOnTracksSelectedCalledCounter.get()).isEqualTo(1);
assertThat(preloadControlOnUsedByPlayerCounter.get()).isEqualTo(1); assertThat(preloadControlOnUsedByPlayerCounter.get()).isEqualTo(1);
} }
@ -290,8 +290,8 @@ public class PreloadAndPlaybackCoordinationTest {
playbackMediaSourceCaller, bandwidthMeter.getTransferListener(), PlayerId.UNSET); playbackMediaSourceCaller, bandwidthMeter.getTransferListener(), PlayerId.UNSET);
ShadowLooper.idleMainLooper(); ShadowLooper.idleMainLooper();
assertThat(preloadControlOnSourceInfoRefreshedCalledCounter.get()).isEqualTo(1); assertThat(preloadControlOnSourcePreparedCalledCounter.get()).isEqualTo(1);
assertThat(preloadControlOnPreparedCalledCounter.get()).isEqualTo(1); assertThat(preloadControlOnTracksSelectedCalledCounter.get()).isEqualTo(1);
assertThat(preloadControlOnUsedByPlayerCounter.get()).isEqualTo(1); assertThat(preloadControlOnUsedByPlayerCounter.get()).isEqualTo(1);
assertThat(playbackSourceCallerOnSourceInfoRefreshedCalled.get()).isTrue(); assertThat(playbackSourceCallerOnSourceInfoRefreshedCalled.get()).isTrue();
assertThat(playbackPeriodCallbackOnPreparedCalled.get()).isTrue(); assertThat(playbackPeriodCallbackOnPreparedCalled.get()).isTrue();
@ -304,8 +304,8 @@ public class PreloadAndPlaybackCoordinationTest {
preloadMediaSource.preload(/* startPositionUs= */ 0L); preloadMediaSource.preload(/* startPositionUs= */ 0L);
ShadowLooper.idleMainLooper(); ShadowLooper.idleMainLooper();
assertThat(preloadControlOnSourceInfoRefreshedCalledCounter.get()).isEqualTo(2); assertThat(preloadControlOnSourcePreparedCalledCounter.get()).isEqualTo(2);
assertThat(preloadControlOnPreparedCalledCounter.get()).isEqualTo(2); assertThat(preloadControlOnTracksSelectedCalledCounter.get()).isEqualTo(2);
assertThat(preloadControlOnUsedByPlayerCounter.get()).isEqualTo(1); assertThat(preloadControlOnUsedByPlayerCounter.get()).isEqualTo(1);
} }

View File

@ -107,22 +107,22 @@ public final class PreloadMediaSourceTest {
@Test @Test
public void preload_loadPeriodToTargetPreloadPosition() throws Exception { public void preload_loadPeriodToTargetPreloadPosition() throws Exception {
AtomicBoolean onTimelineRefreshedCalled = new AtomicBoolean(); AtomicBoolean onSourcePreparedCalled = new AtomicBoolean();
AtomicBoolean onPreparedCalled = new AtomicBoolean(); AtomicBoolean onTracksSelectedCalled = new AtomicBoolean();
AtomicBoolean onContinueLoadingStopped = new AtomicBoolean(); AtomicBoolean onContinueLoadingStopped = new AtomicBoolean();
AtomicReference<PreloadMediaSource> preloadMediaSourceReference = new AtomicReference<>(); AtomicReference<PreloadMediaSource> preloadMediaSourceReference = new AtomicReference<>();
AtomicBoolean onUsedByPlayerCalled = new AtomicBoolean(); AtomicBoolean onUsedByPlayerCalled = new AtomicBoolean();
PreloadMediaSource.PreloadControl preloadControl = PreloadMediaSource.PreloadControl preloadControl =
new PreloadMediaSource.PreloadControl() { new PreloadMediaSource.PreloadControl() {
@Override @Override
public boolean onTimelineRefreshed(PreloadMediaSource mediaSource) { public boolean onSourcePrepared(PreloadMediaSource mediaSource) {
onTimelineRefreshedCalled.set(true); onSourcePreparedCalled.set(true);
return true; return true;
} }
@Override @Override
public boolean onPrepared(PreloadMediaSource mediaSource) { public boolean onTracksSelected(PreloadMediaSource mediaSource) {
onPreparedCalled.set(true); onTracksSelectedCalled.set(true);
return true; return true;
} }
@ -167,31 +167,31 @@ public final class PreloadMediaSourceTest {
preloadMediaSource.preload(/* startPositionUs= */ 0L); preloadMediaSource.preload(/* startPositionUs= */ 0L);
runMainLooperUntil(onContinueLoadingStopped::get); runMainLooperUntil(onContinueLoadingStopped::get);
assertThat(onTimelineRefreshedCalled.get()).isTrue(); assertThat(onSourcePreparedCalled.get()).isTrue();
assertThat(onPreparedCalled.get()).isTrue(); assertThat(onTracksSelectedCalled.get()).isTrue();
assertThat(onUsedByPlayerCalled.get()).isFalse(); assertThat(onUsedByPlayerCalled.get()).isFalse();
assertThat(preloadMediaSourceReference.get()).isSameInstanceAs(preloadMediaSource); assertThat(preloadMediaSourceReference.get()).isSameInstanceAs(preloadMediaSource);
} }
@Test @Test
public void preload_stopWhenPeriodPreparedByPreloadControl() throws Exception { public void preload_stopWhenTracksSelectedByPreloadControl() throws Exception {
AtomicBoolean onTimelineRefreshedCalled = new AtomicBoolean(); AtomicBoolean onSourcePreparedCalled = new AtomicBoolean();
AtomicBoolean onPreparedCalled = new AtomicBoolean(); AtomicBoolean onTracksSelectedCalled = new AtomicBoolean();
AtomicReference<PreloadMediaSource> preloadMediaSourceReference = new AtomicReference<>(); AtomicReference<PreloadMediaSource> preloadMediaSourceReference = new AtomicReference<>();
AtomicBoolean onContinueLoadingRequestedCalled = new AtomicBoolean(); AtomicBoolean onContinueLoadingRequestedCalled = new AtomicBoolean();
AtomicBoolean onUsedByPlayerCalled = new AtomicBoolean(); AtomicBoolean onUsedByPlayerCalled = new AtomicBoolean();
PreloadMediaSource.PreloadControl preloadControl = PreloadMediaSource.PreloadControl preloadControl =
new PreloadMediaSource.PreloadControl() { new PreloadMediaSource.PreloadControl() {
@Override @Override
public boolean onTimelineRefreshed(PreloadMediaSource mediaSource) { public boolean onSourcePrepared(PreloadMediaSource mediaSource) {
onTimelineRefreshedCalled.set(true); onSourcePreparedCalled.set(true);
return true; return true;
} }
@Override @Override
public boolean onPrepared(PreloadMediaSource mediaSource) { public boolean onTracksSelected(PreloadMediaSource mediaSource) {
preloadMediaSourceReference.set(mediaSource); preloadMediaSourceReference.set(mediaSource);
onPreparedCalled.set(true); onTracksSelectedCalled.set(true);
return false; return false;
} }
@ -230,33 +230,33 @@ public final class PreloadMediaSourceTest {
.build()); .build());
preloadMediaSource.preload(/* startPositionUs= */ 0L); preloadMediaSource.preload(/* startPositionUs= */ 0L);
runMainLooperUntil(onPreparedCalled::get); runMainLooperUntil(onTracksSelectedCalled::get);
assertThat(onTimelineRefreshedCalled.get()).isTrue(); assertThat(onSourcePreparedCalled.get()).isTrue();
assertThat(preloadMediaSourceReference.get()).isSameInstanceAs(preloadMediaSource); assertThat(preloadMediaSourceReference.get()).isSameInstanceAs(preloadMediaSource);
assertThat(onContinueLoadingRequestedCalled.get()).isFalse(); assertThat(onContinueLoadingRequestedCalled.get()).isFalse();
assertThat(onUsedByPlayerCalled.get()).isFalse(); assertThat(onUsedByPlayerCalled.get()).isFalse();
} }
@Test @Test
public void preload_stopWhenTimelineRefreshedByPreloadControl() throws Exception { public void preload_stopWhenSourcePreparedByPreloadControl() throws Exception {
AtomicBoolean onTimelineRefreshedCalled = new AtomicBoolean(); AtomicBoolean onSourcePreparedCalled = new AtomicBoolean();
AtomicReference<PreloadMediaSource> preloadMediaSourceReference = new AtomicReference<>(); AtomicReference<PreloadMediaSource> preloadMediaSourceReference = new AtomicReference<>();
AtomicBoolean onPreparedCalled = new AtomicBoolean(); AtomicBoolean onTracksSelectedCalled = new AtomicBoolean();
AtomicBoolean onContinueLoadingRequestedCalled = new AtomicBoolean(); AtomicBoolean onContinueLoadingRequestedCalled = new AtomicBoolean();
AtomicBoolean onUsedByPlayerCalled = new AtomicBoolean(); AtomicBoolean onUsedByPlayerCalled = new AtomicBoolean();
PreloadMediaSource.PreloadControl preloadControl = PreloadMediaSource.PreloadControl preloadControl =
new PreloadMediaSource.PreloadControl() { new PreloadMediaSource.PreloadControl() {
@Override @Override
public boolean onTimelineRefreshed(PreloadMediaSource mediaSource) { public boolean onSourcePrepared(PreloadMediaSource mediaSource) {
preloadMediaSourceReference.set(mediaSource); preloadMediaSourceReference.set(mediaSource);
onTimelineRefreshedCalled.set(true); onSourcePreparedCalled.set(true);
return false; return false;
} }
@Override @Override
public boolean onPrepared(PreloadMediaSource mediaSource) { public boolean onTracksSelected(PreloadMediaSource mediaSource) {
onPreparedCalled.set(true); onTracksSelectedCalled.set(true);
return false; return false;
} }
@ -294,30 +294,30 @@ public final class PreloadMediaSourceTest {
.build()); .build());
preloadMediaSource.preload(/* startPositionUs= */ 0L); preloadMediaSource.preload(/* startPositionUs= */ 0L);
runMainLooperUntil(onTimelineRefreshedCalled::get); runMainLooperUntil(onSourcePreparedCalled::get);
assertThat(preloadMediaSourceReference.get()).isSameInstanceAs(preloadMediaSource); assertThat(preloadMediaSourceReference.get()).isSameInstanceAs(preloadMediaSource);
assertThat(onPreparedCalled.get()).isFalse(); assertThat(onTracksSelectedCalled.get()).isFalse();
assertThat(onContinueLoadingRequestedCalled.get()).isFalse(); assertThat(onContinueLoadingRequestedCalled.get()).isFalse();
assertThat(onUsedByPlayerCalled.get()).isFalse(); assertThat(onUsedByPlayerCalled.get()).isFalse();
} }
@Test @Test
public void preload_whileSourceIsAccessedByExternalCaller_notProceedWithPreloading() { public void preload_whileSourceIsAccessedByExternalCaller_notProceedWithPreloading() {
AtomicBoolean onTimelineRefreshedCalled = new AtomicBoolean(false); AtomicBoolean onSourcePreparedCalled = new AtomicBoolean(false);
AtomicBoolean onPreparedCalled = new AtomicBoolean(false); AtomicBoolean onTracksSelectedCalled = new AtomicBoolean(false);
AtomicBoolean onUsedByPlayerCalled = new AtomicBoolean(); AtomicBoolean onUsedByPlayerCalled = new AtomicBoolean();
PreloadMediaSource.PreloadControl preloadControl = PreloadMediaSource.PreloadControl preloadControl =
new PreloadMediaSource.PreloadControl() { new PreloadMediaSource.PreloadControl() {
@Override @Override
public boolean onTimelineRefreshed(PreloadMediaSource mediaSource) { public boolean onSourcePrepared(PreloadMediaSource mediaSource) {
onTimelineRefreshedCalled.set(true); onSourcePreparedCalled.set(true);
return true; return true;
} }
@Override @Override
public boolean onPrepared(PreloadMediaSource mediaSource) { public boolean onTracksSelected(PreloadMediaSource mediaSource) {
onPreparedCalled.set(true); onTracksSelectedCalled.set(true);
return true; return true;
} }
@ -351,12 +351,7 @@ public final class PreloadMediaSourceTest {
AtomicReference<MediaSource> externalCallerMediaSourceReference = new AtomicReference<>(); AtomicReference<MediaSource> externalCallerMediaSourceReference = new AtomicReference<>();
MediaSource.MediaSourceCaller externalCaller = MediaSource.MediaSourceCaller externalCaller =
new MediaSource.MediaSourceCaller() { (source, timeline) -> externalCallerMediaSourceReference.set(source);
@Override
public void onSourceInfoRefreshed(MediaSource source, Timeline timeline) {
externalCallerMediaSourceReference.set(source);
}
};
preloadMediaSource.prepareSource( preloadMediaSource.prepareSource(
externalCaller, bandwidthMeter.getTransferListener(), PlayerId.UNSET); externalCaller, bandwidthMeter.getTransferListener(), PlayerId.UNSET);
shadowOf(Looper.getMainLooper()).idle(); shadowOf(Looper.getMainLooper()).idle();
@ -364,29 +359,29 @@ public final class PreloadMediaSourceTest {
shadowOf(Looper.getMainLooper()).idle(); shadowOf(Looper.getMainLooper()).idle();
assertThat(externalCallerMediaSourceReference.get()).isSameInstanceAs(preloadMediaSource); assertThat(externalCallerMediaSourceReference.get()).isSameInstanceAs(preloadMediaSource);
assertThat(onTimelineRefreshedCalled.get()).isFalse(); assertThat(onSourcePreparedCalled.get()).isFalse();
assertThat(onPreparedCalled.get()).isFalse(); assertThat(onTracksSelectedCalled.get()).isFalse();
assertThat(onUsedByPlayerCalled.get()).isTrue(); assertThat(onUsedByPlayerCalled.get()).isTrue();
} }
@Test @Test
public void preload_loadToTheEndOfSource() throws Exception { public void preload_loadToTheEndOfSource() throws Exception {
AtomicBoolean onTimelineRefreshedCalled = new AtomicBoolean(); AtomicBoolean onSourcePreparedCalled = new AtomicBoolean();
AtomicBoolean onPreparedCalled = new AtomicBoolean(); AtomicBoolean onTracksSelectedCalled = new AtomicBoolean();
AtomicBoolean onContinueLoadingRequestedCalled = new AtomicBoolean(); AtomicBoolean onContinueLoadingRequestedCalled = new AtomicBoolean();
AtomicBoolean onLoadedToTheEndOfSourceCalled = new AtomicBoolean(); AtomicBoolean onLoadedToTheEndOfSourceCalled = new AtomicBoolean();
AtomicBoolean onUsedByPlayerCalled = new AtomicBoolean(); AtomicBoolean onUsedByPlayerCalled = new AtomicBoolean();
PreloadMediaSource.PreloadControl preloadControl = PreloadMediaSource.PreloadControl preloadControl =
new PreloadMediaSource.PreloadControl() { new PreloadMediaSource.PreloadControl() {
@Override @Override
public boolean onTimelineRefreshed(PreloadMediaSource mediaSource) { public boolean onSourcePrepared(PreloadMediaSource mediaSource) {
onTimelineRefreshedCalled.set(true); onSourcePreparedCalled.set(true);
return true; return true;
} }
@Override @Override
public boolean onPrepared(PreloadMediaSource mediaSource) { public boolean onTracksSelected(PreloadMediaSource mediaSource) {
onPreparedCalled.set(true); onTracksSelectedCalled.set(true);
return true; return true;
} }
@ -437,8 +432,8 @@ public final class PreloadMediaSourceTest {
preloadMediaSource.preload(/* startPositionUs= */ 0L); preloadMediaSource.preload(/* startPositionUs= */ 0L);
runMainLooperUntil(onLoadedToTheEndOfSourceCalled::get); runMainLooperUntil(onLoadedToTheEndOfSourceCalled::get);
assertThat(onTimelineRefreshedCalled.get()).isTrue(); assertThat(onSourcePreparedCalled.get()).isTrue();
assertThat(onPreparedCalled.get()).isTrue(); assertThat(onTracksSelectedCalled.get()).isTrue();
assertThat(onContinueLoadingRequestedCalled.get()).isTrue(); assertThat(onContinueLoadingRequestedCalled.get()).isTrue();
assertThat(onUsedByPlayerCalled.get()).isFalse(); assertThat(onUsedByPlayerCalled.get()).isFalse();
} }
@ -446,20 +441,20 @@ public final class PreloadMediaSourceTest {
@Test @Test
public void public void
prepareSource_beforeSourceInfoRefreshedForPreloading_onlyInvokeExternalCallerOnSourceInfoRefreshed() { prepareSource_beforeSourceInfoRefreshedForPreloading_onlyInvokeExternalCallerOnSourceInfoRefreshed() {
AtomicBoolean onTimelineRefreshedCalled = new AtomicBoolean(false); AtomicBoolean onSourcePreparedCalled = new AtomicBoolean(false);
AtomicBoolean onPreparedCalled = new AtomicBoolean(false); AtomicBoolean onTracksSelectedCalled = new AtomicBoolean(false);
AtomicBoolean onUsedByPlayerCalled = new AtomicBoolean(); AtomicBoolean onUsedByPlayerCalled = new AtomicBoolean();
PreloadMediaSource.PreloadControl preloadControl = PreloadMediaSource.PreloadControl preloadControl =
new PreloadMediaSource.PreloadControl() { new PreloadMediaSource.PreloadControl() {
@Override @Override
public boolean onTimelineRefreshed(PreloadMediaSource mediaSource) { public boolean onSourcePrepared(PreloadMediaSource mediaSource) {
onTimelineRefreshedCalled.set(true); onSourcePreparedCalled.set(true);
return true; return true;
} }
@Override @Override
public boolean onPrepared(PreloadMediaSource mediaSource) { public boolean onTracksSelected(PreloadMediaSource mediaSource) {
onPreparedCalled.set(true); onTracksSelectedCalled.set(true);
return true; return true;
} }
@ -497,39 +492,34 @@ public final class PreloadMediaSourceTest {
shadowOf(Looper.getMainLooper()).idle(); shadowOf(Looper.getMainLooper()).idle();
AtomicReference<MediaSource> externalCallerMediaSourceReference = new AtomicReference<>(); AtomicReference<MediaSource> externalCallerMediaSourceReference = new AtomicReference<>();
MediaSource.MediaSourceCaller externalCaller = MediaSource.MediaSourceCaller externalCaller =
new MediaSource.MediaSourceCaller() { (source, timeline) -> externalCallerMediaSourceReference.set(source);
@Override
public void onSourceInfoRefreshed(MediaSource source, Timeline timeline) {
externalCallerMediaSourceReference.set(source);
}
};
preloadMediaSource.prepareSource( preloadMediaSource.prepareSource(
externalCaller, bandwidthMeter.getTransferListener(), PlayerId.UNSET); externalCaller, bandwidthMeter.getTransferListener(), PlayerId.UNSET);
wrappedMediaSource.setAllowPreparation(true); wrappedMediaSource.setAllowPreparation(true);
shadowOf(Looper.getMainLooper()).idle(); shadowOf(Looper.getMainLooper()).idle();
assertThat(externalCallerMediaSourceReference.get()).isSameInstanceAs(preloadMediaSource); assertThat(externalCallerMediaSourceReference.get()).isSameInstanceAs(preloadMediaSource);
assertThat(onTimelineRefreshedCalled.get()).isFalse(); assertThat(onSourcePreparedCalled.get()).isFalse();
assertThat(onPreparedCalled.get()).isFalse(); assertThat(onTracksSelectedCalled.get()).isFalse();
assertThat(onUsedByPlayerCalled.get()).isTrue(); assertThat(onUsedByPlayerCalled.get()).isTrue();
} }
@Test @Test
public void prepareSource_afterPreload_immediatelyInvokeExternalCallerOnSourceInfoRefreshed() { public void prepareSource_afterPreload_immediatelyInvokeExternalCallerOnSourceInfoRefreshed() {
AtomicBoolean onTimelineRefreshedCalled = new AtomicBoolean(false); AtomicBoolean onSourcePreparedCalled = new AtomicBoolean(false);
AtomicBoolean onPreparedCalled = new AtomicBoolean(false); AtomicBoolean onTracksSelectedCalled = new AtomicBoolean(false);
AtomicBoolean onUsedByPlayerCalled = new AtomicBoolean(); AtomicBoolean onUsedByPlayerCalled = new AtomicBoolean();
PreloadMediaSource.PreloadControl preloadControl = PreloadMediaSource.PreloadControl preloadControl =
new PreloadMediaSource.PreloadControl() { new PreloadMediaSource.PreloadControl() {
@Override @Override
public boolean onTimelineRefreshed(PreloadMediaSource mediaSource) { public boolean onSourcePrepared(PreloadMediaSource mediaSource) {
onTimelineRefreshedCalled.set(true); onSourcePreparedCalled.set(true);
return true; return true;
} }
@Override @Override
public boolean onPrepared(PreloadMediaSource mediaSource) { public boolean onTracksSelected(PreloadMediaSource mediaSource) {
onPreparedCalled.set(true); onTracksSelectedCalled.set(true);
return true; return true;
} }
@ -566,17 +556,12 @@ public final class PreloadMediaSourceTest {
shadowOf(Looper.getMainLooper()).idle(); shadowOf(Looper.getMainLooper()).idle();
AtomicReference<MediaSource> externalCallerMediaSourceReference = new AtomicReference<>(); AtomicReference<MediaSource> externalCallerMediaSourceReference = new AtomicReference<>();
MediaSource.MediaSourceCaller externalCaller = MediaSource.MediaSourceCaller externalCaller =
new MediaSource.MediaSourceCaller() { (source, timeline) -> externalCallerMediaSourceReference.set(source);
@Override
public void onSourceInfoRefreshed(MediaSource source, Timeline timeline) {
externalCallerMediaSourceReference.set(source);
}
};
preloadMediaSource.prepareSource( preloadMediaSource.prepareSource(
externalCaller, bandwidthMeter.getTransferListener(), PlayerId.UNSET); externalCaller, bandwidthMeter.getTransferListener(), PlayerId.UNSET);
assertThat(onTimelineRefreshedCalled.get()).isTrue(); assertThat(onSourcePreparedCalled.get()).isTrue();
assertThat(onPreparedCalled.get()).isTrue(); assertThat(onTracksSelectedCalled.get()).isTrue();
assertThat(externalCallerMediaSourceReference.get()).isSameInstanceAs(preloadMediaSource); assertThat(externalCallerMediaSourceReference.get()).isSameInstanceAs(preloadMediaSource);
assertThat(onUsedByPlayerCalled.get()).isTrue(); assertThat(onUsedByPlayerCalled.get()).isTrue();
} }
@ -584,17 +569,17 @@ public final class PreloadMediaSourceTest {
@Test @Test
public void createPeriodWithSameMediaPeriodIdAndStartPosition_returnExistingPeriod() public void createPeriodWithSameMediaPeriodIdAndStartPosition_returnExistingPeriod()
throws Exception { throws Exception {
AtomicBoolean onPreparedCalled = new AtomicBoolean(); AtomicBoolean onTracksSelectedCalled = new AtomicBoolean();
PreloadMediaSource.PreloadControl preloadControl = PreloadMediaSource.PreloadControl preloadControl =
new PreloadMediaSource.PreloadControl() { new PreloadMediaSource.PreloadControl() {
@Override @Override
public boolean onTimelineRefreshed(PreloadMediaSource mediaSource) { public boolean onSourcePrepared(PreloadMediaSource mediaSource) {
return true; return true;
} }
@Override @Override
public boolean onPrepared(PreloadMediaSource mediaSource) { public boolean onTracksSelected(PreloadMediaSource mediaSource) {
onPreparedCalled.set(true); onTracksSelectedCalled.set(true);
return false; return false;
} }
@ -668,12 +653,7 @@ public final class PreloadMediaSourceTest {
shadowOf(Looper.getMainLooper()).idle(); shadowOf(Looper.getMainLooper()).idle();
AtomicReference<Timeline> externalCallerSourceInfoTimelineReference = new AtomicReference<>(); AtomicReference<Timeline> externalCallerSourceInfoTimelineReference = new AtomicReference<>();
MediaSource.MediaSourceCaller externalCaller = MediaSource.MediaSourceCaller externalCaller =
new MediaSource.MediaSourceCaller() { (source, timeline) -> externalCallerSourceInfoTimelineReference.set(timeline);
@Override
public void onSourceInfoRefreshed(MediaSource source, Timeline timeline) {
externalCallerSourceInfoTimelineReference.set(timeline);
}
};
preloadMediaSource.prepareSource( preloadMediaSource.prepareSource(
externalCaller, bandwidthMeter.getTransferListener(), PlayerId.UNSET); externalCaller, bandwidthMeter.getTransferListener(), PlayerId.UNSET);
Pair<Object, Long> periodPosition = Pair<Object, Long> periodPosition =
@ -687,24 +667,24 @@ public final class PreloadMediaSourceTest {
MediaSource.MediaPeriodId mediaPeriodId = new MediaSource.MediaPeriodId(periodPosition.first); MediaSource.MediaPeriodId mediaPeriodId = new MediaSource.MediaPeriodId(periodPosition.first);
preloadMediaSource.createPeriod(mediaPeriodId, allocator, periodPosition.second); preloadMediaSource.createPeriod(mediaPeriodId, allocator, periodPosition.second);
assertThat(onPreparedCalled.get()).isTrue(); assertThat(onTracksSelectedCalled.get()).isTrue();
verify(internalSourceReference.get()).createPeriod(any(), any(), anyLong()); verify(internalSourceReference.get()).createPeriod(any(), any(), anyLong());
} }
@Test @Test
public void createPeriodWithSameMediaPeriodIdAndDifferentStartPosition_returnNewPeriod() public void createPeriodWithSameMediaPeriodIdAndDifferentStartPosition_returnNewPeriod()
throws Exception { throws Exception {
AtomicBoolean onPreparedCalled = new AtomicBoolean(); AtomicBoolean onTracksSelectedCalled = new AtomicBoolean();
PreloadMediaSource.PreloadControl preloadControl = PreloadMediaSource.PreloadControl preloadControl =
new PreloadMediaSource.PreloadControl() { new PreloadMediaSource.PreloadControl() {
@Override @Override
public boolean onTimelineRefreshed(PreloadMediaSource mediaSource) { public boolean onSourcePrepared(PreloadMediaSource mediaSource) {
return true; return true;
} }
@Override @Override
public boolean onPrepared(PreloadMediaSource mediaSource) { public boolean onTracksSelected(PreloadMediaSource mediaSource) {
onPreparedCalled.set(true); onTracksSelectedCalled.set(true);
return false; return false;
} }
@ -778,12 +758,7 @@ public final class PreloadMediaSourceTest {
shadowOf(Looper.getMainLooper()).idle(); shadowOf(Looper.getMainLooper()).idle();
AtomicReference<Timeline> externalCallerSourceInfoTimelineReference = new AtomicReference<>(); AtomicReference<Timeline> externalCallerSourceInfoTimelineReference = new AtomicReference<>();
MediaSource.MediaSourceCaller externalCaller = MediaSource.MediaSourceCaller externalCaller =
new MediaSource.MediaSourceCaller() { (source, timeline) -> externalCallerSourceInfoTimelineReference.set(timeline);
@Override
public void onSourceInfoRefreshed(MediaSource source, Timeline timeline) {
externalCallerSourceInfoTimelineReference.set(timeline);
}
};
preloadMediaSource.prepareSource( preloadMediaSource.prepareSource(
externalCaller, bandwidthMeter.getTransferListener(), PlayerId.UNSET); externalCaller, bandwidthMeter.getTransferListener(), PlayerId.UNSET);
// Create a period from different position. // Create a period from different position.
@ -798,23 +773,23 @@ public final class PreloadMediaSourceTest {
MediaSource.MediaPeriodId mediaPeriodId = new MediaSource.MediaPeriodId(periodPosition.first); MediaSource.MediaPeriodId mediaPeriodId = new MediaSource.MediaPeriodId(periodPosition.first);
preloadMediaSource.createPeriod(mediaPeriodId, allocator, periodPosition.second); preloadMediaSource.createPeriod(mediaPeriodId, allocator, periodPosition.second);
assertThat(onPreparedCalled.get()).isTrue(); assertThat(onTracksSelectedCalled.get()).isTrue();
verify(internalSourceReference.get(), times(2)).createPeriod(any(), any(), anyLong()); verify(internalSourceReference.get(), times(2)).createPeriod(any(), any(), anyLong());
} }
@Test @Test
public void clear_preloadingPeriodReleased() throws Exception { public void clear_preloadingPeriodReleased() throws Exception {
AtomicBoolean onPreparedCalled = new AtomicBoolean(); AtomicBoolean onTracksSelectedCalled = new AtomicBoolean();
PreloadMediaSource.PreloadControl preloadControl = PreloadMediaSource.PreloadControl preloadControl =
new PreloadMediaSource.PreloadControl() { new PreloadMediaSource.PreloadControl() {
@Override @Override
public boolean onTimelineRefreshed(PreloadMediaSource mediaSource) { public boolean onSourcePrepared(PreloadMediaSource mediaSource) {
return true; return true;
} }
@Override @Override
public boolean onPrepared(PreloadMediaSource mediaSource) { public boolean onTracksSelected(PreloadMediaSource mediaSource) {
onPreparedCalled.set(true); onTracksSelectedCalled.set(true);
return false; return false;
} }
@ -871,7 +846,7 @@ public final class PreloadMediaSourceTest {
.setUri(Uri.parse("asset://android_asset/media/mp4/sample.mp4")) .setUri(Uri.parse("asset://android_asset/media/mp4/sample.mp4"))
.build()); .build());
preloadMediaSource.preload(/* startPositionUs= */ 0L); preloadMediaSource.preload(/* startPositionUs= */ 0L);
runMainLooperUntil(onPreparedCalled::get); runMainLooperUntil(onTracksSelectedCalled::get);
preloadMediaSource.clear(); preloadMediaSource.clear();
shadowOf(Looper.getMainLooper()).idle(); shadowOf(Looper.getMainLooper()).idle();
@ -884,12 +859,12 @@ public final class PreloadMediaSourceTest {
PreloadMediaSource.PreloadControl preloadControl = PreloadMediaSource.PreloadControl preloadControl =
new PreloadMediaSource.PreloadControl() { new PreloadMediaSource.PreloadControl() {
@Override @Override
public boolean onTimelineRefreshed(PreloadMediaSource mediaSource) { public boolean onSourcePrepared(PreloadMediaSource mediaSource) {
return false; return false;
} }
@Override @Override
public boolean onPrepared(PreloadMediaSource mediaSource) { public boolean onTracksSelected(PreloadMediaSource mediaSource) {
return false; return false;
} }
@ -940,12 +915,7 @@ public final class PreloadMediaSourceTest {
.build()); .build());
AtomicBoolean externalCallerSourceInfoRefreshedCalled = new AtomicBoolean(); AtomicBoolean externalCallerSourceInfoRefreshedCalled = new AtomicBoolean();
MediaSource.MediaSourceCaller externalCaller = MediaSource.MediaSourceCaller externalCaller =
new MediaSource.MediaSourceCaller() { (source, timeline) -> externalCallerSourceInfoRefreshedCalled.set(true);
@Override
public void onSourceInfoRefreshed(MediaSource source, Timeline timeline) {
externalCallerSourceInfoRefreshedCalled.set(true);
}
};
preloadMediaSource.prepareSource( preloadMediaSource.prepareSource(
externalCaller, bandwidthMeter.getTransferListener(), PlayerId.UNSET); externalCaller, bandwidthMeter.getTransferListener(), PlayerId.UNSET);
shadowOf(Looper.getMainLooper()).idle(); shadowOf(Looper.getMainLooper()).idle();
@ -959,17 +929,17 @@ public final class PreloadMediaSourceTest {
@Test @Test
public void releaseSourceByAllExternalCallers_stillPreloading_notReleaseInternalSource() { public void releaseSourceByAllExternalCallers_stillPreloading_notReleaseInternalSource() {
AtomicBoolean onTimelineRefreshedCalled = new AtomicBoolean(false); AtomicBoolean onSourcePreparedCalled = new AtomicBoolean(false);
PreloadMediaSource.PreloadControl preloadControl = PreloadMediaSource.PreloadControl preloadControl =
new PreloadMediaSource.PreloadControl() { new PreloadMediaSource.PreloadControl() {
@Override @Override
public boolean onTimelineRefreshed(PreloadMediaSource mediaSource) { public boolean onSourcePrepared(PreloadMediaSource mediaSource) {
onTimelineRefreshedCalled.set(true); onSourcePreparedCalled.set(true);
return true; return true;
} }
@Override @Override
public boolean onPrepared(PreloadMediaSource mediaSource) { public boolean onTracksSelected(PreloadMediaSource mediaSource) {
return true; return true;
} }
@ -1020,19 +990,14 @@ public final class PreloadMediaSourceTest {
.build()); .build());
AtomicBoolean externalCallerSourceInfoRefreshedCalled = new AtomicBoolean(); AtomicBoolean externalCallerSourceInfoRefreshedCalled = new AtomicBoolean();
MediaSource.MediaSourceCaller externalCaller = MediaSource.MediaSourceCaller externalCaller =
new MediaSource.MediaSourceCaller() { (source, timeline) -> externalCallerSourceInfoRefreshedCalled.set(true);
@Override
public void onSourceInfoRefreshed(MediaSource source, Timeline timeline) {
externalCallerSourceInfoRefreshedCalled.set(true);
}
};
preloadMediaSource.preload(/* startPositionUs= */ 0L); preloadMediaSource.preload(/* startPositionUs= */ 0L);
shadowOf(Looper.getMainLooper()).idle(); shadowOf(Looper.getMainLooper()).idle();
preloadMediaSource.prepareSource( preloadMediaSource.prepareSource(
externalCaller, bandwidthMeter.getTransferListener(), PlayerId.UNSET); externalCaller, bandwidthMeter.getTransferListener(), PlayerId.UNSET);
preloadMediaSource.releaseSource(externalCaller); preloadMediaSource.releaseSource(externalCaller);
assertThat(onTimelineRefreshedCalled.get()).isTrue(); assertThat(onSourcePreparedCalled.get()).isTrue();
assertThat(externalCallerSourceInfoRefreshedCalled.get()).isTrue(); assertThat(externalCallerSourceInfoRefreshedCalled.get()).isTrue();
MediaSource internalSource = internalSourceReference.get(); MediaSource internalSource = internalSourceReference.get();
assertThat(internalSource).isNotNull(); assertThat(internalSource).isNotNull();
@ -1045,12 +1010,12 @@ public final class PreloadMediaSourceTest {
PreloadMediaSource.PreloadControl preloadControl = PreloadMediaSource.PreloadControl preloadControl =
new PreloadMediaSource.PreloadControl() { new PreloadMediaSource.PreloadControl() {
@Override @Override
public boolean onTimelineRefreshed(PreloadMediaSource mediaSource) { public boolean onSourcePrepared(PreloadMediaSource mediaSource) {
return false; return false;
} }
@Override @Override
public boolean onPrepared(PreloadMediaSource mediaSource) { public boolean onTracksSelected(PreloadMediaSource mediaSource) {
return false; return false;
} }
@ -1102,19 +1067,9 @@ public final class PreloadMediaSourceTest {
AtomicBoolean externalCaller1SourceInfoRefreshedCalled = new AtomicBoolean(); AtomicBoolean externalCaller1SourceInfoRefreshedCalled = new AtomicBoolean();
AtomicBoolean externalCaller2SourceInfoRefreshedCalled = new AtomicBoolean(); AtomicBoolean externalCaller2SourceInfoRefreshedCalled = new AtomicBoolean();
MediaSource.MediaSourceCaller externalCaller1 = MediaSource.MediaSourceCaller externalCaller1 =
new MediaSource.MediaSourceCaller() { (source, timeline) -> externalCaller1SourceInfoRefreshedCalled.set(true);
@Override
public void onSourceInfoRefreshed(MediaSource source, Timeline timeline) {
externalCaller1SourceInfoRefreshedCalled.set(true);
}
};
MediaSource.MediaSourceCaller externalCaller2 = MediaSource.MediaSourceCaller externalCaller2 =
new MediaSource.MediaSourceCaller() { (source, timeline) -> externalCaller2SourceInfoRefreshedCalled.set(true);
@Override
public void onSourceInfoRefreshed(MediaSource source, Timeline timeline) {
externalCaller2SourceInfoRefreshedCalled.set(true);
}
};
preloadMediaSource.prepareSource( preloadMediaSource.prepareSource(
externalCaller1, bandwidthMeter.getTransferListener(), PlayerId.UNSET); externalCaller1, bandwidthMeter.getTransferListener(), PlayerId.UNSET);
preloadMediaSource.prepareSource( preloadMediaSource.prepareSource(
@ -1131,17 +1086,17 @@ public final class PreloadMediaSourceTest {
@Test @Test
public void releasePreloadMediaSource_notUsedByExternalCallers_releaseInternalSource() { public void releasePreloadMediaSource_notUsedByExternalCallers_releaseInternalSource() {
AtomicBoolean onTimelineRefreshedCalled = new AtomicBoolean(false); AtomicBoolean onSourcePreparedCalled = new AtomicBoolean(false);
PreloadMediaSource.PreloadControl preloadControl = PreloadMediaSource.PreloadControl preloadControl =
new PreloadMediaSource.PreloadControl() { new PreloadMediaSource.PreloadControl() {
@Override @Override
public boolean onTimelineRefreshed(PreloadMediaSource mediaSource) { public boolean onSourcePrepared(PreloadMediaSource mediaSource) {
onTimelineRefreshedCalled.set(true); onSourcePreparedCalled.set(true);
return false; return false;
} }
@Override @Override
public boolean onPrepared(PreloadMediaSource mediaSource) { public boolean onTracksSelected(PreloadMediaSource mediaSource) {
return false; return false;
} }
@ -1195,7 +1150,7 @@ public final class PreloadMediaSourceTest {
preloadMediaSource.releasePreloadMediaSource(); preloadMediaSource.releasePreloadMediaSource();
shadowOf(Looper.getMainLooper()).idle(); shadowOf(Looper.getMainLooper()).idle();
assertThat(onTimelineRefreshedCalled.get()).isTrue(); assertThat(onSourcePreparedCalled.get()).isTrue();
MediaSource internalSource = internalSourceReference.get(); MediaSource internalSource = internalSourceReference.get();
assertThat(internalSource).isNotNull(); assertThat(internalSource).isNotNull();
verify(internalSource).releaseSource(any()); verify(internalSource).releaseSource(any());
@ -1203,17 +1158,17 @@ public final class PreloadMediaSourceTest {
@Test @Test
public void releasePreloadMediaSource_stillUsedByExternalCallers_releaseInternalSource() { public void releasePreloadMediaSource_stillUsedByExternalCallers_releaseInternalSource() {
AtomicBoolean onTimelineRefreshedCalled = new AtomicBoolean(false); AtomicBoolean onSourcePreparedCalled = new AtomicBoolean(false);
PreloadMediaSource.PreloadControl preloadControl = PreloadMediaSource.PreloadControl preloadControl =
new PreloadMediaSource.PreloadControl() { new PreloadMediaSource.PreloadControl() {
@Override @Override
public boolean onTimelineRefreshed(PreloadMediaSource mediaSource) { public boolean onSourcePrepared(PreloadMediaSource mediaSource) {
onTimelineRefreshedCalled.set(true); onSourcePreparedCalled.set(true);
return false; return false;
} }
@Override @Override
public boolean onPrepared(PreloadMediaSource mediaSource) { public boolean onTracksSelected(PreloadMediaSource mediaSource) {
return false; return false;
} }
@ -1264,12 +1219,7 @@ public final class PreloadMediaSourceTest {
.build()); .build());
AtomicBoolean externalCallerSourceInfoRefreshedCalled = new AtomicBoolean(); AtomicBoolean externalCallerSourceInfoRefreshedCalled = new AtomicBoolean();
MediaSource.MediaSourceCaller externalCaller = MediaSource.MediaSourceCaller externalCaller =
new MediaSource.MediaSourceCaller() { (source, timeline) -> externalCallerSourceInfoRefreshedCalled.set(true);
@Override
public void onSourceInfoRefreshed(MediaSource source, Timeline timeline) {
externalCallerSourceInfoRefreshedCalled.set(true);
}
};
preloadMediaSource.preload(/* startPositionUs= */ 0L); preloadMediaSource.preload(/* startPositionUs= */ 0L);
shadowOf(Looper.getMainLooper()).idle(); shadowOf(Looper.getMainLooper()).idle();
preloadMediaSource.prepareSource( preloadMediaSource.prepareSource(
@ -1278,7 +1228,7 @@ public final class PreloadMediaSourceTest {
preloadMediaSource.releasePreloadMediaSource(); preloadMediaSource.releasePreloadMediaSource();
shadowOf(Looper.getMainLooper()).idle(); shadowOf(Looper.getMainLooper()).idle();
assertThat(onTimelineRefreshedCalled.get()).isTrue(); assertThat(onSourcePreparedCalled.get()).isTrue();
assertThat(externalCallerSourceInfoRefreshedCalled.get()).isTrue(); assertThat(externalCallerSourceInfoRefreshedCalled.get()).isTrue();
MediaSource internalSource = internalSourceReference.get(); MediaSource internalSource = internalSourceReference.get();
assertThat(internalSource).isNotNull(); assertThat(internalSource).isNotNull();