Commit a0d42b53 by andrewlewis Committed by Oliver Woodman

Make DashMediaSource.Builder a factory for DashMediaSources

This is in preparation for supporting non-extractor MediaSources for ads in
AdsMediaSource.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=178377627
parent 3e9c86fc
...@@ -371,11 +371,10 @@ public class PlayerActivity extends Activity implements OnClickListener, ...@@ -371,11 +371,10 @@ public class PlayerActivity extends Activity implements OnClickListener,
.setEventListener(mainHandler, eventLogger) .setEventListener(mainHandler, eventLogger)
.build(); .build();
case C.TYPE_DASH: case C.TYPE_DASH:
return DashMediaSource.Builder return new DashMediaSource.Factory(
.forManifestUri(uri, buildDataSourceFactory(false), new DefaultDashChunkSource.Factory(mediaDataSourceFactory),
new DefaultDashChunkSource.Factory(mediaDataSourceFactory)) buildDataSourceFactory(false))
.setEventListener(mainHandler, eventLogger) .createMediaSource(uri, mainHandler, eventLogger);
.build();
case C.TYPE_HLS: case C.TYPE_HLS:
return HlsMediaSource.Builder return HlsMediaSource.Builder
.forDataSource(uri, mediaDataSourceFactory) .forDataSource(uri, mediaDataSourceFactory)
......
...@@ -44,6 +44,31 @@ import java.util.Map; ...@@ -44,6 +44,31 @@ import java.util.Map;
*/ */
public final class AdsMediaSource implements MediaSource { public final class AdsMediaSource implements MediaSource {
/** Factory for creating {@link MediaSource}s to play ad media. */
public interface MediaSourceFactory {
/**
* Creates a new {@link MediaSource} for loading the ad media with the specified {@code uri}.
*
* @param uri The URI of the media or manifest to play.
* @param handler A handler for listener events. May be null if delivery of events is not
* required.
* @param listener A listener for events. May be null if delivery of events is not required.
* @return The new media source.
*/
MediaSource createMediaSource(
Uri uri, @Nullable Handler handler, @Nullable MediaSourceEventListener listener);
/**
* Returns the content types supported by media sources created by this factory. Each element
* should be one of {@link C#TYPE_DASH}, {@link C#TYPE_SS}, {@link C#TYPE_HLS} or {@link
* C#TYPE_OTHER}.
*
* @return The content types supported by media sources created by this factory.
*/
int[] getSupportedTypes();
}
/** Listener for ads media source events. */ /** Listener for ads media source events. */
public interface EventListener extends MediaSourceEventListener { public interface EventListener extends MediaSourceEventListener {
...@@ -77,7 +102,7 @@ public final class AdsMediaSource implements MediaSource { ...@@ -77,7 +102,7 @@ public final class AdsMediaSource implements MediaSource {
@Nullable private final EventListener eventListener; @Nullable private final EventListener eventListener;
private final Handler mainHandler; private final Handler mainHandler;
private final ComponentListener componentListener; private final ComponentListener componentListener;
private final AdMediaSourceFactory adMediaSourceFactory; private final MediaSourceFactory adMediaSourceFactory;
private final Map<MediaSource, List<DeferredMediaPeriod>> deferredMediaPeriodByAdMediaSource; private final Map<MediaSource, List<DeferredMediaPeriod>> deferredMediaPeriodByAdMediaSource;
private final Timeline.Period period; private final Timeline.Period period;
...@@ -138,7 +163,7 @@ public final class AdsMediaSource implements MediaSource { ...@@ -138,7 +163,7 @@ public final class AdsMediaSource implements MediaSource {
this.eventListener = eventListener; this.eventListener = eventListener;
mainHandler = new Handler(Looper.getMainLooper()); mainHandler = new Handler(Looper.getMainLooper());
componentListener = new ComponentListener(); componentListener = new ComponentListener();
adMediaSourceFactory = new ExtractorAdMediaSourceFactory(dataSourceFactory); adMediaSourceFactory = new ExtractorMediaSourceFactory(dataSourceFactory);
deferredMediaPeriodByAdMediaSource = new HashMap<>(); deferredMediaPeriodByAdMediaSource = new HashMap<>();
period = new Timeline.Period(); period = new Timeline.Period();
adGroupMediaSources = new MediaSource[0][]; adGroupMediaSources = new MediaSource[0][];
...@@ -186,7 +211,7 @@ public final class AdsMediaSource implements MediaSource { ...@@ -186,7 +211,7 @@ public final class AdsMediaSource implements MediaSource {
if (adGroupMediaSources[adGroupIndex].length <= adIndexInAdGroup) { if (adGroupMediaSources[adGroupIndex].length <= adIndexInAdGroup) {
Uri adUri = adPlaybackState.adUris[id.adGroupIndex][id.adIndexInAdGroup]; Uri adUri = adPlaybackState.adUris[id.adGroupIndex][id.adIndexInAdGroup];
final MediaSource adMediaSource = final MediaSource adMediaSource =
adMediaSourceFactory.createAdMediaSource(adUri, eventHandler, eventListener); adMediaSourceFactory.createMediaSource(adUri, eventHandler, eventListener);
int oldAdCount = adGroupMediaSources[id.adGroupIndex].length; int oldAdCount = adGroupMediaSources[id.adGroupIndex].length;
if (adIndexInAdGroup >= oldAdCount) { if (adIndexInAdGroup >= oldAdCount) {
int adCount = adIndexInAdGroup + 1; int adCount = adIndexInAdGroup + 1;
...@@ -371,44 +396,16 @@ public final class AdsMediaSource implements MediaSource { ...@@ -371,44 +396,16 @@ public final class AdsMediaSource implements MediaSource {
} }
/** private static final class ExtractorMediaSourceFactory implements MediaSourceFactory {
* Factory for {@link MediaSource}s for loading ad media.
*/
private interface AdMediaSourceFactory {
/**
* Creates a new {@link MediaSource} for loading the ad media with the specified {@code uri}.
*
* @param uri The URI of the ad.
* @param handler A handler for listener events. May be null if delivery of events is not
* required.
* @param listener A listener for events. May be null if delivery of events is not required.
* @return The new media source.
*/
MediaSource createAdMediaSource(
Uri uri, @Nullable Handler handler, @Nullable MediaSourceEventListener listener);
/**
* Returns the content types supported by media sources created by this factory. Each element
* should be one of {@link C#TYPE_DASH}, {@link C#TYPE_SS}, {@link C#TYPE_HLS} or
* {@link C#TYPE_OTHER}.
*
* @return The content types supported by the factory.
*/
int[] getSupportedTypes();
}
private static final class ExtractorAdMediaSourceFactory implements AdMediaSourceFactory {
private final DataSource.Factory dataSourceFactory; private final DataSource.Factory dataSourceFactory;
public ExtractorAdMediaSourceFactory(DataSource.Factory dataSourceFactory) { public ExtractorMediaSourceFactory(DataSource.Factory dataSourceFactory) {
this.dataSourceFactory = dataSourceFactory; this.dataSourceFactory = dataSourceFactory;
} }
@Override @Override
public MediaSource createAdMediaSource( public MediaSource createMediaSource(
Uri uri, @Nullable Handler handler, @Nullable MediaSourceEventListener listener) { Uri uri, @Nullable Handler handler, @Nullable MediaSourceEventListener listener) {
return new ExtractorMediaSource.Builder(uri, dataSourceFactory) return new ExtractorMediaSource.Builder(uri, dataSourceFactory)
.setEventListener(handler, listener) .setEventListener(handler, listener)
......
...@@ -316,11 +316,10 @@ public final class DashTestRunner { ...@@ -316,11 +316,10 @@ public final class DashTestRunner {
Uri manifestUri = Uri.parse(manifestUrl); Uri manifestUri = Uri.parse(manifestUrl);
DefaultDashChunkSource.Factory chunkSourceFactory = new DefaultDashChunkSource.Factory( DefaultDashChunkSource.Factory chunkSourceFactory = new DefaultDashChunkSource.Factory(
mediaDataSourceFactory); mediaDataSourceFactory);
return DashMediaSource.Builder return new DashMediaSource.Factory(chunkSourceFactory, manifestDataSourceFactory)
.forManifestUri(manifestUri, manifestDataSourceFactory, chunkSourceFactory)
.setMinLoadableRetryCount(MIN_LOADABLE_RETRY_COUNT) .setMinLoadableRetryCount(MIN_LOADABLE_RETRY_COUNT)
.setLivePresentationDelayMs(0) .setLivePresentationDelayMs(0)
.build(); .createMediaSource(manifestUri);
} }
@Override @Override
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment