Rollback of e01bb47263
*** Original commit ***
Rollback of 07302a23bd
*** 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
This commit is contained in:
parent
a8a4faa28c
commit
26a1817ebf
@ -18,6 +18,11 @@
|
|||||||
([#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.
|
||||||
|
@ -952,10 +952,12 @@ public final class DownloadHelper {
|
|||||||
MediaItem mediaItem,
|
MediaItem mediaItem,
|
||||||
DataSource.Factory dataSourceFactory,
|
DataSource.Factory dataSourceFactory,
|
||||||
@Nullable DrmSessionManager drmSessionManager) {
|
@Nullable DrmSessionManager drmSessionManager) {
|
||||||
return new DefaultMediaSourceFactory(dataSourceFactory, ExtractorsFactory.EMPTY)
|
DefaultMediaSourceFactory mediaSourceFactory =
|
||||||
.setDrmSessionManagerProvider(
|
new DefaultMediaSourceFactory(dataSourceFactory, ExtractorsFactory.EMPTY);
|
||||||
drmSessionManager != null ? unusedMediaItem -> drmSessionManager : null)
|
if (drmSessionManager != null) {
|
||||||
.createMediaSource(mediaItem);
|
mediaSourceFactory.setDrmSessionManagerProvider(unusedMediaItem -> drmSessionManager);
|
||||||
|
}
|
||||||
|
return mediaSourceFactory.createMediaSource(mediaItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isProgressive(MediaItem.LocalConfiguration localConfiguration) {
|
private static boolean isProgressive(MediaItem.LocalConfiguration localConfiguration) {
|
||||||
|
@ -370,16 +370,26 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory {
|
|||||||
@UnstableApi
|
@UnstableApi
|
||||||
@Override
|
@Override
|
||||||
public DefaultMediaSourceFactory setDrmSessionManagerProvider(
|
public DefaultMediaSourceFactory setDrmSessionManagerProvider(
|
||||||
@Nullable DrmSessionManagerProvider drmSessionManagerProvider) {
|
DrmSessionManagerProvider drmSessionManagerProvider) {
|
||||||
delegateFactoryLoader.setDrmSessionManagerProvider(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;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@UnstableApi
|
@UnstableApi
|
||||||
@Override
|
@Override
|
||||||
public DefaultMediaSourceFactory setLoadErrorHandlingPolicy(
|
public DefaultMediaSourceFactory setLoadErrorHandlingPolicy(
|
||||||
@Nullable LoadErrorHandlingPolicy loadErrorHandlingPolicy) {
|
LoadErrorHandlingPolicy loadErrorHandlingPolicy) {
|
||||||
this.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);
|
delegateFactoryLoader.setLoadErrorHandlingPolicy(loadErrorHandlingPolicy);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
@ -456,16 +466,23 @@ 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] =
|
||||||
new ProgressiveMediaSource.Factory(dataSourceFactory, extractorsFactory)
|
progressiveMediaSourceFactory.createMediaSource(
|
||||||
.setLoadErrorHandlingPolicy(loadErrorHandlingPolicy)
|
MediaItem.fromUri(subtitleConfigurations.get(i).uri.toString()));
|
||||||
.createMediaSource(
|
|
||||||
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] =
|
||||||
new SingleSampleMediaSource.Factory(dataSourceFactory)
|
singleSampleMediaSourceFactory.createMediaSource(
|
||||||
.setLoadErrorHandlingPolicy(loadErrorHandlingPolicy)
|
subtitleConfigurations.get(i), /* durationUs= */ C.TIME_UNSET);
|
||||||
.createMediaSource(subtitleConfigurations.get(i), /* durationUs= */ C.TIME_UNSET);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -581,16 +598,14 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setDrmSessionManagerProvider(
|
public void setDrmSessionManagerProvider(DrmSessionManagerProvider drmSessionManagerProvider) {
|
||||||
@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(
|
public void setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy loadErrorHandlingPolicy) {
|
||||||
@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);
|
||||||
|
@ -24,12 +24,10 @@ 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;
|
||||||
|
|
||||||
@ -69,23 +67,18 @@ 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}.
|
||||||
*
|
*
|
||||||
* <p>If not set, {@link DefaultDrmSessionManagerProvider} is used.
|
|
||||||
*
|
|
||||||
* @return This factory, for convenience.
|
* @return This factory, for convenience.
|
||||||
*/
|
*/
|
||||||
@UnstableApi
|
@UnstableApi
|
||||||
Factory setDrmSessionManagerProvider(
|
Factory setDrmSessionManagerProvider(DrmSessionManagerProvider drmSessionManagerProvider);
|
||||||
@Nullable DrmSessionManagerProvider drmSessionManagerProvider);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets an optional {@link LoadErrorHandlingPolicy}.
|
* Sets an optional {@link LoadErrorHandlingPolicy}.
|
||||||
*
|
*
|
||||||
* @param loadErrorHandlingPolicy A {@link LoadErrorHandlingPolicy}, or {@code null} to use the
|
|
||||||
* {@link DefaultLoadErrorHandlingPolicy}.
|
|
||||||
* @return This factory, for convenience.
|
* @return This factory, for convenience.
|
||||||
*/
|
*/
|
||||||
@UnstableApi
|
@UnstableApi
|
||||||
Factory setLoadErrorHandlingPolicy(@Nullable LoadErrorHandlingPolicy loadErrorHandlingPolicy);
|
Factory setLoadErrorHandlingPolicy(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
|
||||||
|
@ -65,10 +65,18 @@ public final class ProgressiveMediaSource extends BaseMediaSource
|
|||||||
@Nullable private Object tag;
|
@Nullable private Object tag;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new factory for {@link ProgressiveMediaSource}s, using the extractors provided by
|
* Creates a new factory for {@link ProgressiveMediaSource}s.
|
||||||
* {@link DefaultExtractorsFactory}.
|
|
||||||
*
|
*
|
||||||
* @param dataSourceFactory A factory for {@link DataSource}s to read the media.
|
* <p>The factory will use the following default components:
|
||||||
|
*
|
||||||
|
* <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());
|
||||||
@ -77,6 +85,18 @@ 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));
|
||||||
@ -85,9 +105,17 @@ 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 {@link DataSource}s to read the media.
|
* <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 progressiveMediaExtractorFactory A factory for the {@link ProgressiveMediaExtractor}
|
* @param progressiveMediaExtractorFactory A factory for the {@link ProgressiveMediaExtractor}
|
||||||
* to extract media from its container.
|
* to extract the media from its container.
|
||||||
*/
|
*/
|
||||||
public Factory(
|
public Factory(
|
||||||
DataSource.Factory dataSourceFactory,
|
DataSource.Factory dataSourceFactory,
|
||||||
@ -103,7 +131,8 @@ 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 {@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}
|
* @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
|
||||||
@ -126,19 +155,14 @@ public final class ProgressiveMediaSource extends BaseMediaSource
|
|||||||
this.continueLoadingCheckIntervalBytes = continueLoadingCheckIntervalBytes;
|
this.continueLoadingCheckIntervalBytes = continueLoadingCheckIntervalBytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@Override
|
||||||
* Sets the {@link LoadErrorHandlingPolicy}. The default value is created by calling {@link
|
public Factory setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy loadErrorHandlingPolicy) {
|
||||||
* DefaultLoadErrorHandlingPolicy#DefaultLoadErrorHandlingPolicy()}.
|
|
||||||
*
|
|
||||||
* @param loadErrorHandlingPolicy A {@link LoadErrorHandlingPolicy}.
|
|
||||||
* @return This factory, for convenience.
|
|
||||||
*/
|
|
||||||
public Factory setLoadErrorHandlingPolicy(
|
|
||||||
@Nullable LoadErrorHandlingPolicy loadErrorHandlingPolicy) {
|
|
||||||
this.loadErrorHandlingPolicy =
|
this.loadErrorHandlingPolicy =
|
||||||
loadErrorHandlingPolicy != null
|
checkNotNull(
|
||||||
? loadErrorHandlingPolicy
|
loadErrorHandlingPolicy,
|
||||||
: new DefaultLoadErrorHandlingPolicy();
|
"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;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -159,11 +183,13 @@ public final class ProgressiveMediaSource extends BaseMediaSource
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Factory setDrmSessionManagerProvider(
|
public Factory setDrmSessionManagerProvider(
|
||||||
@Nullable DrmSessionManagerProvider drmSessionManagerProvider) {
|
DrmSessionManagerProvider drmSessionManagerProvider) {
|
||||||
this.drmSessionManagerProvider =
|
this.drmSessionManagerProvider =
|
||||||
drmSessionManagerProvider != null
|
checkNotNull(
|
||||||
? drmSessionManagerProvider
|
drmSessionManagerProvider,
|
||||||
: new DefaultDrmSessionManagerProvider();
|
"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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -73,21 +73,6 @@ 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 =
|
||||||
|
@ -114,6 +114,15 @@ 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.
|
||||||
*/
|
*/
|
||||||
@ -124,6 +133,14 @@ 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
|
||||||
@ -143,27 +160,24 @@ public final class DashMediaSource extends BaseMediaSource {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Factory setDrmSessionManagerProvider(
|
public Factory setDrmSessionManagerProvider(
|
||||||
@Nullable DrmSessionManagerProvider drmSessionManagerProvider) {
|
DrmSessionManagerProvider drmSessionManagerProvider) {
|
||||||
this.drmSessionManagerProvider =
|
this.drmSessionManagerProvider =
|
||||||
drmSessionManagerProvider != null
|
checkNotNull(
|
||||||
? drmSessionManagerProvider
|
drmSessionManagerProvider,
|
||||||
: new DefaultDrmSessionManagerProvider();
|
"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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@Override
|
||||||
* Sets the {@link LoadErrorHandlingPolicy}. The default value is created by calling {@link
|
public Factory setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy loadErrorHandlingPolicy) {
|
||||||
* DefaultLoadErrorHandlingPolicy#DefaultLoadErrorHandlingPolicy()}.
|
|
||||||
*
|
|
||||||
* @param loadErrorHandlingPolicy A {@link LoadErrorHandlingPolicy}.
|
|
||||||
* @return This factory, for convenience.
|
|
||||||
*/
|
|
||||||
public Factory setLoadErrorHandlingPolicy(
|
|
||||||
@Nullable LoadErrorHandlingPolicy loadErrorHandlingPolicy) {
|
|
||||||
this.loadErrorHandlingPolicy =
|
this.loadErrorHandlingPolicy =
|
||||||
loadErrorHandlingPolicy != null
|
checkNotNull(
|
||||||
? loadErrorHandlingPolicy
|
loadErrorHandlingPolicy,
|
||||||
: new DefaultLoadErrorHandlingPolicy();
|
"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;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -74,21 +74,6 @@ 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 =
|
||||||
|
@ -114,6 +114,17 @@ 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.
|
||||||
@ -125,6 +136,17 @@ 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.
|
||||||
*/
|
*/
|
||||||
@ -155,19 +177,14 @@ public final class HlsMediaSource extends BaseMediaSource
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@Override
|
||||||
* Sets the {@link LoadErrorHandlingPolicy}. The default value is created by calling {@link
|
public Factory setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy loadErrorHandlingPolicy) {
|
||||||
* DefaultLoadErrorHandlingPolicy#DefaultLoadErrorHandlingPolicy()}.
|
|
||||||
*
|
|
||||||
* @param loadErrorHandlingPolicy A {@link LoadErrorHandlingPolicy}.
|
|
||||||
* @return This factory, for convenience.
|
|
||||||
*/
|
|
||||||
public Factory setLoadErrorHandlingPolicy(
|
|
||||||
@Nullable LoadErrorHandlingPolicy loadErrorHandlingPolicy) {
|
|
||||||
this.loadErrorHandlingPolicy =
|
this.loadErrorHandlingPolicy =
|
||||||
loadErrorHandlingPolicy != null
|
checkNotNull(
|
||||||
? loadErrorHandlingPolicy
|
loadErrorHandlingPolicy,
|
||||||
: new DefaultLoadErrorHandlingPolicy();
|
"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;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -276,11 +293,13 @@ public final class HlsMediaSource extends BaseMediaSource
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Factory setDrmSessionManagerProvider(
|
public Factory setDrmSessionManagerProvider(
|
||||||
@Nullable DrmSessionManagerProvider drmSessionManagerProvider) {
|
DrmSessionManagerProvider drmSessionManagerProvider) {
|
||||||
this.drmSessionManagerProvider =
|
this.drmSessionManagerProvider =
|
||||||
drmSessionManagerProvider != null
|
checkNotNull(
|
||||||
? drmSessionManagerProvider
|
drmSessionManagerProvider,
|
||||||
: new DefaultDrmSessionManagerProvider();
|
"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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -74,21 +74,6 @@ 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 =
|
||||||
|
@ -136,14 +136,14 @@ public final class ImaServerSideAdInsertionMediaSource extends CompositeMediaSou
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MediaSource.Factory setLoadErrorHandlingPolicy(
|
public MediaSource.Factory setLoadErrorHandlingPolicy(
|
||||||
@Nullable LoadErrorHandlingPolicy loadErrorHandlingPolicy) {
|
LoadErrorHandlingPolicy loadErrorHandlingPolicy) {
|
||||||
contentMediaSourceFactory.setLoadErrorHandlingPolicy(loadErrorHandlingPolicy);
|
contentMediaSourceFactory.setLoadErrorHandlingPolicy(loadErrorHandlingPolicy);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MediaSource.Factory setDrmSessionManagerProvider(
|
public MediaSource.Factory setDrmSessionManagerProvider(
|
||||||
@Nullable DrmSessionManagerProvider drmSessionManagerProvider) {
|
DrmSessionManagerProvider drmSessionManagerProvider) {
|
||||||
contentMediaSourceFactory.setDrmSessionManagerProvider(drmSessionManagerProvider);
|
contentMediaSourceFactory.setDrmSessionManagerProvider(drmSessionManagerProvider);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
@ -148,15 +148,13 @@ 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(
|
public Factory setDrmSessionManagerProvider(DrmSessionManagerProvider drmSessionManager) {
|
||||||
@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(
|
public Factory setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy loadErrorHandlingPolicy) {
|
||||||
@Nullable LoadErrorHandlingPolicy loadErrorHandlingPolicy) {
|
|
||||||
// TODO(internal b/172331505): Implement support.
|
// TODO(internal b/172331505): Implement support.
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
@ -93,6 +93,15 @@ 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.
|
||||||
*/
|
*/
|
||||||
@ -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:
|
||||||
|
*
|
||||||
|
* <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
|
||||||
@ -120,19 +136,14 @@ public final class SsMediaSource extends BaseMediaSource
|
|||||||
compositeSequenceableLoaderFactory = new DefaultCompositeSequenceableLoaderFactory();
|
compositeSequenceableLoaderFactory = new DefaultCompositeSequenceableLoaderFactory();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@Override
|
||||||
* Sets the {@link LoadErrorHandlingPolicy}. The default value is created by calling {@link
|
public Factory setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy loadErrorHandlingPolicy) {
|
||||||
* DefaultLoadErrorHandlingPolicy#DefaultLoadErrorHandlingPolicy()}.
|
|
||||||
*
|
|
||||||
* @param loadErrorHandlingPolicy A {@link LoadErrorHandlingPolicy}.
|
|
||||||
* @return This factory, for convenience.
|
|
||||||
*/
|
|
||||||
public Factory setLoadErrorHandlingPolicy(
|
|
||||||
@Nullable LoadErrorHandlingPolicy loadErrorHandlingPolicy) {
|
|
||||||
this.loadErrorHandlingPolicy =
|
this.loadErrorHandlingPolicy =
|
||||||
loadErrorHandlingPolicy != null
|
checkNotNull(
|
||||||
? loadErrorHandlingPolicy
|
loadErrorHandlingPolicy,
|
||||||
: new DefaultLoadErrorHandlingPolicy();
|
"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;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -184,11 +195,13 @@ public final class SsMediaSource extends BaseMediaSource
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Factory setDrmSessionManagerProvider(
|
public Factory setDrmSessionManagerProvider(
|
||||||
@Nullable DrmSessionManagerProvider drmSessionManagerProvider) {
|
DrmSessionManagerProvider drmSessionManagerProvider) {
|
||||||
this.drmSessionManagerProvider =
|
this.drmSessionManagerProvider =
|
||||||
drmSessionManagerProvider != null
|
checkNotNull(
|
||||||
? drmSessionManagerProvider
|
drmSessionManagerProvider,
|
||||||
: new DefaultDrmSessionManagerProvider();
|
"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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,21 +85,6 @@ 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 =
|
||||||
|
@ -15,7 +15,6 @@
|
|||||||
*/
|
*/
|
||||||
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;
|
||||||
@ -39,13 +38,13 @@ public final class FakeMediaSourceFactory implements MediaSourceFactory {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MediaSourceFactory setDrmSessionManagerProvider(
|
public MediaSourceFactory setDrmSessionManagerProvider(
|
||||||
@Nullable DrmSessionManagerProvider drmSessionManagerProvider) {
|
DrmSessionManagerProvider drmSessionManagerProvider) {
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MediaSourceFactory setLoadErrorHandlingPolicy(
|
public MediaSourceFactory setLoadErrorHandlingPolicy(
|
||||||
@Nullable LoadErrorHandlingPolicy loadErrorHandlingPolicy) {
|
LoadErrorHandlingPolicy loadErrorHandlingPolicy) {
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user