Commit 5ff4211c by tonihei Committed by Oliver Woodman

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
parent 0de6bc86
...@@ -18,6 +18,7 @@ package com.google.android.exoplayer2; ...@@ -18,6 +18,7 @@ package com.google.android.exoplayer2;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.google.android.exoplayer2.source.MediaPeriod; import com.google.android.exoplayer2.source.MediaPeriod;
import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId; import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId;
import com.google.android.exoplayer2.util.Assertions;
import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.util.Util;
/** Stores the information required to load and play a {@link MediaPeriod}. */ /** Stores the information required to load and play a {@link MediaPeriod}. */
...@@ -49,6 +50,12 @@ import com.google.android.exoplayer2.util.Util; ...@@ -49,6 +50,12 @@ import com.google.android.exoplayer2.util.Util;
*/ */
public final long durationUs; 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 * 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). * period corresponding to a timeline period without ads).
*/ */
...@@ -67,14 +74,21 @@ import com.google.android.exoplayer2.util.Util; ...@@ -67,14 +74,21 @@ import com.google.android.exoplayer2.util.Util;
long requestedContentPositionUs, long requestedContentPositionUs,
long endPositionUs, long endPositionUs,
long durationUs, long durationUs,
boolean isFollowedByTransitionToSameStream,
boolean isLastInTimelinePeriod, boolean isLastInTimelinePeriod,
boolean isLastInTimelineWindow, boolean isLastInTimelineWindow,
boolean isFinal) { boolean isFinal) {
Assertions.checkArgument(!isFinal || isLastInTimelinePeriod);
Assertions.checkArgument(!isLastInTimelineWindow || isLastInTimelinePeriod);
Assertions.checkArgument(
!isFollowedByTransitionToSameStream
|| (!isLastInTimelinePeriod && !isLastInTimelineWindow && !isFinal));
this.id = id; this.id = id;
this.startPositionUs = startPositionUs; this.startPositionUs = startPositionUs;
this.requestedContentPositionUs = requestedContentPositionUs; this.requestedContentPositionUs = requestedContentPositionUs;
this.endPositionUs = endPositionUs; this.endPositionUs = endPositionUs;
this.durationUs = durationUs; this.durationUs = durationUs;
this.isFollowedByTransitionToSameStream = isFollowedByTransitionToSameStream;
this.isLastInTimelinePeriod = isLastInTimelinePeriod; this.isLastInTimelinePeriod = isLastInTimelinePeriod;
this.isLastInTimelineWindow = isLastInTimelineWindow; this.isLastInTimelineWindow = isLastInTimelineWindow;
this.isFinal = isFinal; this.isFinal = isFinal;
...@@ -93,6 +107,7 @@ import com.google.android.exoplayer2.util.Util; ...@@ -93,6 +107,7 @@ import com.google.android.exoplayer2.util.Util;
requestedContentPositionUs, requestedContentPositionUs,
endPositionUs, endPositionUs,
durationUs, durationUs,
isFollowedByTransitionToSameStream,
isLastInTimelinePeriod, isLastInTimelinePeriod,
isLastInTimelineWindow, isLastInTimelineWindow,
isFinal); isFinal);
...@@ -111,6 +126,7 @@ import com.google.android.exoplayer2.util.Util; ...@@ -111,6 +126,7 @@ import com.google.android.exoplayer2.util.Util;
requestedContentPositionUs, requestedContentPositionUs,
endPositionUs, endPositionUs,
durationUs, durationUs,
isFollowedByTransitionToSameStream,
isLastInTimelinePeriod, isLastInTimelinePeriod,
isLastInTimelineWindow, isLastInTimelineWindow,
isFinal); isFinal);
...@@ -129,6 +145,7 @@ import com.google.android.exoplayer2.util.Util; ...@@ -129,6 +145,7 @@ import com.google.android.exoplayer2.util.Util;
&& requestedContentPositionUs == that.requestedContentPositionUs && requestedContentPositionUs == that.requestedContentPositionUs
&& endPositionUs == that.endPositionUs && endPositionUs == that.endPositionUs
&& durationUs == that.durationUs && durationUs == that.durationUs
&& isFollowedByTransitionToSameStream == that.isFollowedByTransitionToSameStream
&& isLastInTimelinePeriod == that.isLastInTimelinePeriod && isLastInTimelinePeriod == that.isLastInTimelinePeriod
&& isLastInTimelineWindow == that.isLastInTimelineWindow && isLastInTimelineWindow == that.isLastInTimelineWindow
&& isFinal == that.isFinal && isFinal == that.isFinal
...@@ -143,6 +160,7 @@ import com.google.android.exoplayer2.util.Util; ...@@ -143,6 +160,7 @@ import com.google.android.exoplayer2.util.Util;
result = 31 * result + (int) requestedContentPositionUs; result = 31 * result + (int) requestedContentPositionUs;
result = 31 * result + (int) endPositionUs; result = 31 * result + (int) endPositionUs;
result = 31 * result + (int) durationUs; result = 31 * result + (int) durationUs;
result = 31 * result + (isFollowedByTransitionToSameStream ? 1 : 0);
result = 31 * result + (isLastInTimelinePeriod ? 1 : 0); result = 31 * result + (isLastInTimelinePeriod ? 1 : 0);
result = 31 * result + (isLastInTimelineWindow ? 1 : 0); result = 31 * result + (isLastInTimelineWindow ? 1 : 0);
result = 31 * result + (isFinal ? 1 : 0); result = 31 * result + (isFinal ? 1 : 0);
......
...@@ -358,7 +358,7 @@ import com.google.common.collect.ImmutableList; ...@@ -358,7 +358,7 @@ import com.google.common.collect.ImmutableList;
: periodHolder.toRendererTime(newPeriodInfo.durationUs); : periodHolder.toRendererTime(newPeriodInfo.durationUs);
boolean isReadingAndReadBeyondNewDuration = boolean isReadingAndReadBeyondNewDuration =
periodHolder == reading periodHolder == reading
&& !isUsingSameStreamForNextMediaPeriod(timeline, periodHolder.info.id) && !periodHolder.info.isFollowedByTransitionToSameStream
&& (maxRendererReadPositionUs == C.TIME_END_OF_SOURCE && (maxRendererReadPositionUs == C.TIME_END_OF_SOURCE
|| maxRendererReadPositionUs >= newDurationInRendererTime); || maxRendererReadPositionUs >= newDurationInRendererTime);
boolean readingPeriodRemoved = removeAfter(periodHolder); boolean readingPeriodRemoved = removeAfter(periodHolder);
...@@ -396,12 +396,18 @@ import com.google.common.collect.ImmutableList; ...@@ -396,12 +396,18 @@ import com.google.common.collect.ImmutableList;
: (endPositionUs == C.TIME_UNSET || endPositionUs == C.TIME_END_OF_SOURCE : (endPositionUs == C.TIME_UNSET || endPositionUs == C.TIME_END_OF_SOURCE
? period.getDurationUs() ? period.getDurationUs()
: endPositionUs); : endPositionUs);
boolean isFollowedByTransitionToSameStream =
id.isAd()
? period.isServerSideInsertedAdGroup(id.adGroupIndex)
: (id.nextAdGroupIndex != C.INDEX_UNSET
&& period.isServerSideInsertedAdGroup(id.nextAdGroupIndex));
return new MediaPeriodInfo( return new MediaPeriodInfo(
id, id,
info.startPositionUs, info.startPositionUs,
info.requestedContentPositionUs, info.requestedContentPositionUs,
endPositionUs, endPositionUs,
durationUs, durationUs,
isFollowedByTransitionToSameStream,
isLastInPeriod, isLastInPeriod,
isLastInWindow, isLastInWindow,
isLastInTimeline); isLastInTimeline);
...@@ -778,6 +784,8 @@ import com.google.common.collect.ImmutableList; ...@@ -778,6 +784,8 @@ import com.google.common.collect.ImmutableList;
adIndexInAdGroup == period.getFirstAdIndexToPlay(adGroupIndex) adIndexInAdGroup == period.getFirstAdIndexToPlay(adGroupIndex)
? period.getAdResumePositionUs() ? period.getAdResumePositionUs()
: 0; : 0;
boolean isFollowedByTransitionToSameStream =
period.isServerSideInsertedAdGroup(id.adGroupIndex);
if (durationUs != C.TIME_UNSET && startPositionUs >= durationUs) { if (durationUs != C.TIME_UNSET && startPositionUs >= durationUs) {
// Ensure start position doesn't exceed duration. // Ensure start position doesn't exceed duration.
startPositionUs = max(0, durationUs - 1); startPositionUs = max(0, durationUs - 1);
...@@ -788,6 +796,7 @@ import com.google.common.collect.ImmutableList; ...@@ -788,6 +796,7 @@ import com.google.common.collect.ImmutableList;
contentPositionUs, contentPositionUs,
/* endPositionUs= */ C.TIME_UNSET, /* endPositionUs= */ C.TIME_UNSET,
durationUs, durationUs,
isFollowedByTransitionToSameStream,
/* isLastInTimelinePeriod= */ false, /* isLastInTimelinePeriod= */ false,
/* isLastInTimelineWindow= */ false, /* isLastInTimelineWindow= */ false,
/* isFinal= */ false); /* isFinal= */ false);
...@@ -805,6 +814,8 @@ import com.google.common.collect.ImmutableList; ...@@ -805,6 +814,8 @@ import com.google.common.collect.ImmutableList;
boolean isLastInPeriod = isLastInPeriod(id); boolean isLastInPeriod = isLastInPeriod(id);
boolean isLastInWindow = isLastInWindow(timeline, id); boolean isLastInWindow = isLastInWindow(timeline, id);
boolean isLastInTimeline = isLastInTimeline(timeline, id, isLastInPeriod); boolean isLastInTimeline = isLastInTimeline(timeline, id, isLastInPeriod);
boolean isFollowedByTransitionToSameStream =
nextAdGroupIndex != C.INDEX_UNSET && period.isServerSideInsertedAdGroup(nextAdGroupIndex);
long endPositionUs = long endPositionUs =
nextAdGroupIndex != C.INDEX_UNSET nextAdGroupIndex != C.INDEX_UNSET
? period.getAdGroupTimeUs(nextAdGroupIndex) ? period.getAdGroupTimeUs(nextAdGroupIndex)
...@@ -823,6 +834,7 @@ import com.google.common.collect.ImmutableList; ...@@ -823,6 +834,7 @@ import com.google.common.collect.ImmutableList;
requestedContentPositionUs, requestedContentPositionUs,
endPositionUs, endPositionUs,
durationUs, durationUs,
isFollowedByTransitionToSameStream,
isLastInPeriod, isLastInPeriod,
isLastInWindow, isLastInWindow,
isLastInTimeline); isLastInTimeline);
...@@ -859,20 +871,4 @@ import com.google.common.collect.ImmutableList; ...@@ -859,20 +871,4 @@ import com.google.common.collect.ImmutableList;
} }
return startPositionUs + period.getContentResumeOffsetUs(adGroupIndex); 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);
}
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment