diff --git a/demo/src/main/java/com/google/android/exoplayer/demo/PlayerActivity.java b/demo/src/main/java/com/google/android/exoplayer/demo/PlayerActivity.java index 852f8f0927..e058550cb5 100644 --- a/demo/src/main/java/com/google/android/exoplayer/demo/PlayerActivity.java +++ b/demo/src/main/java/com/google/android/exoplayer/demo/PlayerActivity.java @@ -22,12 +22,9 @@ import com.google.android.exoplayer.ExoPlaybackException; import com.google.android.exoplayer.ExoPlayer; import com.google.android.exoplayer.MediaCodecTrackRenderer.DecoderInitializationException; import com.google.android.exoplayer.MediaCodecUtil.DecoderQueryException; -import com.google.android.exoplayer.demo.player.DashSourceBuilder; +import com.google.android.exoplayer.SampleSource; import com.google.android.exoplayer.demo.player.DemoPlayer; -import com.google.android.exoplayer.demo.player.DemoPlayer.SourceBuilder; -import com.google.android.exoplayer.demo.player.ExtractorSourceBuilder; -import com.google.android.exoplayer.demo.player.HlsSourceBuilder; -import com.google.android.exoplayer.demo.player.SmoothStreamingSourceBuilder; +import com.google.android.exoplayer.demo.player.SourceBuilder; import com.google.android.exoplayer.demo.ui.TrackSelectionHelper; import com.google.android.exoplayer.drm.UnsupportedDrmException; import com.google.android.exoplayer.metadata.id3.GeobFrame; @@ -286,18 +283,18 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback, // Internal methods - private SourceBuilder getSourceBuilder() { + private SampleSource buildSource(DemoPlayer player) { switch (contentType) { case Util.TYPE_SS: - return new SmoothStreamingSourceBuilder(dataSourceFactory, contentUri.toString(), - new SmoothStreamingTestMediaDrmCallback()); + return SourceBuilder.buildSmoothStreamingSource(player, dataSourceFactory, + contentUri.toString(), new SmoothStreamingTestMediaDrmCallback()); case Util.TYPE_DASH: - return new DashSourceBuilder(dataSourceFactory, contentUri.toString(), + return SourceBuilder.buildDashSource(player, dataSourceFactory, contentUri.toString(), new WidevineTestMediaDrmCallback(contentId, provider)); case Util.TYPE_HLS: - return new HlsSourceBuilder(dataSourceFactory, contentUri.toString()); + return SourceBuilder.buildHlsSource(player, dataSourceFactory, contentUri.toString()); case Util.TYPE_OTHER: - return new ExtractorSourceBuilder(dataSourceFactory, contentUri); + return SourceBuilder.buildExtractorSource(player, dataSourceFactory, contentUri); default: throw new IllegalStateException("Unsupported type: " + contentType); } @@ -305,7 +302,7 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback, private void preparePlayer(boolean playWhenReady) { if (player == null) { - player = new DemoPlayer(this, getSourceBuilder()); + player = new DemoPlayer(this); player.addListener(this); player.setCaptionListener(this); player.setMetadataListener(this); @@ -324,7 +321,7 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback, debugViewHelper.start(); } if (playerNeedsPrepare) { - player.setSource(); + player.setSource(buildSource(player)); playerNeedsPrepare = false; updateButtonVisibilities(); } diff --git a/demo/src/main/java/com/google/android/exoplayer/demo/player/DashSourceBuilder.java b/demo/src/main/java/com/google/android/exoplayer/demo/player/DashSourceBuilder.java deleted file mode 100644 index 7bb2d95d61..0000000000 --- a/demo/src/main/java/com/google/android/exoplayer/demo/player/DashSourceBuilder.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright (C) 2014 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.google.android.exoplayer.demo.player; - -import com.google.android.exoplayer.C; -import com.google.android.exoplayer.DefaultLoadControl; -import com.google.android.exoplayer.LoadControl; -import com.google.android.exoplayer.MultiSampleSource; -import com.google.android.exoplayer.SampleSource; -import com.google.android.exoplayer.chunk.ChunkSampleSource; -import com.google.android.exoplayer.chunk.ChunkSource; -import com.google.android.exoplayer.chunk.FormatEvaluator.AdaptiveEvaluator; -import com.google.android.exoplayer.dash.DashChunkSource; -import com.google.android.exoplayer.dash.mpd.MediaPresentationDescription; -import com.google.android.exoplayer.dash.mpd.MediaPresentationDescriptionParser; -import com.google.android.exoplayer.demo.player.DemoPlayer.SourceBuilder; -import com.google.android.exoplayer.drm.MediaDrmCallback; -import com.google.android.exoplayer.upstream.BandwidthMeter; -import com.google.android.exoplayer.upstream.DataSource; -import com.google.android.exoplayer.upstream.DataSourceFactory; -import com.google.android.exoplayer.upstream.DefaultAllocator; -import com.google.android.exoplayer.util.ManifestFetcher; - -import android.net.Uri; -import android.os.Handler; - -/** - * A {@link SourceBuilder} for DASH. - */ -// TODO[REFACTOR]: Bring back DRM support. -// TODO[REFACTOR]: Bring back UTC timing element support. -public class DashSourceBuilder implements SourceBuilder { - - private static final int BUFFER_SEGMENT_SIZE = 64 * 1024; - private static final int VIDEO_BUFFER_SEGMENTS = 200; - private static final int AUDIO_BUFFER_SEGMENTS = 54; - private static final int TEXT_BUFFER_SEGMENTS = 2; - - private final DataSourceFactory dataSourceFactory; - private final String url; - private final MediaDrmCallback drmCallback; - - public DashSourceBuilder(DataSourceFactory dataSourceFactory, String url, - MediaDrmCallback drmCallback) { - this.dataSourceFactory = dataSourceFactory; - this.url = url; - this.drmCallback = drmCallback; - } - - @Override - public SampleSource buildSource(DemoPlayer player) { - MediaPresentationDescriptionParser parser = new MediaPresentationDescriptionParser(); - DataSource manifestDataSource = dataSourceFactory.createDataSource(); - // TODO[REFACTOR]: This needs releasing. - ManifestFetcher manifestFetcher = new ManifestFetcher<>( - Uri.parse(url), manifestDataSource, parser); - - Handler mainHandler = player.getMainHandler(); - BandwidthMeter bandwidthMeter = player.getBandwidthMeter(); - LoadControl loadControl = new DefaultLoadControl(new DefaultAllocator(BUFFER_SEGMENT_SIZE)); - - // Build the video renderer. - DataSource videoDataSource = dataSourceFactory.createDataSource(bandwidthMeter); - ChunkSource videoChunkSource = new DashChunkSource(manifestFetcher, C.TRACK_TYPE_VIDEO, - videoDataSource, new AdaptiveEvaluator(bandwidthMeter)); - ChunkSampleSource videoSampleSource = new ChunkSampleSource(videoChunkSource, loadControl, - VIDEO_BUFFER_SEGMENTS * BUFFER_SEGMENT_SIZE, mainHandler, player, DemoPlayer.TYPE_VIDEO); - - // Build the audio renderer. - DataSource audioDataSource = dataSourceFactory.createDataSource(bandwidthMeter); - ChunkSource audioChunkSource = new DashChunkSource(manifestFetcher, C.TRACK_TYPE_AUDIO, - audioDataSource, null); - ChunkSampleSource audioSampleSource = new ChunkSampleSource(audioChunkSource, loadControl, - AUDIO_BUFFER_SEGMENTS * BUFFER_SEGMENT_SIZE, mainHandler, player, - DemoPlayer.TYPE_AUDIO); - - // Build the text renderer. - DataSource textDataSource = dataSourceFactory.createDataSource(bandwidthMeter); - ChunkSource textChunkSource = new DashChunkSource(manifestFetcher, C.TRACK_TYPE_TEXT, - textDataSource, null); - ChunkSampleSource textSampleSource = new ChunkSampleSource(textChunkSource, loadControl, - TEXT_BUFFER_SEGMENTS * BUFFER_SEGMENT_SIZE, mainHandler, player, - DemoPlayer.TYPE_TEXT); - - return new MultiSampleSource(videoSampleSource, audioSampleSource, textSampleSource); - } - -} diff --git a/demo/src/main/java/com/google/android/exoplayer/demo/player/DemoPlayer.java b/demo/src/main/java/com/google/android/exoplayer/demo/player/DemoPlayer.java index 8dff9b31a0..4e95f13dfc 100644 --- a/demo/src/main/java/com/google/android/exoplayer/demo/player/DemoPlayer.java +++ b/demo/src/main/java/com/google/android/exoplayer/demo/player/DemoPlayer.java @@ -57,9 +57,7 @@ import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; /** - * A wrapper around {@link ExoPlayer} that provides a higher level interface. It can be prepared - * with one of a number of {@link SourceBuilder} classes to suit different use cases (e.g. DASH, - * SmoothStreaming and so on). + * A wrapper around {@link ExoPlayer} that provides a higher level interface. */ public class DemoPlayer implements ExoPlayer.Listener, DefaultTrackSelector.EventListener, ChunkSampleSourceEventListener, ExtractorSampleSource.EventListener, @@ -68,19 +66,6 @@ public class DemoPlayer implements ExoPlayer.Listener, DefaultTrackSelector.Even StreamingDrmSessionManager.EventListener, TextRenderer, MetadataRenderer>, DebugTextViewHelper.Provider { - /** - * Builds a source to play. - */ - public interface SourceBuilder { - /** - * Builds a source to play. - * - * @param player The player for which a source is being built. - * @return SampleSource The source to play. - */ - SampleSource buildSource(DemoPlayer player); - } - /** * A listener for core events. */ @@ -155,7 +140,6 @@ public class DemoPlayer implements ExoPlayer.Listener, DefaultTrackSelector.Even private final ExoPlayer player; private final DefaultTrackSelector trackSelector; - private final SourceBuilder sourceBuilder; private final BandwidthMeter bandwidthMeter; private final MediaCodecVideoTrackRenderer videoRenderer; private final PlayerControl playerControl; @@ -171,8 +155,7 @@ public class DemoPlayer implements ExoPlayer.Listener, DefaultTrackSelector.Even private InternalErrorListener internalErrorListener; private InfoListener infoListener; - public DemoPlayer(Context context, SourceBuilder sourceBuilder) { - this.sourceBuilder = sourceBuilder; + public DemoPlayer(Context context) { mainHandler = new Handler(); bandwidthMeter = new DefaultBandwidthMeter(); listeners = new CopyOnWriteArrayList<>(); @@ -246,8 +229,8 @@ public class DemoPlayer implements ExoPlayer.Listener, DefaultTrackSelector.Even return trackInfo; } - public void setSource() { - player.setSource(sourceBuilder.buildSource(this)); + public void setSource(SampleSource source) { + player.setSource(source); } public void setPlayWhenReady(boolean playWhenReady) { diff --git a/demo/src/main/java/com/google/android/exoplayer/demo/player/ExtractorSourceBuilder.java b/demo/src/main/java/com/google/android/exoplayer/demo/player/ExtractorSourceBuilder.java deleted file mode 100644 index 1533faad3c..0000000000 --- a/demo/src/main/java/com/google/android/exoplayer/demo/player/ExtractorSourceBuilder.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2014 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.google.android.exoplayer.demo.player; - -import com.google.android.exoplayer.SampleSource; -import com.google.android.exoplayer.demo.player.DemoPlayer.SourceBuilder; -import com.google.android.exoplayer.extractor.Extractor; -import com.google.android.exoplayer.extractor.ExtractorSampleSource; -import com.google.android.exoplayer.upstream.Allocator; -import com.google.android.exoplayer.upstream.DataSource; -import com.google.android.exoplayer.upstream.DataSourceFactory; -import com.google.android.exoplayer.upstream.DefaultAllocator; - -import android.net.Uri; - -/** - * A {@link SourceBuilder} for streams that can be read using an {@link Extractor}. - */ -public class ExtractorSourceBuilder implements SourceBuilder { - - private static final int BUFFER_SEGMENT_SIZE = 64 * 1024; - private static final int BUFFER_SEGMENT_COUNT = 256; - - private final DataSourceFactory dataSourceFactory; - private final Uri uri; - - public ExtractorSourceBuilder(DataSourceFactory dataSourceFactory, Uri uri) { - this.dataSourceFactory = dataSourceFactory; - this.uri = uri; - } - - @Override - public SampleSource buildSource(DemoPlayer player) { - Allocator allocator = new DefaultAllocator(BUFFER_SEGMENT_SIZE); - DataSource dataSource = dataSourceFactory.createDataSource(player.getBandwidthMeter()); - return new ExtractorSampleSource(uri, dataSource, allocator, - BUFFER_SEGMENT_COUNT * BUFFER_SEGMENT_SIZE, player.getMainHandler(), player, 0); - } - -} diff --git a/demo/src/main/java/com/google/android/exoplayer/demo/player/HlsSourceBuilder.java b/demo/src/main/java/com/google/android/exoplayer/demo/player/HlsSourceBuilder.java deleted file mode 100644 index f145ee354b..0000000000 --- a/demo/src/main/java/com/google/android/exoplayer/demo/player/HlsSourceBuilder.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (C) 2014 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.google.android.exoplayer.demo.player; - -import com.google.android.exoplayer.C; -import com.google.android.exoplayer.DefaultLoadControl; -import com.google.android.exoplayer.LoadControl; -import com.google.android.exoplayer.MultiSampleSource; -import com.google.android.exoplayer.SampleSource; -import com.google.android.exoplayer.chunk.FormatEvaluator; -import com.google.android.exoplayer.demo.player.DemoPlayer.SourceBuilder; -import com.google.android.exoplayer.hls.HlsChunkSource; -import com.google.android.exoplayer.hls.HlsPlaylist; -import com.google.android.exoplayer.hls.HlsPlaylistParser; -import com.google.android.exoplayer.hls.HlsSampleSource; -import com.google.android.exoplayer.hls.PtsTimestampAdjusterProvider; -import com.google.android.exoplayer.upstream.BandwidthMeter; -import com.google.android.exoplayer.upstream.DataSource; -import com.google.android.exoplayer.upstream.DataSourceFactory; -import com.google.android.exoplayer.upstream.DefaultAllocator; -import com.google.android.exoplayer.util.ManifestFetcher; - -import android.net.Uri; -import android.os.Handler; - -/** - * A {@link SourceBuilder} for HLS. - */ -// TODO[REFACTOR]: Bring back caption support. -public class HlsSourceBuilder implements SourceBuilder { - - private static final int BUFFER_SEGMENT_SIZE = 64 * 1024; - private static final int MAIN_BUFFER_SEGMENTS = 254; - private static final int AUDIO_BUFFER_SEGMENTS = 54; - private static final int TEXT_BUFFER_SEGMENTS = 2; - - private final DataSourceFactory dataSourceFactory; - private final String url; - - public HlsSourceBuilder(DataSourceFactory dataSourceFactory, String url) { - this.dataSourceFactory = dataSourceFactory; - this.url = url; - } - - @Override - public SampleSource buildSource(DemoPlayer player) { - HlsPlaylistParser parser = new HlsPlaylistParser(); - DataSource manifestDataSource = dataSourceFactory.createDataSource(); - // TODO[REFACTOR]: This needs releasing. - ManifestFetcher manifestFetcher = new ManifestFetcher<>(Uri.parse(url), - manifestDataSource, parser); - - Handler mainHandler = player.getMainHandler(); - BandwidthMeter bandwidthMeter = player.getBandwidthMeter(); - LoadControl loadControl = new DefaultLoadControl(new DefaultAllocator(BUFFER_SEGMENT_SIZE)); - PtsTimestampAdjusterProvider timestampAdjusterProvider = new PtsTimestampAdjusterProvider(); - - DataSource defaultDataSource = dataSourceFactory.createDataSource(bandwidthMeter); - HlsChunkSource defaultChunkSource = new HlsChunkSource(manifestFetcher, - C.TRACK_TYPE_DEFAULT, defaultDataSource, timestampAdjusterProvider, - new FormatEvaluator.AdaptiveEvaluator(bandwidthMeter)); - HlsSampleSource defaultSampleSource = new HlsSampleSource(defaultChunkSource, loadControl, - MAIN_BUFFER_SEGMENTS * BUFFER_SEGMENT_SIZE, mainHandler, player, DemoPlayer.TYPE_VIDEO); - - DataSource audioDataSource = dataSourceFactory.createDataSource(bandwidthMeter); - HlsChunkSource audioChunkSource = new HlsChunkSource(manifestFetcher, C.TRACK_TYPE_AUDIO, - audioDataSource, timestampAdjusterProvider, null); - HlsSampleSource audioSampleSource = new HlsSampleSource(audioChunkSource, loadControl, - AUDIO_BUFFER_SEGMENTS * BUFFER_SEGMENT_SIZE, mainHandler, player, DemoPlayer.TYPE_AUDIO); - - DataSource subtitleDataSource = dataSourceFactory.createDataSource(bandwidthMeter); - HlsChunkSource subtitleChunkSource = new HlsChunkSource(manifestFetcher, - C.TRACK_TYPE_TEXT, subtitleDataSource, timestampAdjusterProvider, null); - HlsSampleSource subtitleSampleSource = new HlsSampleSource(subtitleChunkSource, loadControl, - TEXT_BUFFER_SEGMENTS * BUFFER_SEGMENT_SIZE, mainHandler, player, DemoPlayer.TYPE_TEXT); - - return new MultiSampleSource(defaultSampleSource, audioSampleSource, subtitleSampleSource); - } - -} diff --git a/demo/src/main/java/com/google/android/exoplayer/demo/player/SmoothStreamingSourceBuilder.java b/demo/src/main/java/com/google/android/exoplayer/demo/player/SmoothStreamingSourceBuilder.java deleted file mode 100644 index d346361eb4..0000000000 --- a/demo/src/main/java/com/google/android/exoplayer/demo/player/SmoothStreamingSourceBuilder.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (C) 2014 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.google.android.exoplayer.demo.player; - -import com.google.android.exoplayer.C; -import com.google.android.exoplayer.DefaultLoadControl; -import com.google.android.exoplayer.LoadControl; -import com.google.android.exoplayer.MultiSampleSource; -import com.google.android.exoplayer.SampleSource; -import com.google.android.exoplayer.chunk.ChunkSampleSource; -import com.google.android.exoplayer.chunk.ChunkSource; -import com.google.android.exoplayer.chunk.FormatEvaluator.AdaptiveEvaluator; -import com.google.android.exoplayer.demo.player.DemoPlayer.SourceBuilder; -import com.google.android.exoplayer.drm.MediaDrmCallback; -import com.google.android.exoplayer.smoothstreaming.SmoothStreamingChunkSource; -import com.google.android.exoplayer.smoothstreaming.SmoothStreamingManifest; -import com.google.android.exoplayer.smoothstreaming.SmoothStreamingManifestParser; -import com.google.android.exoplayer.upstream.BandwidthMeter; -import com.google.android.exoplayer.upstream.DataSource; -import com.google.android.exoplayer.upstream.DataSourceFactory; -import com.google.android.exoplayer.upstream.DefaultAllocator; -import com.google.android.exoplayer.util.ManifestFetcher; -import com.google.android.exoplayer.util.Util; - -import android.net.Uri; -import android.os.Handler; - -/** - * A {@link SourceBuilder} for SmoothStreaming. - */ -// TODO[REFACTOR]: Bring back DRM support. -public class SmoothStreamingSourceBuilder implements SourceBuilder { - - private static final int BUFFER_SEGMENT_SIZE = 64 * 1024; - private static final int VIDEO_BUFFER_SEGMENTS = 200; - private static final int AUDIO_BUFFER_SEGMENTS = 54; - private static final int TEXT_BUFFER_SEGMENTS = 2; - - private final DataSourceFactory dataSourceFactory; - private final String url; - private final MediaDrmCallback drmCallback; - - public SmoothStreamingSourceBuilder(DataSourceFactory dataSourceFactory, String url, - MediaDrmCallback drmCallback) { - this.dataSourceFactory = dataSourceFactory; - this.url = Util.toLowerInvariant(url).endsWith("/manifest") ? url : url + "/Manifest"; - this.drmCallback = drmCallback; - } - - @Override - public SampleSource buildSource(DemoPlayer player) { - SmoothStreamingManifestParser parser = new SmoothStreamingManifestParser(); - // TODO[REFACTOR]: This needs releasing. - DataSource manifestDataSource = dataSourceFactory.createDataSource(); - ManifestFetcher manifestFetcher = new ManifestFetcher<>(Uri.parse(url), - manifestDataSource, parser); - Handler mainHandler = player.getMainHandler(); - BandwidthMeter bandwidthMeter = player.getBandwidthMeter(); - LoadControl loadControl = new DefaultLoadControl(new DefaultAllocator(BUFFER_SEGMENT_SIZE)); - - // Build the video renderer. - DataSource videoDataSource = dataSourceFactory.createDataSource(bandwidthMeter); - ChunkSource videoChunkSource = new SmoothStreamingChunkSource(manifestFetcher, - C.TRACK_TYPE_VIDEO, videoDataSource, new AdaptiveEvaluator(bandwidthMeter)); - ChunkSampleSource videoSampleSource = new ChunkSampleSource(videoChunkSource, loadControl, - VIDEO_BUFFER_SEGMENTS * BUFFER_SEGMENT_SIZE, mainHandler, player, - DemoPlayer.TYPE_VIDEO); - - // Build the audio renderer. - DataSource audioDataSource = dataSourceFactory.createDataSource(bandwidthMeter); - ChunkSource audioChunkSource = new SmoothStreamingChunkSource(manifestFetcher, - C.TRACK_TYPE_AUDIO, audioDataSource, null); - ChunkSampleSource audioSampleSource = new ChunkSampleSource(audioChunkSource, loadControl, - AUDIO_BUFFER_SEGMENTS * BUFFER_SEGMENT_SIZE, mainHandler, player, DemoPlayer.TYPE_AUDIO); - - // Build the text renderer. - DataSource textDataSource = dataSourceFactory.createDataSource(bandwidthMeter); - ChunkSource textChunkSource = new SmoothStreamingChunkSource(manifestFetcher, - C.TRACK_TYPE_TEXT, textDataSource, null); - ChunkSampleSource textSampleSource = new ChunkSampleSource(textChunkSource, loadControl, - TEXT_BUFFER_SEGMENTS * BUFFER_SEGMENT_SIZE, mainHandler, player, DemoPlayer.TYPE_TEXT); - - return new MultiSampleSource(videoSampleSource, audioSampleSource, textSampleSource); - } - -} diff --git a/demo/src/main/java/com/google/android/exoplayer/demo/player/SourceBuilder.java b/demo/src/main/java/com/google/android/exoplayer/demo/player/SourceBuilder.java new file mode 100644 index 0000000000..91b75865b2 --- /dev/null +++ b/demo/src/main/java/com/google/android/exoplayer/demo/player/SourceBuilder.java @@ -0,0 +1,184 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.android.exoplayer.demo.player; + +import com.google.android.exoplayer.C; +import com.google.android.exoplayer.DefaultLoadControl; +import com.google.android.exoplayer.LoadControl; +import com.google.android.exoplayer.MultiSampleSource; +import com.google.android.exoplayer.SampleSource; +import com.google.android.exoplayer.chunk.ChunkSampleSource; +import com.google.android.exoplayer.chunk.ChunkSource; +import com.google.android.exoplayer.chunk.FormatEvaluator; +import com.google.android.exoplayer.chunk.FormatEvaluator.AdaptiveEvaluator; +import com.google.android.exoplayer.dash.DashChunkSource; +import com.google.android.exoplayer.dash.mpd.MediaPresentationDescription; +import com.google.android.exoplayer.dash.mpd.MediaPresentationDescriptionParser; +import com.google.android.exoplayer.drm.MediaDrmCallback; +import com.google.android.exoplayer.extractor.ExtractorSampleSource; +import com.google.android.exoplayer.hls.HlsChunkSource; +import com.google.android.exoplayer.hls.HlsPlaylist; +import com.google.android.exoplayer.hls.HlsPlaylistParser; +import com.google.android.exoplayer.hls.HlsSampleSource; +import com.google.android.exoplayer.hls.PtsTimestampAdjusterProvider; +import com.google.android.exoplayer.smoothstreaming.SmoothStreamingChunkSource; +import com.google.android.exoplayer.smoothstreaming.SmoothStreamingManifest; +import com.google.android.exoplayer.smoothstreaming.SmoothStreamingManifestParser; +import com.google.android.exoplayer.upstream.Allocator; +import com.google.android.exoplayer.upstream.BandwidthMeter; +import com.google.android.exoplayer.upstream.DataSource; +import com.google.android.exoplayer.upstream.DataSourceFactory; +import com.google.android.exoplayer.upstream.DefaultAllocator; +import com.google.android.exoplayer.util.ManifestFetcher; + +import android.net.Uri; +import android.os.Handler; + +/** + * A utility class for building {@link SampleSource} instances. + */ +public class SourceBuilder { + + private static final int BUFFER_SEGMENT_SIZE = 64 * 1024; + + private static final int MUXED_BUFFER_SEGMENTS = 256; + private static final int VIDEO_BUFFER_SEGMENTS = 200; + private static final int AUDIO_BUFFER_SEGMENTS = 54; + private static final int TEXT_BUFFER_SEGMENTS = 2; + + private SourceBuilder() {} + + // TODO[REFACTOR]: Bring back DASH DRM support. + // TODO[REFACTOR]: Bring back DASH UTC timing element support. + public static SampleSource buildDashSource(DemoPlayer player, DataSourceFactory dataSourceFactory, + String url, MediaDrmCallback drmCallback) { + MediaPresentationDescriptionParser parser = new MediaPresentationDescriptionParser(); + DataSource manifestDataSource = dataSourceFactory.createDataSource(); + // TODO[REFACTOR]: This needs releasing. + ManifestFetcher manifestFetcher = new ManifestFetcher<>( + Uri.parse(url), manifestDataSource, parser); + + Handler mainHandler = player.getMainHandler(); + BandwidthMeter bandwidthMeter = player.getBandwidthMeter(); + LoadControl loadControl = new DefaultLoadControl(new DefaultAllocator(BUFFER_SEGMENT_SIZE)); + + // Build the video renderer. + DataSource videoDataSource = dataSourceFactory.createDataSource(bandwidthMeter); + ChunkSource videoChunkSource = new DashChunkSource(manifestFetcher, C.TRACK_TYPE_VIDEO, + videoDataSource, new AdaptiveEvaluator(bandwidthMeter)); + ChunkSampleSource videoSampleSource = new ChunkSampleSource(videoChunkSource, loadControl, + VIDEO_BUFFER_SEGMENTS * BUFFER_SEGMENT_SIZE, mainHandler, player, DemoPlayer.TYPE_VIDEO); + + // Build the audio renderer. + DataSource audioDataSource = dataSourceFactory.createDataSource(bandwidthMeter); + ChunkSource audioChunkSource = new DashChunkSource(manifestFetcher, C.TRACK_TYPE_AUDIO, + audioDataSource, null); + ChunkSampleSource audioSampleSource = new ChunkSampleSource(audioChunkSource, loadControl, + AUDIO_BUFFER_SEGMENTS * BUFFER_SEGMENT_SIZE, mainHandler, player, + DemoPlayer.TYPE_AUDIO); + + // Build the text renderer. + DataSource textDataSource = dataSourceFactory.createDataSource(bandwidthMeter); + ChunkSource textChunkSource = new DashChunkSource(manifestFetcher, C.TRACK_TYPE_TEXT, + textDataSource, null); + ChunkSampleSource textSampleSource = new ChunkSampleSource(textChunkSource, loadControl, + TEXT_BUFFER_SEGMENTS * BUFFER_SEGMENT_SIZE, mainHandler, player, + DemoPlayer.TYPE_TEXT); + + return new MultiSampleSource(videoSampleSource, audioSampleSource, textSampleSource); + } + + // TODO[REFACTOR]: Bring back DRM support. + public static SampleSource buildSmoothStreamingSource(DemoPlayer player, + DataSourceFactory dataSourceFactory, String url, MediaDrmCallback drmCallback) { + SmoothStreamingManifestParser parser = new SmoothStreamingManifestParser(); + // TODO[REFACTOR]: This needs releasing. + DataSource manifestDataSource = dataSourceFactory.createDataSource(); + ManifestFetcher manifestFetcher = new ManifestFetcher<>(Uri.parse(url), + manifestDataSource, parser); + Handler mainHandler = player.getMainHandler(); + BandwidthMeter bandwidthMeter = player.getBandwidthMeter(); + LoadControl loadControl = new DefaultLoadControl(new DefaultAllocator(BUFFER_SEGMENT_SIZE)); + + // Build the video renderer. + DataSource videoDataSource = dataSourceFactory.createDataSource(bandwidthMeter); + ChunkSource videoChunkSource = new SmoothStreamingChunkSource(manifestFetcher, + C.TRACK_TYPE_VIDEO, videoDataSource, new AdaptiveEvaluator(bandwidthMeter)); + ChunkSampleSource videoSampleSource = new ChunkSampleSource(videoChunkSource, loadControl, + VIDEO_BUFFER_SEGMENTS * BUFFER_SEGMENT_SIZE, mainHandler, player, + DemoPlayer.TYPE_VIDEO); + + // Build the audio renderer. + DataSource audioDataSource = dataSourceFactory.createDataSource(bandwidthMeter); + ChunkSource audioChunkSource = new SmoothStreamingChunkSource(manifestFetcher, + C.TRACK_TYPE_AUDIO, audioDataSource, null); + ChunkSampleSource audioSampleSource = new ChunkSampleSource(audioChunkSource, loadControl, + AUDIO_BUFFER_SEGMENTS * BUFFER_SEGMENT_SIZE, mainHandler, player, DemoPlayer.TYPE_AUDIO); + + // Build the text renderer. + DataSource textDataSource = dataSourceFactory.createDataSource(bandwidthMeter); + ChunkSource textChunkSource = new SmoothStreamingChunkSource(manifestFetcher, + C.TRACK_TYPE_TEXT, textDataSource, null); + ChunkSampleSource textSampleSource = new ChunkSampleSource(textChunkSource, loadControl, + TEXT_BUFFER_SEGMENTS * BUFFER_SEGMENT_SIZE, mainHandler, player, DemoPlayer.TYPE_TEXT); + + return new MultiSampleSource(videoSampleSource, audioSampleSource, textSampleSource); + } + + public static SampleSource buildHlsSource(DemoPlayer player, + DataSourceFactory dataSourceFactory, String url) { + HlsPlaylistParser parser = new HlsPlaylistParser(); + DataSource manifestDataSource = dataSourceFactory.createDataSource(); + // TODO[REFACTOR]: This needs releasing. + ManifestFetcher manifestFetcher = new ManifestFetcher<>(Uri.parse(url), + manifestDataSource, parser); + + Handler mainHandler = player.getMainHandler(); + BandwidthMeter bandwidthMeter = player.getBandwidthMeter(); + LoadControl loadControl = new DefaultLoadControl(new DefaultAllocator(BUFFER_SEGMENT_SIZE)); + PtsTimestampAdjusterProvider timestampAdjusterProvider = new PtsTimestampAdjusterProvider(); + + DataSource defaultDataSource = dataSourceFactory.createDataSource(bandwidthMeter); + HlsChunkSource defaultChunkSource = new HlsChunkSource(manifestFetcher, + C.TRACK_TYPE_DEFAULT, defaultDataSource, timestampAdjusterProvider, + new FormatEvaluator.AdaptiveEvaluator(bandwidthMeter)); + HlsSampleSource defaultSampleSource = new HlsSampleSource(defaultChunkSource, loadControl, + MUXED_BUFFER_SEGMENTS * BUFFER_SEGMENT_SIZE, mainHandler, player, DemoPlayer.TYPE_VIDEO); + + DataSource audioDataSource = dataSourceFactory.createDataSource(bandwidthMeter); + HlsChunkSource audioChunkSource = new HlsChunkSource(manifestFetcher, C.TRACK_TYPE_AUDIO, + audioDataSource, timestampAdjusterProvider, null); + HlsSampleSource audioSampleSource = new HlsSampleSource(audioChunkSource, loadControl, + AUDIO_BUFFER_SEGMENTS * BUFFER_SEGMENT_SIZE, mainHandler, player, DemoPlayer.TYPE_AUDIO); + + DataSource subtitleDataSource = dataSourceFactory.createDataSource(bandwidthMeter); + HlsChunkSource subtitleChunkSource = new HlsChunkSource(manifestFetcher, + C.TRACK_TYPE_TEXT, subtitleDataSource, timestampAdjusterProvider, null); + HlsSampleSource subtitleSampleSource = new HlsSampleSource(subtitleChunkSource, loadControl, + TEXT_BUFFER_SEGMENTS * BUFFER_SEGMENT_SIZE, mainHandler, player, DemoPlayer.TYPE_TEXT); + + return new MultiSampleSource(defaultSampleSource, audioSampleSource, subtitleSampleSource); + } + + public static SampleSource buildExtractorSource(DemoPlayer player, + DataSourceFactory dataSourceFactory, Uri uri) { + Allocator allocator = new DefaultAllocator(BUFFER_SEGMENT_SIZE); + DataSource dataSource = dataSourceFactory.createDataSource(player.getBandwidthMeter()); + return new ExtractorSampleSource(uri, dataSource, allocator, + MUXED_BUFFER_SEGMENTS * BUFFER_SEGMENT_SIZE, player.getMainHandler(), player, 0); + } + +}