diff --git a/RELEASENOTES.md b/RELEASENOTES.md
index a5c5e2ba23..dc5972d32f 100644
--- a/RELEASENOTES.md
+++ b/RELEASENOTES.md
@@ -18,11 +18,6 @@
([#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 df11e0e589..07db1b368e 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,12 +952,10 @@ public final class DownloadHelper {
MediaItem mediaItem,
DataSource.Factory dataSourceFactory,
@Nullable DrmSessionManager drmSessionManager) {
- DefaultMediaSourceFactory mediaSourceFactory =
- new DefaultMediaSourceFactory(dataSourceFactory, ExtractorsFactory.EMPTY);
- if (drmSessionManager != null) {
- mediaSourceFactory.setDrmSessionManagerProvider(unusedMediaItem -> drmSessionManager);
- }
- return mediaSourceFactory.createMediaSource(mediaItem);
+ return new DefaultMediaSourceFactory(dataSourceFactory, ExtractorsFactory.EMPTY)
+ .setDrmSessionManagerProvider(
+ drmSessionManager != null ? unusedMediaItem -> drmSessionManager : null)
+ .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 afad68202b..5ffb33a7cd 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
@@ -345,26 +345,16 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory {
@UnstableApi
@Override
public DefaultMediaSourceFactory setDrmSessionManagerProvider(
- 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."));
+ @Nullable DrmSessionManagerProvider drmSessionManagerProvider) {
+ delegateFactoryLoader.setDrmSessionManagerProvider(drmSessionManagerProvider);
return this;
}
@UnstableApi
@Override
public DefaultMediaSourceFactory setLoadErrorHandlingPolicy(
- 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.");
+ @Nullable LoadErrorHandlingPolicy loadErrorHandlingPolicy) {
+ this.loadErrorHandlingPolicy = loadErrorHandlingPolicy;
delegateFactoryLoader.setLoadErrorHandlingPolicy(loadErrorHandlingPolicy);
return this;
}
@@ -441,23 +431,16 @@ 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] =
- progressiveMediaSourceFactory.createMediaSource(
- MediaItem.fromUri(subtitleConfigurations.get(i).uri.toString()));
+ new ProgressiveMediaSource.Factory(dataSourceFactory, extractorsFactory)
+ .setLoadErrorHandlingPolicy(loadErrorHandlingPolicy)
+ .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] =
- singleSampleMediaSourceFactory.createMediaSource(
- subtitleConfigurations.get(i), /* durationUs= */ C.TIME_UNSET);
+ new SingleSampleMediaSource.Factory(dataSourceFactory)
+ .setLoadErrorHandlingPolicy(loadErrorHandlingPolicy)
+ .createMediaSource(subtitleConfigurations.get(i), /* durationUs= */ C.TIME_UNSET);
}
}
@@ -566,14 +549,16 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory {
return mediaSourceFactory;
}
- public void setDrmSessionManagerProvider(DrmSessionManagerProvider drmSessionManagerProvider) {
+ public void setDrmSessionManagerProvider(
+ @Nullable DrmSessionManagerProvider drmSessionManagerProvider) {
this.drmSessionManagerProvider = drmSessionManagerProvider;
for (MediaSource.Factory mediaSourceFactory : mediaSourceFactories.values()) {
mediaSourceFactory.setDrmSessionManagerProvider(drmSessionManagerProvider);
}
}
- public void setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy loadErrorHandlingPolicy) {
+ public void setLoadErrorHandlingPolicy(
+ @Nullable 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 d9d496bccd..32c3c75a49 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,10 +24,12 @@ 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;
@@ -67,18 +69,23 @@ public interface MediaSource {
* Sets the {@link DrmSessionManagerProvider} used to obtain a {@link DrmSessionManager} for a
* {@link MediaItem}.
*
- * @return This factory, for convenience.
- */
- @UnstableApi
- Factory setDrmSessionManagerProvider(DrmSessionManagerProvider drmSessionManagerProvider);
-
- /**
- * Sets an optional {@link LoadErrorHandlingPolicy}.
+ *
If not set, {@link DefaultDrmSessionManagerProvider} is used.
*
* @return This factory, for convenience.
*/
@UnstableApi
- Factory setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy loadErrorHandlingPolicy);
+ Factory setDrmSessionManagerProvider(
+ @Nullable 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);
/**
* 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 807e336e8d..5d3756fc3b 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,18 +65,10 @@ public final class ProgressiveMediaSource extends BaseMediaSource
@Nullable private Object tag;
/**
- * Creates a new factory for {@link ProgressiveMediaSource}s.
+ * Creates a new factory for {@link ProgressiveMediaSource}s, using the extractors provided by
+ * {@link DefaultExtractorsFactory}.
*
- *
The factory will use the following default components:
- *
- *
- * - {@link DefaultExtractorsFactory}
- *
- {@link DefaultDrmSessionManagerProvider}
- *
- {@link DefaultLoadErrorHandlingPolicy}
- *
- *
- * @param dataSourceFactory A factory for {@linkplain DataSource data sources} to read the
- * media.
+ * @param dataSourceFactory A factory for {@link DataSource}s to read the media.
*/
public Factory(DataSource.Factory dataSourceFactory) {
this(dataSourceFactory, new DefaultExtractorsFactory());
@@ -85,18 +77,6 @@ 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:
- *
- *
- * - {@link DefaultDrmSessionManagerProvider}
- *
- {@link DefaultLoadErrorHandlingPolicy}
- *
- *
- * @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));
@@ -105,17 +85,9 @@ public final class ProgressiveMediaSource extends BaseMediaSource
/**
* Creates a new factory for {@link ProgressiveMediaSource}s.
*
- * The factory will use the following default components:
- *
- *
- * - {@link DefaultDrmSessionManagerProvider}
- *
- {@link DefaultLoadErrorHandlingPolicy}
- *
- *
- * @param dataSourceFactory A factory for {@linkplain DataSource data sources} to read the
- * media.
+ * @param dataSourceFactory A factory for {@link DataSource}s to read the media.
* @param progressiveMediaExtractorFactory A factory for the {@link ProgressiveMediaExtractor}
- * to extract the media from its container.
+ * to extract media from its container.
*/
public Factory(
DataSource.Factory dataSourceFactory,
@@ -131,8 +103,7 @@ public final class ProgressiveMediaSource extends BaseMediaSource
/**
* Creates a new factory for {@link ProgressiveMediaSource}s.
*
- * @param dataSourceFactory A factory for {@linkplain DataSource data sources} to read the
- * media.
+ * @param dataSourceFactory A factory for {@link DataSource}s 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
@@ -155,14 +126,19 @@ public final class ProgressiveMediaSource extends BaseMediaSource
this.continueLoadingCheckIntervalBytes = continueLoadingCheckIntervalBytes;
}
- @Override
- public Factory setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy loadErrorHandlingPolicy) {
+ /**
+ * 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) {
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.");
+ loadErrorHandlingPolicy != null
+ ? loadErrorHandlingPolicy
+ : new DefaultLoadErrorHandlingPolicy();
return this;
}
@@ -183,13 +159,11 @@ public final class ProgressiveMediaSource extends BaseMediaSource
@Override
public Factory setDrmSessionManagerProvider(
- DrmSessionManagerProvider drmSessionManagerProvider) {
+ @Nullable DrmSessionManagerProvider drmSessionManagerProvider) {
this.drmSessionManagerProvider =
- 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.");
+ drmSessionManagerProvider != null
+ ? drmSessionManagerProvider
+ : new DefaultDrmSessionManagerProvider();
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 7d3af7bb08..a87d86f8a8 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,6 +73,21 @@ 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 7abde693ba..178078f480 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,15 +114,6 @@ public final class DashMediaSource extends BaseMediaSource {
/**
* Creates a new factory for {@link DashMediaSource}s.
*
- * The factory will use the following default components:
- *
- *
- * - {@link DefaultDashChunkSource.Factory}
- *
- {@link DefaultDrmSessionManagerProvider}
- *
- {@link DefaultLoadErrorHandlingPolicy}
- *
- {@link DefaultCompositeSequenceableLoaderFactory}
- *
- *
* @param dataSourceFactory A factory for {@link DataSource} instances that will be used to load
* manifest and media data.
*/
@@ -133,14 +124,6 @@ public final class DashMediaSource extends BaseMediaSource {
/**
* Creates a new factory for {@link DashMediaSource}s.
*
- * The factory will use the following default components:
- *
- *
- * - {@link DefaultDrmSessionManagerProvider}
- *
- {@link DefaultLoadErrorHandlingPolicy}
- *
- {@link DefaultCompositeSequenceableLoaderFactory}
- *
- *
* @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
@@ -160,24 +143,27 @@ public final class DashMediaSource extends BaseMediaSource {
@Override
public Factory setDrmSessionManagerProvider(
- DrmSessionManagerProvider drmSessionManagerProvider) {
+ @Nullable DrmSessionManagerProvider drmSessionManagerProvider) {
this.drmSessionManagerProvider =
- 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.");
+ drmSessionManagerProvider != null
+ ? drmSessionManagerProvider
+ : new DefaultDrmSessionManagerProvider();
return this;
}
- @Override
- public Factory setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy loadErrorHandlingPolicy) {
+ /**
+ * 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) {
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.");
+ loadErrorHandlingPolicy != null
+ ? loadErrorHandlingPolicy
+ : new DefaultLoadErrorHandlingPolicy();
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 b6d4ac102f..3d4ebd874e 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,6 +74,21 @@ 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 0cc5663a03..18d9b0fd96 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,17 +114,6 @@ public final class HlsMediaSource extends BaseMediaSource
/**
* Creates a new factory for {@link HlsMediaSource}s.
*
- * The factory will use the following default components:
- *
- *
- * - {@link DefaultDrmSessionManagerProvider}
- *
- {@link DefaultHlsPlaylistParserFactory}
- *
- {@link DefaultHlsPlaylistTracker#FACTORY}
- *
- {@link HlsExtractorFactory#DEFAULT}
- *
- {@link DefaultLoadErrorHandlingPolicy}
- *
- {@link DefaultCompositeSequenceableLoaderFactory}
- *
- *
* @param dataSourceFactory A data source factory that will be wrapped by a {@link
* DefaultHlsDataSourceFactory} to create {@link DataSource}s for manifests, segments and
* keys.
@@ -136,17 +125,6 @@ public final class HlsMediaSource extends BaseMediaSource
/**
* Creates a new factory for {@link HlsMediaSource}s.
*
- * The factory will use the following default components:
- *
- *
- * - {@link DefaultDrmSessionManagerProvider}
- *
- {@link DefaultHlsPlaylistParserFactory}
- *
- {@link DefaultHlsPlaylistTracker#FACTORY}
- *
- {@link HlsExtractorFactory#DEFAULT}
- *
- {@link DefaultLoadErrorHandlingPolicy}
- *
- {@link DefaultCompositeSequenceableLoaderFactory}
- *
- *
* @param hlsDataSourceFactory An {@link HlsDataSourceFactory} for {@link DataSource}s for
* manifests, segments and keys.
*/
@@ -177,14 +155,19 @@ public final class HlsMediaSource extends BaseMediaSource
return this;
}
- @Override
- public Factory setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy loadErrorHandlingPolicy) {
+ /**
+ * 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) {
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.");
+ loadErrorHandlingPolicy != null
+ ? loadErrorHandlingPolicy
+ : new DefaultLoadErrorHandlingPolicy();
return this;
}
@@ -293,13 +276,11 @@ public final class HlsMediaSource extends BaseMediaSource
@Override
public Factory setDrmSessionManagerProvider(
- DrmSessionManagerProvider drmSessionManagerProvider) {
+ @Nullable DrmSessionManagerProvider drmSessionManagerProvider) {
this.drmSessionManagerProvider =
- 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.");
+ drmSessionManagerProvider != null
+ ? drmSessionManagerProvider
+ : new DefaultDrmSessionManagerProvider();
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 2a2ff66b28..b474edf99c 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,6 +74,21 @@ 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 e7d261c220..d6278fe69a 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(
- LoadErrorHandlingPolicy loadErrorHandlingPolicy) {
+ @Nullable LoadErrorHandlingPolicy loadErrorHandlingPolicy) {
contentMediaSourceFactory.setLoadErrorHandlingPolicy(loadErrorHandlingPolicy);
return this;
}
@Override
public MediaSource.Factory setDrmSessionManagerProvider(
- DrmSessionManagerProvider drmSessionManagerProvider) {
+ @Nullable 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 3aa2d7f090..0c08b62220 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,13 +148,15 @@ public final class RtspMediaSource extends BaseMediaSource {
/** Does nothing. {@link RtspMediaSource} does not support DRM. */
@Override
- public Factory setDrmSessionManagerProvider(DrmSessionManagerProvider drmSessionManager) {
+ public Factory setDrmSessionManagerProvider(
+ @Nullable DrmSessionManagerProvider drmSessionManager) {
return this;
}
/** Does nothing. {@link RtspMediaSource} does not support error handling policies. */
@Override
- public Factory setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy loadErrorHandlingPolicy) {
+ public Factory setLoadErrorHandlingPolicy(
+ @Nullable 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 b8231da9b1..ffb18544b8 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,15 +93,6 @@ public final class SsMediaSource extends BaseMediaSource
/**
* Creates a new factory for {@link SsMediaSource}s.
*
- * The factory will use the following default components:
- *
- *
- * - {@link DefaultSsChunkSource.Factory}
- *
- {@link DefaultDrmSessionManagerProvider}
- *
- {@link DefaultLoadErrorHandlingPolicy}
- *
- {@link DefaultCompositeSequenceableLoaderFactory}
- *
- *
* @param dataSourceFactory A factory for {@link DataSource} instances that will be used to load
* manifest and media data.
*/
@@ -110,14 +101,7 @@ public final class SsMediaSource extends BaseMediaSource
}
/**
- * Creates a new factory for {@link SsMediaSource}s. The factory will use the following default
- * components:
- *
- *
- * - {@link DefaultDrmSessionManagerProvider}
- *
- {@link DefaultLoadErrorHandlingPolicy}
- *
- {@link DefaultCompositeSequenceableLoaderFactory}
- *
+ * Creates a new factory for {@link SsMediaSource}s.
*
* @param chunkSourceFactory A factory for {@link SsChunkSource} instances.
* @param manifestDataSourceFactory A factory for {@link DataSource} instances that will be used
@@ -136,14 +120,19 @@ public final class SsMediaSource extends BaseMediaSource
compositeSequenceableLoaderFactory = new DefaultCompositeSequenceableLoaderFactory();
}
- @Override
- public Factory setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy loadErrorHandlingPolicy) {
+ /**
+ * 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) {
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.");
+ loadErrorHandlingPolicy != null
+ ? loadErrorHandlingPolicy
+ : new DefaultLoadErrorHandlingPolicy();
return this;
}
@@ -195,13 +184,11 @@ public final class SsMediaSource extends BaseMediaSource
@Override
public Factory setDrmSessionManagerProvider(
- DrmSessionManagerProvider drmSessionManagerProvider) {
+ @Nullable DrmSessionManagerProvider drmSessionManagerProvider) {
this.drmSessionManagerProvider =
- 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.");
+ drmSessionManagerProvider != null
+ ? drmSessionManagerProvider
+ : new DefaultDrmSessionManagerProvider();
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 f5a205fcbe..28ca0c58a7 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,6 +85,21 @@ 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 bd92f38471..f87863c64f 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,6 +15,7 @@
*/
package androidx.media3.test.utils;
+import androidx.annotation.Nullable;
import androidx.media3.common.AdPlaybackState;
import androidx.media3.common.C;
import androidx.media3.common.MediaItem;
@@ -38,13 +39,13 @@ public final class FakeMediaSourceFactory implements MediaSourceFactory {
@Override
public MediaSourceFactory setDrmSessionManagerProvider(
- DrmSessionManagerProvider drmSessionManagerProvider) {
+ @Nullable DrmSessionManagerProvider drmSessionManagerProvider) {
throw new UnsupportedOperationException();
}
@Override
public MediaSourceFactory setLoadErrorHandlingPolicy(
- LoadErrorHandlingPolicy loadErrorHandlingPolicy) {
+ @Nullable LoadErrorHandlingPolicy loadErrorHandlingPolicy) {
throw new UnsupportedOperationException();
}