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;
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}. */
......@@ -49,6 +50,12 @@ import com.google.android.exoplayer2.util.Util;
*/
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);
}
}
}
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