Skip to content

Commit

Permalink
Use content timeline to get ad group index and ad index in ad group
Browse files Browse the repository at this point in the history
The timeline used to map ad groups to periods needs to report the original content period duration without subtracting the serverside inserted ad duration. When marking played ads in onPositionDiscontinuity, the public timeline has been used which crashed the app when the ads media source is playing on a window index different to zero (in a playlist).

#minor-release

PiperOrigin-RevId: 428465833
  • Loading branch information
marcbaechinger authored and icbaker committed Feb 21, 2022
1 parent e777bed commit 2b817fb
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.checkerframework.checker.nullness.qual.EnsuresNonNull;
import org.checkerframework.checker.nullness.qual.MonotonicNonNull;

/**
Expand Down Expand Up @@ -476,6 +477,7 @@ private void setAdPlaybackState(AdPlaybackState adPlaybackState) {
}

@MainThread
@EnsuresNonNull("contentTimeline")
private void setContentTimeline(Timeline contentTimeline) {
if (contentTimeline.equals(this.contentTimeline)) {
return;
Expand Down Expand Up @@ -640,7 +642,9 @@ public void onPositionDiscontinuity(
// Map adGroupIndex and adIndexInAdGroup to multi-period window.
Pair<Integer, Integer> adGroupIndexAndAdIndexInAdGroup =
getAdGroupAndIndexInMultiPeriodWindow(
oldPosition.periodIndex, adPlaybackState, timeline);
oldPosition.periodIndex - window.firstPeriodIndex,
adPlaybackState,
checkNotNull(contentTimeline));
adGroupIndex = adGroupIndexAndAdIndexInAdGroup.first;
adIndexInAdGroup = adGroupIndexAndAdIndexInAdGroup.second;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -475,11 +475,11 @@ private static AdPlaybackState splitAdGroupForPeriod(
*
* @param adPeriodIndex The period index of the ad period.
* @param adPlaybackState The ad playback state that holds the ad group and ad information.
* @param timeline The timeline that contains the ad period.
* @param contentTimeline The timeline that contains the ad period.
* @return A pair with the ad group index (first) and the ad index in that ad group (second).
*/
public static Pair<Integer, Integer> getAdGroupAndIndexInMultiPeriodWindow(
int adPeriodIndex, AdPlaybackState adPlaybackState, Timeline timeline) {
int adPeriodIndex, AdPlaybackState adPlaybackState, Timeline contentTimeline) {
Timeline.Period period = new Timeline.Period();
int periodIndex = 0;
long totalElapsedContentDurationUs = 0;
Expand All @@ -488,8 +488,8 @@ public static Pair<Integer, Integer> getAdGroupAndIndexInMultiPeriodWindow(
AdPlaybackState.AdGroup adGroup = adPlaybackState.getAdGroup(/* adGroupIndex= */ i);
long adGroupDurationUs = sum(adGroup.durationsUs);
long elapsedAdGroupAdDurationUs = 0;
for (int j = periodIndex; j < timeline.getPeriodCount(); j++) {
timeline.getPeriod(j, period, /* setIds= */ true);
for (int j = periodIndex; j < contentTimeline.getPeriodCount(); j++) {
contentTimeline.getPeriod(j, period, /* setIds= */ true);
// TODO(b/192231683) Remove subtracted US from ad group time when we can upgrade the SDK.
// Subtract one microsecond to work around rounding errors with adGroup.timeUs.
if (totalElapsedContentDurationUs < adGroup.timeUs - 1) {
Expand Down

0 comments on commit 2b817fb

Please sign in to comment.