diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 5e7c988db2b..9e4a6088845 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -97,6 +97,9 @@ ([#4583](https://github.com/google/ExoPlayer/issues/4583)). * Add `DataSpec.httpMethod` and update `HttpDataSource` implementations to support HTTP HEAD method. Previously, only GET and POST were supported. +* 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 ### 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 c7ba8de726c..bf1cdfe02c0 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 @@ -631,8 +631,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 @@ -1124,6 +1127,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) {