diff --git a/RELEASENOTES.md b/RELEASENOTES.md index b643bacdb28..645fb3a97ad 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -1,5 +1,11 @@ # Release notes # +### 2.8.4 ### + +* IMA: Improve handling of consecutive empty ad groups + ([#4030](https://github.com/google/ExoPlayer/issues/4030)), + ([#4280](https://github.com/google/ExoPlayer/issues/4280)). + ### 2.8.3 ### * IMA: 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 dc2df9eb71c..15847d988a0 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 @@ -619,8 +619,11 @@ public VideoProgressUpdate getContentProgress() { } else if (fakeContentProgressElapsedRealtimeMs != C.TIME_UNSET) { long elapsedSinceEndMs = SystemClock.elapsedRealtime() - fakeContentProgressElapsedRealtimeMs; contentPositionMs = fakeContentProgressOffsetMs + elapsedSinceEndMs; - expectedAdGroupIndex = + int adGroupIndexForPosition = adPlaybackState.getAdGroupIndexForPositionUs(C.msToUs(contentPositionMs)); + if (adGroupIndexForPosition != C.INDEX_UNSET) { + expectedAdGroupIndex = adGroupIndexForPosition; + } } else if (imaAdState == IMA_AD_STATE_NONE && !playingAd && hasContentDuration) { contentPositionMs = player.getCurrentPosition(); // Update the expected ad group index for the current content position. The update is delayed @@ -1096,6 +1099,16 @@ private void handleAdGroupLoadError(Exception error) { if (pendingAdLoadError == null) { pendingAdLoadError = AdLoadException.createForAdGroup(error, adGroupIndex); } + // Discard the ad break, which makes sure we don't receive duplicate load error events. + adsManager.discardAdBreak(); + // Set the next expected ad group index so we can handle multiple load errors in a row. + adGroupIndex++; + if (adGroupIndex < adPlaybackState.adGroupCount) { + expectedAdGroupIndex = adGroupIndex; + } else { + expectedAdGroupIndex = C.INDEX_UNSET; + } + pendingContentPositionMs = C.TIME_UNSET; } private void handleAdPrepareError(int adGroupIndex, int adIndexInAdGroup, Exception exception) {