From b5d5f492e7c304d455a79685742cb1df5e0fc11d 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/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 0e04bb4903..d77b50fc0c 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 @@ -379,6 +379,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"); @@ -1152,4 +1153,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/libraries/exoplayer_ima/src/main/java/androidx/media3/exoplayer/ima/ImaServerSideAdInsertionUriBuilder.java b/libraries/exoplayer_ima/src/main/java/androidx/media3/exoplayer/ima/ImaServerSideAdInsertionUriBuilder.java index c9cf63973e..6e00303d58 100644 --- a/libraries/exoplayer_ima/src/main/java/androidx/media3/exoplayer/ima/ImaServerSideAdInsertionUriBuilder.java +++ b/libraries/exoplayer_ima/src/main/java/androidx/media3/exoplayer/ima/ImaServerSideAdInsertionUriBuilder.java @@ -43,7 +43,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";