Rollback of 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 implementation is only used if the
parameter is `null`.

PiperOrigin-RevId: 450410833
This commit is contained in:
ibaker 2022-05-23 13:01:22 +01:00 committed by Ian Baker
parent 8d03fdfe34
commit 1d139174fd
15 changed files with 174 additions and 198 deletions

View File

@ -18,11 +18,6 @@
([#10248](https://github.com/google/ExoPlayer/issues/10248)). ([#10248](https://github.com/google/ExoPlayer/issues/10248)).
* Stop detecting 5G-NSA network type on API 29 and 30. These playbacks * Stop detecting 5G-NSA network type on API 29 and 30. These playbacks
will assume a 4G network. 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: * Track selection:
* Flatten `TrackSelectionOverrides` class into `TrackSelectionParameters`, * Flatten `TrackSelectionOverrides` class into `TrackSelectionParameters`,
and promote `TrackSelectionOverride` to a top level class. and promote `TrackSelectionOverride` to a top level class.

View File

@ -952,12 +952,10 @@ public final class DownloadHelper {
MediaItem mediaItem, MediaItem mediaItem,
DataSource.Factory dataSourceFactory, DataSource.Factory dataSourceFactory,
@Nullable DrmSessionManager drmSessionManager) { @Nullable DrmSessionManager drmSessionManager) {
DefaultMediaSourceFactory mediaSourceFactory = return new DefaultMediaSourceFactory(dataSourceFactory, ExtractorsFactory.EMPTY)
new DefaultMediaSourceFactory(dataSourceFactory, ExtractorsFactory.EMPTY); .setDrmSessionManagerProvider(
if (drmSessionManager != null) { drmSessionManager != null ? unusedMediaItem -> drmSessionManager : null)
mediaSourceFactory.setDrmSessionManagerProvider(unusedMediaItem -> drmSessionManager); .createMediaSource(mediaItem);
}
return mediaSourceFactory.createMediaSource(mediaItem);
} }
private static boolean isProgressive(MediaItem.LocalConfiguration localConfiguration) { private static boolean isProgressive(MediaItem.LocalConfiguration localConfiguration) {

View File

@ -345,26 +345,16 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory {
@UnstableApi @UnstableApi
@Override @Override
public DefaultMediaSourceFactory setDrmSessionManagerProvider( public DefaultMediaSourceFactory setDrmSessionManagerProvider(
DrmSessionManagerProvider drmSessionManagerProvider) { @Nullable DrmSessionManagerProvider drmSessionManagerProvider) {
delegateFactoryLoader.setDrmSessionManagerProvider( delegateFactoryLoader.setDrmSessionManagerProvider(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."));
return this; return this;
} }
@UnstableApi @UnstableApi
@Override @Override
public DefaultMediaSourceFactory setLoadErrorHandlingPolicy( public DefaultMediaSourceFactory setLoadErrorHandlingPolicy(
LoadErrorHandlingPolicy loadErrorHandlingPolicy) { @Nullable LoadErrorHandlingPolicy loadErrorHandlingPolicy) {
this.loadErrorHandlingPolicy = this.loadErrorHandlingPolicy = 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); delegateFactoryLoader.setLoadErrorHandlingPolicy(loadErrorHandlingPolicy);
return this; return this;
} }
@ -441,23 +431,16 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory {
SubtitleDecoderFactory.DEFAULT.createDecoder(format), format) SubtitleDecoderFactory.DEFAULT.createDecoder(format), format)
: new UnknownSubtitlesExtractor(format) : new UnknownSubtitlesExtractor(format)
}; };
ProgressiveMediaSource.Factory progressiveMediaSourceFactory =
new ProgressiveMediaSource.Factory(dataSourceFactory, extractorsFactory);
if (loadErrorHandlingPolicy != null) {
progressiveMediaSourceFactory.setLoadErrorHandlingPolicy(loadErrorHandlingPolicy);
}
mediaSources[i + 1] = mediaSources[i + 1] =
progressiveMediaSourceFactory.createMediaSource( new ProgressiveMediaSource.Factory(dataSourceFactory, extractorsFactory)
.setLoadErrorHandlingPolicy(loadErrorHandlingPolicy)
.createMediaSource(
MediaItem.fromUri(subtitleConfigurations.get(i).uri.toString())); MediaItem.fromUri(subtitleConfigurations.get(i).uri.toString()));
} else { } else {
SingleSampleMediaSource.Factory singleSampleMediaSourceFactory =
new SingleSampleMediaSource.Factory(dataSourceFactory);
if (loadErrorHandlingPolicy != null) {
singleSampleMediaSourceFactory.setLoadErrorHandlingPolicy(loadErrorHandlingPolicy);
}
mediaSources[i + 1] = mediaSources[i + 1] =
singleSampleMediaSourceFactory.createMediaSource( new SingleSampleMediaSource.Factory(dataSourceFactory)
subtitleConfigurations.get(i), /* durationUs= */ C.TIME_UNSET); .setLoadErrorHandlingPolicy(loadErrorHandlingPolicy)
.createMediaSource(subtitleConfigurations.get(i), /* durationUs= */ C.TIME_UNSET);
} }
} }
@ -566,14 +549,16 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory {
return mediaSourceFactory; return mediaSourceFactory;
} }
public void setDrmSessionManagerProvider(DrmSessionManagerProvider drmSessionManagerProvider) { public void setDrmSessionManagerProvider(
@Nullable DrmSessionManagerProvider drmSessionManagerProvider) {
this.drmSessionManagerProvider = drmSessionManagerProvider; this.drmSessionManagerProvider = drmSessionManagerProvider;
for (MediaSource.Factory mediaSourceFactory : mediaSourceFactories.values()) { for (MediaSource.Factory mediaSourceFactory : mediaSourceFactories.values()) {
mediaSourceFactory.setDrmSessionManagerProvider(drmSessionManagerProvider); mediaSourceFactory.setDrmSessionManagerProvider(drmSessionManagerProvider);
} }
} }
public void setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy loadErrorHandlingPolicy) { public void setLoadErrorHandlingPolicy(
@Nullable LoadErrorHandlingPolicy loadErrorHandlingPolicy) {
this.loadErrorHandlingPolicy = loadErrorHandlingPolicy; this.loadErrorHandlingPolicy = loadErrorHandlingPolicy;
for (MediaSource.Factory mediaSourceFactory : mediaSourceFactories.values()) { for (MediaSource.Factory mediaSourceFactory : mediaSourceFactories.values()) {
mediaSourceFactory.setLoadErrorHandlingPolicy(loadErrorHandlingPolicy); mediaSourceFactory.setLoadErrorHandlingPolicy(loadErrorHandlingPolicy);

View File

@ -24,10 +24,12 @@ import androidx.media3.common.util.UnstableApi;
import androidx.media3.datasource.TransferListener; import androidx.media3.datasource.TransferListener;
import androidx.media3.exoplayer.ExoPlayer; import androidx.media3.exoplayer.ExoPlayer;
import androidx.media3.exoplayer.analytics.PlayerId; import androidx.media3.exoplayer.analytics.PlayerId;
import androidx.media3.exoplayer.drm.DefaultDrmSessionManagerProvider;
import androidx.media3.exoplayer.drm.DrmSessionEventListener; import androidx.media3.exoplayer.drm.DrmSessionEventListener;
import androidx.media3.exoplayer.drm.DrmSessionManager; import androidx.media3.exoplayer.drm.DrmSessionManager;
import androidx.media3.exoplayer.drm.DrmSessionManagerProvider; import androidx.media3.exoplayer.drm.DrmSessionManagerProvider;
import androidx.media3.exoplayer.upstream.Allocator; import androidx.media3.exoplayer.upstream.Allocator;
import androidx.media3.exoplayer.upstream.DefaultLoadErrorHandlingPolicy;
import androidx.media3.exoplayer.upstream.LoadErrorHandlingPolicy; import androidx.media3.exoplayer.upstream.LoadErrorHandlingPolicy;
import java.io.IOException; import java.io.IOException;
@ -67,18 +69,23 @@ public interface MediaSource {
* Sets the {@link DrmSessionManagerProvider} used to obtain a {@link DrmSessionManager} for a * Sets the {@link DrmSessionManagerProvider} used to obtain a {@link DrmSessionManager} for a
* {@link MediaItem}. * {@link MediaItem}.
* *
* @return This factory, for convenience. * <p>If not set, {@link DefaultDrmSessionManagerProvider} is used.
*/
@UnstableApi
Factory setDrmSessionManagerProvider(DrmSessionManagerProvider drmSessionManagerProvider);
/**
* Sets an optional {@link LoadErrorHandlingPolicy}.
* *
* @return This factory, for convenience. * @return This factory, for convenience.
*/ */
@UnstableApi @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 * Returns the {@link C.ContentType content types} supported by media sources created by this

View File

@ -65,18 +65,10 @@ public final class ProgressiveMediaSource extends BaseMediaSource
@Nullable private Object tag; @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}.
* *
* <p>The factory will use the following default components: * @param dataSourceFactory A factory for {@link DataSource}s to read the media.
*
* <ul>
* <li>{@link DefaultExtractorsFactory}
* <li>{@link DefaultDrmSessionManagerProvider}
* <li>{@link DefaultLoadErrorHandlingPolicy}
* </ul>
*
* @param dataSourceFactory A factory for {@linkplain DataSource data sources} to read the
* media.
*/ */
public Factory(DataSource.Factory dataSourceFactory) { public Factory(DataSource.Factory dataSourceFactory) {
this(dataSourceFactory, new DefaultExtractorsFactory()); this(dataSourceFactory, new DefaultExtractorsFactory());
@ -85,18 +77,6 @@ public final class ProgressiveMediaSource extends BaseMediaSource
/** /**
* Equivalent to {@link #Factory(DataSource.Factory, ProgressiveMediaExtractor.Factory) new * Equivalent to {@link #Factory(DataSource.Factory, ProgressiveMediaExtractor.Factory) new
* Factory(dataSourceFactory, () -> new BundledExtractorsAdapter(extractorsFactory)}. * Factory(dataSourceFactory, () -> new BundledExtractorsAdapter(extractorsFactory)}.
*
* <p>The factory will use the following default components:
*
* <ul>
* <li>{@link DefaultDrmSessionManagerProvider}
* <li>{@link DefaultLoadErrorHandlingPolicy}
* </ul>
*
* @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) { public Factory(DataSource.Factory dataSourceFactory, ExtractorsFactory extractorsFactory) {
this(dataSourceFactory, playerId -> new BundledExtractorsAdapter(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. * Creates a new factory for {@link ProgressiveMediaSource}s.
* *
* <p>The factory will use the following default components: * @param dataSourceFactory A factory for {@link DataSource}s to read the media.
*
* <ul>
* <li>{@link DefaultDrmSessionManagerProvider}
* <li>{@link DefaultLoadErrorHandlingPolicy}
* </ul>
*
* @param dataSourceFactory A factory for {@linkplain DataSource data sources} to read the
* media.
* @param progressiveMediaExtractorFactory A factory for the {@link ProgressiveMediaExtractor} * @param progressiveMediaExtractorFactory A factory for the {@link ProgressiveMediaExtractor}
* to extract the media from its container. * to extract media from its container.
*/ */
public Factory( public Factory(
DataSource.Factory dataSourceFactory, DataSource.Factory dataSourceFactory,
@ -131,8 +103,7 @@ public final class ProgressiveMediaSource extends BaseMediaSource
/** /**
* Creates a new factory for {@link ProgressiveMediaSource}s. * Creates a new factory for {@link ProgressiveMediaSource}s.
* *
* @param dataSourceFactory A factory for {@linkplain DataSource data sources} to read the * @param dataSourceFactory A factory for {@link DataSource}s to read the media.
* media.
* @param progressiveMediaExtractorFactory A factory for the {@link ProgressiveMediaExtractor} * @param progressiveMediaExtractorFactory A factory for the {@link ProgressiveMediaExtractor}
* to extract media from its container. * to extract media from its container.
* @param drmSessionManagerProvider A provider to obtain a {@link DrmSessionManager} for a * @param drmSessionManagerProvider A provider to obtain a {@link DrmSessionManager} for a
@ -155,14 +126,19 @@ public final class ProgressiveMediaSource extends BaseMediaSource
this.continueLoadingCheckIntervalBytes = continueLoadingCheckIntervalBytes; 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 = this.loadErrorHandlingPolicy =
checkNotNull( loadErrorHandlingPolicy != null
loadErrorHandlingPolicy, ? loadErrorHandlingPolicy
"MediaSource.Factory#setLoadErrorHandlingPolicy no longer handles null by" : new DefaultLoadErrorHandlingPolicy();
+ " instantiating a new DefaultLoadErrorHandlingPolicy. Explicitly construct and"
+ " pass an instance in order to retain the old behavior.");
return this; return this;
} }
@ -183,13 +159,11 @@ public final class ProgressiveMediaSource extends BaseMediaSource
@Override @Override
public Factory setDrmSessionManagerProvider( public Factory setDrmSessionManagerProvider(
DrmSessionManagerProvider drmSessionManagerProvider) { @Nullable DrmSessionManagerProvider drmSessionManagerProvider) {
this.drmSessionManagerProvider = this.drmSessionManagerProvider =
checkNotNull( drmSessionManagerProvider != null
drmSessionManagerProvider, ? drmSessionManagerProvider
"MediaSource.Factory#setDrmSessionManagerProvider no longer handles null by" : new DefaultDrmSessionManagerProvider();
+ " instantiating a new DefaultDrmSessionManagerProvider. Explicitly construct"
+ " and pass an instance in order to retain the old behavior.");
return this; return this;
} }

View File

@ -73,6 +73,21 @@ public final class DefaultMediaSourceFactoryTest {
assertThat(mediaSource).isInstanceOf(ProgressiveMediaSource.class); 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 @Test
public void createMediaSource_withSubtitle_isMergingMediaSource() { public void createMediaSource_withSubtitle_isMergingMediaSource() {
DefaultMediaSourceFactory defaultMediaSourceFactory = DefaultMediaSourceFactory defaultMediaSourceFactory =

View File

@ -114,15 +114,6 @@ public final class DashMediaSource extends BaseMediaSource {
/** /**
* Creates a new factory for {@link DashMediaSource}s. * Creates a new factory for {@link DashMediaSource}s.
* *
* <p>The factory will use the following default components:
*
* <ul>
* <li>{@link DefaultDashChunkSource.Factory}
* <li>{@link DefaultDrmSessionManagerProvider}
* <li>{@link DefaultLoadErrorHandlingPolicy}
* <li>{@link DefaultCompositeSequenceableLoaderFactory}
* </ul>
*
* @param dataSourceFactory A factory for {@link DataSource} instances that will be used to load * @param dataSourceFactory A factory for {@link DataSource} instances that will be used to load
* manifest and media data. * manifest and media data.
*/ */
@ -133,14 +124,6 @@ public final class DashMediaSource extends BaseMediaSource {
/** /**
* Creates a new factory for {@link DashMediaSource}s. * Creates a new factory for {@link DashMediaSource}s.
* *
* <p>The factory will use the following default components:
*
* <ul>
* <li>{@link DefaultDrmSessionManagerProvider}
* <li>{@link DefaultLoadErrorHandlingPolicy}
* <li>{@link DefaultCompositeSequenceableLoaderFactory}
* </ul>
*
* @param chunkSourceFactory A factory for {@link DashChunkSource} instances. * @param chunkSourceFactory A factory for {@link DashChunkSource} instances.
* @param manifestDataSourceFactory A factory for {@link DataSource} instances that will be used * @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 * 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 @Override
public Factory setDrmSessionManagerProvider( public Factory setDrmSessionManagerProvider(
DrmSessionManagerProvider drmSessionManagerProvider) { @Nullable DrmSessionManagerProvider drmSessionManagerProvider) {
this.drmSessionManagerProvider = this.drmSessionManagerProvider =
checkNotNull( drmSessionManagerProvider != null
drmSessionManagerProvider, ? drmSessionManagerProvider
"MediaSource.Factory#setDrmSessionManagerProvider no longer handles null by" : new DefaultDrmSessionManagerProvider();
+ " instantiating a new DefaultDrmSessionManagerProvider. Explicitly construct"
+ " and pass an instance in order to retain the old behavior.");
return this; 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 = this.loadErrorHandlingPolicy =
checkNotNull( loadErrorHandlingPolicy != null
loadErrorHandlingPolicy, ? loadErrorHandlingPolicy
"MediaSource.Factory#setLoadErrorHandlingPolicy no longer handles null by" : new DefaultLoadErrorHandlingPolicy();
+ " instantiating a new DefaultLoadErrorHandlingPolicy. Explicitly construct and"
+ " pass an instance in order to retain the old behavior.");
return this; return this;
} }

View File

@ -74,6 +74,21 @@ public class DefaultMediaSourceFactoryTest {
assertThat(mediaSource).isInstanceOf(DashMediaSource.class); 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 @Test
public void getSupportedTypes_dashModule_containsTypeDash() { public void getSupportedTypes_dashModule_containsTypeDash() {
int[] supportedTypes = int[] supportedTypes =

View File

@ -114,17 +114,6 @@ public final class HlsMediaSource extends BaseMediaSource
/** /**
* Creates a new factory for {@link HlsMediaSource}s. * Creates a new factory for {@link HlsMediaSource}s.
* *
* <p>The factory will use the following default components:
*
* <ul>
* <li>{@link DefaultDrmSessionManagerProvider}
* <li>{@link DefaultHlsPlaylistParserFactory}
* <li>{@link DefaultHlsPlaylistTracker#FACTORY}
* <li>{@link HlsExtractorFactory#DEFAULT}
* <li>{@link DefaultLoadErrorHandlingPolicy}
* <li>{@link DefaultCompositeSequenceableLoaderFactory}
* </ul>
*
* @param dataSourceFactory A data source factory that will be wrapped by a {@link * @param dataSourceFactory A data source factory that will be wrapped by a {@link
* DefaultHlsDataSourceFactory} to create {@link DataSource}s for manifests, segments and * DefaultHlsDataSourceFactory} to create {@link DataSource}s for manifests, segments and
* keys. * keys.
@ -136,17 +125,6 @@ public final class HlsMediaSource extends BaseMediaSource
/** /**
* Creates a new factory for {@link HlsMediaSource}s. * Creates a new factory for {@link HlsMediaSource}s.
* *
* <p>The factory will use the following default components:
*
* <ul>
* <li>{@link DefaultDrmSessionManagerProvider}
* <li>{@link DefaultHlsPlaylistParserFactory}
* <li>{@link DefaultHlsPlaylistTracker#FACTORY}
* <li>{@link HlsExtractorFactory#DEFAULT}
* <li>{@link DefaultLoadErrorHandlingPolicy}
* <li>{@link DefaultCompositeSequenceableLoaderFactory}
* </ul>
*
* @param hlsDataSourceFactory An {@link HlsDataSourceFactory} for {@link DataSource}s for * @param hlsDataSourceFactory An {@link HlsDataSourceFactory} for {@link DataSource}s for
* manifests, segments and keys. * manifests, segments and keys.
*/ */
@ -177,14 +155,19 @@ public final class HlsMediaSource extends BaseMediaSource
return this; 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 = this.loadErrorHandlingPolicy =
checkNotNull( loadErrorHandlingPolicy != null
loadErrorHandlingPolicy, ? loadErrorHandlingPolicy
"MediaSource.Factory#setLoadErrorHandlingPolicy no longer handles null by" : new DefaultLoadErrorHandlingPolicy();
+ " instantiating a new DefaultLoadErrorHandlingPolicy. Explicitly construct and"
+ " pass an instance in order to retain the old behavior.");
return this; return this;
} }
@ -293,13 +276,11 @@ public final class HlsMediaSource extends BaseMediaSource
@Override @Override
public Factory setDrmSessionManagerProvider( public Factory setDrmSessionManagerProvider(
DrmSessionManagerProvider drmSessionManagerProvider) { @Nullable DrmSessionManagerProvider drmSessionManagerProvider) {
this.drmSessionManagerProvider = this.drmSessionManagerProvider =
checkNotNull( drmSessionManagerProvider != null
drmSessionManagerProvider, ? drmSessionManagerProvider
"MediaSource.Factory#setDrmSessionManagerProvider no longer handles null by" : new DefaultDrmSessionManagerProvider();
+ " instantiating a new DefaultDrmSessionManagerProvider. Explicitly construct"
+ " and pass an instance in order to retain the old behavior.");
return this; return this;
} }

View File

@ -74,6 +74,21 @@ public class DefaultMediaSourceFactoryTest {
assertThat(mediaSource).isInstanceOf(HlsMediaSource.class); 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 @Test
public void getSupportedTypes_hlsModule_containsTypeHls() { public void getSupportedTypes_hlsModule_containsTypeHls() {
int[] supportedTypes = int[] supportedTypes =

View File

@ -136,14 +136,14 @@ public final class ImaServerSideAdInsertionMediaSource extends CompositeMediaSou
@Override @Override
public MediaSource.Factory setLoadErrorHandlingPolicy( public MediaSource.Factory setLoadErrorHandlingPolicy(
LoadErrorHandlingPolicy loadErrorHandlingPolicy) { @Nullable LoadErrorHandlingPolicy loadErrorHandlingPolicy) {
contentMediaSourceFactory.setLoadErrorHandlingPolicy(loadErrorHandlingPolicy); contentMediaSourceFactory.setLoadErrorHandlingPolicy(loadErrorHandlingPolicy);
return this; return this;
} }
@Override @Override
public MediaSource.Factory setDrmSessionManagerProvider( public MediaSource.Factory setDrmSessionManagerProvider(
DrmSessionManagerProvider drmSessionManagerProvider) { @Nullable DrmSessionManagerProvider drmSessionManagerProvider) {
contentMediaSourceFactory.setDrmSessionManagerProvider(drmSessionManagerProvider); contentMediaSourceFactory.setDrmSessionManagerProvider(drmSessionManagerProvider);
return this; return this;
} }

View File

@ -148,13 +148,15 @@ public final class RtspMediaSource extends BaseMediaSource {
/** Does nothing. {@link RtspMediaSource} does not support DRM. */ /** Does nothing. {@link RtspMediaSource} does not support DRM. */
@Override @Override
public Factory setDrmSessionManagerProvider(DrmSessionManagerProvider drmSessionManager) { public Factory setDrmSessionManagerProvider(
@Nullable DrmSessionManagerProvider drmSessionManager) {
return this; return this;
} }
/** Does nothing. {@link RtspMediaSource} does not support error handling policies. */ /** Does nothing. {@link RtspMediaSource} does not support error handling policies. */
@Override @Override
public Factory setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy loadErrorHandlingPolicy) { public Factory setLoadErrorHandlingPolicy(
@Nullable LoadErrorHandlingPolicy loadErrorHandlingPolicy) {
// TODO(internal b/172331505): Implement support. // TODO(internal b/172331505): Implement support.
return this; return this;
} }

View File

@ -93,15 +93,6 @@ public final class SsMediaSource extends BaseMediaSource
/** /**
* Creates a new factory for {@link SsMediaSource}s. * Creates a new factory for {@link SsMediaSource}s.
* *
* <p>The factory will use the following default components:
*
* <ul>
* <li>{@link DefaultSsChunkSource.Factory}
* <li>{@link DefaultDrmSessionManagerProvider}
* <li>{@link DefaultLoadErrorHandlingPolicy}
* <li>{@link DefaultCompositeSequenceableLoaderFactory}
* </ul>
*
* @param dataSourceFactory A factory for {@link DataSource} instances that will be used to load * @param dataSourceFactory A factory for {@link DataSource} instances that will be used to load
* manifest and media data. * 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 * Creates a new factory for {@link SsMediaSource}s.
* components:
*
* <ul>
* <li>{@link DefaultDrmSessionManagerProvider}
* <li>{@link DefaultLoadErrorHandlingPolicy}
* <li>{@link DefaultCompositeSequenceableLoaderFactory}
* </ul>
* *
* @param chunkSourceFactory A factory for {@link SsChunkSource} instances. * @param chunkSourceFactory A factory for {@link SsChunkSource} instances.
* @param manifestDataSourceFactory A factory for {@link DataSource} instances that will be used * @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(); 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 = this.loadErrorHandlingPolicy =
checkNotNull( loadErrorHandlingPolicy != null
loadErrorHandlingPolicy, ? loadErrorHandlingPolicy
"MediaSource.Factory#setLoadErrorHandlingPolicy no longer handles null by" : new DefaultLoadErrorHandlingPolicy();
+ " instantiating a new DefaultLoadErrorHandlingPolicy. Explicitly construct and"
+ " pass an instance in order to retain the old behavior.");
return this; return this;
} }
@ -195,13 +184,11 @@ public final class SsMediaSource extends BaseMediaSource
@Override @Override
public Factory setDrmSessionManagerProvider( public Factory setDrmSessionManagerProvider(
DrmSessionManagerProvider drmSessionManagerProvider) { @Nullable DrmSessionManagerProvider drmSessionManagerProvider) {
this.drmSessionManagerProvider = this.drmSessionManagerProvider =
checkNotNull( drmSessionManagerProvider != null
drmSessionManagerProvider, ? drmSessionManagerProvider
"MediaSource.Factory#setDrmSessionManagerProvider no longer handles null by" : new DefaultDrmSessionManagerProvider();
+ " instantiating a new DefaultDrmSessionManagerProvider. Explicitly construct"
+ " and pass an instance in order to retain the old behavior.");
return this; return this;
} }

View File

@ -85,6 +85,21 @@ public class DefaultMediaSourceFactoryTest {
assertThat(mediaSource).isInstanceOf(SsMediaSource.class); 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 @Test
public void getSupportedTypes_smoothstreamingModule_containsTypeSS() { public void getSupportedTypes_smoothstreamingModule_containsTypeSS() {
int[] supportedTypes = int[] supportedTypes =

View File

@ -15,6 +15,7 @@
*/ */
package androidx.media3.test.utils; package androidx.media3.test.utils;
import androidx.annotation.Nullable;
import androidx.media3.common.AdPlaybackState; import androidx.media3.common.AdPlaybackState;
import androidx.media3.common.C; import androidx.media3.common.C;
import androidx.media3.common.MediaItem; import androidx.media3.common.MediaItem;
@ -38,13 +39,13 @@ public final class FakeMediaSourceFactory implements MediaSourceFactory {
@Override @Override
public MediaSourceFactory setDrmSessionManagerProvider( public MediaSourceFactory setDrmSessionManagerProvider(
DrmSessionManagerProvider drmSessionManagerProvider) { @Nullable DrmSessionManagerProvider drmSessionManagerProvider) {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }
@Override @Override
public MediaSourceFactory setLoadErrorHandlingPolicy( public MediaSourceFactory setLoadErrorHandlingPolicy(
LoadErrorHandlingPolicy loadErrorHandlingPolicy) { @Nullable LoadErrorHandlingPolicy loadErrorHandlingPolicy) {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }