Remove @Nullable from some Dash/Hls/SsMediaSource.Factory methods

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`.

Follow-up to 07302a23bd

PiperOrigin-RevId: 450395941
This commit is contained in:
ibaker 2022-05-23 11:19:47 +01:00 committed by Ian Baker
parent 07302a23bd
commit 07039a45b0
4 changed files with 51 additions and 30 deletions

View File

@ -74,10 +74,27 @@
* Parse channel count from DTS `AudioChannelConfiguration` elements. This * Parse channel count from DTS `AudioChannelConfiguration` elements. This
re-enables audio passthrough for DTS streams re-enables audio passthrough for DTS streams
([#10159](https://github.com/google/ExoPlayer/issues/10159)). ([#10159](https://github.com/google/ExoPlayer/issues/10159)).
* Disallow passing `null` to
`DashMediaSource.Factory.setCompositeSequenceableLoaderFactory`.
Instances of `DefaultCompositeSequenceableLoaderFactory` can be passed
explicitly if required.
* HLS: * HLS:
* Fallback to chunkful preparation if the playlist CODECS attribute does * Fallback to chunkful preparation if the playlist CODECS attribute does
not contain the audio codec not contain the audio codec
([#10065](https://github.com/google/ExoPlayer/issues/10065)). ([#10065](https://github.com/google/ExoPlayer/issues/10065)).
* Disallow passing `null` to
`HlsMediaSource.Factory.setCompositeSequenceableLoaderFactory`,
`HlsMediaSource.Factory.setPlaylistParserFactory`, and
`HlsMediaSource.Factory.setPlaylistTrackerFactory`. Instances of
`DefaultCompositeSequenceableLoaderFactory`,
`DefaultHlsPlaylistParserFactory`, or a reference to
`DefaultHlsPlaylistTracker.FACTORY` can be passed explicitly if
required.
* Smooth Streaming:
* Disallow passing `null` to
`SsMediaSource.Factory.setCompositeSequenceableLoaderFactory`. Instances
of `DefaultCompositeSequenceableLoaderFactory` can be passed explicitly
if required.
* RTSP: * RTSP:
* Add RTP reader for MPEG4 * Add RTP reader for MPEG4
([#35](https://github.com/androidx/media/pull/35)). ([#35](https://github.com/androidx/media/pull/35)).

View File

@ -218,11 +218,13 @@ public final class DashMediaSource extends BaseMediaSource {
* @return This factory, for convenience. * @return This factory, for convenience.
*/ */
public Factory setCompositeSequenceableLoaderFactory( public Factory setCompositeSequenceableLoaderFactory(
@Nullable CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory) { CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory) {
this.compositeSequenceableLoaderFactory = this.compositeSequenceableLoaderFactory =
compositeSequenceableLoaderFactory != null checkNotNull(
? compositeSequenceableLoaderFactory compositeSequenceableLoaderFactory,
: new DefaultCompositeSequenceableLoaderFactory(); "DashMediaSource.Factory#setCompositeSequenceableLoaderFactory no longer handles null"
+ " by instantiating a new DefaultCompositeSequenceableLoaderFactory. Explicitly"
+ " construct and pass an instance in order to retain the old behavior.");
return this; return this;
} }

View File

@ -189,41 +189,40 @@ public final class HlsMediaSource extends BaseMediaSource
} }
/** /**
* Sets the factory from which playlist parsers will be obtained. The default value is a {@link * Sets the factory from which playlist parsers will be obtained.
* DefaultHlsPlaylistParserFactory}.
* *
* @param playlistParserFactory An {@link HlsPlaylistParserFactory}. * @param playlistParserFactory An {@link HlsPlaylistParserFactory}.
* @return This factory, for convenience. * @return This factory, for convenience.
*/ */
public Factory setPlaylistParserFactory( public Factory setPlaylistParserFactory(HlsPlaylistParserFactory playlistParserFactory) {
@Nullable HlsPlaylistParserFactory playlistParserFactory) {
this.playlistParserFactory = this.playlistParserFactory =
playlistParserFactory != null checkNotNull(
? playlistParserFactory playlistParserFactory,
: new DefaultHlsPlaylistParserFactory(); "HlsMediaSource.Factory#setPlaylistParserFactory no longer handles null by"
+ " instantiating a new DefaultHlsPlaylistParserFactory. Explicitly"
+ " construct and pass an instance in order to retain the old behavior.");
return this; return this;
} }
/** /**
* Sets the {@link HlsPlaylistTracker} factory. The default value is {@link * Sets the {@link HlsPlaylistTracker} factory.
* DefaultHlsPlaylistTracker#FACTORY}.
* *
* @param playlistTrackerFactory A factory for {@link HlsPlaylistTracker} instances. * @param playlistTrackerFactory A factory for {@link HlsPlaylistTracker} instances.
* @return This factory, for convenience. * @return This factory, for convenience.
*/ */
public Factory setPlaylistTrackerFactory( public Factory setPlaylistTrackerFactory(HlsPlaylistTracker.Factory playlistTrackerFactory) {
@Nullable HlsPlaylistTracker.Factory playlistTrackerFactory) {
this.playlistTrackerFactory = this.playlistTrackerFactory =
playlistTrackerFactory != null checkNotNull(
? playlistTrackerFactory playlistTrackerFactory,
: DefaultHlsPlaylistTracker.FACTORY; "HlsMediaSource.Factory#setPlaylistTrackerFactory no longer handles null by"
+ " defaulting to DefaultHlsPlaylistTracker.FACTORY. Explicitly"
+ " pass a reference to this instance in order to retain the old behavior.");
return this; return this;
} }
/** /**
* Sets the factory to create composite {@link SequenceableLoader}s for when this media source * Sets the factory to create composite {@link SequenceableLoader}s for when this media source
* loads data from multiple streams (video, audio etc...). The default is an instance of {@link * loads data from multiple streams (video, audio etc...).
* DefaultCompositeSequenceableLoaderFactory}.
* *
* @param compositeSequenceableLoaderFactory A factory to create composite {@link * @param compositeSequenceableLoaderFactory A factory to create composite {@link
* SequenceableLoader}s for when this media source loads data from multiple streams (video, * SequenceableLoader}s for when this media source loads data from multiple streams (video,
@ -231,11 +230,13 @@ public final class HlsMediaSource extends BaseMediaSource
* @return This factory, for convenience. * @return This factory, for convenience.
*/ */
public Factory setCompositeSequenceableLoaderFactory( public Factory setCompositeSequenceableLoaderFactory(
@Nullable CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory) { CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory) {
this.compositeSequenceableLoaderFactory = this.compositeSequenceableLoaderFactory =
compositeSequenceableLoaderFactory != null checkNotNull(
? compositeSequenceableLoaderFactory compositeSequenceableLoaderFactory,
: new DefaultCompositeSequenceableLoaderFactory(); "HlsMediaSource.Factory#setCompositeSequenceableLoaderFactory no longer handles null"
+ " by instantiating a new DefaultCompositeSequenceableLoaderFactory. Explicitly"
+ " construct and pass an instance in order to retain the old behavior.");
return this; return this;
} }

View File

@ -175,8 +175,7 @@ public final class SsMediaSource extends BaseMediaSource
/** /**
* Sets the factory to create composite {@link SequenceableLoader}s for when this media source * Sets the factory to create composite {@link SequenceableLoader}s for when this media source
* loads data from multiple streams (video, audio etc.). The default is an instance of {@link * loads data from multiple streams (video, audio etc.).
* DefaultCompositeSequenceableLoaderFactory}.
* *
* @param compositeSequenceableLoaderFactory A factory to create composite {@link * @param compositeSequenceableLoaderFactory A factory to create composite {@link
* SequenceableLoader}s for when this media source loads data from multiple streams (video, * SequenceableLoader}s for when this media source loads data from multiple streams (video,
@ -184,11 +183,13 @@ public final class SsMediaSource extends BaseMediaSource
* @return This factory, for convenience. * @return This factory, for convenience.
*/ */
public Factory setCompositeSequenceableLoaderFactory( public Factory setCompositeSequenceableLoaderFactory(
@Nullable CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory) { CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory) {
this.compositeSequenceableLoaderFactory = this.compositeSequenceableLoaderFactory =
compositeSequenceableLoaderFactory != null checkNotNull(
? compositeSequenceableLoaderFactory compositeSequenceableLoaderFactory,
: new DefaultCompositeSequenceableLoaderFactory(); "SsMediaSource.Factory#setCompositeSequenceableLoaderFactory no longer handles null"
+ " by instantiating a new DefaultCompositeSequenceableLoaderFactory. Explicitly"
+ " construct and pass an instance in order to retain the old behavior.");
return this; return this;
} }