From 6a269baeede1714d71f4a765e6cfafd680cfdfeb Mon Sep 17 00:00:00 2001 From: ibaker Date: Fri, 4 Feb 2022 10:02:09 +0000 Subject: [PATCH] Redefine the SSAI URI format with an "ssai" scheme instead of "imadai" This allows us to remove the IMA naming from DefaultMediaSourceFactory's SSAI integration. #minor-release PiperOrigin-RevId: 426346456 --- .../ServerSideAdInsertionStreamRequest.java | 9 +++---- .../java/com/google/android/exoplayer2/C.java | 4 ++++ .../source/DefaultMediaSourceFactory.java | 24 +++++++++---------- 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ServerSideAdInsertionStreamRequest.java b/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ServerSideAdInsertionStreamRequest.java index 6a52991489..ef5b22c5d5 100644 --- a/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ServerSideAdInsertionStreamRequest.java +++ b/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ServerSideAdInsertionStreamRequest.java @@ -246,7 +246,7 @@ import java.util.Map; } } - private static final String SCHEME = "imadai"; + private 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"; @@ -341,7 +341,8 @@ import java.util.Map; /** Returns a corresponding {@link Uri}. */ public Uri toUri() { Uri.Builder dataUriBuilder = new Uri.Builder(); - dataUriBuilder.scheme(SCHEME); + dataUriBuilder.scheme(C.SSAI_SCHEME); + dataUriBuilder.authority(IMA_AUTHORITY); dataUriBuilder.appendQueryParameter(ADS_ID, adsId); if (loadVideoTimeoutMs != DEFAULT_LOAD_VIDEO_TIMEOUT_MS) { dataUriBuilder.appendQueryParameter( @@ -433,8 +434,8 @@ import java.util.Map; public static ServerSideAdInsertionStreamRequest fromUri(Uri uri) { ServerSideAdInsertionStreamRequest.Builder request = new ServerSideAdInsertionStreamRequest.Builder(); - if (!SCHEME.equals(uri.getScheme())) { - throw new IllegalArgumentException("Invalid scheme."); + if (!C.SSAI_SCHEME.equals(uri.getScheme()) || !IMA_AUTHORITY.equals(uri.getAuthority())) { + throw new IllegalArgumentException("Invalid URI scheme or authority."); } request.setAdsId(checkNotNull(uri.getQueryParameter(ADS_ID))); request.setAssetKey(uri.getQueryParameter(ASSET_KEY)); diff --git a/library/common/src/main/java/com/google/android/exoplayer2/C.java b/library/common/src/main/java/com/google/android/exoplayer2/C.java index 0d71ac6cec..c94f251c58 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/C.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/C.java @@ -29,6 +29,7 @@ import android.media.AudioManager; import android.media.MediaCodec; import android.media.MediaCrypto; import android.media.MediaFormat; +import android.net.Uri; import android.view.Surface; import androidx.annotation.IntDef; import androidx.annotation.RequiresApi; @@ -125,6 +126,9 @@ public final class C { /** The name of the sans-serif font family. */ public static final String SANS_SERIF_NAME = "sans-serif"; + /** The {@link Uri#getScheme() URI scheme} used for content with server side ad insertion. */ + public static final String SSAI_SCHEME = "ssai"; + /** * Types of crypto implementation. May be one of {@link #CRYPTO_TYPE_NONE}, {@link * #CRYPTO_TYPE_UNSUPPORTED} or {@link #CRYPTO_TYPE_FRAMEWORK}. May also be an app-defined value diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java index 67f7ba3638..42a89b7749 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java @@ -20,6 +20,7 @@ import static com.google.android.exoplayer2.util.Assertions.checkStateNotNull; import static com.google.android.exoplayer2.util.Util.castNonNull; import android.content.Context; +import android.net.Uri; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; @@ -104,7 +105,7 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { private final DataSource.Factory dataSourceFactory; private final DelegateFactoryLoader delegateFactoryLoader; - @Nullable private MediaSource.Factory imaServerSideAdInsertionMediaSourceFactory; + @Nullable private MediaSource.Factory serverSideAdInsertionMediaSourceFactory; @Nullable private AdsLoader.Provider adsLoaderProvider; @Nullable private AdViewProvider adViewProvider; @Nullable private LoadErrorHandlingPolicy loadErrorHandlingPolicy; @@ -206,21 +207,18 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { } /** - * Sets the {@link MediaSource.Factory} used to handle {@link MediaItem} instances containing IMA Dynamic Ad Insertion URIs. + * Sets the {@link MediaSource.Factory} used to handle {@link MediaItem} instances containing a + * {@link Uri} identified as resolving to content with server side ad insertion (SSAI). * - *

In most cases this will be an {@code ImaServerSideAdInsertionMediaSource.Factory} from the - * IMA extension. + *

SSAI URIs are those with a {@link Uri#getScheme() scheme} of {@link C#SSAI_SCHEME}. * - *

IMA DAI URIs are those with a scheme of {@code "imadai"}. - * - * @param imaServerSideAdInsertionMediaSourceFactory The {@link MediaSource.Factory} for IMA DAI + * @param serverSideAdInsertionMediaSourceFactory The {@link MediaSource.Factory} for SSAI * content, or {@code null} to remove a previously set {@link MediaSource.Factory}. * @return This factory, for convenience. */ - public DefaultMediaSourceFactory setImaServerSideAdInsertionMediaSourceFactory( - @Nullable MediaSource.Factory imaServerSideAdInsertionMediaSourceFactory) { - this.imaServerSideAdInsertionMediaSourceFactory = imaServerSideAdInsertionMediaSourceFactory; + public DefaultMediaSourceFactory setServerSideAdInsertionMediaSourceFactory( + @Nullable MediaSource.Factory serverSideAdInsertionMediaSourceFactory) { + this.serverSideAdInsertionMediaSourceFactory = serverSideAdInsertionMediaSourceFactory; return this; } @@ -308,8 +306,8 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { public MediaSource createMediaSource(MediaItem mediaItem) { Assertions.checkNotNull(mediaItem.localConfiguration); @Nullable String scheme = mediaItem.localConfiguration.uri.getScheme(); - if (scheme != null && scheme.equals("imadai")) { - return checkNotNull(imaServerSideAdInsertionMediaSourceFactory).createMediaSource(mediaItem); + if (scheme != null && scheme.equals(C.SSAI_SCHEME)) { + return checkNotNull(serverSideAdInsertionMediaSourceFactory).createMediaSource(mediaItem); } @C.ContentType int type =