From fdcee8f1b6a13dc22972ae3cc28279edcebdc219 Mon Sep 17 00:00:00 2001 From: andrewlewis Date: Thu, 13 Jul 2017 08:03:45 +0100 Subject: [PATCH] Fix detection of postroll when seeking to duration Also mark all ads as played when the postroll plays, in the case the player is backgrounded then resumed and the user seeks back. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=164262738 --- .../exoplayer2/ext/ima/ImaAdsLoader.java | 28 +++++++++++++------ .../ext/ima/SinglePeriodAdTimeline.java | 2 +- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.java b/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.java index 6541dad0ac..c00e0731ee 100644 --- a/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.java +++ b/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.java @@ -572,15 +572,25 @@ public final class ImaAdsLoader implements Player.EventListener, VideoAdPlayer, return; } if (!playingAd && !player.isPlayingAd()) { - long positionUs = C.msToUs(player.getCurrentPosition()); - int adGroupIndex = timeline.getPeriod(0, period).getAdGroupIndexForPositionUs(positionUs); - if (adGroupIndex != C.INDEX_UNSET) { - sentPendingContentPositionMs = false; - pendingContentPositionMs = player.getCurrentPosition(); + checkForContentComplete(); + if (sentContentComplete) { + for (int i = 0; i < adPlaybackState.adGroupCount; i++) { + if (adPlaybackState.adGroupTimesUs[i] != C.TIME_END_OF_SOURCE) { + adPlaybackState.playedAdGroup(i); + } + } + updateAdPlaybackState(); + } else { + long positionMs = player.getCurrentPosition(); + timeline.getPeriod(0, period); + if (period.getAdGroupIndexForPositionUs(C.msToUs(positionMs)) != C.INDEX_UNSET) { + sentPendingContentPositionMs = false; + pendingContentPositionMs = positionMs; + } } - return; + } else { + updateImaStateForPlayerState(); } - updateImaStateForPlayerState(); } @Override @@ -672,8 +682,8 @@ public final class ImaAdsLoader implements Player.EventListener, VideoAdPlayer, } private void checkForContentComplete() { - if (contentDurationMs != C.TIME_UNSET - && player.getCurrentPosition() + END_OF_CONTENT_POSITION_THRESHOLD_MS >= contentDurationMs + if (contentDurationMs != C.TIME_UNSET && pendingContentPositionMs == C.TIME_UNSET + && player.getContentPosition() + END_OF_CONTENT_POSITION_THRESHOLD_MS >= contentDurationMs && !sentContentComplete) { adsLoader.contentComplete(); if (DEBUG) { diff --git a/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/SinglePeriodAdTimeline.java b/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/SinglePeriodAdTimeline.java index c93f1e8f28..1d73234286 100644 --- a/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/SinglePeriodAdTimeline.java +++ b/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/SinglePeriodAdTimeline.java @@ -22,7 +22,7 @@ import com.google.android.exoplayer2.util.Assertions; /** * A {@link Timeline} for sources that have ads. */ -public final class SinglePeriodAdTimeline extends Timeline { +/* package */ final class SinglePeriodAdTimeline extends Timeline { private final Timeline contentTimeline; private final long[] adGroupTimesUs;