2018-02-27 04:57:59 +01:00
|
|
|
package org.schabi.newpipe.player.helper;
|
|
|
|
|
|
|
|
import android.content.Context;
|
2019-10-07 09:41:44 +02:00
|
|
|
|
2019-10-04 14:59:08 +02:00
|
|
|
import androidx.annotation.NonNull;
|
2018-02-27 04:57:59 +01:00
|
|
|
|
2019-10-07 09:41:44 +02:00
|
|
|
import com.google.android.exoplayer2.source.ProgressiveMediaSource;
|
2018-02-27 04:57:59 +01:00
|
|
|
import com.google.android.exoplayer2.source.SingleSampleMediaSource;
|
|
|
|
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.DataSource;
|
|
|
|
import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory;
|
2019-03-05 18:05:44 +01:00
|
|
|
import com.google.android.exoplayer2.upstream.DefaultLoadErrorHandlingPolicy;
|
2018-02-27 04:57:59 +01:00
|
|
|
import com.google.android.exoplayer2.upstream.TransferListener;
|
|
|
|
|
|
|
|
public class PlayerDataSource {
|
|
|
|
private static final int MANIFEST_MINIMUM_RETRY = 5;
|
2018-02-27 07:37:19 +01:00
|
|
|
private static final int EXTRACTOR_MINIMUM_RETRY = Integer.MAX_VALUE;
|
2018-02-27 04:57:59 +01:00
|
|
|
private static final int LIVE_STREAM_EDGE_GAP_MILLIS = 10000;
|
|
|
|
|
|
|
|
private final DataSource.Factory cacheDataSourceFactory;
|
|
|
|
private final DataSource.Factory cachelessDataSourceFactory;
|
|
|
|
|
2020-03-31 19:20:15 +02:00
|
|
|
public PlayerDataSource(@NonNull final Context context, @NonNull final String userAgent,
|
2019-03-05 18:05:44 +01:00
|
|
|
@NonNull final TransferListener transferListener) {
|
2018-02-27 04:57:59 +01:00
|
|
|
cacheDataSourceFactory = new CacheFactory(context, userAgent, transferListener);
|
2020-03-31 19:20:15 +02:00
|
|
|
cachelessDataSourceFactory
|
|
|
|
= new DefaultDataSourceFactory(context, userAgent, transferListener);
|
2018-02-27 04:57:59 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public SsMediaSource.Factory getLiveSsMediaSourceFactory() {
|
|
|
|
return new SsMediaSource.Factory(new DefaultSsChunkSource.Factory(
|
|
|
|
cachelessDataSourceFactory), cachelessDataSourceFactory)
|
2020-03-31 19:20:15 +02:00
|
|
|
.setLoadErrorHandlingPolicy(
|
|
|
|
new DefaultLoadErrorHandlingPolicy(MANIFEST_MINIMUM_RETRY))
|
2018-02-27 04:57:59 +01:00
|
|
|
.setLivePresentationDelayMs(LIVE_STREAM_EDGE_GAP_MILLIS);
|
|
|
|
}
|
|
|
|
|
|
|
|
public HlsMediaSource.Factory getLiveHlsMediaSourceFactory() {
|
|
|
|
return new HlsMediaSource.Factory(cachelessDataSourceFactory)
|
|
|
|
.setAllowChunklessPreparation(true)
|
2020-03-31 19:20:15 +02:00
|
|
|
.setLoadErrorHandlingPolicy(
|
|
|
|
new DefaultLoadErrorHandlingPolicy(MANIFEST_MINIMUM_RETRY));
|
2018-02-27 04:57:59 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public DashMediaSource.Factory getLiveDashMediaSourceFactory() {
|
|
|
|
return new DashMediaSource.Factory(new DefaultDashChunkSource.Factory(
|
|
|
|
cachelessDataSourceFactory), cachelessDataSourceFactory)
|
2020-03-31 19:20:15 +02:00
|
|
|
.setLoadErrorHandlingPolicy(
|
|
|
|
new DefaultLoadErrorHandlingPolicy(MANIFEST_MINIMUM_RETRY))
|
2019-03-05 18:05:44 +01:00
|
|
|
.setLivePresentationDelayMs(LIVE_STREAM_EDGE_GAP_MILLIS, true);
|
2018-02-27 04:57:59 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public SsMediaSource.Factory getSsMediaSourceFactory() {
|
|
|
|
return new SsMediaSource.Factory(new DefaultSsChunkSource.Factory(
|
|
|
|
cacheDataSourceFactory), cacheDataSourceFactory);
|
|
|
|
}
|
|
|
|
|
|
|
|
public HlsMediaSource.Factory getHlsMediaSourceFactory() {
|
|
|
|
return new HlsMediaSource.Factory(cacheDataSourceFactory);
|
|
|
|
}
|
|
|
|
|
|
|
|
public DashMediaSource.Factory getDashMediaSourceFactory() {
|
|
|
|
return new DashMediaSource.Factory(new DefaultDashChunkSource.Factory(
|
|
|
|
cacheDataSourceFactory), cacheDataSourceFactory);
|
|
|
|
}
|
|
|
|
|
2019-10-07 09:41:44 +02:00
|
|
|
public ProgressiveMediaSource.Factory getExtractorMediaSourceFactory() {
|
|
|
|
return new ProgressiveMediaSource.Factory(cacheDataSourceFactory)
|
2020-03-31 19:20:15 +02:00
|
|
|
.setLoadErrorHandlingPolicy(
|
|
|
|
new DefaultLoadErrorHandlingPolicy(EXTRACTOR_MINIMUM_RETRY));
|
2018-02-27 04:57:59 +01:00
|
|
|
}
|
|
|
|
|
2020-03-31 19:20:15 +02:00
|
|
|
public ProgressiveMediaSource.Factory getExtractorMediaSourceFactory(
|
|
|
|
@NonNull final String key) {
|
2018-02-27 07:37:19 +01:00
|
|
|
return getExtractorMediaSourceFactory().setCustomCacheKey(key);
|
2018-02-27 04:57:59 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public SingleSampleMediaSource.Factory getSampleMediaSourceFactory() {
|
|
|
|
return new SingleSampleMediaSource.Factory(cacheDataSourceFactory);
|
|
|
|
}
|
|
|
|
}
|