mirror of
https://github.com/samsonjs/media.git
synced 2026-03-31 10:25:48 +00:00
Simplify source building.
------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=119842861
This commit is contained in:
parent
e4ee19513c
commit
d9dcc58dca
7 changed files with 198 additions and 380 deletions
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<MediaPresentationDescription> 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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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<List<Id3Frame>>,
|
||||
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) {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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<HlsPlaylist> 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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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<SmoothStreamingManifest> 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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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<MediaPresentationDescription> 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<SmoothStreamingManifest> 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<HlsPlaylist> 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);
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Reference in a new issue