diff --git a/RELEASENOTES.md b/RELEASENOTES.md index df570372a5..b089e99ca7 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -85,6 +85,8 @@ ([#3584](https://github.com/google/ExoPlayer/issues/3584)). * Work around loadAd not being called beore the LOADED AdEvent arrives ([#3552](https://github.com/google/ExoPlayer/issues/3552)). + * Handle asset mismatch errors + ([#3801](https://github.com/google/ExoPlayer/issues/3801)). * Add support for playing non-Extractor content MediaSources in the IMA demo app ([#3676](https://github.com/google/ExoPlayer/issues/3676)). 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 d714eed98c..d11bc920e1 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 @@ -25,6 +25,8 @@ import android.view.ViewGroup; import android.webkit.WebView; import com.google.ads.interactivemedia.v3.api.Ad; import com.google.ads.interactivemedia.v3.api.AdDisplayContainer; +import com.google.ads.interactivemedia.v3.api.AdError; +import com.google.ads.interactivemedia.v3.api.AdError.AdErrorCode; import com.google.ads.interactivemedia.v3.api.AdErrorEvent; import com.google.ads.interactivemedia.v3.api.AdErrorEvent.AdErrorListener; import com.google.ads.interactivemedia.v3.api.AdEvent; @@ -580,14 +582,17 @@ public final class ImaAdsLoader extends Player.DefaultEventListener implements A @Override public void onAdError(AdErrorEvent adErrorEvent) { + AdError error = adErrorEvent.getError(); if (DEBUG) { - Log.d(TAG, "onAdError " + adErrorEvent); + Log.d(TAG, "onAdError", error); } if (adsManager == null) { // No ads were loaded, so allow playback to start without any ads. pendingAdRequestContext = null; adPlaybackState = new AdPlaybackState(); updateAdPlaybackState(); + } else if (isAdGroupLoadError(error)) { + handleAdGroupLoadError(); } if (pendingAdErrorEvent == null) { pendingAdErrorEvent = adErrorEvent; @@ -1041,4 +1046,9 @@ public final class ImaAdsLoader extends Player.DefaultEventListener implements A return adGroupTimesUs; } + private static boolean isAdGroupLoadError(AdError adError) { + // TODO: Find out what other errors need to be handled (if any), and whether each one relates to + // a single ad, ad group or the whole timeline. + return adError.getErrorCode() == AdErrorCode.VAST_LINEAR_ASSET_MISMATCH; + } }