package com.felkertech.cumulustv.player; import android.content.Context; import android.net.Uri; import android.os.Handler; import android.text.TextUtils; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory; import com.google.android.exoplayer2.source.ExtractorMediaSource; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.dash.DashMediaSource; import com.google.android.exoplayer2.source.dash.DefaultDashChunkSource; import com.google.android.exoplayer2.source.hls.HlsMediaSource; import com.google.android.exoplayer2.source.smoothstreaming.DefaultSsChunkSource; import com.google.android.exoplayer2.source.smoothstreaming.SsMediaSource; import com.google.android.exoplayer2.upstream.ByteArrayDataSink; import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter; import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; import com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory; import com.google.android.exoplayer2.upstream.HttpDataSource; import com.google.android.exoplayer2.util.Util; /** * Created by guest1 on 12/23/2016. */ public class MediaSourceFactory { private static final DefaultBandwidthMeter BANDWIDTH_METER = new DefaultBandwidthMeter(); public static MediaSource getMediaSourceFor(Context context, Uri mediaUri) { return getMediaSourceFor(context, mediaUri, null); } public static MediaSource getMediaSourceFor(Context context, Uri mediaUri, String overrideExtension) { // Measures bandwidth during playback. Can be null if not required. DataSource.Factory mediaDataSourceFactory = buildDataSourceFactory(context, true); int type = Util.inferContentType(!TextUtils.isEmpty(overrideExtension) ? "." + overrideExtension : mediaUri.getLastPathSegment()); Handler mainHandler = new Handler(); switch (type) { case C.TYPE_SS: return new SsMediaSource(mediaUri, buildDataSourceFactory(context, false), new DefaultSsChunkSource.Factory(mediaDataSourceFactory), mainHandler, null); case C.TYPE_DASH: return new DashMediaSource(mediaUri, buildDataSourceFactory(context, false), new DefaultDashChunkSource.Factory(mediaDataSourceFactory), mainHandler, null); case C.TYPE_HLS: return new HlsMediaSource(mediaUri, mediaDataSourceFactory, mainHandler, null); case C.TYPE_OTHER: return new ExtractorMediaSource(mediaUri, mediaDataSourceFactory, new DefaultExtractorsFactory(), mainHandler, null); default: { throw new NotMediaException("Unsupported type: " + type); } } } private static DataSource.Factory buildDataSourceFactory(Context context, boolean useBandwidthMeter) { return buildDataSourceFactory(context, useBandwidthMeter ? BANDWIDTH_METER : null); } private static HttpDataSource.Factory buildHttpDataSourceFactory(Context context, boolean useBandwidthMeter) { return buildHttpDataSourceFactory(context, useBandwidthMeter ? BANDWIDTH_METER : null); } public static DataSource.Factory buildDataSourceFactory(Context context, DefaultBandwidthMeter bandwidthMeter) { return new DefaultDataSourceFactory(context, bandwidthMeter, buildHttpDataSourceFactory(context, bandwidthMeter)); } public static HttpDataSource.Factory buildHttpDataSourceFactory(Context context, DefaultBandwidthMeter bandwidthMeter) { String userAgent = Util.getUserAgent(context, "ExoPlayerDemo"); return new DefaultHttpDataSourceFactory(userAgent, bandwidthMeter); } public static class NotMediaException extends IllegalArgumentException { public NotMediaException(String s) { super(s); } } }