diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 09d72bfc2e..d6eba89c0e 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -2981,6 +2981,10 @@ This release corresponds to the * Ad playback / IMA: * Decrease ad polling rate from every 100ms to every 200ms, to line up with Media Rating Council (MRC) recommendations. + * Fix bug where ad groups after the end of a VOD window stalled playback. + Ads groups with a start time after the window are not enqueued into the + `MediaPeriodQueue` anymore + ([#2215](https://github.com/androidx/media/issues/2215)). * FFmpeg extension: * Update CMake version to `3.21.0+` to avoid a CMake bug causing AndroidStudio's gradle sync to fail diff --git a/libraries/common/src/main/java/androidx/media3/common/AdPlaybackState.java b/libraries/common/src/main/java/androidx/media3/common/AdPlaybackState.java index fb5f9b02a4..53a5912830 100644 --- a/libraries/common/src/main/java/androidx/media3/common/AdPlaybackState.java +++ b/libraries/common/src/main/java/androidx/media3/common/AdPlaybackState.java @@ -865,7 +865,10 @@ public final class AdPlaybackState { || !getAdGroup(index).shouldPlayAdGroup())) { index++; } - return index < adGroupCount ? index : C.INDEX_UNSET; + return index < adGroupCount + && (periodDurationUs == C.TIME_UNSET || getAdGroup(index).timeUs <= periodDurationUs) + ? index + : C.INDEX_UNSET; } /** Returns whether the specified ad has been marked as in {@link #AD_STATE_ERROR}. */ diff --git a/libraries/common/src/test/java/androidx/media3/common/AdPlaybackStateTest.java b/libraries/common/src/test/java/androidx/media3/common/AdPlaybackStateTest.java index b31972fb55..1234b98a5d 100644 --- a/libraries/common/src/test/java/androidx/media3/common/AdPlaybackStateTest.java +++ b/libraries/common/src/test/java/androidx/media3/common/AdPlaybackStateTest.java @@ -856,6 +856,10 @@ public class AdPlaybackStateTest { state.getAdGroupIndexAfterPositionUs( /* positionUs= */ C.TIME_END_OF_SOURCE, /* periodDurationUs= */ 5000)) .isEqualTo(C.INDEX_UNSET); + assertThat( + state.getAdGroupIndexAfterPositionUs( + /* positionUs= */ 1001, /* periodDurationUs= */ 1002)) + .isEqualTo(C.INDEX_UNSET); } @Test diff --git a/libraries/exoplayer_ima/src/main/java/androidx/media3/exoplayer/ima/AdTagLoader.java b/libraries/exoplayer_ima/src/main/java/androidx/media3/exoplayer/ima/AdTagLoader.java index a9756d044d..b1e03fc159 100644 --- a/libraries/exoplayer_ima/src/main/java/androidx/media3/exoplayer/ima/AdTagLoader.java +++ b/libraries/exoplayer_ima/src/main/java/androidx/media3/exoplayer/ima/AdTagLoader.java @@ -868,7 +868,7 @@ import java.util.Objects; } if (imaAdState == IMA_AD_STATE_NONE - && playbackState == Player.STATE_BUFFERING + && (playbackState == Player.STATE_BUFFERING || playbackState == Player.STATE_ENDED) && playWhenReady) { ensureSentContentCompleteIfAtEndOfStream(); } else if (imaAdState != IMA_AD_STATE_NONE && playbackState == Player.STATE_ENDED) {