@@ -10794,6 +10794,62 @@ public void maybeThrowPrepareError() throws IOException {
10794
10794
player.release();
10795
10795
}
10796
10796
10797
+ @Test
10798
+ public void
10799
+ mediaPeriodMaybeThrowPrepareError_bufferedDurationUnderMinimumBufferForPlayback_keepPlayingUntilBufferedDataExhausts()
10800
+ throws Exception {
10801
+ ExoPlayer player = parameterizeTestExoPlayerBuilder(new TestExoPlayerBuilder(context)).build();
10802
+ // Define a timeline that has a short duration of 1 second for the first item, which is smaller
10803
+ // than the default buffer duration for playback in DefaultLoadControl (2.5 seconds).
10804
+ Timeline timeline =
10805
+ new FakeTimeline(
10806
+ new TimelineWindowDefinition(
10807
+ /* isSeekable= */ true,
10808
+ /* isDynamic= */ false,
10809
+ /* durationUs= */ 1 * C.MICROS_PER_SECOND));
10810
+ player.addMediaSource(new FakeMediaSource(timeline, ExoPlayerTestRunner.VIDEO_FORMAT));
10811
+ player.addMediaSource(
10812
+ new FakeMediaSource(timeline, ExoPlayerTestRunner.VIDEO_FORMAT) {
10813
+ @Override
10814
+ protected MediaPeriod createMediaPeriod(
10815
+ MediaPeriodId id,
10816
+ TrackGroupArray trackGroupArray,
10817
+ Allocator allocator,
10818
+ MediaSourceEventListener.EventDispatcher mediaSourceEventDispatcher,
10819
+ DrmSessionManager drmSessionManager,
10820
+ DrmSessionEventListener.EventDispatcher drmEventDispatcher,
10821
+ @Nullable TransferListener transferListener) {
10822
+ return new FakeMediaPeriod(
10823
+ trackGroupArray,
10824
+ allocator,
10825
+ /* singleSampleTimeUs= */ 0,
10826
+ mediaSourceEventDispatcher,
10827
+ DrmSessionManager.DRM_UNSUPPORTED,
10828
+ drmEventDispatcher,
10829
+ /* deferOnPrepared= */ true) {
10830
+ @Override
10831
+ public void maybeThrowPrepareError() throws IOException {
10832
+ throw new IOException();
10833
+ }
10834
+ };
10835
+ }
10836
+ });
10837
+
10838
+ player.prepare();
10839
+ player.play();
10840
+ ExoPlaybackException error = TestPlayerRunHelper.runUntilError(player);
10841
+
10842
+ Object period1Uid =
10843
+ player
10844
+ .getCurrentTimeline()
10845
+ .getPeriod(/* periodIndex= */ 1, new Timeline.Period(), /* setIds= */ true)
10846
+ .uid;
10847
+ assertThat(error.mediaPeriodId.periodUid).isEqualTo(period1Uid);
10848
+ assertThat(player.getCurrentMediaItemIndex()).isEqualTo(1);
10849
+
10850
+ player.release();
10851
+ }
10852
+
10797
10853
@Test
10798
10854
public void sampleStreamMaybeThrowError_isNotThrownUntilPlaybackReachedFailingItem()
10799
10855
throws Exception {
@@ -10859,6 +10915,79 @@ public void maybeThrowError() throws IOException {
10859
10915
player.release();
10860
10916
}
10861
10917
10918
+ @Test
10919
+ public void
10920
+ sampleStreamMaybeThrowError_bufferedDurationUnderMinimumBufferForPlayback_keepPlayingUntilBufferedDataExhausts()
10921
+ throws Exception {
10922
+ ExoPlayer player = parameterizeTestExoPlayerBuilder(new TestExoPlayerBuilder(context)).build();
10923
+ // Define a timeline that has a short duration of 1 second for the first item, which is smaller
10924
+ // than the default buffer duration for playback in DefaultLoadControl (2.5 seconds).
10925
+ Timeline timeline =
10926
+ new FakeTimeline(
10927
+ new TimelineWindowDefinition(
10928
+ /* isSeekable= */ true,
10929
+ /* isDynamic= */ false,
10930
+ /* durationUs= */ 1 * C.MICROS_PER_SECOND));
10931
+ player.addMediaSource(new FakeMediaSource(timeline, ExoPlayerTestRunner.VIDEO_FORMAT));
10932
+ player.addMediaSource(
10933
+ new FakeMediaSource(timeline, ExoPlayerTestRunner.VIDEO_FORMAT) {
10934
+ @Override
10935
+ protected MediaPeriod createMediaPeriod(
10936
+ MediaPeriodId id,
10937
+ TrackGroupArray trackGroupArray,
10938
+ Allocator allocator,
10939
+ MediaSourceEventListener.EventDispatcher mediaSourceEventDispatcher,
10940
+ DrmSessionManager drmSessionManager,
10941
+ DrmSessionEventListener.EventDispatcher drmEventDispatcher,
10942
+ @Nullable TransferListener transferListener) {
10943
+ return new FakeMediaPeriod(
10944
+ trackGroupArray,
10945
+ allocator,
10946
+ /* trackDataFactory= */ (format, mediaPeriodId) -> ImmutableList.of(),
10947
+ mediaSourceEventDispatcher,
10948
+ drmSessionManager,
10949
+ drmEventDispatcher,
10950
+ /* deferOnPrepared= */ false) {
10951
+ @Override
10952
+ protected FakeSampleStream createSampleStream(
10953
+ Allocator allocator,
10954
+ @Nullable MediaSourceEventListener.EventDispatcher mediaSourceEventDispatcher,
10955
+ DrmSessionManager drmSessionManager,
10956
+ DrmSessionEventListener.EventDispatcher drmEventDispatcher,
10957
+ Format initialFormat,
10958
+ List<FakeSampleStreamItem> fakeSampleStreamItems) {
10959
+ return new FakeSampleStream(
10960
+ allocator,
10961
+ mediaSourceEventDispatcher,
10962
+ drmSessionManager,
10963
+ drmEventDispatcher,
10964
+ initialFormat,
10965
+ fakeSampleStreamItems) {
10966
+ @Override
10967
+ public void maybeThrowError() throws IOException {
10968
+ throw new IOException();
10969
+ }
10970
+ };
10971
+ }
10972
+ };
10973
+ }
10974
+ });
10975
+
10976
+ player.prepare();
10977
+ player.play();
10978
+ ExoPlaybackException error = TestPlayerRunHelper.runUntilError(player);
10979
+
10980
+ Object period1Uid =
10981
+ player
10982
+ .getCurrentTimeline()
10983
+ .getPeriod(/* periodIndex= */ 1, new Timeline.Period(), /* setIds= */ true)
10984
+ .uid;
10985
+ assertThat(error.mediaPeriodId.periodUid).isEqualTo(period1Uid);
10986
+ assertThat(player.getCurrentMediaItemIndex()).isEqualTo(1);
10987
+
10988
+ player.release();
10989
+ }
10990
+
10862
10991
@Test
10863
10992
public void rendererError_isReportedWithReadingMediaPeriodId() throws Exception {
10864
10993
FakeMediaSource source0 =
0 commit comments