Inform DefaultPreloadManager when player uses PreloadMediaSource
Add a new method `onUsedByPlayer(PreloadMediaSource)` for `PreloadMediaSource.PreloadControl`, which will be invoked when the player starts to use the `PreloadMediaSource`, or calling `PreloadMediaSource.preload` while the player is already using that source. `DefaultPreloadManager` will immediately preload the next source when receiving `onUsedByPlayer` event. PiperOrigin-RevId: 616789121
This commit is contained in:
parent
87f4a3ca71
commit
2c8d07c2dd
@ -26,7 +26,6 @@ import androidx.media3.common.util.UnstableApi
|
||||
import androidx.media3.common.util.Util
|
||||
import androidx.media3.exoplayer.RendererCapabilities
|
||||
import androidx.media3.exoplayer.RenderersFactory
|
||||
import androidx.media3.exoplayer.analytics.PlayerId
|
||||
import androidx.media3.exoplayer.audio.AudioRendererEventListener
|
||||
import androidx.media3.exoplayer.source.MediaSource
|
||||
import androidx.media3.exoplayer.source.preload.PreloadMediaSource
|
||||
@ -61,7 +60,7 @@ class MediaSourceManager(
|
||||
bandwidthMeter,
|
||||
getRendererCapabilities(renderersFactory = renderersFactory),
|
||||
allocator,
|
||||
preloadLooper
|
||||
preloadLooper,
|
||||
)
|
||||
}
|
||||
|
||||
@ -104,7 +103,7 @@ class MediaSourceManager(
|
||||
Util.createHandlerForCurrentOrMainLooper(),
|
||||
object : VideoRendererEventListener {},
|
||||
object : AudioRendererEventListener {},
|
||||
{ _: CueGroup? -> }
|
||||
{ _: CueGroup? -> },
|
||||
) { _: Metadata ->
|
||||
}
|
||||
val capabilities = ArrayList<RendererCapabilities>()
|
||||
@ -131,9 +130,14 @@ class MediaSourceManager(
|
||||
|
||||
override fun onContinueLoadingRequested(
|
||||
mediaSource: PreloadMediaSource,
|
||||
bufferedPositionUs: Long
|
||||
bufferedPositionUs: Long,
|
||||
): Boolean {
|
||||
return bufferedPositionUs < targetPreloadPositionUs
|
||||
}
|
||||
|
||||
override fun onUsedByPlayer(mediaSource: PreloadMediaSource) {
|
||||
// Implementation is no-op until the whole class is removed with the adoption of
|
||||
// DefaultPreloadManager.
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -171,10 +171,6 @@ public final class DefaultPreloadManager extends BasePreloadManager<Integer> {
|
||||
protected void preloadSourceInternal(MediaSource mediaSource, long startPositionsUs) {
|
||||
checkArgument(mediaSource instanceof PreloadMediaSource);
|
||||
PreloadMediaSource preloadMediaSource = (PreloadMediaSource) mediaSource;
|
||||
if (preloadMediaSource.isUsedByPlayer()) {
|
||||
onPreloadCompleted(preloadMediaSource);
|
||||
return;
|
||||
}
|
||||
preloadMediaSource.preload(startPositionsUs);
|
||||
}
|
||||
|
||||
@ -227,6 +223,11 @@ public final class DefaultPreloadManager extends BasePreloadManager<Integer> {
|
||||
&& status.getValue() > Util.usToMs(bufferedPositionUs)));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUsedByPlayer(PreloadMediaSource mediaSource) {
|
||||
onPreloadCompleted(mediaSource);
|
||||
}
|
||||
|
||||
private boolean continueOrCompletePreloading(
|
||||
MediaSource mediaSource, Predicate<Status> continueLoadingPredicate) {
|
||||
@Nullable
|
||||
|
@ -86,6 +86,13 @@ public final class PreloadMediaSource extends WrappingMediaSource {
|
||||
* data is buffered, or {@link C#TIME_END_OF_SOURCE} if the track is fully buffered.
|
||||
*/
|
||||
boolean onContinueLoadingRequested(PreloadMediaSource mediaSource, long bufferedPositionUs);
|
||||
|
||||
/**
|
||||
* Called from {@link PreloadMediaSource} when the player starts using this source.
|
||||
*
|
||||
* @param mediaSource The {@link PreloadMediaSource} that the player starts using.
|
||||
*/
|
||||
void onUsedByPlayer(PreloadMediaSource mediaSource);
|
||||
}
|
||||
|
||||
/** Factory for {@link PreloadMediaSource}. */
|
||||
@ -197,6 +204,7 @@ public final class PreloadMediaSource extends WrappingMediaSource {
|
||||
@Nullable private Timeline timeline;
|
||||
@Nullable private Pair<PreloadMediaPeriod, MediaPeriodKey> preloadingMediaPeriodAndKey;
|
||||
@Nullable private Pair<PreloadMediaPeriod, MediaPeriodId> playingPreloadedMediaPeriodAndId;
|
||||
private boolean onUsedByPlayerNotified;
|
||||
|
||||
private PreloadMediaSource(
|
||||
MediaSource mediaSource,
|
||||
@ -230,7 +238,9 @@ public final class PreloadMediaSource extends WrappingMediaSource {
|
||||
() -> {
|
||||
preloadCalled = true;
|
||||
this.startPositionUs = startPositionUs;
|
||||
if (!isUsedByPlayer()) {
|
||||
if (isUsedByPlayer()) {
|
||||
notifyOnUsedByPlayer();
|
||||
} else {
|
||||
setPlayerId(PlayerId.UNSET); // Set to PlayerId.UNSET as there is no ongoing playback.
|
||||
prepareSourceInternal(bandwidthMeter.getTransferListener());
|
||||
}
|
||||
@ -239,6 +249,9 @@ public final class PreloadMediaSource extends WrappingMediaSource {
|
||||
|
||||
@Override
|
||||
protected void prepareSourceInternal() {
|
||||
if (isUsedByPlayer() && !onUsedByPlayerNotified) {
|
||||
notifyOnUsedByPlayer();
|
||||
}
|
||||
if (timeline != null) {
|
||||
onChildSourceInfoRefreshed(timeline);
|
||||
} else if (!prepareChildSourceCalled) {
|
||||
@ -318,10 +331,13 @@ public final class PreloadMediaSource extends WrappingMediaSource {
|
||||
|
||||
@Override
|
||||
protected void releaseSourceInternal() {
|
||||
if (!preloadCalled && !isUsedByPlayer()) {
|
||||
timeline = null;
|
||||
prepareChildSourceCalled = false;
|
||||
super.releaseSourceInternal();
|
||||
if (!isUsedByPlayer()) {
|
||||
onUsedByPlayerNotified = false;
|
||||
if (!preloadCalled) {
|
||||
timeline = null;
|
||||
prepareChildSourceCalled = false;
|
||||
super.releaseSourceInternal();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -355,6 +371,9 @@ public final class PreloadMediaSource extends WrappingMediaSource {
|
||||
|
||||
@Override
|
||||
public void onPrepared(MediaPeriod mediaPeriod) {
|
||||
if (isUsedByPlayer()) {
|
||||
return;
|
||||
}
|
||||
prepared = true;
|
||||
PreloadMediaPeriod preloadMediaPeriod = (PreloadMediaPeriod) mediaPeriod;
|
||||
TrackGroupArray trackGroups = preloadMediaPeriod.getTrackGroups();
|
||||
@ -379,6 +398,9 @@ public final class PreloadMediaSource extends WrappingMediaSource {
|
||||
|
||||
@Override
|
||||
public void onContinueLoadingRequested(MediaPeriod mediaPeriod) {
|
||||
if (isUsedByPlayer()) {
|
||||
return;
|
||||
}
|
||||
PreloadMediaPeriod preloadMediaPeriod = (PreloadMediaPeriod) mediaPeriod;
|
||||
if (!prepared
|
||||
|| preloadControl.onContinueLoadingRequested(
|
||||
@ -389,10 +411,15 @@ public final class PreloadMediaSource extends WrappingMediaSource {
|
||||
}
|
||||
}
|
||||
|
||||
/* package */ boolean isUsedByPlayer() {
|
||||
private boolean isUsedByPlayer() {
|
||||
return prepareSourceCalled();
|
||||
}
|
||||
|
||||
private void notifyOnUsedByPlayer() {
|
||||
preloadControl.onUsedByPlayer(this);
|
||||
onUsedByPlayerNotified = true;
|
||||
}
|
||||
|
||||
private static boolean mediaPeriodIdEqualsWithoutWindowSequenceNumber(
|
||||
MediaPeriodId firstPeriodId, MediaPeriodId secondPeriodId) {
|
||||
return firstPeriodId.periodUid.equals(secondPeriodId.periodUid)
|
||||
|
@ -246,11 +246,10 @@ public class DefaultPreloadManagerTest {
|
||||
FakeMediaSource wrappedMediaSource2 = fakeMediaSourceFactory.getLastCreatedSource();
|
||||
wrappedMediaSource2.setAllowPreparation(false);
|
||||
|
||||
MediaSource.MediaSourceCaller externalCaller = (source, timeline) -> {};
|
||||
PreloadMediaSource preloadMediaSource2 =
|
||||
(PreloadMediaSource) preloadManager.getMediaSource(mediaItem2);
|
||||
preloadMediaSource2.prepareSource(
|
||||
externalCaller, bandwidthMeter.getTransferListener(), PlayerId.UNSET);
|
||||
(source, timeline) -> {}, bandwidthMeter.getTransferListener(), PlayerId.UNSET);
|
||||
preloadManager.setCurrentPlayingIndex(2);
|
||||
preloadManager.invalidate();
|
||||
shadowOf(Looper.getMainLooper()).idle();
|
||||
@ -261,6 +260,51 @@ public class DefaultPreloadManagerTest {
|
||||
assertThat(targetPreloadStatusControlCallReference).containsExactly(2, 1, 0).inOrder();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void invalidate_sourceHandedOverToPlayerDuringPreloading_continuesPreloadingNextSource() {
|
||||
ArrayList<Integer> targetPreloadStatusControlCallReference = new ArrayList<>();
|
||||
TargetPreloadStatusControl<Integer> targetPreloadStatusControl =
|
||||
rankingData -> {
|
||||
targetPreloadStatusControlCallReference.add(rankingData);
|
||||
return new DefaultPreloadManager.Status(
|
||||
DefaultPreloadManager.Status.STAGE_TIMELINE_REFRESHED);
|
||||
};
|
||||
FakeMediaSourceFactory fakeMediaSourceFactory = new FakeMediaSourceFactory();
|
||||
DefaultPreloadManager preloadManager =
|
||||
new DefaultPreloadManager(
|
||||
targetPreloadStatusControl,
|
||||
fakeMediaSourceFactory,
|
||||
trackSelector,
|
||||
bandwidthMeter,
|
||||
rendererCapabilitiesListFactory,
|
||||
allocator,
|
||||
Util.getCurrentOrMainLooper());
|
||||
MediaItem.Builder mediaItemBuilder = new MediaItem.Builder();
|
||||
MediaItem mediaItem0 =
|
||||
mediaItemBuilder.setMediaId("mediaId0").setUri("http://exoplayer.dev/video0").build();
|
||||
MediaItem mediaItem1 =
|
||||
mediaItemBuilder.setMediaId("mediaId1").setUri("http://exoplayer.dev/video1").build();
|
||||
|
||||
preloadManager.add(mediaItem0, /* rankingData= */ 0);
|
||||
FakeMediaSource wrappedMediaSource0 = fakeMediaSourceFactory.getLastCreatedSource();
|
||||
wrappedMediaSource0.setAllowPreparation(false);
|
||||
preloadManager.add(mediaItem1, /* rankingData= */ 1);
|
||||
FakeMediaSource wrappedMediaSource1 = fakeMediaSourceFactory.getLastCreatedSource();
|
||||
wrappedMediaSource1.setAllowPreparation(false);
|
||||
preloadManager.invalidate();
|
||||
assertThat(targetPreloadStatusControlCallReference).containsExactly(0);
|
||||
|
||||
PreloadMediaSource preloadMediaSource0 =
|
||||
(PreloadMediaSource) preloadManager.getMediaSource(mediaItem0);
|
||||
preloadMediaSource0.prepareSource(
|
||||
(source, timeline) -> {}, bandwidthMeter.getTransferListener(), PlayerId.UNSET);
|
||||
shadowOf(Looper.getMainLooper()).idle();
|
||||
|
||||
// The preload of mediaItem0 should complete and the preload manager continues to preload
|
||||
// mediaItem1, even when the preloadMediaSource0 hasn't finished preparation.
|
||||
assertThat(targetPreloadStatusControlCallReference).containsExactly(0, 1).inOrder();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void invalidate_beforePreloadCompletedForLastInvalidate_preloadRespectsToLatestOrder() {
|
||||
ArrayList<Integer> targetPreloadStatusControlCallReference = new ArrayList<>();
|
||||
|
@ -70,6 +70,7 @@ public class PreloadAndPlaybackCoordinationTest {
|
||||
|
||||
private final AtomicInteger preloadControlOnSourceInfoRefreshedCalledCounter;
|
||||
private final AtomicInteger preloadControlOnPreparedCalledCounter;
|
||||
private final AtomicInteger preloadControlOnUsedByPlayerCounter;
|
||||
private final AtomicBoolean playbackSourceCallerOnSourceInfoRefreshedCalled;
|
||||
private final AtomicBoolean playbackPeriodCallbackOnPreparedCalled;
|
||||
private final AtomicReference<MediaPeriod> preloadMediaPeriodReference;
|
||||
@ -94,6 +95,7 @@ public class PreloadAndPlaybackCoordinationTest {
|
||||
};
|
||||
preloadControlOnSourceInfoRefreshedCalledCounter = new AtomicInteger();
|
||||
preloadControlOnPreparedCalledCounter = new AtomicInteger();
|
||||
preloadControlOnUsedByPlayerCounter = new AtomicInteger();
|
||||
playbackSourceCallerOnSourceInfoRefreshedCalled = new AtomicBoolean();
|
||||
playbackPeriodCallbackOnPreparedCalled = new AtomicBoolean();
|
||||
preloadMediaPeriodReference = new AtomicReference<>();
|
||||
@ -117,6 +119,11 @@ public class PreloadAndPlaybackCoordinationTest {
|
||||
PreloadMediaSource mediaSource, long bufferedPositionUs) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUsedByPlayer(PreloadMediaSource mediaSource) {
|
||||
preloadControlOnUsedByPlayerCounter.addAndGet(1);
|
||||
}
|
||||
};
|
||||
PreloadMediaSource.Factory preloadMediaSourceFactory =
|
||||
new PreloadMediaSource.Factory(
|
||||
@ -168,6 +175,7 @@ public class PreloadAndPlaybackCoordinationTest {
|
||||
|
||||
assertThat(preloadControlOnSourceInfoRefreshedCalledCounter.get()).isEqualTo(0);
|
||||
assertThat(preloadControlOnPreparedCalledCounter.get()).isEqualTo(0);
|
||||
assertThat(preloadControlOnUsedByPlayerCounter.get()).isEqualTo(1);
|
||||
assertThat(playbackSourceCallerOnSourceInfoRefreshedCalled.get()).isTrue();
|
||||
assertThat(playbackPeriodCallbackOnPreparedCalled.get()).isTrue();
|
||||
assertThat(preloadMediaPeriodReference.get()).isNotNull();
|
||||
@ -181,6 +189,7 @@ public class PreloadAndPlaybackCoordinationTest {
|
||||
|
||||
assertThat(preloadControlOnSourceInfoRefreshedCalledCounter.get()).isEqualTo(1);
|
||||
assertThat(preloadControlOnPreparedCalledCounter.get()).isEqualTo(1);
|
||||
assertThat(preloadControlOnUsedByPlayerCounter.get()).isEqualTo(1);
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -192,6 +201,7 @@ public class PreloadAndPlaybackCoordinationTest {
|
||||
|
||||
assertThat(preloadControlOnSourceInfoRefreshedCalledCounter.get()).isEqualTo(0);
|
||||
assertThat(preloadControlOnPreparedCalledCounter.get()).isEqualTo(0);
|
||||
assertThat(preloadControlOnUsedByPlayerCounter.get()).isEqualTo(2);
|
||||
assertThat(playbackSourceCallerOnSourceInfoRefreshedCalled.get()).isTrue();
|
||||
assertThat(playbackPeriodCallbackOnPreparedCalled.get()).isTrue();
|
||||
assertThat(preloadMediaPeriodReference.get()).isNotNull();
|
||||
@ -205,6 +215,7 @@ public class PreloadAndPlaybackCoordinationTest {
|
||||
|
||||
assertThat(preloadControlOnSourceInfoRefreshedCalledCounter.get()).isEqualTo(1);
|
||||
assertThat(preloadControlOnPreparedCalledCounter.get()).isEqualTo(1);
|
||||
assertThat(preloadControlOnUsedByPlayerCounter.get()).isEqualTo(2);
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -220,6 +231,7 @@ public class PreloadAndPlaybackCoordinationTest {
|
||||
|
||||
assertThat(preloadControlOnSourceInfoRefreshedCalledCounter.get()).isEqualTo(0);
|
||||
assertThat(preloadControlOnPreparedCalledCounter.get()).isEqualTo(0);
|
||||
assertThat(preloadControlOnUsedByPlayerCounter.get()).isEqualTo(1);
|
||||
assertThat(playbackSourceCallerOnSourceInfoRefreshedCalled.get()).isTrue();
|
||||
assertThat(playbackPeriodCallbackOnPreparedCalled.get()).isTrue();
|
||||
assertThat(preloadMediaPeriodReference.get()).isNotNull();
|
||||
@ -233,6 +245,7 @@ public class PreloadAndPlaybackCoordinationTest {
|
||||
|
||||
assertThat(preloadControlOnSourceInfoRefreshedCalledCounter.get()).isEqualTo(1);
|
||||
assertThat(preloadControlOnPreparedCalledCounter.get()).isEqualTo(1);
|
||||
assertThat(preloadControlOnUsedByPlayerCounter.get()).isEqualTo(1);
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -251,6 +264,7 @@ public class PreloadAndPlaybackCoordinationTest {
|
||||
|
||||
assertThat(preloadControlOnSourceInfoRefreshedCalledCounter.get()).isEqualTo(1);
|
||||
assertThat(preloadControlOnPreparedCalledCounter.get()).isEqualTo(0);
|
||||
assertThat(preloadControlOnUsedByPlayerCounter.get()).isEqualTo(1);
|
||||
assertThat(playbackSourceCallerOnSourceInfoRefreshedCalled.get()).isTrue();
|
||||
assertThat(playbackPeriodCallbackOnPreparedCalled.get()).isTrue();
|
||||
assertThat(preloadMediaPeriodReference.get()).isNotNull();
|
||||
@ -265,6 +279,7 @@ public class PreloadAndPlaybackCoordinationTest {
|
||||
|
||||
assertThat(preloadControlOnSourceInfoRefreshedCalledCounter.get()).isEqualTo(2);
|
||||
assertThat(preloadControlOnPreparedCalledCounter.get()).isEqualTo(1);
|
||||
assertThat(preloadControlOnUsedByPlayerCounter.get()).isEqualTo(1);
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -277,6 +292,7 @@ public class PreloadAndPlaybackCoordinationTest {
|
||||
|
||||
assertThat(preloadControlOnSourceInfoRefreshedCalledCounter.get()).isEqualTo(1);
|
||||
assertThat(preloadControlOnPreparedCalledCounter.get()).isEqualTo(1);
|
||||
assertThat(preloadControlOnUsedByPlayerCounter.get()).isEqualTo(1);
|
||||
assertThat(playbackSourceCallerOnSourceInfoRefreshedCalled.get()).isTrue();
|
||||
assertThat(playbackPeriodCallbackOnPreparedCalled.get()).isTrue();
|
||||
assertThat(preloadMediaPeriodReference.get()).isNotNull();
|
||||
@ -290,6 +306,7 @@ public class PreloadAndPlaybackCoordinationTest {
|
||||
|
||||
assertThat(preloadControlOnSourceInfoRefreshedCalledCounter.get()).isEqualTo(2);
|
||||
assertThat(preloadControlOnPreparedCalledCounter.get()).isEqualTo(2);
|
||||
assertThat(preloadControlOnUsedByPlayerCounter.get()).isEqualTo(1);
|
||||
}
|
||||
|
||||
private static RendererCapabilities[] getRendererCapabilities(RenderersFactory renderersFactory) {
|
||||
|
@ -104,6 +104,7 @@ public final class PreloadMediaSourceTest {
|
||||
AtomicBoolean onPreparedCalled = new AtomicBoolean();
|
||||
AtomicBoolean onContinueLoadingStopped = new AtomicBoolean();
|
||||
AtomicReference<PreloadMediaSource> preloadMediaSourceReference = new AtomicReference<>();
|
||||
AtomicBoolean onUsedByPlayerCalled = new AtomicBoolean();
|
||||
PreloadMediaSource.PreloadControl preloadControl =
|
||||
new PreloadMediaSource.PreloadControl() {
|
||||
@Override
|
||||
@ -128,6 +129,11 @@ public final class PreloadMediaSourceTest {
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUsedByPlayer(PreloadMediaSource mediaSource) {
|
||||
onUsedByPlayerCalled.set(true);
|
||||
}
|
||||
};
|
||||
ProgressiveMediaSource.Factory mediaSourceFactory =
|
||||
new ProgressiveMediaSource.Factory(
|
||||
@ -156,6 +162,7 @@ public final class PreloadMediaSourceTest {
|
||||
|
||||
assertThat(onTimelineRefreshedCalled.get()).isTrue();
|
||||
assertThat(onPreparedCalled.get()).isTrue();
|
||||
assertThat(onUsedByPlayerCalled.get()).isFalse();
|
||||
assertThat(preloadMediaSourceReference.get()).isSameInstanceAs(preloadMediaSource);
|
||||
}
|
||||
|
||||
@ -165,6 +172,7 @@ public final class PreloadMediaSourceTest {
|
||||
AtomicBoolean onPreparedCalled = new AtomicBoolean();
|
||||
AtomicReference<PreloadMediaSource> preloadMediaSourceReference = new AtomicReference<>();
|
||||
AtomicBoolean onContinueLoadingRequestedCalled = new AtomicBoolean();
|
||||
AtomicBoolean onUsedByPlayerCalled = new AtomicBoolean();
|
||||
PreloadMediaSource.PreloadControl preloadControl =
|
||||
new PreloadMediaSource.PreloadControl() {
|
||||
@Override
|
||||
@ -186,6 +194,11 @@ public final class PreloadMediaSourceTest {
|
||||
onContinueLoadingRequestedCalled.set(true);
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUsedByPlayer(PreloadMediaSource mediaSource) {
|
||||
onUsedByPlayerCalled.set(true);
|
||||
}
|
||||
};
|
||||
ProgressiveMediaSource.Factory mediaSourceFactory =
|
||||
new ProgressiveMediaSource.Factory(
|
||||
@ -215,6 +228,7 @@ public final class PreloadMediaSourceTest {
|
||||
assertThat(onTimelineRefreshedCalled.get()).isTrue();
|
||||
assertThat(preloadMediaSourceReference.get()).isSameInstanceAs(preloadMediaSource);
|
||||
assertThat(onContinueLoadingRequestedCalled.get()).isFalse();
|
||||
assertThat(onUsedByPlayerCalled.get()).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -223,6 +237,7 @@ public final class PreloadMediaSourceTest {
|
||||
AtomicReference<PreloadMediaSource> preloadMediaSourceReference = new AtomicReference<>();
|
||||
AtomicBoolean onPreparedCalled = new AtomicBoolean();
|
||||
AtomicBoolean onContinueLoadingRequestedCalled = new AtomicBoolean();
|
||||
AtomicBoolean onUsedByPlayerCalled = new AtomicBoolean();
|
||||
PreloadMediaSource.PreloadControl preloadControl =
|
||||
new PreloadMediaSource.PreloadControl() {
|
||||
@Override
|
||||
@ -244,6 +259,11 @@ public final class PreloadMediaSourceTest {
|
||||
onContinueLoadingRequestedCalled.set(true);
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUsedByPlayer(PreloadMediaSource mediaSource) {
|
||||
onUsedByPlayerCalled.set(true);
|
||||
}
|
||||
};
|
||||
ProgressiveMediaSource.Factory mediaSourceFactory =
|
||||
new ProgressiveMediaSource.Factory(
|
||||
@ -272,12 +292,14 @@ public final class PreloadMediaSourceTest {
|
||||
assertThat(preloadMediaSourceReference.get()).isSameInstanceAs(preloadMediaSource);
|
||||
assertThat(onPreparedCalled.get()).isFalse();
|
||||
assertThat(onContinueLoadingRequestedCalled.get()).isFalse();
|
||||
assertThat(onUsedByPlayerCalled.get()).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void preload_whileSourceIsAccessedByExternalCaller_notProceedWithPreloading() {
|
||||
AtomicBoolean onTimelineRefreshedCalled = new AtomicBoolean(false);
|
||||
AtomicBoolean onPreparedCalled = new AtomicBoolean(false);
|
||||
AtomicBoolean onUsedByPlayerCalled = new AtomicBoolean();
|
||||
PreloadMediaSource.PreloadControl preloadControl =
|
||||
new PreloadMediaSource.PreloadControl() {
|
||||
@Override
|
||||
@ -297,6 +319,11 @@ public final class PreloadMediaSourceTest {
|
||||
PreloadMediaSource mediaSource, long bufferedPositionUs) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUsedByPlayer(PreloadMediaSource mediaSource) {
|
||||
onUsedByPlayerCalled.set(true);
|
||||
}
|
||||
};
|
||||
TrackSelector trackSelector = new FakeTrackSelector();
|
||||
trackSelector.init(() -> {}, bandwidthMeter);
|
||||
@ -332,6 +359,7 @@ public final class PreloadMediaSourceTest {
|
||||
assertThat(externalCallerMediaSourceReference.get()).isSameInstanceAs(preloadMediaSource);
|
||||
assertThat(onTimelineRefreshedCalled.get()).isFalse();
|
||||
assertThat(onPreparedCalled.get()).isFalse();
|
||||
assertThat(onUsedByPlayerCalled.get()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -339,6 +367,7 @@ public final class PreloadMediaSourceTest {
|
||||
prepareSource_beforeSourceInfoRefreshedForPreloading_onlyInvokeExternalCallerOnSourceInfoRefreshed() {
|
||||
AtomicBoolean onTimelineRefreshedCalled = new AtomicBoolean(false);
|
||||
AtomicBoolean onPreparedCalled = new AtomicBoolean(false);
|
||||
AtomicBoolean onUsedByPlayerCalled = new AtomicBoolean();
|
||||
PreloadMediaSource.PreloadControl preloadControl =
|
||||
new PreloadMediaSource.PreloadControl() {
|
||||
@Override
|
||||
@ -358,6 +387,11 @@ public final class PreloadMediaSourceTest {
|
||||
PreloadMediaSource mediaSource, long bufferedPositionUs) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUsedByPlayer(PreloadMediaSource mediaSource) {
|
||||
onUsedByPlayerCalled.set(true);
|
||||
}
|
||||
};
|
||||
FakeMediaSourceFactory mediaSourceFactory = new FakeMediaSourceFactory();
|
||||
TrackSelector trackSelector = new FakeTrackSelector();
|
||||
@ -396,12 +430,14 @@ public final class PreloadMediaSourceTest {
|
||||
assertThat(externalCallerMediaSourceReference.get()).isSameInstanceAs(preloadMediaSource);
|
||||
assertThat(onTimelineRefreshedCalled.get()).isFalse();
|
||||
assertThat(onPreparedCalled.get()).isFalse();
|
||||
assertThat(onUsedByPlayerCalled.get()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void prepareSource_afterPreload_immediatelyInvokeExternalCallerOnSourceInfoRefreshed() {
|
||||
AtomicBoolean onTimelineRefreshedCalled = new AtomicBoolean(false);
|
||||
AtomicBoolean onPreparedCalled = new AtomicBoolean(false);
|
||||
AtomicBoolean onUsedByPlayerCalled = new AtomicBoolean();
|
||||
PreloadMediaSource.PreloadControl preloadControl =
|
||||
new PreloadMediaSource.PreloadControl() {
|
||||
@Override
|
||||
@ -421,6 +457,11 @@ public final class PreloadMediaSourceTest {
|
||||
PreloadMediaSource mediaSource, long bufferedPositionUs) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUsedByPlayer(PreloadMediaSource mediaSource) {
|
||||
onUsedByPlayerCalled.set(true);
|
||||
}
|
||||
};
|
||||
FakeMediaSourceFactory mediaSourceFactory = new FakeMediaSourceFactory();
|
||||
TrackSelector trackSelector = new FakeTrackSelector();
|
||||
@ -456,6 +497,7 @@ public final class PreloadMediaSourceTest {
|
||||
assertThat(onTimelineRefreshedCalled.get()).isTrue();
|
||||
assertThat(onPreparedCalled.get()).isTrue();
|
||||
assertThat(externalCallerMediaSourceReference.get()).isSameInstanceAs(preloadMediaSource);
|
||||
assertThat(onUsedByPlayerCalled.get()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -480,6 +522,9 @@ public final class PreloadMediaSourceTest {
|
||||
PreloadMediaSource mediaSource, long bufferedPositionUs) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUsedByPlayer(PreloadMediaSource mediaSource) {}
|
||||
};
|
||||
AtomicReference<MediaSource> internalSourceReference = new AtomicReference<>();
|
||||
MediaSource.Factory mockMediaSourceFactory = mock(MediaSource.Factory.class);
|
||||
@ -587,6 +632,9 @@ public final class PreloadMediaSourceTest {
|
||||
PreloadMediaSource mediaSource, long bufferedPositionUs) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUsedByPlayer(PreloadMediaSource mediaSource) {}
|
||||
};
|
||||
AtomicReference<MediaSource> internalSourceReference = new AtomicReference<>();
|
||||
MediaSource.Factory mockMediaSourceFactory = mock(MediaSource.Factory.class);
|
||||
@ -692,6 +740,9 @@ public final class PreloadMediaSourceTest {
|
||||
PreloadMediaSource mediaSource, long bufferedPositionUs) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUsedByPlayer(PreloadMediaSource mediaSource) {}
|
||||
};
|
||||
AtomicReference<MediaSource> internalSourceReference = new AtomicReference<>();
|
||||
MediaSource.Factory mockMediaSourceFactory = mock(MediaSource.Factory.class);
|
||||
@ -769,6 +820,9 @@ public final class PreloadMediaSourceTest {
|
||||
PreloadMediaSource mediaSource, long bufferedPositionUs) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUsedByPlayer(PreloadMediaSource mediaSource) {}
|
||||
};
|
||||
AtomicReference<MediaSource> internalSourceReference = new AtomicReference<>();
|
||||
MediaSource.Factory mockMediaSourceFactory = mock(MediaSource.Factory.class);
|
||||
@ -847,6 +901,9 @@ public final class PreloadMediaSourceTest {
|
||||
PreloadMediaSource mediaSource, long bufferedPositionUs) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUsedByPlayer(PreloadMediaSource mediaSource) {}
|
||||
};
|
||||
AtomicReference<MediaSource> internalSourceReference = new AtomicReference<>();
|
||||
MediaSource.Factory mockMediaSourceFactory = mock(MediaSource.Factory.class);
|
||||
@ -935,6 +992,9 @@ public final class PreloadMediaSourceTest {
|
||||
PreloadMediaSource mediaSource, long bufferedPositionUs) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUsedByPlayer(PreloadMediaSource mediaSource) {}
|
||||
};
|
||||
AtomicReference<MediaSource> internalSourceReference = new AtomicReference<>();
|
||||
MediaSource.Factory mockMediaSourceFactory = mock(MediaSource.Factory.class);
|
||||
@ -1004,6 +1064,9 @@ public final class PreloadMediaSourceTest {
|
||||
PreloadMediaSource mediaSource, long bufferedPositionUs) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUsedByPlayer(PreloadMediaSource mediaSource) {}
|
||||
};
|
||||
AtomicReference<MediaSource> internalSourceReference = new AtomicReference<>();
|
||||
MediaSource.Factory mockMediaSourceFactory = mock(MediaSource.Factory.class);
|
||||
|
Loading…
x
Reference in New Issue
Block a user