mirror of
https://github.com/samsonjs/media.git
synced 2026-03-26 09:35:47 +00:00
Avoid recalculation of whether a MediaPeriod is part of a SSAI stream
We can instead just save this information in MediaPeriodInfo, similar to how we store whether the MediaPeriod is last in the timeline etc. PiperOrigin-RevId: 374835918
This commit is contained in:
parent
0de6bc861a
commit
5ff4211c5e
3 changed files with 165 additions and 28 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
Loading…
Reference in a new issue