From c0a8b944a6dacec9a2606aba912d07ec3df9b31c Mon Sep 17 00:00:00 2001 From: bachinger Date: Wed, 8 Mar 2023 19:27:39 +0000 Subject: [PATCH] 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 --- RELEASENOTES.md | 3 +++ .../ima/ImaServerSideAdInsertionMediaSource.java | 12 +++++++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 3d6f16349c..fcf2c5fc46 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -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. diff --git a/libraries/exoplayer_ima/src/main/java/androidx/media3/exoplayer/ima/ImaServerSideAdInsertionMediaSource.java b/libraries/exoplayer_ima/src/main/java/androidx/media3/exoplayer/ima/ImaServerSideAdInsertionMediaSource.java index 13d3209098..d418768885 100644 --- a/libraries/exoplayer_ima/src/main/java/androidx/media3/exoplayer/ima/ImaServerSideAdInsertionMediaSource.java +++ b/libraries/exoplayer_ima/src/main/java/androidx/media3/exoplayer/ima/ImaServerSideAdInsertionMediaSource.java @@ -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()),