diff --git a/library/core/src/main/java/com/google/android/exoplayer2/MediaPeriodInfo.java b/library/core/src/main/java/com/google/android/exoplayer2/MediaPeriodInfo.java index b14af5e1de..aa9455fcbe 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/MediaPeriodInfo.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/MediaPeriodInfo.java @@ -18,6 +18,7 @@ package com.google.android.exoplayer2; import androidx.annotation.Nullable; import com.google.android.exoplayer2.source.MediaPeriod; import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId; +import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Util; /** Stores the information required to load and play a {@link MediaPeriod}. */ @@ -48,6 +49,12 @@ import com.google.android.exoplayer2.util.Util; * known. */ public final long durationUs; + /** + * Whether this media period is followed by a transition to another media period of the same + * server-side inserted ad stream. If true, {@link #isLastInTimelinePeriod}, {@link + * #isLastInTimelineWindow} and {@link #isFinal} will all be false. + */ + public final boolean isFollowedByTransitionToSameStream; /** * Whether this is the last media period in its timeline period (e.g., a postroll ad, or a media * period corresponding to a timeline period without ads). @@ -67,14 +74,21 @@ import com.google.android.exoplayer2.util.Util; long requestedContentPositionUs, long endPositionUs, long durationUs, + boolean isFollowedByTransitionToSameStream, boolean isLastInTimelinePeriod, boolean isLastInTimelineWindow, boolean isFinal) { + Assertions.checkArgument(!isFinal || isLastInTimelinePeriod); + Assertions.checkArgument(!isLastInTimelineWindow || isLastInTimelinePeriod); + Assertions.checkArgument( + !isFollowedByTransitionToSameStream + || (!isLastInTimelinePeriod && !isLastInTimelineWindow && !isFinal)); this.id = id; this.startPositionUs = startPositionUs; this.requestedContentPositionUs = requestedContentPositionUs; this.endPositionUs = endPositionUs; this.durationUs = durationUs; + this.isFollowedByTransitionToSameStream = isFollowedByTransitionToSameStream; this.isLastInTimelinePeriod = isLastInTimelinePeriod; this.isLastInTimelineWindow = isLastInTimelineWindow; this.isFinal = isFinal; @@ -93,6 +107,7 @@ import com.google.android.exoplayer2.util.Util; requestedContentPositionUs, endPositionUs, durationUs, + isFollowedByTransitionToSameStream, isLastInTimelinePeriod, isLastInTimelineWindow, isFinal); @@ -111,6 +126,7 @@ import com.google.android.exoplayer2.util.Util; requestedContentPositionUs, endPositionUs, durationUs, + isFollowedByTransitionToSameStream, isLastInTimelinePeriod, isLastInTimelineWindow, isFinal); @@ -129,6 +145,7 @@ import com.google.android.exoplayer2.util.Util; && requestedContentPositionUs == that.requestedContentPositionUs && endPositionUs == that.endPositionUs && durationUs == that.durationUs + && isFollowedByTransitionToSameStream == that.isFollowedByTransitionToSameStream && isLastInTimelinePeriod == that.isLastInTimelinePeriod && isLastInTimelineWindow == that.isLastInTimelineWindow && isFinal == that.isFinal @@ -143,6 +160,7 @@ import com.google.android.exoplayer2.util.Util; result = 31 * result + (int) requestedContentPositionUs; result = 31 * result + (int) endPositionUs; result = 31 * result + (int) durationUs; + result = 31 * result + (isFollowedByTransitionToSameStream ? 1 : 0); result = 31 * result + (isLastInTimelinePeriod ? 1 : 0); result = 31 * result + (isLastInTimelineWindow ? 1 : 0); result = 31 * result + (isFinal ? 1 : 0); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/MediaPeriodQueue.java b/library/core/src/main/java/com/google/android/exoplayer2/MediaPeriodQueue.java index e32135fd50..18b258d779 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/MediaPeriodQueue.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/MediaPeriodQueue.java @@ -358,7 +358,7 @@ import com.google.common.collect.ImmutableList; : periodHolder.toRendererTime(newPeriodInfo.durationUs); boolean isReadingAndReadBeyondNewDuration = periodHolder == reading - && !isUsingSameStreamForNextMediaPeriod(timeline, periodHolder.info.id) + && !periodHolder.info.isFollowedByTransitionToSameStream && (maxRendererReadPositionUs == C.TIME_END_OF_SOURCE || maxRendererReadPositionUs >= newDurationInRendererTime); boolean readingPeriodRemoved = removeAfter(periodHolder); @@ -396,12 +396,18 @@ import com.google.common.collect.ImmutableList; : (endPositionUs == C.TIME_UNSET || endPositionUs == C.TIME_END_OF_SOURCE ? period.getDurationUs() : endPositionUs); + boolean isFollowedByTransitionToSameStream = + id.isAd() + ? period.isServerSideInsertedAdGroup(id.adGroupIndex) + : (id.nextAdGroupIndex != C.INDEX_UNSET + && period.isServerSideInsertedAdGroup(id.nextAdGroupIndex)); return new MediaPeriodInfo( id, info.startPositionUs, info.requestedContentPositionUs, endPositionUs, durationUs, + isFollowedByTransitionToSameStream, isLastInPeriod, isLastInWindow, isLastInTimeline); @@ -778,6 +784,8 @@ import com.google.common.collect.ImmutableList; adIndexInAdGroup == period.getFirstAdIndexToPlay(adGroupIndex) ? period.getAdResumePositionUs() : 0; + boolean isFollowedByTransitionToSameStream = + period.isServerSideInsertedAdGroup(id.adGroupIndex); if (durationUs != C.TIME_UNSET && startPositionUs >= durationUs) { // Ensure start position doesn't exceed duration. startPositionUs = max(0, durationUs - 1); @@ -788,6 +796,7 @@ import com.google.common.collect.ImmutableList; contentPositionUs, /* endPositionUs= */ C.TIME_UNSET, durationUs, + isFollowedByTransitionToSameStream, /* isLastInTimelinePeriod= */ false, /* isLastInTimelineWindow= */ false, /* isFinal= */ false); @@ -805,6 +814,8 @@ import com.google.common.collect.ImmutableList; boolean isLastInPeriod = isLastInPeriod(id); boolean isLastInWindow = isLastInWindow(timeline, id); boolean isLastInTimeline = isLastInTimeline(timeline, id, isLastInPeriod); + boolean isFollowedByTransitionToSameStream = + nextAdGroupIndex != C.INDEX_UNSET && period.isServerSideInsertedAdGroup(nextAdGroupIndex); long endPositionUs = nextAdGroupIndex != C.INDEX_UNSET ? period.getAdGroupTimeUs(nextAdGroupIndex) @@ -823,6 +834,7 @@ import com.google.common.collect.ImmutableList; requestedContentPositionUs, endPositionUs, durationUs, + isFollowedByTransitionToSameStream, isLastInPeriod, isLastInWindow, isLastInTimeline); @@ -859,20 +871,4 @@ import com.google.common.collect.ImmutableList; } return startPositionUs + period.getContentResumeOffsetUs(adGroupIndex); } - - private boolean isUsingSameStreamForNextMediaPeriod( - Timeline timeline, MediaPeriodId mediaPeriodId) { - // Server-side inserted ads or content after them will use the same underlying stream. - if (mediaPeriodId.isAd()) { - return timeline - .getPeriodByUid(mediaPeriodId.periodUid, period) - .isServerSideInsertedAdGroup(mediaPeriodId.adGroupIndex); - } else if (mediaPeriodId.nextAdGroupIndex == C.INDEX_UNSET) { - return false; - } else { - return timeline - .getPeriodByUid(mediaPeriodId.periodUid, period) - .isServerSideInsertedAdGroup(mediaPeriodId.nextAdGroupIndex); - } - } } diff --git a/library/core/src/test/java/com/google/android/exoplayer2/MediaPeriodQueueTest.java b/library/core/src/test/java/com/google/android/exoplayer2/MediaPeriodQueueTest.java index fcbeb09658..a59d84abb4 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/MediaPeriodQueueTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/MediaPeriodQueueTest.java @@ -93,6 +93,7 @@ public final class MediaPeriodQueueTest { /* requestedContentPositionUs= */ C.TIME_UNSET, /* endPositionUs= */ C.TIME_UNSET, /* durationUs= */ CONTENT_DURATION_US, + /* isFollowedByTransitionToSameStream= */ false, /* isLastInPeriod= */ true, /* isLastInWindow= */ true, /* nextAdGroupIndex= */ C.INDEX_UNSET); @@ -103,7 +104,10 @@ public final class MediaPeriodQueueTest { setupAdTimeline(/* adGroupTimesUs...= */ 0); setAdGroupLoaded(/* adGroupIndex= */ 0); assertNextMediaPeriodInfoIsAd( - /* adGroupIndex= */ 0, AD_DURATION_US, /* contentPositionUs= */ C.TIME_UNSET); + /* adGroupIndex= */ 0, + AD_DURATION_US, + /* contentPositionUs= */ C.TIME_UNSET, + /* isFollowedByTransitionToSameStream= */ false); advance(); assertGetNextMediaPeriodInfoReturnsContentMediaPeriod( /* periodUid= */ firstPeriodUid, @@ -111,6 +115,7 @@ public final class MediaPeriodQueueTest { /* requestedContentPositionUs= */ C.TIME_UNSET, /* endPositionUs= */ C.TIME_UNSET, /* durationUs= */ CONTENT_DURATION_US, + /* isFollowedByTransitionToSameStream= */ false, /* isLastInPeriod= */ true, /* isLastInWindow= */ true, /* nextAdGroupIndex= */ C.INDEX_UNSET); @@ -125,6 +130,7 @@ public final class MediaPeriodQueueTest { /* requestedContentPositionUs= */ C.TIME_UNSET, /* endPositionUs= */ FIRST_AD_START_TIME_US, /* durationUs= */ FIRST_AD_START_TIME_US, + /* isFollowedByTransitionToSameStream= */ false, /* isLastInPeriod= */ false, /* isLastInWindow= */ false, /* nextAdGroupIndex= */ 0); @@ -132,10 +138,14 @@ public final class MediaPeriodQueueTest { assertNextMediaPeriodInfoIsAd( /* adGroupIndex= */ 0, /* adDurationUs= */ C.TIME_UNSET, - /* contentPositionUs= */ FIRST_AD_START_TIME_US); + /* contentPositionUs= */ FIRST_AD_START_TIME_US, + /* isFollowedByTransitionToSameStream= */ false); setAdGroupLoaded(/* adGroupIndex= */ 0); assertNextMediaPeriodInfoIsAd( - /* adGroupIndex= */ 0, AD_DURATION_US, /* contentPositionUs= */ FIRST_AD_START_TIME_US); + /* adGroupIndex= */ 0, + AD_DURATION_US, + /* contentPositionUs= */ FIRST_AD_START_TIME_US, + /* isFollowedByTransitionToSameStream= */ false); advance(); assertGetNextMediaPeriodInfoReturnsContentMediaPeriod( /* periodUid= */ firstPeriodUid, @@ -143,13 +153,17 @@ public final class MediaPeriodQueueTest { /* requestedContentPositionUs= */ FIRST_AD_START_TIME_US, /* endPositionUs= */ SECOND_AD_START_TIME_US, /* durationUs= */ SECOND_AD_START_TIME_US, + /* isFollowedByTransitionToSameStream= */ false, /* isLastInPeriod= */ false, /* isLastInWindow= */ false, /* nextAdGroupIndex= */ 1); advance(); setAdGroupLoaded(/* adGroupIndex= */ 1); assertNextMediaPeriodInfoIsAd( - /* adGroupIndex= */ 1, AD_DURATION_US, /* contentPositionUs= */ SECOND_AD_START_TIME_US); + /* adGroupIndex= */ 1, + AD_DURATION_US, + /* contentPositionUs= */ SECOND_AD_START_TIME_US, + /* isFollowedByTransitionToSameStream= */ false); advance(); assertGetNextMediaPeriodInfoReturnsContentMediaPeriod( /* periodUid= */ firstPeriodUid, @@ -157,6 +171,7 @@ public final class MediaPeriodQueueTest { /* requestedContentPositionUs= */ SECOND_AD_START_TIME_US, /* endPositionUs= */ C.TIME_UNSET, /* durationUs= */ CONTENT_DURATION_US, + /* isFollowedByTransitionToSameStream= */ false, /* isLastInPeriod= */ true, /* isLastInWindow= */ true, /* nextAdGroupIndex= */ C.INDEX_UNSET); @@ -171,13 +186,17 @@ public final class MediaPeriodQueueTest { /* requestedContentPositionUs= */ C.TIME_UNSET, /* endPositionUs= */ FIRST_AD_START_TIME_US, /* durationUs= */ FIRST_AD_START_TIME_US, + /* isFollowedByTransitionToSameStream= */ false, /* isLastInPeriod= */ false, /* isLastInWindow= */ false, /* nextAdGroupIndex= */ 0); advance(); setAdGroupLoaded(/* adGroupIndex= */ 0); assertNextMediaPeriodInfoIsAd( - /* adGroupIndex= */ 0, AD_DURATION_US, /* contentPositionUs= */ FIRST_AD_START_TIME_US); + /* adGroupIndex= */ 0, + AD_DURATION_US, + /* contentPositionUs= */ FIRST_AD_START_TIME_US, + /* isFollowedByTransitionToSameStream= */ false); advance(); assertGetNextMediaPeriodInfoReturnsContentMediaPeriod( /* periodUid= */ firstPeriodUid, @@ -185,13 +204,17 @@ public final class MediaPeriodQueueTest { /* requestedContentPositionUs= */ FIRST_AD_START_TIME_US, /* endPositionUs= */ C.TIME_END_OF_SOURCE, /* durationUs= */ CONTENT_DURATION_US, + /* isFollowedByTransitionToSameStream= */ false, /* isLastInPeriod= */ false, /* isLastInWindow= */ false, /* nextAdGroupIndex= */ 1); advance(); setAdGroupLoaded(/* adGroupIndex= */ 1); assertNextMediaPeriodInfoIsAd( - /* adGroupIndex= */ 1, AD_DURATION_US, /* contentPositionUs= */ CONTENT_DURATION_US); + /* adGroupIndex= */ 1, + AD_DURATION_US, + /* contentPositionUs= */ CONTENT_DURATION_US, + /* isFollowedByTransitionToSameStream= */ false); advance(); assertGetNextMediaPeriodInfoReturnsContentMediaPeriod( /* periodUid= */ firstPeriodUid, @@ -199,6 +222,7 @@ public final class MediaPeriodQueueTest { /* requestedContentPositionUs= */ CONTENT_DURATION_US, /* endPositionUs= */ C.TIME_UNSET, /* durationUs= */ CONTENT_DURATION_US, + /* isFollowedByTransitionToSameStream= */ false, /* isLastInPeriod= */ true, /* isLastInWindow= */ true, /* nextAdGroupIndex= */ C.INDEX_UNSET); @@ -222,7 +246,10 @@ public final class MediaPeriodQueueTest { setAdGroupLoaded(/* adGroupIndex= */ 0); assertNextMediaPeriodInfoIsAd( - /* adGroupIndex= */ 0, AD_DURATION_US, /* contentPositionUs= */ C.TIME_UNSET); + /* adGroupIndex= */ 0, + AD_DURATION_US, + /* contentPositionUs= */ C.TIME_UNSET, + /* isFollowedByTransitionToSameStream= */ false); advance(); assertGetNextMediaPeriodInfoReturnsContentMediaPeriod( /* periodUid= */ firstPeriodUid, @@ -230,13 +257,17 @@ public final class MediaPeriodQueueTest { /* requestedContentPositionUs= */ C.TIME_UNSET, /* endPositionUs= */ FIRST_AD_START_TIME_US, /* durationUs= */ FIRST_AD_START_TIME_US, + /* isFollowedByTransitionToSameStream= */ false, /* isLastInPeriod= */ false, /* isLastInWindow= */ false, /* nextAdGroupIndex= */ 1); advance(); setAdGroupLoaded(/* adGroupIndex= */ 1); assertNextMediaPeriodInfoIsAd( - /* adGroupIndex= */ 1, AD_DURATION_US, /* contentPositionUs= */ FIRST_AD_START_TIME_US); + /* adGroupIndex= */ 1, + AD_DURATION_US, + /* contentPositionUs= */ FIRST_AD_START_TIME_US, + /* isFollowedByTransitionToSameStream= */ false); advance(); assertGetNextMediaPeriodInfoReturnsContentMediaPeriod( /* periodUid= */ firstPeriodUid, @@ -244,13 +275,17 @@ public final class MediaPeriodQueueTest { /* requestedContentPositionUs= */ FIRST_AD_START_TIME_US, /* endPositionUs= */ C.TIME_END_OF_SOURCE, /* durationUs= */ CONTENT_DURATION_US, + /* isFollowedByTransitionToSameStream= */ false, /* isLastInPeriod= */ false, /* isLastInWindow= */ false, /* nextAdGroupIndex= */ 2); advance(); setAdGroupLoaded(/* adGroupIndex= */ 2); assertNextMediaPeriodInfoIsAd( - /* adGroupIndex= */ 2, AD_DURATION_US, /* contentPositionUs= */ CONTENT_DURATION_US); + /* adGroupIndex= */ 2, + AD_DURATION_US, + /* contentPositionUs= */ CONTENT_DURATION_US, + /* isFollowedByTransitionToSameStream= */ false); advance(); assertGetNextMediaPeriodInfoReturnsContentMediaPeriod( /* periodUid= */ firstPeriodUid, @@ -258,6 +293,78 @@ public final class MediaPeriodQueueTest { /* requestedContentPositionUs= */ CONTENT_DURATION_US, /* endPositionUs= */ C.TIME_UNSET, /* durationUs= */ CONTENT_DURATION_US, + /* isFollowedByTransitionToSameStream= */ false, + /* isLastInPeriod= */ true, + /* isLastInWindow= */ true, + /* nextAdGroupIndex= */ C.INDEX_UNSET); + } + + @Test + public void getNextMediaPeriodInfo_withServerSideInsertedAds_returnsCorrectMediaPeriodInfos() { + adPlaybackState = + new AdPlaybackState( + /* adsId= */ new Object(), + /* adGroupTimesUs...= */ 0, + FIRST_AD_START_TIME_US, + SECOND_AD_START_TIME_US) + .withContentDurationUs(CONTENT_DURATION_US) + .withIsServerSideInserted(/* adGroupIndex= */ 0, /* isServerSideInserted= */ true) + .withIsServerSideInserted(/* adGroupIndex= */ 1, /* isServerSideInserted= */ true) + .withIsServerSideInserted(/* adGroupIndex= */ 2, /* isServerSideInserted= */ true); + SinglePeriodAdTimeline adTimeline = + new SinglePeriodAdTimeline(CONTENT_TIMELINE, adPlaybackState); + setupTimeline(adTimeline); + + setAdGroupLoaded(/* adGroupIndex= */ 0); + assertNextMediaPeriodInfoIsAd( + /* adGroupIndex= */ 0, + AD_DURATION_US, + /* contentPositionUs= */ C.TIME_UNSET, + /* isFollowedByTransitionToSameStream= */ true); + advance(); + assertGetNextMediaPeriodInfoReturnsContentMediaPeriod( + /* periodUid= */ firstPeriodUid, + /* startPositionUs= */ 0, + /* requestedContentPositionUs= */ C.TIME_UNSET, + /* endPositionUs= */ FIRST_AD_START_TIME_US, + /* durationUs= */ FIRST_AD_START_TIME_US, + /* isFollowedByTransitionToSameStream= */ true, + /* isLastInPeriod= */ false, + /* isLastInWindow= */ false, + /* nextAdGroupIndex= */ 1); + advance(); + setAdGroupLoaded(/* adGroupIndex= */ 1); + assertNextMediaPeriodInfoIsAd( + /* adGroupIndex= */ 1, + AD_DURATION_US, + /* contentPositionUs= */ FIRST_AD_START_TIME_US, + /* isFollowedByTransitionToSameStream= */ true); + advance(); + assertGetNextMediaPeriodInfoReturnsContentMediaPeriod( + /* periodUid= */ firstPeriodUid, + /* startPositionUs= */ FIRST_AD_START_TIME_US, + /* requestedContentPositionUs= */ FIRST_AD_START_TIME_US, + /* endPositionUs= */ SECOND_AD_START_TIME_US, + /* durationUs= */ SECOND_AD_START_TIME_US, + /* isFollowedByTransitionToSameStream= */ true, + /* isLastInPeriod= */ false, + /* isLastInWindow= */ false, + /* nextAdGroupIndex= */ 2); + advance(); + setAdGroupLoaded(/* adGroupIndex= */ 2); + assertNextMediaPeriodInfoIsAd( + /* adGroupIndex= */ 2, + AD_DURATION_US, + /* contentPositionUs= */ SECOND_AD_START_TIME_US, + /* isFollowedByTransitionToSameStream= */ true); + advance(); + assertGetNextMediaPeriodInfoReturnsContentMediaPeriod( + /* periodUid= */ firstPeriodUid, + /* startPositionUs= */ SECOND_AD_START_TIME_US, + /* requestedContentPositionUs= */ SECOND_AD_START_TIME_US, + /* endPositionUs= */ C.TIME_UNSET, + /* durationUs= */ CONTENT_DURATION_US, + /* isFollowedByTransitionToSameStream= */ false, /* isLastInPeriod= */ true, /* isLastInWindow= */ true, /* nextAdGroupIndex= */ C.INDEX_UNSET); @@ -272,6 +379,7 @@ public final class MediaPeriodQueueTest { /* requestedContentPositionUs= */ C.TIME_UNSET, /* endPositionUs= */ C.TIME_END_OF_SOURCE, /* durationUs= */ CONTENT_DURATION_US, + /* isFollowedByTransitionToSameStream= */ false, /* isLastInPeriod= */ false, /* isLastInWindow= */ false, /* nextAdGroupIndex= */ 0); @@ -283,6 +391,7 @@ public final class MediaPeriodQueueTest { /* requestedContentPositionUs= */ CONTENT_DURATION_US, /* endPositionUs= */ C.TIME_UNSET, /* durationUs= */ CONTENT_DURATION_US, + /* isFollowedByTransitionToSameStream= */ false, /* isLastInPeriod= */ true, /* isLastInWindow= */ true, /* nextAdGroupIndex= */ C.INDEX_UNSET); @@ -295,7 +404,10 @@ public final class MediaPeriodQueueTest { setAdGroupLoaded(/* adGroupIndex= */ 1); setAdGroupLoaded(/* adGroupIndex= */ 2); assertNextMediaPeriodInfoIsAd( - /* adGroupIndex= */ 0, AD_DURATION_US, /* contentPositionUs= */ C.TIME_UNSET); + /* adGroupIndex= */ 0, + AD_DURATION_US, + /* contentPositionUs= */ C.TIME_UNSET, + /* isFollowedByTransitionToSameStream= */ false); setAdGroupPlayed(/* adGroupIndex= */ 0); clear(); assertGetNextMediaPeriodInfoReturnsContentMediaPeriod( @@ -304,6 +416,7 @@ public final class MediaPeriodQueueTest { /* requestedContentPositionUs= */ C.TIME_UNSET, /* endPositionUs= */ FIRST_AD_START_TIME_US, /* durationUs= */ FIRST_AD_START_TIME_US, + /* isFollowedByTransitionToSameStream= */ false, /* isLastInPeriod= */ false, /* isLastInWindow= */ false, /* nextAdGroupIndex= */ 1); @@ -315,6 +428,7 @@ public final class MediaPeriodQueueTest { /* requestedContentPositionUs= */ C.TIME_UNSET, /* endPositionUs= */ C.TIME_END_OF_SOURCE, /* durationUs= */ CONTENT_DURATION_US, + /* isFollowedByTransitionToSameStream= */ false, /* isLastInPeriod= */ false, /* isLastInWindow= */ false, /* nextAdGroupIndex= */ 2); @@ -326,6 +440,7 @@ public final class MediaPeriodQueueTest { /* requestedContentPositionUs= */ C.TIME_UNSET, /* endPositionUs= */ C.TIME_UNSET, /* durationUs= */ CONTENT_DURATION_US, + /* isFollowedByTransitionToSameStream= */ false, /* isLastInPeriod= */ true, /* isLastInWindow= */ true, /* nextAdGroupIndex= */ C.INDEX_UNSET); @@ -349,6 +464,7 @@ public final class MediaPeriodQueueTest { /* endPositionUs= */ C.TIME_UNSET, /* durationUs= */ CONTENT_DURATION_US + TimelineWindowDefinition.DEFAULT_WINDOW_OFFSET_IN_FIRST_PERIOD_US, + /* isFollowedByTransitionToSameStream= */ false, /* isLastInPeriod= */ true, /* isLastInWindow= */ false, /* nextAdGroupIndex= */ C.INDEX_UNSET); @@ -359,6 +475,7 @@ public final class MediaPeriodQueueTest { /* requestedContentPositionUs= */ 0, /* endPositionUs= */ C.TIME_UNSET, /* durationUs= */ CONTENT_DURATION_US, + /* isFollowedByTransitionToSameStream= */ false, /* isLastInPeriod= */ true, /* isLastInWindow= */ true, /* nextAdGroupIndex= */ C.INDEX_UNSET); @@ -727,6 +844,7 @@ public final class MediaPeriodQueueTest { long requestedContentPositionUs, long endPositionUs, long durationUs, + boolean isFollowedByTransitionToSameStream, boolean isLastInPeriod, boolean isLastInWindow, int nextAdGroupIndex) { @@ -738,13 +856,17 @@ public final class MediaPeriodQueueTest { requestedContentPositionUs, endPositionUs, durationUs, + isFollowedByTransitionToSameStream, isLastInPeriod, isLastInWindow, /* isFinal= */ isLastInWindow)); } private void assertNextMediaPeriodInfoIsAd( - int adGroupIndex, long adDurationUs, long contentPositionUs) { + int adGroupIndex, + long adDurationUs, + long contentPositionUs, + boolean isFollowedByTransitionToSameStream) { assertThat(getNextMediaPeriodInfo()) .isEqualTo( new MediaPeriodInfo( @@ -757,6 +879,7 @@ public final class MediaPeriodQueueTest { contentPositionUs, /* endPositionUs= */ C.TIME_UNSET, adDurationUs, + isFollowedByTransitionToSameStream, /* isLastInTimelinePeriod= */ false, /* isLastInTimelineWindow= */ false, /* isFinal= */ false));