From de3708ee1272622dd0674bad6788e80d047bc393 Mon Sep 17 00:00:00 2001 From: bachinger Date: Tue, 15 Feb 2022 12:12:34 +0000 Subject: [PATCH] Prevent adding multiple IMA SSAI media source instances to the playlist Currently only a single instance of ImaServerSideAdInsertionMediaSource is supported at the same time in a playlist. This change makes sure that an attempt to add multiple instances is prevented by throwing a an exception. #minor-release PiperOrigin-RevId: 428743140 --- .../ImaServerSideAdInsertionMediaSource.java | 17 +++++++++++++++++ .../ima/ImaServerSideAdInsertionUriBuilder.java | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaServerSideAdInsertionMediaSource.java b/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaServerSideAdInsertionMediaSource.java index 6a503d416a..9df38e116c 100644 --- a/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaServerSideAdInsertionMediaSource.java +++ b/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaServerSideAdInsertionMediaSource.java @@ -377,6 +377,7 @@ public final class ImaServerSideAdInsertionMediaSource extends CompositeMediaSou @Override public void prepareSourceInternal(@Nullable TransferListener mediaTransferListener) { + mainHandler.post(() -> assertSingleInstanceInPlaylist(checkNotNull(player))); super.prepareSourceInternal(mediaTransferListener); if (loader == null) { Loader loader = new Loader("ImaServerSideAdInsertionMediaSource"); @@ -1150,4 +1151,20 @@ public final class ImaServerSideAdInsertionMediaSource extends CompositeMediaSou overlayInfo.reasonDetail != null ? overlayInfo.reasonDetail : "Unknown reason")); } } + + private static void assertSingleInstanceInPlaylist(Player player) { + int counter = 0; + for (int i = 0; i < player.getMediaItemCount(); i++) { + MediaItem mediaItem = player.getMediaItemAt(i); + if (mediaItem.localConfiguration != null + && C.SSAI_SCHEME.equals(mediaItem.localConfiguration.uri.getScheme()) + && ImaServerSideAdInsertionUriBuilder.IMA_AUTHORITY.equals( + mediaItem.localConfiguration.uri.getAuthority())) { + if (++counter > 1) { + throw new IllegalStateException( + "Multiple IMA server side ad insertion sources not supported."); + } + } + } + } } diff --git a/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaServerSideAdInsertionUriBuilder.java b/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaServerSideAdInsertionUriBuilder.java index 8641d843b8..1334a488a2 100644 --- a/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaServerSideAdInsertionUriBuilder.java +++ b/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaServerSideAdInsertionUriBuilder.java @@ -41,7 +41,7 @@ public final class ImaServerSideAdInsertionUriBuilder { /** The default timeout for loading the video URI, in milliseconds. */ public static final int DEFAULT_LOAD_VIDEO_TIMEOUT_MS = 10_000; - private static final String IMA_AUTHORITY = "dai.google.com"; + /* package */ static final String IMA_AUTHORITY = "dai.google.com"; private static final String ADS_ID = "adsId"; private static final String ASSET_KEY = "assetKey"; private static final String API_KEY = "apiKey";