From 26a1817ebf6b692aa1993220cab3fe59762be4c5 Mon Sep 17 00:00:00 2001 From: ibaker Date: Mon, 23 May 2022 17:12:22 +0100 Subject: [PATCH] Rollback of https://github.com/androidx/media/commit/e01bb47263bb509497b79bf0a475c3bd385dcb95 *** Original commit *** Rollback of https://github.com/androidx/media/commit/07302a23bd5894d57514c68b2db499ac46726e77 *** Original commit *** Remove `@Nullable` from `MediaSource.Factory` setters The null-behaviour of these methods creates a minimization footgun, because **any** call to these setters will prevent R8 from removing the default implementation (even if it's never used by the app) - this is because R8 can't tell the default imple... *** PiperOrigin-RevId: 450453325 --- RELEASENOTES.md | 5 ++ .../exoplayer/offline/DownloadHelper.java | 10 +-- .../source/DefaultMediaSourceFactory.java | 45 ++++++++---- .../media3/exoplayer/source/MediaSource.java | 11 +-- .../source/ProgressiveMediaSource.java | 70 +++++++++++++------ .../source/DefaultMediaSourceFactoryTest.java | 15 ---- .../exoplayer/dash/DashMediaSource.java | 46 +++++++----- .../dash/DefaultMediaSourceFactoryTest.java | 15 ---- .../media3/exoplayer/hls/HlsMediaSource.java | 51 +++++++++----- .../hls/DefaultMediaSourceFactoryTest.java | 15 ---- .../ImaServerSideAdInsertionMediaSource.java | 4 +- .../exoplayer/rtsp/RtspMediaSource.java | 6 +- .../smoothstreaming/SsMediaSource.java | 47 ++++++++----- .../DefaultMediaSourceFactoryTest.java | 15 ---- .../test/utils/FakeMediaSourceFactory.java | 5 +- 15 files changed, 192 insertions(+), 168 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index dc5972d32f..a5c5e2ba23 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -18,6 +18,11 @@ ([#10248](https://github.com/google/ExoPlayer/issues/10248)). * Stop detecting 5G-NSA network type on API 29 and 30. These playbacks will assume a 4G network. + * Disallow passing `null` to + `MediaSource.Factory.setDrmSessionManagerProvider` and + `MediaSource.Factory.setLoadErrorHandlingPolicy`. Instances of + `DefaultDrmSessionManagerProvider` and `DefaultLoadErrorHandlingPolicy` + can be passed explicitly if required. * Track selection: * Flatten `TrackSelectionOverrides` class into `TrackSelectionParameters`, and promote `TrackSelectionOverride` to a top level class. diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/DownloadHelper.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/DownloadHelper.java index 07db1b368e..df11e0e589 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/DownloadHelper.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/DownloadHelper.java @@ -952,10 +952,12 @@ public final class DownloadHelper { MediaItem mediaItem, DataSource.Factory dataSourceFactory, @Nullable DrmSessionManager drmSessionManager) { - return new DefaultMediaSourceFactory(dataSourceFactory, ExtractorsFactory.EMPTY) - .setDrmSessionManagerProvider( - drmSessionManager != null ? unusedMediaItem -> drmSessionManager : null) - .createMediaSource(mediaItem); + DefaultMediaSourceFactory mediaSourceFactory = + new DefaultMediaSourceFactory(dataSourceFactory, ExtractorsFactory.EMPTY); + if (drmSessionManager != null) { + mediaSourceFactory.setDrmSessionManagerProvider(unusedMediaItem -> drmSessionManager); + } + return mediaSourceFactory.createMediaSource(mediaItem); } private static boolean isProgressive(MediaItem.LocalConfiguration localConfiguration) { diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/DefaultMediaSourceFactory.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/DefaultMediaSourceFactory.java index 7d8f367172..f0a8cb1164 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/DefaultMediaSourceFactory.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/DefaultMediaSourceFactory.java @@ -370,16 +370,26 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { @UnstableApi @Override public DefaultMediaSourceFactory setDrmSessionManagerProvider( - @Nullable DrmSessionManagerProvider drmSessionManagerProvider) { - delegateFactoryLoader.setDrmSessionManagerProvider(drmSessionManagerProvider); + DrmSessionManagerProvider drmSessionManagerProvider) { + delegateFactoryLoader.setDrmSessionManagerProvider( + checkNotNull( + drmSessionManagerProvider, + "MediaSource.Factory#setDrmSessionManagerProvider no longer handles null by" + + " instantiating a new DefaultDrmSessionManagerProvider. Explicitly construct and" + + " pass an instance in order to retain the old behavior.")); return this; } @UnstableApi @Override public DefaultMediaSourceFactory setLoadErrorHandlingPolicy( - @Nullable LoadErrorHandlingPolicy loadErrorHandlingPolicy) { - this.loadErrorHandlingPolicy = loadErrorHandlingPolicy; + LoadErrorHandlingPolicy loadErrorHandlingPolicy) { + this.loadErrorHandlingPolicy = + checkNotNull( + loadErrorHandlingPolicy, + "MediaSource.Factory#setLoadErrorHandlingPolicy no longer handles null by" + + " instantiating a new DefaultLoadErrorHandlingPolicy. Explicitly construct and" + + " pass an instance in order to retain the old behavior."); delegateFactoryLoader.setLoadErrorHandlingPolicy(loadErrorHandlingPolicy); return this; } @@ -456,16 +466,23 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { SubtitleDecoderFactory.DEFAULT.createDecoder(format), format) : new UnknownSubtitlesExtractor(format) }; + ProgressiveMediaSource.Factory progressiveMediaSourceFactory = + new ProgressiveMediaSource.Factory(dataSourceFactory, extractorsFactory); + if (loadErrorHandlingPolicy != null) { + progressiveMediaSourceFactory.setLoadErrorHandlingPolicy(loadErrorHandlingPolicy); + } mediaSources[i + 1] = - new ProgressiveMediaSource.Factory(dataSourceFactory, extractorsFactory) - .setLoadErrorHandlingPolicy(loadErrorHandlingPolicy) - .createMediaSource( - MediaItem.fromUri(subtitleConfigurations.get(i).uri.toString())); + progressiveMediaSourceFactory.createMediaSource( + MediaItem.fromUri(subtitleConfigurations.get(i).uri.toString())); } else { + SingleSampleMediaSource.Factory singleSampleMediaSourceFactory = + new SingleSampleMediaSource.Factory(dataSourceFactory); + if (loadErrorHandlingPolicy != null) { + singleSampleMediaSourceFactory.setLoadErrorHandlingPolicy(loadErrorHandlingPolicy); + } mediaSources[i + 1] = - new SingleSampleMediaSource.Factory(dataSourceFactory) - .setLoadErrorHandlingPolicy(loadErrorHandlingPolicy) - .createMediaSource(subtitleConfigurations.get(i), /* durationUs= */ C.TIME_UNSET); + singleSampleMediaSourceFactory.createMediaSource( + subtitleConfigurations.get(i), /* durationUs= */ C.TIME_UNSET); } } @@ -581,16 +598,14 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { } } - public void setDrmSessionManagerProvider( - @Nullable DrmSessionManagerProvider drmSessionManagerProvider) { + public void setDrmSessionManagerProvider(DrmSessionManagerProvider drmSessionManagerProvider) { this.drmSessionManagerProvider = drmSessionManagerProvider; for (MediaSource.Factory mediaSourceFactory : mediaSourceFactories.values()) { mediaSourceFactory.setDrmSessionManagerProvider(drmSessionManagerProvider); } } - public void setLoadErrorHandlingPolicy( - @Nullable LoadErrorHandlingPolicy loadErrorHandlingPolicy) { + public void setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy loadErrorHandlingPolicy) { this.loadErrorHandlingPolicy = loadErrorHandlingPolicy; for (MediaSource.Factory mediaSourceFactory : mediaSourceFactories.values()) { mediaSourceFactory.setLoadErrorHandlingPolicy(loadErrorHandlingPolicy); diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaSource.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaSource.java index 32c3c75a49..d9d496bccd 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaSource.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaSource.java @@ -24,12 +24,10 @@ import androidx.media3.common.util.UnstableApi; import androidx.media3.datasource.TransferListener; import androidx.media3.exoplayer.ExoPlayer; import androidx.media3.exoplayer.analytics.PlayerId; -import androidx.media3.exoplayer.drm.DefaultDrmSessionManagerProvider; import androidx.media3.exoplayer.drm.DrmSessionEventListener; import androidx.media3.exoplayer.drm.DrmSessionManager; import androidx.media3.exoplayer.drm.DrmSessionManagerProvider; import androidx.media3.exoplayer.upstream.Allocator; -import androidx.media3.exoplayer.upstream.DefaultLoadErrorHandlingPolicy; import androidx.media3.exoplayer.upstream.LoadErrorHandlingPolicy; import java.io.IOException; @@ -69,23 +67,18 @@ public interface MediaSource { * Sets the {@link DrmSessionManagerProvider} used to obtain a {@link DrmSessionManager} for a * {@link MediaItem}. * - *

If not set, {@link DefaultDrmSessionManagerProvider} is used. - * * @return This factory, for convenience. */ @UnstableApi - Factory setDrmSessionManagerProvider( - @Nullable DrmSessionManagerProvider drmSessionManagerProvider); + Factory setDrmSessionManagerProvider(DrmSessionManagerProvider drmSessionManagerProvider); /** * Sets an optional {@link LoadErrorHandlingPolicy}. * - * @param loadErrorHandlingPolicy A {@link LoadErrorHandlingPolicy}, or {@code null} to use the - * {@link DefaultLoadErrorHandlingPolicy}. * @return This factory, for convenience. */ @UnstableApi - Factory setLoadErrorHandlingPolicy(@Nullable LoadErrorHandlingPolicy loadErrorHandlingPolicy); + Factory setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy loadErrorHandlingPolicy); /** * Returns the {@link C.ContentType content types} supported by media sources created by this diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ProgressiveMediaSource.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ProgressiveMediaSource.java index 5d3756fc3b..807e336e8d 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ProgressiveMediaSource.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ProgressiveMediaSource.java @@ -65,10 +65,18 @@ public final class ProgressiveMediaSource extends BaseMediaSource @Nullable private Object tag; /** - * Creates a new factory for {@link ProgressiveMediaSource}s, using the extractors provided by - * {@link DefaultExtractorsFactory}. + * Creates a new factory for {@link ProgressiveMediaSource}s. * - * @param dataSourceFactory A factory for {@link DataSource}s to read the media. + *

The factory will use the following default components: + * + *

+ * + * @param dataSourceFactory A factory for {@linkplain DataSource data sources} to read the + * media. */ public Factory(DataSource.Factory dataSourceFactory) { this(dataSourceFactory, new DefaultExtractorsFactory()); @@ -77,6 +85,18 @@ public final class ProgressiveMediaSource extends BaseMediaSource /** * Equivalent to {@link #Factory(DataSource.Factory, ProgressiveMediaExtractor.Factory) new * Factory(dataSourceFactory, () -> new BundledExtractorsAdapter(extractorsFactory)}. + * + *

The factory will use the following default components: + * + *

+ * + * @param dataSourceFactory A factory for {@linkplain DataSource data sources} to read the + * media. + * @param extractorsFactory A factory for the {@linkplain Extractor extractors} used to extract + * the media from its container. */ public Factory(DataSource.Factory dataSourceFactory, ExtractorsFactory extractorsFactory) { this(dataSourceFactory, playerId -> new BundledExtractorsAdapter(extractorsFactory)); @@ -85,9 +105,17 @@ public final class ProgressiveMediaSource extends BaseMediaSource /** * Creates a new factory for {@link ProgressiveMediaSource}s. * - * @param dataSourceFactory A factory for {@link DataSource}s to read the media. + *

The factory will use the following default components: + * + *

+ * + * @param dataSourceFactory A factory for {@linkplain DataSource data sources} to read the + * media. * @param progressiveMediaExtractorFactory A factory for the {@link ProgressiveMediaExtractor} - * to extract media from its container. + * to extract the media from its container. */ public Factory( DataSource.Factory dataSourceFactory, @@ -103,7 +131,8 @@ public final class ProgressiveMediaSource extends BaseMediaSource /** * Creates a new factory for {@link ProgressiveMediaSource}s. * - * @param dataSourceFactory A factory for {@link DataSource}s to read the media. + * @param dataSourceFactory A factory for {@linkplain DataSource data sources} to read the + * media. * @param progressiveMediaExtractorFactory A factory for the {@link ProgressiveMediaExtractor} * to extract media from its container. * @param drmSessionManagerProvider A provider to obtain a {@link DrmSessionManager} for a @@ -126,19 +155,14 @@ public final class ProgressiveMediaSource extends BaseMediaSource this.continueLoadingCheckIntervalBytes = continueLoadingCheckIntervalBytes; } - /** - * Sets the {@link LoadErrorHandlingPolicy}. The default value is created by calling {@link - * DefaultLoadErrorHandlingPolicy#DefaultLoadErrorHandlingPolicy()}. - * - * @param loadErrorHandlingPolicy A {@link LoadErrorHandlingPolicy}. - * @return This factory, for convenience. - */ - public Factory setLoadErrorHandlingPolicy( - @Nullable LoadErrorHandlingPolicy loadErrorHandlingPolicy) { + @Override + public Factory setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy loadErrorHandlingPolicy) { this.loadErrorHandlingPolicy = - loadErrorHandlingPolicy != null - ? loadErrorHandlingPolicy - : new DefaultLoadErrorHandlingPolicy(); + checkNotNull( + loadErrorHandlingPolicy, + "MediaSource.Factory#setLoadErrorHandlingPolicy no longer handles null by" + + " instantiating a new DefaultLoadErrorHandlingPolicy. Explicitly construct and" + + " pass an instance in order to retain the old behavior."); return this; } @@ -159,11 +183,13 @@ public final class ProgressiveMediaSource extends BaseMediaSource @Override public Factory setDrmSessionManagerProvider( - @Nullable DrmSessionManagerProvider drmSessionManagerProvider) { + DrmSessionManagerProvider drmSessionManagerProvider) { this.drmSessionManagerProvider = - drmSessionManagerProvider != null - ? drmSessionManagerProvider - : new DefaultDrmSessionManagerProvider(); + checkNotNull( + drmSessionManagerProvider, + "MediaSource.Factory#setDrmSessionManagerProvider no longer handles null by" + + " instantiating a new DefaultDrmSessionManagerProvider. Explicitly construct" + + " and pass an instance in order to retain the old behavior."); return this; } diff --git a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/source/DefaultMediaSourceFactoryTest.java b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/source/DefaultMediaSourceFactoryTest.java index a87d86f8a8..7d3af7bb08 100644 --- a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/source/DefaultMediaSourceFactoryTest.java +++ b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/source/DefaultMediaSourceFactoryTest.java @@ -73,21 +73,6 @@ public final class DefaultMediaSourceFactoryTest { assertThat(mediaSource).isInstanceOf(ProgressiveMediaSource.class); } - @Test - public void createMediaSource_withNull_usesNonNullDefaults() { - DefaultMediaSourceFactory defaultMediaSourceFactory = - new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext()); - MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA).build(); - - MediaSource mediaSource = - defaultMediaSourceFactory - .setDrmSessionManagerProvider(null) - .setLoadErrorHandlingPolicy(null) - .createMediaSource(mediaItem); - - assertThat(mediaSource).isNotNull(); - } - @Test public void createMediaSource_withSubtitle_isMergingMediaSource() { DefaultMediaSourceFactory defaultMediaSourceFactory = diff --git a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaSource.java b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaSource.java index 178078f480..7abde693ba 100644 --- a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaSource.java +++ b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaSource.java @@ -114,6 +114,15 @@ public final class DashMediaSource extends BaseMediaSource { /** * Creates a new factory for {@link DashMediaSource}s. * + *

The factory will use the following default components: + * + *

+ * * @param dataSourceFactory A factory for {@link DataSource} instances that will be used to load * manifest and media data. */ @@ -124,6 +133,14 @@ public final class DashMediaSource extends BaseMediaSource { /** * Creates a new factory for {@link DashMediaSource}s. * + *

The factory will use the following default components: + * + *

+ * * @param chunkSourceFactory A factory for {@link DashChunkSource} instances. * @param manifestDataSourceFactory A factory for {@link DataSource} instances that will be used * to load (and refresh) the manifest. May be {@code null} if the factory will only ever be @@ -143,27 +160,24 @@ public final class DashMediaSource extends BaseMediaSource { @Override public Factory setDrmSessionManagerProvider( - @Nullable DrmSessionManagerProvider drmSessionManagerProvider) { + DrmSessionManagerProvider drmSessionManagerProvider) { this.drmSessionManagerProvider = - drmSessionManagerProvider != null - ? drmSessionManagerProvider - : new DefaultDrmSessionManagerProvider(); + checkNotNull( + drmSessionManagerProvider, + "MediaSource.Factory#setDrmSessionManagerProvider no longer handles null by" + + " instantiating a new DefaultDrmSessionManagerProvider. Explicitly construct" + + " and pass an instance in order to retain the old behavior."); return this; } - /** - * Sets the {@link LoadErrorHandlingPolicy}. The default value is created by calling {@link - * DefaultLoadErrorHandlingPolicy#DefaultLoadErrorHandlingPolicy()}. - * - * @param loadErrorHandlingPolicy A {@link LoadErrorHandlingPolicy}. - * @return This factory, for convenience. - */ - public Factory setLoadErrorHandlingPolicy( - @Nullable LoadErrorHandlingPolicy loadErrorHandlingPolicy) { + @Override + public Factory setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy loadErrorHandlingPolicy) { this.loadErrorHandlingPolicy = - loadErrorHandlingPolicy != null - ? loadErrorHandlingPolicy - : new DefaultLoadErrorHandlingPolicy(); + checkNotNull( + loadErrorHandlingPolicy, + "MediaSource.Factory#setLoadErrorHandlingPolicy no longer handles null by" + + " instantiating a new DefaultLoadErrorHandlingPolicy. Explicitly construct and" + + " pass an instance in order to retain the old behavior."); return this; } diff --git a/libraries/exoplayer_dash/src/test/java/androidx/media3/exoplayer/dash/DefaultMediaSourceFactoryTest.java b/libraries/exoplayer_dash/src/test/java/androidx/media3/exoplayer/dash/DefaultMediaSourceFactoryTest.java index 3d4ebd874e..b6d4ac102f 100644 --- a/libraries/exoplayer_dash/src/test/java/androidx/media3/exoplayer/dash/DefaultMediaSourceFactoryTest.java +++ b/libraries/exoplayer_dash/src/test/java/androidx/media3/exoplayer/dash/DefaultMediaSourceFactoryTest.java @@ -74,21 +74,6 @@ public class DefaultMediaSourceFactoryTest { assertThat(mediaSource).isInstanceOf(DashMediaSource.class); } - @Test - public void createMediaSource_withNull_usesNonNullDefaults() { - DefaultMediaSourceFactory defaultMediaSourceFactory = - new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext()); - MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA + "/file.mpd").build(); - - MediaSource mediaSource = - defaultMediaSourceFactory - .setDrmSessionManagerProvider(null) - .setLoadErrorHandlingPolicy(null) - .createMediaSource(mediaItem); - - assertThat(mediaSource).isNotNull(); - } - @Test public void getSupportedTypes_dashModule_containsTypeDash() { int[] supportedTypes = diff --git a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsMediaSource.java b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsMediaSource.java index 18d9b0fd96..0cc5663a03 100644 --- a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsMediaSource.java +++ b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsMediaSource.java @@ -114,6 +114,17 @@ public final class HlsMediaSource extends BaseMediaSource /** * Creates a new factory for {@link HlsMediaSource}s. * + *

The factory will use the following default components: + * + *

+ * * @param dataSourceFactory A data source factory that will be wrapped by a {@link * DefaultHlsDataSourceFactory} to create {@link DataSource}s for manifests, segments and * keys. @@ -125,6 +136,17 @@ public final class HlsMediaSource extends BaseMediaSource /** * Creates a new factory for {@link HlsMediaSource}s. * + *

The factory will use the following default components: + * + *

+ * * @param hlsDataSourceFactory An {@link HlsDataSourceFactory} for {@link DataSource}s for * manifests, segments and keys. */ @@ -155,19 +177,14 @@ public final class HlsMediaSource extends BaseMediaSource return this; } - /** - * Sets the {@link LoadErrorHandlingPolicy}. The default value is created by calling {@link - * DefaultLoadErrorHandlingPolicy#DefaultLoadErrorHandlingPolicy()}. - * - * @param loadErrorHandlingPolicy A {@link LoadErrorHandlingPolicy}. - * @return This factory, for convenience. - */ - public Factory setLoadErrorHandlingPolicy( - @Nullable LoadErrorHandlingPolicy loadErrorHandlingPolicy) { + @Override + public Factory setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy loadErrorHandlingPolicy) { this.loadErrorHandlingPolicy = - loadErrorHandlingPolicy != null - ? loadErrorHandlingPolicy - : new DefaultLoadErrorHandlingPolicy(); + checkNotNull( + loadErrorHandlingPolicy, + "MediaSource.Factory#setLoadErrorHandlingPolicy no longer handles null by" + + " instantiating a new DefaultLoadErrorHandlingPolicy. Explicitly construct and" + + " pass an instance in order to retain the old behavior."); return this; } @@ -276,11 +293,13 @@ public final class HlsMediaSource extends BaseMediaSource @Override public Factory setDrmSessionManagerProvider( - @Nullable DrmSessionManagerProvider drmSessionManagerProvider) { + DrmSessionManagerProvider drmSessionManagerProvider) { this.drmSessionManagerProvider = - drmSessionManagerProvider != null - ? drmSessionManagerProvider - : new DefaultDrmSessionManagerProvider(); + checkNotNull( + drmSessionManagerProvider, + "MediaSource.Factory#setDrmSessionManagerProvider no longer handles null by" + + " instantiating a new DefaultDrmSessionManagerProvider. Explicitly construct" + + " and pass an instance in order to retain the old behavior."); return this; } diff --git a/libraries/exoplayer_hls/src/test/java/androidx/media3/exoplayer/hls/DefaultMediaSourceFactoryTest.java b/libraries/exoplayer_hls/src/test/java/androidx/media3/exoplayer/hls/DefaultMediaSourceFactoryTest.java index b474edf99c..2a2ff66b28 100644 --- a/libraries/exoplayer_hls/src/test/java/androidx/media3/exoplayer/hls/DefaultMediaSourceFactoryTest.java +++ b/libraries/exoplayer_hls/src/test/java/androidx/media3/exoplayer/hls/DefaultMediaSourceFactoryTest.java @@ -74,21 +74,6 @@ public class DefaultMediaSourceFactoryTest { assertThat(mediaSource).isInstanceOf(HlsMediaSource.class); } - @Test - public void createMediaSource_withNull_usesNonNullDefaults() { - DefaultMediaSourceFactory defaultMediaSourceFactory = - new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext()); - MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA + "/file.m3u8").build(); - - MediaSource mediaSource = - defaultMediaSourceFactory - .setDrmSessionManagerProvider(null) - .setLoadErrorHandlingPolicy(null) - .createMediaSource(mediaItem); - - assertThat(mediaSource).isNotNull(); - } - @Test public void getSupportedTypes_hlsModule_containsTypeHls() { int[] supportedTypes = 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 d6278fe69a..e7d261c220 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 @@ -136,14 +136,14 @@ public final class ImaServerSideAdInsertionMediaSource extends CompositeMediaSou @Override public MediaSource.Factory setLoadErrorHandlingPolicy( - @Nullable LoadErrorHandlingPolicy loadErrorHandlingPolicy) { + LoadErrorHandlingPolicy loadErrorHandlingPolicy) { contentMediaSourceFactory.setLoadErrorHandlingPolicy(loadErrorHandlingPolicy); return this; } @Override public MediaSource.Factory setDrmSessionManagerProvider( - @Nullable DrmSessionManagerProvider drmSessionManagerProvider) { + DrmSessionManagerProvider drmSessionManagerProvider) { contentMediaSourceFactory.setDrmSessionManagerProvider(drmSessionManagerProvider); return this; } diff --git a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspMediaSource.java b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspMediaSource.java index 0c08b62220..3aa2d7f090 100644 --- a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspMediaSource.java +++ b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspMediaSource.java @@ -148,15 +148,13 @@ public final class RtspMediaSource extends BaseMediaSource { /** Does nothing. {@link RtspMediaSource} does not support DRM. */ @Override - public Factory setDrmSessionManagerProvider( - @Nullable DrmSessionManagerProvider drmSessionManager) { + public Factory setDrmSessionManagerProvider(DrmSessionManagerProvider drmSessionManager) { return this; } /** Does nothing. {@link RtspMediaSource} does not support error handling policies. */ @Override - public Factory setLoadErrorHandlingPolicy( - @Nullable LoadErrorHandlingPolicy loadErrorHandlingPolicy) { + public Factory setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy loadErrorHandlingPolicy) { // TODO(internal b/172331505): Implement support. return this; } diff --git a/libraries/exoplayer_smoothstreaming/src/main/java/androidx/media3/exoplayer/smoothstreaming/SsMediaSource.java b/libraries/exoplayer_smoothstreaming/src/main/java/androidx/media3/exoplayer/smoothstreaming/SsMediaSource.java index ffb18544b8..b8231da9b1 100644 --- a/libraries/exoplayer_smoothstreaming/src/main/java/androidx/media3/exoplayer/smoothstreaming/SsMediaSource.java +++ b/libraries/exoplayer_smoothstreaming/src/main/java/androidx/media3/exoplayer/smoothstreaming/SsMediaSource.java @@ -93,6 +93,15 @@ public final class SsMediaSource extends BaseMediaSource /** * Creates a new factory for {@link SsMediaSource}s. * + *

The factory will use the following default components: + * + *

+ * * @param dataSourceFactory A factory for {@link DataSource} instances that will be used to load * manifest and media data. */ @@ -101,7 +110,14 @@ public final class SsMediaSource extends BaseMediaSource } /** - * Creates a new factory for {@link SsMediaSource}s. + * Creates a new factory for {@link SsMediaSource}s. The factory will use the following default + * components: + * + * * * @param chunkSourceFactory A factory for {@link SsChunkSource} instances. * @param manifestDataSourceFactory A factory for {@link DataSource} instances that will be used @@ -120,19 +136,14 @@ public final class SsMediaSource extends BaseMediaSource compositeSequenceableLoaderFactory = new DefaultCompositeSequenceableLoaderFactory(); } - /** - * Sets the {@link LoadErrorHandlingPolicy}. The default value is created by calling {@link - * DefaultLoadErrorHandlingPolicy#DefaultLoadErrorHandlingPolicy()}. - * - * @param loadErrorHandlingPolicy A {@link LoadErrorHandlingPolicy}. - * @return This factory, for convenience. - */ - public Factory setLoadErrorHandlingPolicy( - @Nullable LoadErrorHandlingPolicy loadErrorHandlingPolicy) { + @Override + public Factory setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy loadErrorHandlingPolicy) { this.loadErrorHandlingPolicy = - loadErrorHandlingPolicy != null - ? loadErrorHandlingPolicy - : new DefaultLoadErrorHandlingPolicy(); + checkNotNull( + loadErrorHandlingPolicy, + "MediaSource.Factory#setLoadErrorHandlingPolicy no longer handles null by" + + " instantiating a new DefaultLoadErrorHandlingPolicy. Explicitly construct and" + + " pass an instance in order to retain the old behavior."); return this; } @@ -184,11 +195,13 @@ public final class SsMediaSource extends BaseMediaSource @Override public Factory setDrmSessionManagerProvider( - @Nullable DrmSessionManagerProvider drmSessionManagerProvider) { + DrmSessionManagerProvider drmSessionManagerProvider) { this.drmSessionManagerProvider = - drmSessionManagerProvider != null - ? drmSessionManagerProvider - : new DefaultDrmSessionManagerProvider(); + checkNotNull( + drmSessionManagerProvider, + "MediaSource.Factory#setDrmSessionManagerProvider no longer handles null by" + + " instantiating a new DefaultDrmSessionManagerProvider. Explicitly construct" + + " and pass an instance in order to retain the old behavior."); return this; } diff --git a/libraries/exoplayer_smoothstreaming/src/test/java/androidx/media3/exoplayer/smoothstreaming/DefaultMediaSourceFactoryTest.java b/libraries/exoplayer_smoothstreaming/src/test/java/androidx/media3/exoplayer/smoothstreaming/DefaultMediaSourceFactoryTest.java index 28ca0c58a7..f5a205fcbe 100644 --- a/libraries/exoplayer_smoothstreaming/src/test/java/androidx/media3/exoplayer/smoothstreaming/DefaultMediaSourceFactoryTest.java +++ b/libraries/exoplayer_smoothstreaming/src/test/java/androidx/media3/exoplayer/smoothstreaming/DefaultMediaSourceFactoryTest.java @@ -85,21 +85,6 @@ public class DefaultMediaSourceFactoryTest { assertThat(mediaSource).isInstanceOf(SsMediaSource.class); } - @Test - public void createMediaSource_withNull_usesNonNullDefaults() { - DefaultMediaSourceFactory defaultMediaSourceFactory = - new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext()); - MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA + "/file.ism").build(); - - MediaSource mediaSource = - defaultMediaSourceFactory - .setDrmSessionManagerProvider(null) - .setLoadErrorHandlingPolicy(null) - .createMediaSource(mediaItem); - - assertThat(mediaSource).isNotNull(); - } - @Test public void getSupportedTypes_smoothstreamingModule_containsTypeSS() { int[] supportedTypes = diff --git a/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeMediaSourceFactory.java b/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeMediaSourceFactory.java index f87863c64f..bd92f38471 100644 --- a/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeMediaSourceFactory.java +++ b/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeMediaSourceFactory.java @@ -15,7 +15,6 @@ */ package androidx.media3.test.utils; -import androidx.annotation.Nullable; import androidx.media3.common.AdPlaybackState; import androidx.media3.common.C; import androidx.media3.common.MediaItem; @@ -39,13 +38,13 @@ public final class FakeMediaSourceFactory implements MediaSourceFactory { @Override public MediaSourceFactory setDrmSessionManagerProvider( - @Nullable DrmSessionManagerProvider drmSessionManagerProvider) { + DrmSessionManagerProvider drmSessionManagerProvider) { throw new UnsupportedOperationException(); } @Override public MediaSourceFactory setLoadErrorHandlingPolicy( - @Nullable LoadErrorHandlingPolicy loadErrorHandlingPolicy) { + LoadErrorHandlingPolicy loadErrorHandlingPolicy) { throw new UnsupportedOperationException(); }