Simplify DefaultMediaSourceFactory ad configuration
- Use a setter, which is consistent with how other optional components are passed. - Remove nesting where a provider provides another provider. Since AdSupportProvider then only provides one thing, it can be renamed to AdsLoaderProvider, which more clearly expresses what it provides. PiperOrigin-RevId: 330396334
This commit is contained in:
parent
442aa78196
commit
04f67e4adc
@ -50,6 +50,7 @@ public final class DemoUtil {
|
|||||||
private static final String DOWNLOAD_TRACKER_ACTION_FILE = "tracked_actions";
|
private static final String DOWNLOAD_TRACKER_ACTION_FILE = "tracked_actions";
|
||||||
private static final String DOWNLOAD_CONTENT_DIRECTORY = "downloads";
|
private static final String DOWNLOAD_CONTENT_DIRECTORY = "downloads";
|
||||||
|
|
||||||
|
private static @MonotonicNonNull String userAgent;
|
||||||
private static DataSource.@MonotonicNonNull Factory dataSourceFactory;
|
private static DataSource.@MonotonicNonNull Factory dataSourceFactory;
|
||||||
private static HttpDataSource.@MonotonicNonNull Factory httpDataSourceFactory;
|
private static HttpDataSource.@MonotonicNonNull Factory httpDataSourceFactory;
|
||||||
private static @MonotonicNonNull DatabaseProvider databaseProvider;
|
private static @MonotonicNonNull DatabaseProvider databaseProvider;
|
||||||
@ -77,17 +78,23 @@ public final class DemoUtil {
|
|||||||
.setExtensionRendererMode(extensionRendererMode);
|
.setExtensionRendererMode(extensionRendererMode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static synchronized String getUserAgent(Context context) {
|
||||||
|
if (userAgent == null) {
|
||||||
|
userAgent = Util.getUserAgent(context, "ExoPlayerDemo");
|
||||||
|
}
|
||||||
|
return userAgent;
|
||||||
|
}
|
||||||
|
|
||||||
public static synchronized HttpDataSource.Factory getHttpDataSourceFactory(Context context) {
|
public static synchronized HttpDataSource.Factory getHttpDataSourceFactory(Context context) {
|
||||||
if (httpDataSourceFactory == null) {
|
if (httpDataSourceFactory == null) {
|
||||||
context = context.getApplicationContext();
|
context = context.getApplicationContext();
|
||||||
CronetEngineWrapper cronetEngineWrapper = new CronetEngineWrapper(context);
|
CronetEngineWrapper cronetEngineWrapper = new CronetEngineWrapper(context);
|
||||||
String userAgent = Util.getUserAgent(context, "ExoPlayerDemo");
|
|
||||||
httpDataSourceFactory =
|
httpDataSourceFactory =
|
||||||
new CronetDataSourceFactory(
|
new CronetDataSourceFactory(
|
||||||
cronetEngineWrapper,
|
cronetEngineWrapper,
|
||||||
Executors.newSingleThreadExecutor(),
|
Executors.newSingleThreadExecutor(),
|
||||||
/* transferListener= */ null,
|
/* transferListener= */ null,
|
||||||
userAgent);
|
getUserAgent(context));
|
||||||
}
|
}
|
||||||
return httpDataSourceFactory;
|
return httpDataSourceFactory;
|
||||||
}
|
}
|
||||||
|
@ -47,6 +47,7 @@ import com.google.android.exoplayer2.mediacodec.MediaCodecUtil.DecoderQueryExcep
|
|||||||
import com.google.android.exoplayer2.offline.DownloadRequest;
|
import com.google.android.exoplayer2.offline.DownloadRequest;
|
||||||
import com.google.android.exoplayer2.source.BehindLiveWindowException;
|
import com.google.android.exoplayer2.source.BehindLiveWindowException;
|
||||||
import com.google.android.exoplayer2.source.DefaultMediaSourceFactory;
|
import com.google.android.exoplayer2.source.DefaultMediaSourceFactory;
|
||||||
|
import com.google.android.exoplayer2.source.MediaSourceFactory;
|
||||||
import com.google.android.exoplayer2.source.TrackGroupArray;
|
import com.google.android.exoplayer2.source.TrackGroupArray;
|
||||||
import com.google.android.exoplayer2.source.ads.AdsLoader;
|
import com.google.android.exoplayer2.source.ads.AdsLoader;
|
||||||
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
|
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
|
||||||
@ -285,16 +286,18 @@ public class PlayerActivity extends AppCompatActivity
|
|||||||
intent.getBooleanExtra(IntentUtil.PREFER_EXTENSION_DECODERS_EXTRA, false);
|
intent.getBooleanExtra(IntentUtil.PREFER_EXTENSION_DECODERS_EXTRA, false);
|
||||||
RenderersFactory renderersFactory =
|
RenderersFactory renderersFactory =
|
||||||
DemoUtil.buildRenderersFactory(/* context= */ this, preferExtensionDecoders);
|
DemoUtil.buildRenderersFactory(/* context= */ this, preferExtensionDecoders);
|
||||||
|
MediaSourceFactory mediaSourceFactory =
|
||||||
|
new DefaultMediaSourceFactory(dataSourceFactory)
|
||||||
|
.setDrmUserAgent(DemoUtil.getUserAgent(this))
|
||||||
|
.setAdsLoaderProvider(this::getAdsLoader)
|
||||||
|
.setAdViewProvider(playerView);
|
||||||
|
|
||||||
trackSelector = new DefaultTrackSelector(/* context= */ this);
|
trackSelector = new DefaultTrackSelector(/* context= */ this);
|
||||||
trackSelector.setParameters(trackSelectorParameters);
|
trackSelector.setParameters(trackSelectorParameters);
|
||||||
lastSeenTrackGroupArray = null;
|
lastSeenTrackGroupArray = null;
|
||||||
|
|
||||||
player =
|
player =
|
||||||
new SimpleExoPlayer.Builder(/* context= */ this, renderersFactory)
|
new SimpleExoPlayer.Builder(/* context= */ this, renderersFactory)
|
||||||
.setMediaSourceFactory(
|
.setMediaSourceFactory(mediaSourceFactory)
|
||||||
DefaultMediaSourceFactory.newInstance(
|
|
||||||
/* context= */ this, dataSourceFactory, new AdSupportProvider()))
|
|
||||||
.setTrackSelector(trackSelector)
|
.setTrackSelector(trackSelector)
|
||||||
.build();
|
.build();
|
||||||
player.addListener(new PlayerEventListener());
|
player.addListener(new PlayerEventListener());
|
||||||
@ -361,6 +364,24 @@ public class PlayerActivity extends AppCompatActivity
|
|||||||
return mediaItems;
|
return mediaItems;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private AdsLoader getAdsLoader(Uri adTagUri) {
|
||||||
|
if (mediaItems.size() > 1) {
|
||||||
|
showToast(R.string.unsupported_ads_in_playlist);
|
||||||
|
releaseAdsLoader();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (!adTagUri.equals(loadedAdTagUri)) {
|
||||||
|
releaseAdsLoader();
|
||||||
|
loadedAdTagUri = adTagUri;
|
||||||
|
}
|
||||||
|
// The ads loader is reused for multiple playbacks, so that ad playback can resume.
|
||||||
|
if (adsLoader == null) {
|
||||||
|
adsLoader = new ImaAdsLoader(/* context= */ PlayerActivity.this, adTagUri);
|
||||||
|
}
|
||||||
|
adsLoader.setPlayer(player);
|
||||||
|
return adsLoader;
|
||||||
|
}
|
||||||
|
|
||||||
protected void releasePlayer() {
|
protected void releasePlayer() {
|
||||||
if (player != null) {
|
if (player != null) {
|
||||||
updateTrackSelectorParameters();
|
updateTrackSelectorParameters();
|
||||||
@ -517,33 +538,6 @@ public class PlayerActivity extends AppCompatActivity
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class AdSupportProvider implements DefaultMediaSourceFactory.AdSupportProvider {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public AdsLoader getAdsLoader(Uri adTagUri) {
|
|
||||||
if (mediaItems.size() > 1) {
|
|
||||||
showToast(R.string.unsupported_ads_in_playlist);
|
|
||||||
releaseAdsLoader();
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
if (!adTagUri.equals(loadedAdTagUri)) {
|
|
||||||
releaseAdsLoader();
|
|
||||||
loadedAdTagUri = adTagUri;
|
|
||||||
}
|
|
||||||
// The ads loader is reused for multiple playbacks, so that ad playback can resume.
|
|
||||||
if (adsLoader == null) {
|
|
||||||
adsLoader = new ImaAdsLoader(/* context= */ PlayerActivity.this, adTagUri);
|
|
||||||
}
|
|
||||||
adsLoader.setPlayer(player);
|
|
||||||
return adsLoader;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public AdsLoader.AdViewProvider getAdViewProvider() {
|
|
||||||
return checkNotNull(playerView);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static List<MediaItem> createMediaItems(Intent intent, DownloadTracker downloadTracker) {
|
private static List<MediaItem> createMediaItems(Intent intent, DownloadTracker downloadTracker) {
|
||||||
List<MediaItem> mediaItems = new ArrayList<>();
|
List<MediaItem> mediaItems = new ArrayList<>();
|
||||||
for (MediaItem item : IntentUtil.createMediaItemsFromIntent(intent)) {
|
for (MediaItem item : IntentUtil.createMediaItemsFromIntent(intent)) {
|
||||||
|
@ -53,7 +53,6 @@ import com.google.android.exoplayer2.offline.DownloadService;
|
|||||||
import com.google.android.exoplayer2.upstream.DataSource;
|
import com.google.android.exoplayer2.upstream.DataSource;
|
||||||
import com.google.android.exoplayer2.upstream.DataSourceInputStream;
|
import com.google.android.exoplayer2.upstream.DataSourceInputStream;
|
||||||
import com.google.android.exoplayer2.upstream.DataSpec;
|
import com.google.android.exoplayer2.upstream.DataSpec;
|
||||||
import com.google.android.exoplayer2.upstream.DefaultDataSource;
|
|
||||||
import com.google.android.exoplayer2.util.Log;
|
import com.google.android.exoplayer2.util.Log;
|
||||||
import com.google.android.exoplayer2.util.Util;
|
import com.google.android.exoplayer2.util.Util;
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
@ -276,9 +275,7 @@ public class SampleChooserActivity extends AppCompatActivity
|
|||||||
protected List<PlaylistGroup> doInBackground(String... uris) {
|
protected List<PlaylistGroup> doInBackground(String... uris) {
|
||||||
List<PlaylistGroup> result = new ArrayList<>();
|
List<PlaylistGroup> result = new ArrayList<>();
|
||||||
Context context = getApplicationContext();
|
Context context = getApplicationContext();
|
||||||
String userAgent = Util.getUserAgent(context, "ExoPlayerDemo");
|
DataSource dataSource = DemoUtil.getDataSourceFactory(context).createDataSource();
|
||||||
DataSource dataSource =
|
|
||||||
new DefaultDataSource(context, userAgent, /* allowCrossProtocolRedirects= */ false);
|
|
||||||
for (String uri : uris) {
|
for (String uri : uris) {
|
||||||
DataSpec dataSpec = new DataSpec(Uri.parse(uri));
|
DataSpec dataSpec = new DataSpec(Uri.parse(uri));
|
||||||
InputStream inputStream = new DataSourceInputStream(dataSource, dataSpec);
|
InputStream inputStream = new DataSourceInputStream(dataSource, dataSpec);
|
||||||
|
@ -243,8 +243,7 @@ public final class ImaPlaybackTest {
|
|||||||
new DefaultDataSourceFactory(
|
new DefaultDataSourceFactory(
|
||||||
context, Util.getUserAgent(context, ImaPlaybackTest.class.getSimpleName()));
|
context, Util.getUserAgent(context, ImaPlaybackTest.class.getSimpleName()));
|
||||||
MediaSource contentMediaSource =
|
MediaSource contentMediaSource =
|
||||||
DefaultMediaSourceFactory.newInstance(context)
|
new DefaultMediaSourceFactory(context).createMediaSource(MediaItem.fromUri(contentUri));
|
||||||
.createMediaSource(MediaItem.fromUri(contentUri));
|
|
||||||
return new AdsMediaSource(
|
return new AdsMediaSource(
|
||||||
contentMediaSource,
|
contentMediaSource,
|
||||||
dataSourceFactory,
|
dataSourceFactory,
|
||||||
|
@ -80,7 +80,7 @@ import org.junit.rules.ExternalResource;
|
|||||||
exoPlayer =
|
exoPlayer =
|
||||||
new SimpleExoPlayer.Builder(context)
|
new SimpleExoPlayer.Builder(context)
|
||||||
.setLooper(Looper.myLooper())
|
.setLooper(Looper.myLooper())
|
||||||
.setMediaSourceFactory(new DefaultMediaSourceFactory(dataSourceFactory, null))
|
.setMediaSourceFactory(new DefaultMediaSourceFactory(dataSourceFactory))
|
||||||
.build();
|
.build();
|
||||||
sessionPlayerConnector = new SessionPlayerConnector(exoPlayer);
|
sessionPlayerConnector = new SessionPlayerConnector(exoPlayer);
|
||||||
});
|
});
|
||||||
|
@ -182,7 +182,7 @@ public interface ExoPlayer extends Player {
|
|||||||
this(
|
this(
|
||||||
renderers,
|
renderers,
|
||||||
new DefaultTrackSelector(context),
|
new DefaultTrackSelector(context),
|
||||||
DefaultMediaSourceFactory.newInstance(context),
|
new DefaultMediaSourceFactory(context),
|
||||||
new DefaultLoadControl(),
|
new DefaultLoadControl(),
|
||||||
DefaultBandwidthMeter.getSingletonInstance(context));
|
DefaultBandwidthMeter.getSingletonInstance(context));
|
||||||
}
|
}
|
||||||
|
@ -194,7 +194,7 @@ public final class ExoPlayerFactory {
|
|||||||
context,
|
context,
|
||||||
renderersFactory,
|
renderersFactory,
|
||||||
trackSelector,
|
trackSelector,
|
||||||
DefaultMediaSourceFactory.newInstance(context),
|
new DefaultMediaSourceFactory(context),
|
||||||
loadControl,
|
loadControl,
|
||||||
bandwidthMeter,
|
bandwidthMeter,
|
||||||
analyticsCollector,
|
analyticsCollector,
|
||||||
@ -250,7 +250,7 @@ public final class ExoPlayerFactory {
|
|||||||
return new ExoPlayerImpl(
|
return new ExoPlayerImpl(
|
||||||
renderers,
|
renderers,
|
||||||
trackSelector,
|
trackSelector,
|
||||||
DefaultMediaSourceFactory.newInstance(context),
|
new DefaultMediaSourceFactory(context),
|
||||||
loadControl,
|
loadControl,
|
||||||
bandwidthMeter,
|
bandwidthMeter,
|
||||||
/* analyticsCollector= */ null,
|
/* analyticsCollector= */ null,
|
||||||
|
@ -43,8 +43,8 @@ public final class MetadataRetriever {
|
|||||||
/**
|
/**
|
||||||
* Retrieves the {@link TrackGroupArray} corresponding to a {@link MediaItem}.
|
* Retrieves the {@link TrackGroupArray} corresponding to a {@link MediaItem}.
|
||||||
*
|
*
|
||||||
* <p>This is equivalent to using {@code
|
* <p>This is equivalent to using {@code retrieveMetadata(new DefaultMediaSourceFactory(context),
|
||||||
* retrieveMetadata(DefaultMediaSourceFactory.newInstance(context), mediaItem)}.
|
* mediaItem)}.
|
||||||
*
|
*
|
||||||
* @param context The {@link Context}.
|
* @param context The {@link Context}.
|
||||||
* @param mediaItem The {@link MediaItem} whose metadata should be retrieved.
|
* @param mediaItem The {@link MediaItem} whose metadata should be retrieved.
|
||||||
@ -52,7 +52,7 @@ public final class MetadataRetriever {
|
|||||||
*/
|
*/
|
||||||
public static ListenableFuture<TrackGroupArray> retrieveMetadata(
|
public static ListenableFuture<TrackGroupArray> retrieveMetadata(
|
||||||
Context context, MediaItem mediaItem) {
|
Context context, MediaItem mediaItem) {
|
||||||
return retrieveMetadata(DefaultMediaSourceFactory.newInstance(context), mediaItem);
|
return retrieveMetadata(new DefaultMediaSourceFactory(context), mediaItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -163,7 +163,7 @@ public class SimpleExoPlayer extends BasePlayer
|
|||||||
context,
|
context,
|
||||||
renderersFactory,
|
renderersFactory,
|
||||||
new DefaultTrackSelector(context),
|
new DefaultTrackSelector(context),
|
||||||
DefaultMediaSourceFactory.newInstance(context),
|
new DefaultMediaSourceFactory(context),
|
||||||
new DefaultLoadControl(),
|
new DefaultLoadControl(),
|
||||||
DefaultBandwidthMeter.getSingletonInstance(context),
|
DefaultBandwidthMeter.getSingletonInstance(context),
|
||||||
new AnalyticsCollector(Clock.DEFAULT));
|
new AnalyticsCollector(Clock.DEFAULT));
|
||||||
|
@ -889,7 +889,7 @@ public final class DownloadHelper {
|
|||||||
MediaItem mediaItem,
|
MediaItem mediaItem,
|
||||||
DataSource.Factory dataSourceFactory,
|
DataSource.Factory dataSourceFactory,
|
||||||
@Nullable DrmSessionManager drmSessionManager) {
|
@Nullable DrmSessionManager drmSessionManager) {
|
||||||
return new DefaultMediaSourceFactory(dataSourceFactory, /* adSupportProvider= */ null)
|
return new DefaultMediaSourceFactory(dataSourceFactory)
|
||||||
.setDrmSessionManager(drmSessionManager)
|
.setDrmSessionManager(drmSessionManager)
|
||||||
.createMediaSource(mediaItem);
|
.createMediaSource(mediaItem);
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,7 @@ import com.google.android.exoplayer2.MediaItem;
|
|||||||
import com.google.android.exoplayer2.drm.DrmSessionManager;
|
import com.google.android.exoplayer2.drm.DrmSessionManager;
|
||||||
import com.google.android.exoplayer2.offline.StreamKey;
|
import com.google.android.exoplayer2.offline.StreamKey;
|
||||||
import com.google.android.exoplayer2.source.ads.AdsLoader;
|
import com.google.android.exoplayer2.source.ads.AdsLoader;
|
||||||
|
import com.google.android.exoplayer2.source.ads.AdsLoader.AdViewProvider;
|
||||||
import com.google.android.exoplayer2.source.ads.AdsMediaSource;
|
import com.google.android.exoplayer2.source.ads.AdsMediaSource;
|
||||||
import com.google.android.exoplayer2.upstream.DataSource;
|
import com.google.android.exoplayer2.upstream.DataSource;
|
||||||
import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory;
|
import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory;
|
||||||
@ -68,101 +69,62 @@ import java.util.List;
|
|||||||
* the stream.
|
* the stream.
|
||||||
* </ul>
|
* </ul>
|
||||||
*
|
*
|
||||||
* <h3>Ad support for media items with ad tag uri</h3>
|
* <h3>Ad support for media items with ad tag URIs</h3>
|
||||||
*
|
*
|
||||||
* <p>For a media item with an ad tag uri, an {@link AdSupportProvider} needs to be passed to {@link
|
* <p>To support media items with {@link MediaItem.PlaybackProperties#adTagUri ad tag URIs}, {@link
|
||||||
* #newInstance(Context, DataSource.Factory, AdSupportProvider)}.
|
* #setAdsLoaderProvider} and {@link #setAdViewProvider} need to be called to configure the factory
|
||||||
|
* with the required providers.
|
||||||
*/
|
*/
|
||||||
public final class DefaultMediaSourceFactory implements MediaSourceFactory {
|
public final class DefaultMediaSourceFactory implements MediaSourceFactory {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides {@link AdsLoader ads loaders} and an {@link AdsLoader.AdViewProvider} to created
|
* Provides {@link AdsLoader} instances for media items that have {@link
|
||||||
* {@link AdsMediaSource AdsMediaSources}.
|
* MediaItem.PlaybackProperties#adTagUri ad tag URIs}.
|
||||||
*/
|
*/
|
||||||
public interface AdSupportProvider {
|
public interface AdsLoaderProvider {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns an {@link AdsLoader} for the given {@link Uri ad tag uri} or null if no ads loader is
|
* Returns an {@link AdsLoader} for the given {@link MediaItem.PlaybackProperties#adTagUri ad
|
||||||
* available for the given ad tag uri.
|
* tag URI}, or null if no ads loader is available for the given ad tag URI.
|
||||||
*
|
*
|
||||||
* <p>This method is called for each media item for which a media source is created.
|
* <p>This method is called each time a {@link MediaSource} is created from a {@link MediaItem}
|
||||||
|
* that defines an {@link MediaItem.PlaybackProperties#adTagUri ad tag URI}.
|
||||||
*/
|
*/
|
||||||
@Nullable
|
@Nullable
|
||||||
AdsLoader getAdsLoader(Uri adTagUri);
|
AdsLoader getAdsLoader(Uri adTagUri);
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns an {@link AdsLoader.AdViewProvider} which is used to create {@link AdsMediaSource
|
|
||||||
* AdsMediaSources}.
|
|
||||||
*/
|
|
||||||
AdsLoader.AdViewProvider getAdViewProvider();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a new instance with the given {@link Context}.
|
|
||||||
*
|
|
||||||
* <p>This is functionally equivalent with calling {@code #newInstance(Context,
|
|
||||||
* DefaultDataSourceFactory)}.
|
|
||||||
*
|
|
||||||
* @param context The {@link Context}.
|
|
||||||
* @return A new instance of {@link DefaultMediaSourceFactory}.
|
|
||||||
*/
|
|
||||||
public static DefaultMediaSourceFactory newInstance(Context context) {
|
|
||||||
return newInstance(
|
|
||||||
context,
|
|
||||||
new DefaultDataSourceFactory(
|
|
||||||
context, Util.getUserAgent(context, ExoPlayerLibraryInfo.VERSION_SLASHY)));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a new instance with the given {@link Context} and {@link DataSource.Factory}.
|
|
||||||
*
|
|
||||||
* @param context The {@link Context}.
|
|
||||||
* @param dataSourceFactory A {@link DataSource.Factory} to be used to create media sources.
|
|
||||||
* @return A new instance of {@link DefaultMediaSourceFactory}.
|
|
||||||
*/
|
|
||||||
public static DefaultMediaSourceFactory newInstance(
|
|
||||||
Context context, DataSource.Factory dataSourceFactory) {
|
|
||||||
return new DefaultMediaSourceFactory(dataSourceFactory, /* adSupportProvider= */ null)
|
|
||||||
.setDrmUserAgent(Util.getUserAgent(context, ExoPlayerLibraryInfo.VERSION_SLASHY));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a new instance with the given {@link Context} and {@link DataSource.Factory}.
|
|
||||||
*
|
|
||||||
* @param context The {@link Context}.
|
|
||||||
* @param dataSourceFactory A {@link DataSource.Factory} to be used to create media sources.
|
|
||||||
* @param adSupportProvider A {@link AdSupportProvider} to be used to create ad media sources.
|
|
||||||
* @return A new instance of {@link DefaultMediaSourceFactory}.
|
|
||||||
*/
|
|
||||||
public static DefaultMediaSourceFactory newInstance(
|
|
||||||
Context context, DataSource.Factory dataSourceFactory, AdSupportProvider adSupportProvider) {
|
|
||||||
return new DefaultMediaSourceFactory(dataSourceFactory, adSupportProvider)
|
|
||||||
.setDrmUserAgent(Util.getUserAgent(context, ExoPlayerLibraryInfo.VERSION_SLASHY));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final String TAG = "DefaultMediaSourceFactory";
|
private static final String TAG = "DefaultMediaSourceFactory";
|
||||||
|
|
||||||
private final MediaSourceDrmHelper mediaSourceDrmHelper;
|
private final MediaSourceDrmHelper mediaSourceDrmHelper;
|
||||||
private final DataSource.Factory dataSourceFactory;
|
private final DataSource.Factory dataSourceFactory;
|
||||||
@Nullable private final AdSupportProvider adSupportProvider;
|
|
||||||
private final SparseArray<MediaSourceFactory> mediaSourceFactories;
|
private final SparseArray<MediaSourceFactory> mediaSourceFactories;
|
||||||
@C.ContentType private final int[] supportedTypes;
|
@C.ContentType private final int[] supportedTypes;
|
||||||
|
|
||||||
|
@Nullable private AdsLoaderProvider adsLoaderProvider;
|
||||||
|
@Nullable private AdViewProvider adViewProvider;
|
||||||
@Nullable private DrmSessionManager drmSessionManager;
|
@Nullable private DrmSessionManager drmSessionManager;
|
||||||
@Nullable private List<StreamKey> streamKeys;
|
@Nullable private List<StreamKey> streamKeys;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new instance with the {@link DataSource.Factory} for downloading media and an {@link
|
* Creates a new instance.
|
||||||
* AdSupportProvider} to create {@link AdsMediaSource AdsMediaSources}.
|
|
||||||
*
|
*
|
||||||
* @param dataSourceFactory A {@link DataSource.Factory} to be used to create media sources.
|
* @param context Any context.
|
||||||
* @param adSupportProvider An {@link AdSupportProvider} to get ads loaders and ad view providers
|
|
||||||
* to be used to create {@link AdsMediaSource AdsMediaSources}.
|
|
||||||
*/
|
*/
|
||||||
public DefaultMediaSourceFactory(
|
public DefaultMediaSourceFactory(Context context) {
|
||||||
DataSource.Factory dataSourceFactory, @Nullable AdSupportProvider adSupportProvider) {
|
this(
|
||||||
|
new DefaultDataSourceFactory(
|
||||||
|
context, Util.getUserAgent(context, ExoPlayerLibraryInfo.VERSION_SLASHY)));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new instance.
|
||||||
|
*
|
||||||
|
* @param dataSourceFactory A {@link DataSource.Factory} to create {@link DataSource} instances
|
||||||
|
* for requesting media data.
|
||||||
|
*/
|
||||||
|
public DefaultMediaSourceFactory(DataSource.Factory dataSourceFactory) {
|
||||||
this.dataSourceFactory = dataSourceFactory;
|
this.dataSourceFactory = dataSourceFactory;
|
||||||
this.adSupportProvider = adSupportProvider;
|
|
||||||
mediaSourceDrmHelper = new MediaSourceDrmHelper();
|
mediaSourceDrmHelper = new MediaSourceDrmHelper();
|
||||||
mediaSourceFactories = loadDelegates(dataSourceFactory);
|
mediaSourceFactories = loadDelegates(dataSourceFactory);
|
||||||
supportedTypes = new int[mediaSourceFactories.size()];
|
supportedTypes = new int[mediaSourceFactories.size()];
|
||||||
@ -171,6 +133,30 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the {@link AdsLoaderProvider} that provides {@link AdsLoader} instances for media items
|
||||||
|
* that have {@link MediaItem.PlaybackProperties#adTagUri ad tag URIs}.
|
||||||
|
*
|
||||||
|
* @param adsLoaderProvider A provider for {@link AdsLoader} instances.
|
||||||
|
* @return This factory, for convenience.
|
||||||
|
*/
|
||||||
|
public DefaultMediaSourceFactory setAdsLoaderProvider(
|
||||||
|
@Nullable AdsLoaderProvider adsLoaderProvider) {
|
||||||
|
this.adsLoaderProvider = adsLoaderProvider;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the {@link AdViewProvider} that provides information about views for the ad playback UI.
|
||||||
|
*
|
||||||
|
* @param adViewProvider A provider for {@link AdsLoader} instances.
|
||||||
|
* @return This factory, for convenience.
|
||||||
|
*/
|
||||||
|
public DefaultMediaSourceFactory setAdViewProvider(@Nullable AdViewProvider adViewProvider) {
|
||||||
|
this.adViewProvider = adViewProvider;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DefaultMediaSourceFactory setDrmHttpDataSourceFactory(
|
public DefaultMediaSourceFactory setDrmHttpDataSourceFactory(
|
||||||
@Nullable HttpDataSource.Factory drmHttpDataSourceFactory) {
|
@Nullable HttpDataSource.Factory drmHttpDataSourceFactory) {
|
||||||
@ -279,24 +265,23 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory {
|
|||||||
if (mediaItem.playbackProperties.adTagUri == null) {
|
if (mediaItem.playbackProperties.adTagUri == null) {
|
||||||
return mediaSource;
|
return mediaSource;
|
||||||
}
|
}
|
||||||
if (adSupportProvider == null) {
|
AdsLoaderProvider adsLoaderProvider = this.adsLoaderProvider;
|
||||||
|
AdViewProvider adViewProvider = this.adViewProvider;
|
||||||
|
if (adsLoaderProvider == null || adViewProvider == null) {
|
||||||
Log.w(
|
Log.w(
|
||||||
TAG,
|
TAG,
|
||||||
"Playing media without ads. Pass an AdsSupportProvider to the constructor for supporting"
|
"Playing media without ads. Configure ad support by calling setAdsLoaderProvider and"
|
||||||
+ " media items with an ad tag uri.");
|
+ " setAdViewProvider.");
|
||||||
return mediaSource;
|
return mediaSource;
|
||||||
}
|
}
|
||||||
@Nullable
|
@Nullable
|
||||||
AdsLoader adsLoader = adSupportProvider.getAdsLoader(mediaItem.playbackProperties.adTagUri);
|
AdsLoader adsLoader = adsLoaderProvider.getAdsLoader(mediaItem.playbackProperties.adTagUri);
|
||||||
if (adsLoader == null) {
|
if (adsLoader == null) {
|
||||||
Log.w(TAG, "Playing media without ads. No AdsLoader for provided adTagUri");
|
Log.w(TAG, "Playing media without ads. No AdsLoader for provided adTagUri");
|
||||||
return mediaSource;
|
return mediaSource;
|
||||||
}
|
}
|
||||||
return new AdsMediaSource(
|
return new AdsMediaSource(
|
||||||
mediaSource,
|
mediaSource, /* adMediaSourceFactory= */ this, adsLoader, adViewProvider);
|
||||||
/* adMediaSourceFactory= */ this,
|
|
||||||
adsLoader,
|
|
||||||
adSupportProvider.getAdViewProvider());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static SparseArray<MediaSourceFactory> loadDelegates(
|
private static SparseArray<MediaSourceFactory> loadDelegates(
|
||||||
|
@ -20,14 +20,12 @@ import static org.mockito.Mockito.mock;
|
|||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
import androidx.test.core.app.ApplicationProvider;
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
import com.google.android.exoplayer2.C;
|
import com.google.android.exoplayer2.C;
|
||||||
import com.google.android.exoplayer2.MediaItem;
|
import com.google.android.exoplayer2.MediaItem;
|
||||||
import com.google.android.exoplayer2.source.ads.AdsLoader;
|
import com.google.android.exoplayer2.source.ads.AdsLoader;
|
||||||
import com.google.android.exoplayer2.source.ads.AdsMediaSource;
|
import com.google.android.exoplayer2.source.ads.AdsMediaSource;
|
||||||
import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory;
|
|
||||||
import com.google.android.exoplayer2.util.MimeTypes;
|
import com.google.android.exoplayer2.util.MimeTypes;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
@ -45,7 +43,7 @@ public final class DefaultMediaSourceFactoryTest {
|
|||||||
@Test
|
@Test
|
||||||
public void createMediaSource_fromMediaItem_returnsSameMediaItemInstance() {
|
public void createMediaSource_fromMediaItem_returnsSameMediaItemInstance() {
|
||||||
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
||||||
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
|
new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext());
|
||||||
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA).build();
|
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA).build();
|
||||||
|
|
||||||
MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem);
|
MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem);
|
||||||
@ -56,7 +54,7 @@ public final class DefaultMediaSourceFactoryTest {
|
|||||||
@Test
|
@Test
|
||||||
public void createMediaSource_withoutMimeType_progressiveSource() {
|
public void createMediaSource_withoutMimeType_progressiveSource() {
|
||||||
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
||||||
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
|
new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext());
|
||||||
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA).build();
|
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA).build();
|
||||||
|
|
||||||
MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem);
|
MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem);
|
||||||
@ -69,7 +67,7 @@ public final class DefaultMediaSourceFactoryTest {
|
|||||||
public void createMediaSource_withTag_tagInSource_deprecated() {
|
public void createMediaSource_withTag_tagInSource_deprecated() {
|
||||||
Object tag = new Object();
|
Object tag = new Object();
|
||||||
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
||||||
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
|
new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext());
|
||||||
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA).setTag(tag).build();
|
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA).setTag(tag).build();
|
||||||
|
|
||||||
MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem);
|
MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem);
|
||||||
@ -80,7 +78,7 @@ public final class DefaultMediaSourceFactoryTest {
|
|||||||
@Test
|
@Test
|
||||||
public void createMediaSource_withPath_progressiveSource() {
|
public void createMediaSource_withPath_progressiveSource() {
|
||||||
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
||||||
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
|
new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext());
|
||||||
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA + "/file.mp3").build();
|
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA + "/file.mp3").build();
|
||||||
|
|
||||||
MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem);
|
MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem);
|
||||||
@ -91,7 +89,7 @@ public final class DefaultMediaSourceFactoryTest {
|
|||||||
@Test
|
@Test
|
||||||
public void createMediaSource_withNull_usesNonNullDefaults() {
|
public void createMediaSource_withNull_usesNonNullDefaults() {
|
||||||
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
||||||
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
|
new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext());
|
||||||
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA).build();
|
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA).build();
|
||||||
|
|
||||||
MediaSource mediaSource =
|
MediaSource mediaSource =
|
||||||
@ -107,7 +105,7 @@ public final class DefaultMediaSourceFactoryTest {
|
|||||||
@Test
|
@Test
|
||||||
public void createMediaSource_withSubtitle_isMergingMediaSource() {
|
public void createMediaSource_withSubtitle_isMergingMediaSource() {
|
||||||
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
||||||
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
|
new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext());
|
||||||
List<MediaItem.Subtitle> subtitles =
|
List<MediaItem.Subtitle> subtitles =
|
||||||
Arrays.asList(
|
Arrays.asList(
|
||||||
new MediaItem.Subtitle(Uri.parse(URI_TEXT), MimeTypes.APPLICATION_TTML, "en"),
|
new MediaItem.Subtitle(Uri.parse(URI_TEXT), MimeTypes.APPLICATION_TTML, "en"),
|
||||||
@ -124,7 +122,7 @@ public final class DefaultMediaSourceFactoryTest {
|
|||||||
@SuppressWarnings("deprecation") // Testing deprecated MediaSource.getTag() still works.
|
@SuppressWarnings("deprecation") // Testing deprecated MediaSource.getTag() still works.
|
||||||
public void createMediaSource_withSubtitle_hasTag_deprecated() {
|
public void createMediaSource_withSubtitle_hasTag_deprecated() {
|
||||||
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
||||||
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
|
new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext());
|
||||||
Object tag = new Object();
|
Object tag = new Object();
|
||||||
MediaItem mediaItem =
|
MediaItem mediaItem =
|
||||||
new MediaItem.Builder()
|
new MediaItem.Builder()
|
||||||
@ -143,7 +141,7 @@ public final class DefaultMediaSourceFactoryTest {
|
|||||||
@Test
|
@Test
|
||||||
public void createMediaSource_withStartPosition_isClippingMediaSource() {
|
public void createMediaSource_withStartPosition_isClippingMediaSource() {
|
||||||
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
||||||
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
|
new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext());
|
||||||
MediaItem mediaItem =
|
MediaItem mediaItem =
|
||||||
new MediaItem.Builder().setUri(URI_MEDIA).setClipStartPositionMs(1000L).build();
|
new MediaItem.Builder().setUri(URI_MEDIA).setClipStartPositionMs(1000L).build();
|
||||||
|
|
||||||
@ -155,7 +153,7 @@ public final class DefaultMediaSourceFactoryTest {
|
|||||||
@Test
|
@Test
|
||||||
public void createMediaSource_withEndPosition_isClippingMediaSource() {
|
public void createMediaSource_withEndPosition_isClippingMediaSource() {
|
||||||
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
||||||
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
|
new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext());
|
||||||
MediaItem mediaItem =
|
MediaItem mediaItem =
|
||||||
new MediaItem.Builder().setUri(URI_MEDIA).setClipEndPositionMs(1000L).build();
|
new MediaItem.Builder().setUri(URI_MEDIA).setClipEndPositionMs(1000L).build();
|
||||||
|
|
||||||
@ -167,7 +165,7 @@ public final class DefaultMediaSourceFactoryTest {
|
|||||||
@Test
|
@Test
|
||||||
public void createMediaSource_relativeToDefaultPosition_isClippingMediaSource() {
|
public void createMediaSource_relativeToDefaultPosition_isClippingMediaSource() {
|
||||||
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
||||||
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
|
new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext());
|
||||||
MediaItem mediaItem =
|
MediaItem mediaItem =
|
||||||
new MediaItem.Builder().setUri(URI_MEDIA).setClipRelativeToDefaultPosition(true).build();
|
new MediaItem.Builder().setUri(URI_MEDIA).setClipRelativeToDefaultPosition(true).build();
|
||||||
|
|
||||||
@ -179,7 +177,7 @@ public final class DefaultMediaSourceFactoryTest {
|
|||||||
@Test
|
@Test
|
||||||
public void createMediaSource_defaultToEnd_isNotClippingMediaSource() {
|
public void createMediaSource_defaultToEnd_isNotClippingMediaSource() {
|
||||||
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
||||||
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
|
new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext());
|
||||||
MediaItem mediaItem =
|
MediaItem mediaItem =
|
||||||
new MediaItem.Builder()
|
new MediaItem.Builder()
|
||||||
.setUri(URI_MEDIA)
|
.setUri(URI_MEDIA)
|
||||||
@ -194,7 +192,7 @@ public final class DefaultMediaSourceFactoryTest {
|
|||||||
@Test
|
@Test
|
||||||
public void getSupportedTypes_coreModule_onlyOther() {
|
public void getSupportedTypes_coreModule_onlyOther() {
|
||||||
int[] supportedTypes =
|
int[] supportedTypes =
|
||||||
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext())
|
new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext())
|
||||||
.getSupportedTypes();
|
.getSupportedTypes();
|
||||||
|
|
||||||
assertThat(supportedTypes).asList().containsExactly(C.TYPE_OTHER);
|
assertThat(supportedTypes).asList().containsExactly(C.TYPE_OTHER);
|
||||||
@ -202,14 +200,12 @@ public final class DefaultMediaSourceFactoryTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void createMediaSource_withAdTagUri_callsAdsLoader() {
|
public void createMediaSource_withAdTagUri_callsAdsLoader() {
|
||||||
Context applicationContext = ApplicationProvider.getApplicationContext();
|
|
||||||
Uri adTagUri = Uri.parse(URI_MEDIA);
|
Uri adTagUri = Uri.parse(URI_MEDIA);
|
||||||
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA).setAdTagUri(adTagUri).build();
|
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA).setAdTagUri(adTagUri).build();
|
||||||
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
||||||
DefaultMediaSourceFactory.newInstance(
|
new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext())
|
||||||
applicationContext,
|
.setAdsLoaderProvider(ignoredAdTagUri -> mock(AdsLoader.class))
|
||||||
new DefaultDataSourceFactory(applicationContext, /* userAgent= */ "ua"),
|
.setAdViewProvider(mock(AdsLoader.AdViewProvider.class));
|
||||||
createAdSupportProvider(mock(AdsLoader.class), mock(AdsLoader.AdViewProvider.class)));
|
|
||||||
|
|
||||||
MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem);
|
MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem);
|
||||||
|
|
||||||
@ -217,15 +213,11 @@ public final class DefaultMediaSourceFactoryTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void createMediaSource_withAdTagUriAdsLoaderNull_playsWithoutAdNoException() {
|
public void createMediaSource_withAdTagUri_adProvidersNotSet_playsWithoutAdNoException() {
|
||||||
Context applicationContext = ApplicationProvider.getApplicationContext();
|
|
||||||
MediaItem mediaItem =
|
MediaItem mediaItem =
|
||||||
new MediaItem.Builder().setUri(URI_MEDIA).setAdTagUri(Uri.parse(URI_MEDIA)).build();
|
new MediaItem.Builder().setUri(URI_MEDIA).setAdTagUri(Uri.parse(URI_MEDIA)).build();
|
||||||
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
||||||
DefaultMediaSourceFactory.newInstance(
|
new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext());
|
||||||
applicationContext,
|
|
||||||
new DefaultDataSourceFactory(applicationContext, /* userAgent= */ "ua"),
|
|
||||||
createAdSupportProvider(/* adsLoader= */ null, mock(AdsLoader.AdViewProvider.class)));
|
|
||||||
|
|
||||||
MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem);
|
MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem);
|
||||||
|
|
||||||
@ -239,24 +231,8 @@ public final class DefaultMediaSourceFactoryTest {
|
|||||||
new MediaItem.Builder().setUri(URI_MEDIA).setAdTagUri(Uri.parse(URI_MEDIA)).build();
|
new MediaItem.Builder().setUri(URI_MEDIA).setAdTagUri(Uri.parse(URI_MEDIA)).build();
|
||||||
|
|
||||||
MediaSource mediaSource =
|
MediaSource mediaSource =
|
||||||
DefaultMediaSourceFactory.newInstance(applicationContext).createMediaSource(mediaItem);
|
new DefaultMediaSourceFactory(applicationContext).createMediaSource(mediaItem);
|
||||||
|
|
||||||
assertThat(mediaSource).isNotInstanceOf(AdsMediaSource.class);
|
assertThat(mediaSource).isNotInstanceOf(AdsMediaSource.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static DefaultMediaSourceFactory.AdSupportProvider createAdSupportProvider(
|
|
||||||
@Nullable AdsLoader adsLoader, AdsLoader.AdViewProvider adViewProvider) {
|
|
||||||
return new DefaultMediaSourceFactory.AdSupportProvider() {
|
|
||||||
@Nullable
|
|
||||||
@Override
|
|
||||||
public AdsLoader getAdsLoader(Uri adTagUri) {
|
|
||||||
return adsLoader;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public AdsLoader.AdViewProvider getAdViewProvider() {
|
|
||||||
return adViewProvider;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,7 @@ package com.google.android.exoplayer2.source.dash;
|
|||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
import androidx.test.core.app.ApplicationProvider;
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
import com.google.android.exoplayer2.C;
|
import com.google.android.exoplayer2.C;
|
||||||
@ -36,7 +37,7 @@ public class DefaultMediaSourceFactoryTest {
|
|||||||
@Test
|
@Test
|
||||||
public void createMediaSource_withMimeType_dashSource() {
|
public void createMediaSource_withMimeType_dashSource() {
|
||||||
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
||||||
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
|
new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext());
|
||||||
MediaItem mediaItem =
|
MediaItem mediaItem =
|
||||||
new MediaItem.Builder().setUri(URI_MEDIA).setMimeType(MimeTypes.APPLICATION_MPD).build();
|
new MediaItem.Builder().setUri(URI_MEDIA).setMimeType(MimeTypes.APPLICATION_MPD).build();
|
||||||
|
|
||||||
@ -49,7 +50,7 @@ public class DefaultMediaSourceFactoryTest {
|
|||||||
public void createMediaSource_withTag_tagInSource() {
|
public void createMediaSource_withTag_tagInSource() {
|
||||||
Object tag = new Object();
|
Object tag = new Object();
|
||||||
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
||||||
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
|
new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext());
|
||||||
MediaItem mediaItem =
|
MediaItem mediaItem =
|
||||||
new MediaItem.Builder()
|
new MediaItem.Builder()
|
||||||
.setUri(URI_MEDIA)
|
.setUri(URI_MEDIA)
|
||||||
@ -65,7 +66,7 @@ public class DefaultMediaSourceFactoryTest {
|
|||||||
@Test
|
@Test
|
||||||
public void createMediaSource_withPath_dashSource() {
|
public void createMediaSource_withPath_dashSource() {
|
||||||
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
||||||
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
|
new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext());
|
||||||
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA + "/file.mpd").build();
|
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA + "/file.mpd").build();
|
||||||
|
|
||||||
MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem);
|
MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem);
|
||||||
@ -76,7 +77,7 @@ public class DefaultMediaSourceFactoryTest {
|
|||||||
@Test
|
@Test
|
||||||
public void createMediaSource_withNull_usesNonNullDefaults() {
|
public void createMediaSource_withNull_usesNonNullDefaults() {
|
||||||
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
||||||
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
|
new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext());
|
||||||
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA + "/file.mpd").build();
|
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA + "/file.mpd").build();
|
||||||
|
|
||||||
MediaSource mediaSource =
|
MediaSource mediaSource =
|
||||||
@ -92,7 +93,7 @@ public class DefaultMediaSourceFactoryTest {
|
|||||||
@Test
|
@Test
|
||||||
public void getSupportedTypes_dashModule_containsTypeDash() {
|
public void getSupportedTypes_dashModule_containsTypeDash() {
|
||||||
int[] supportedTypes =
|
int[] supportedTypes =
|
||||||
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext())
|
new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext())
|
||||||
.getSupportedTypes();
|
.getSupportedTypes();
|
||||||
|
|
||||||
assertThat(supportedTypes).asList().containsExactly(C.TYPE_OTHER, C.TYPE_DASH);
|
assertThat(supportedTypes).asList().containsExactly(C.TYPE_OTHER, C.TYPE_DASH);
|
||||||
|
@ -17,6 +17,7 @@ package com.google.android.exoplayer2.source.hls;
|
|||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
import androidx.test.core.app.ApplicationProvider;
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
import com.google.android.exoplayer2.C;
|
import com.google.android.exoplayer2.C;
|
||||||
@ -36,7 +37,7 @@ public class DefaultMediaSourceFactoryTest {
|
|||||||
@Test
|
@Test
|
||||||
public void createMediaSource_withMimeType_hlsSource() {
|
public void createMediaSource_withMimeType_hlsSource() {
|
||||||
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
||||||
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
|
new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext());
|
||||||
MediaItem mediaItem =
|
MediaItem mediaItem =
|
||||||
new MediaItem.Builder().setUri(URI_MEDIA).setMimeType(MimeTypes.APPLICATION_M3U8).build();
|
new MediaItem.Builder().setUri(URI_MEDIA).setMimeType(MimeTypes.APPLICATION_M3U8).build();
|
||||||
|
|
||||||
@ -49,7 +50,7 @@ public class DefaultMediaSourceFactoryTest {
|
|||||||
public void createMediaSource_withTag_tagInSource() {
|
public void createMediaSource_withTag_tagInSource() {
|
||||||
Object tag = new Object();
|
Object tag = new Object();
|
||||||
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
||||||
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
|
new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext());
|
||||||
MediaItem mediaItem =
|
MediaItem mediaItem =
|
||||||
new MediaItem.Builder()
|
new MediaItem.Builder()
|
||||||
.setUri(URI_MEDIA)
|
.setUri(URI_MEDIA)
|
||||||
@ -65,7 +66,7 @@ public class DefaultMediaSourceFactoryTest {
|
|||||||
@Test
|
@Test
|
||||||
public void createMediaSource_withPath_hlsSource() {
|
public void createMediaSource_withPath_hlsSource() {
|
||||||
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
||||||
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
|
new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext());
|
||||||
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA + "/file.m3u8").build();
|
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA + "/file.m3u8").build();
|
||||||
|
|
||||||
MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem);
|
MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem);
|
||||||
@ -76,7 +77,7 @@ public class DefaultMediaSourceFactoryTest {
|
|||||||
@Test
|
@Test
|
||||||
public void createMediaSource_withNull_usesNonNullDefaults() {
|
public void createMediaSource_withNull_usesNonNullDefaults() {
|
||||||
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
||||||
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
|
new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext());
|
||||||
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA + "/file.m3u8").build();
|
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA + "/file.m3u8").build();
|
||||||
|
|
||||||
MediaSource mediaSource =
|
MediaSource mediaSource =
|
||||||
@ -92,7 +93,7 @@ public class DefaultMediaSourceFactoryTest {
|
|||||||
@Test
|
@Test
|
||||||
public void getSupportedTypes_hlsModule_containsTypeHls() {
|
public void getSupportedTypes_hlsModule_containsTypeHls() {
|
||||||
int[] supportedTypes =
|
int[] supportedTypes =
|
||||||
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext())
|
new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext())
|
||||||
.getSupportedTypes();
|
.getSupportedTypes();
|
||||||
|
|
||||||
assertThat(supportedTypes).asList().containsExactly(C.TYPE_OTHER, C.TYPE_HLS);
|
assertThat(supportedTypes).asList().containsExactly(C.TYPE_OTHER, C.TYPE_HLS);
|
||||||
|
@ -17,6 +17,7 @@ package com.google.android.exoplayer2.source.smoothstreaming;
|
|||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
import androidx.test.core.app.ApplicationProvider;
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
import com.google.android.exoplayer2.C;
|
import com.google.android.exoplayer2.C;
|
||||||
@ -38,7 +39,7 @@ public class DefaultMediaSourceFactoryTest {
|
|||||||
@Test
|
@Test
|
||||||
public void createMediaSource_withMimeType_smoothstreamingSource() {
|
public void createMediaSource_withMimeType_smoothstreamingSource() {
|
||||||
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
||||||
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
|
new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext());
|
||||||
MediaItem mediaItem =
|
MediaItem mediaItem =
|
||||||
new MediaItem.Builder().setUri(URI_MEDIA).setMimeType(MimeTypes.APPLICATION_SS).build();
|
new MediaItem.Builder().setUri(URI_MEDIA).setMimeType(MimeTypes.APPLICATION_SS).build();
|
||||||
MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem);
|
MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem);
|
||||||
@ -49,7 +50,7 @@ public class DefaultMediaSourceFactoryTest {
|
|||||||
public void createMediaSource_withTag_tagInSource() {
|
public void createMediaSource_withTag_tagInSource() {
|
||||||
Object tag = new Object();
|
Object tag = new Object();
|
||||||
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
||||||
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
|
new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext());
|
||||||
MediaItem mediaItem =
|
MediaItem mediaItem =
|
||||||
new MediaItem.Builder()
|
new MediaItem.Builder()
|
||||||
.setUri(URI_MEDIA)
|
.setUri(URI_MEDIA)
|
||||||
@ -65,7 +66,7 @@ public class DefaultMediaSourceFactoryTest {
|
|||||||
@Test
|
@Test
|
||||||
public void createMediaSource_withIsmPath_smoothstreamingSource() {
|
public void createMediaSource_withIsmPath_smoothstreamingSource() {
|
||||||
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
||||||
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
|
new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext());
|
||||||
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA + "/file.ism").build();
|
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA + "/file.ism").build();
|
||||||
|
|
||||||
MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem);
|
MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem);
|
||||||
@ -76,7 +77,7 @@ public class DefaultMediaSourceFactoryTest {
|
|||||||
@Test
|
@Test
|
||||||
public void createMediaSource_withManifestPath_smoothstreamingSource() {
|
public void createMediaSource_withManifestPath_smoothstreamingSource() {
|
||||||
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
||||||
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
|
new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext());
|
||||||
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA + ".ism/Manifest").build();
|
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA + ".ism/Manifest").build();
|
||||||
|
|
||||||
MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem);
|
MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem);
|
||||||
@ -87,7 +88,7 @@ public class DefaultMediaSourceFactoryTest {
|
|||||||
@Test
|
@Test
|
||||||
public void createMediaSource_withNull_usesNonNullDefaults() {
|
public void createMediaSource_withNull_usesNonNullDefaults() {
|
||||||
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
DefaultMediaSourceFactory defaultMediaSourceFactory =
|
||||||
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
|
new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext());
|
||||||
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA + "/file.ism").build();
|
MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA + "/file.ism").build();
|
||||||
|
|
||||||
MediaSource mediaSource =
|
MediaSource mediaSource =
|
||||||
@ -103,7 +104,7 @@ public class DefaultMediaSourceFactoryTest {
|
|||||||
@Test
|
@Test
|
||||||
public void getSupportedTypes_smoothstreamingModule_containsTypeSS() {
|
public void getSupportedTypes_smoothstreamingModule_containsTypeSS() {
|
||||||
int[] supportedTypes =
|
int[] supportedTypes =
|
||||||
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext())
|
new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext())
|
||||||
.getSupportedTypes();
|
.getSupportedTypes();
|
||||||
|
|
||||||
assertThat(supportedTypes).asList().containsExactly(C.TYPE_OTHER, C.TYPE_SS);
|
assertThat(supportedTypes).asList().containsExactly(C.TYPE_OTHER, C.TYPE_SS);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user