Use the ad group time as content position while playing an ad

The value returned by `player.getContentPosition()` is calculated
in the timeline based on the position of the first period in the
window. In a single period live stream this position is advanced
when the live window advances on timeline refresh.

This calculation has produced slightly varying values below 1000
us which are likely caused by us/ms truncations for public API
values that we use in the IMASSAIMediaSource.

However, `AdGroup.timeUs` is the (recorded) content position at the
moment when the first ad of the an ad group has been inserted. While
playing an ad, we can always use this value instead of
`getContentPosition()` to not require recalculation.

#minor-release

PiperOrigin-RevId: 515093177
This commit is contained in:
bachinger 2023-03-08 19:27:39 +00:00 committed by tonihei
parent 2dee3bf46c
commit c0a8b944a6
2 changed files with 10 additions and 5 deletions

View File

@ -34,6 +34,9 @@
* DASH:
* Fix handling of empty segment timelines
([#11014](https://github.com/google/ExoPlayer/issues/11014)).
* IMA DAI extension:
* Fix a bug where a new ad group is inserted in live streams because the
calculated content position in consecutive timelines varies slightly.
* Remove deprecated symbols:
* Remove `DefaultAudioSink` constructors, use `DefaultAudioSink.Builder`
instead.

View File

@ -1340,16 +1340,18 @@ public final class ImaServerSideAdInsertionMediaSource extends CompositeMediaSou
}
AdPlaybackState newAdPlaybackState = adPlaybackState;
Timeline timeline = player.getCurrentTimeline();
Timeline.Period currentPeriod = new Timeline.Period();
long positionInWindowUs =
timeline.getPeriod(player.getCurrentPeriodIndex(), new Timeline.Period())
.positionInWindowUs;
long currentContentPeriodPositionUs =
msToUs(player.getContentPosition()) - positionInWindowUs;
timeline.getPeriod(player.getCurrentPeriodIndex(), currentPeriod).positionInWindowUs;
long contentPositionUs =
player.isPlayingAd()
? currentPeriod.getAdGroupTimeUs(player.getCurrentAdGroupIndex())
: msToUs(player.getContentPosition());
Ad ad = event.getAd();
AdPodInfo adPodInfo = ad.getAdPodInfo();
newAdPlaybackState =
addLiveAdBreak(
currentContentPeriodPositionUs,
/* currentContentPeriodPositionUs= */ contentPositionUs - positionInWindowUs,
/* adDurationUs= */ secToUsRounded(ad.getDuration()),
/* adPositionInAdPod= */ adPodInfo.getAdPosition(),
/* totalAdDurationUs= */ secToUsRounded(adPodInfo.getMaxDuration()),