From e6b9bde1dd8ec7d9148a2c7cebf39ff10294d632 Mon Sep 17 00:00:00 2001 From: bachinger Date: Mon, 3 Apr 2023 17:15:15 +0100 Subject: [PATCH] Use SKIPPED ad status when a playing ad period has been removed PiperOrigin-RevId: 521476767 --- .../ImaServerSideAdInsertionMediaSource.java | 2 +- .../media3/exoplayer/ima/ImaUtil.java | 8 +++++-- .../media3/exoplayer/ima/ImaUtilTest.java | 23 +++++++++---------- 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/libraries/exoplayer_ima/src/main/java/androidx/media3/exoplayer/ima/ImaServerSideAdInsertionMediaSource.java b/libraries/exoplayer_ima/src/main/java/androidx/media3/exoplayer/ima/ImaServerSideAdInsertionMediaSource.java index 1f126a8100..bf318794df 100644 --- a/libraries/exoplayer_ima/src/main/java/androidx/media3/exoplayer/ima/ImaServerSideAdInsertionMediaSource.java +++ b/libraries/exoplayer_ima/src/main/java/androidx/media3/exoplayer/ima/ImaServerSideAdInsertionMediaSource.java @@ -1435,7 +1435,7 @@ public final class ImaServerSideAdInsertionMediaSource extends CompositeMediaSou Timeline timeline = player.getCurrentTimeline(); Timeline.Window window = new Timeline.Window(); Timeline.Period adPeriod = new Timeline.Period(); - // In case all periods are in the live window, we need the correct ad group duration when + // In case all periods are in the live window, we need to correct the ad group duration when // inserting the first ad. Try calculate ad group duration from media structure. long totalAdDurationUs = getAdGroupDurationUsForLiveAdPeriodIndex( diff --git a/libraries/exoplayer_ima/src/main/java/androidx/media3/exoplayer/ima/ImaUtil.java b/libraries/exoplayer_ima/src/main/java/androidx/media3/exoplayer/ima/ImaUtil.java index da06b7dfe2..c32d5d4f9a 100644 --- a/libraries/exoplayer_ima/src/main/java/androidx/media3/exoplayer/ima/ImaUtil.java +++ b/libraries/exoplayer_ima/src/main/java/androidx/media3/exoplayer/ima/ImaUtil.java @@ -737,7 +737,7 @@ import java.util.Set; return adPlaybackState; } if (state == AD_STATE_AVAILABLE || state == AD_STATE_UNAVAILABLE) { - adPlaybackState = adPlaybackState.withPlayedAd(adGroupIndex, /* adIndexInAdGroup= */ i); + adPlaybackState = adPlaybackState.withSkippedAd(adGroupIndex, /* adIndexInAdGroup= */ i); } adGroupDurationUs += adGroup.durationsUs[i]; } @@ -751,7 +751,11 @@ import java.util.Set; long[] newDurationsUs = new long[adGroup.durationsUs.length]; for (int adIndex = 0; adIndex < newDurationsUs.length; adIndex++) { newDurationsUs[adIndex] = preserveDurations ? adGroup.durationsUs[adIndex] : 0; - adPlaybackState = adPlaybackState.withPlayedAd(adGroupIndex, /* adIndexInAdGroup= */ adIndex); + if (adGroup.states[adIndex] == AD_STATE_AVAILABLE + || adGroup.states[adIndex] == AD_STATE_UNAVAILABLE) { + adPlaybackState = + adPlaybackState.withSkippedAd(adGroupIndex, /* adIndexInAdGroup= */ adIndex); + } } return adPlaybackState .withAdDurationsUs(adGroupIndex, newDurationsUs) diff --git a/libraries/exoplayer_ima/src/test/java/androidx/media3/exoplayer/ima/ImaUtilTest.java b/libraries/exoplayer_ima/src/test/java/androidx/media3/exoplayer/ima/ImaUtilTest.java index 3ef2a6bd17..40bb2d4210 100644 --- a/libraries/exoplayer_ima/src/test/java/androidx/media3/exoplayer/ima/ImaUtilTest.java +++ b/libraries/exoplayer_ima/src/test/java/androidx/media3/exoplayer/ima/ImaUtilTest.java @@ -1663,7 +1663,6 @@ public class ImaUtilTest { /* totalAdDurationUs= */ 3 * AD_PERIOD_DURATION_US, /* totalAdsInAdPod= */ 3, adPlaybackState); - AdPlaybackState finalAdPlaybackState = adPlaybackState; assertThat( getAdGroupAndIndexInLiveMultiPeriodTimeline( @@ -2040,7 +2039,7 @@ public class ImaUtilTest { .asList() .containsExactly( AD_STATE_PLAYED, - AD_STATE_PLAYED, + AD_STATE_SKIPPED, AD_STATE_UNAVAILABLE, AD_STATE_UNAVAILABLE, AD_STATE_UNAVAILABLE, @@ -2059,11 +2058,11 @@ public class ImaUtilTest { .asList() .containsExactly( AD_STATE_PLAYED, - AD_STATE_PLAYED, - AD_STATE_PLAYED, - AD_STATE_PLAYED, - AD_STATE_PLAYED, - AD_STATE_PLAYED) + AD_STATE_SKIPPED, + AD_STATE_SKIPPED, + AD_STATE_SKIPPED, + AD_STATE_SKIPPED, + AD_STATE_SKIPPED) .inOrder(); assertThat(adPlaybackState5.getAdGroup(/* adGroupIndex= */ 0).durationsUs) .asList() @@ -2085,11 +2084,11 @@ public class ImaUtilTest { .asList() .containsExactly( AD_STATE_PLAYED, - AD_STATE_PLAYED, - AD_STATE_PLAYED, - AD_STATE_PLAYED, - AD_STATE_PLAYED, - AD_STATE_PLAYED) + AD_STATE_SKIPPED, + AD_STATE_SKIPPED, + AD_STATE_SKIPPED, + AD_STATE_SKIPPED, + AD_STATE_SKIPPED) .inOrder(); assertThat(adPlaybackState6.getAdGroup(/* adGroupIndex= */ 0).durationsUs) .asList()