NewPipe-app-android/app/src/main/java/org/schabi/newpipe/player/helper/PlayerDataSource.java

122 lines
5.1 KiB
Java
Raw Normal View History

package org.schabi.newpipe.player.helper;
import android.content.Context;
2021-10-22 12:07:25 +02:00
import android.os.Build;
2019-10-07 09:41:44 +02:00
2019-10-04 14:59:08 +02:00
import androidx.annotation.NonNull;
2021-10-22 12:07:25 +02:00
import com.google.android.exoplayer2.source.MediaParserExtractorAdapter;
2019-10-07 09:41:44 +02:00
import com.google.android.exoplayer2.source.ProgressiveMediaSource;
import com.google.android.exoplayer2.source.SingleSampleMediaSource;
2021-10-22 12:07:25 +02:00
import com.google.android.exoplayer2.source.chunk.MediaParserChunkExtractor;
import com.google.android.exoplayer2.source.dash.DashMediaSource;
import com.google.android.exoplayer2.source.dash.DefaultDashChunkSource;
import com.google.android.exoplayer2.source.hls.HlsMediaSource;
2021-10-22 12:07:25 +02:00
import com.google.android.exoplayer2.source.hls.MediaParserHlsMediaChunkExtractor;
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;
import com.google.android.exoplayer2.upstream.DefaultLoadErrorHandlingPolicy;
import com.google.android.exoplayer2.upstream.TransferListener;
public class PlayerDataSource {
private static final int MANIFEST_MINIMUM_RETRY = 5;
private static final int EXTRACTOR_MINIMUM_RETRY = Integer.MAX_VALUE;
2021-08-28 19:41:58 +02:00
public static final int LIVE_STREAM_EDGE_GAP_MILLIS = 10000;
private final DataSource.Factory cacheDataSourceFactory;
private final DataSource.Factory cachelessDataSourceFactory;
public PlayerDataSource(@NonNull final Context context, @NonNull final String userAgent,
@NonNull final TransferListener transferListener) {
cacheDataSourceFactory = new CacheFactory(context, userAgent, transferListener);
cachelessDataSourceFactory
= new DefaultDataSourceFactory(context, userAgent, transferListener);
}
public SsMediaSource.Factory getLiveSsMediaSourceFactory() {
2021-11-12 19:40:00 +01:00
return new SsMediaSource.Factory(
new DefaultSsChunkSource.Factory(cachelessDataSourceFactory),
cachelessDataSourceFactory
)
.setLoadErrorHandlingPolicy(
new DefaultLoadErrorHandlingPolicy(MANIFEST_MINIMUM_RETRY))
.setLivePresentationDelayMs(LIVE_STREAM_EDGE_GAP_MILLIS);
}
public HlsMediaSource.Factory getLiveHlsMediaSourceFactory() {
2021-11-12 19:40:00 +01:00
final HlsMediaSource.Factory factory =
new HlsMediaSource.Factory(cachelessDataSourceFactory)
.setAllowChunklessPreparation(true)
.setLoadErrorHandlingPolicy(
new DefaultLoadErrorHandlingPolicy(MANIFEST_MINIMUM_RETRY));
2021-10-22 12:07:25 +02:00
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
2021-11-12 19:40:00 +01:00
factory.setExtractorFactory(MediaParserHlsMediaChunkExtractor.FACTORY);
2021-10-22 12:07:25 +02:00
}
2021-11-12 19:40:00 +01:00
return factory;
}
public DashMediaSource.Factory getLiveDashMediaSourceFactory() {
2021-11-12 19:40:00 +01:00
return new DashMediaSource.Factory(
getDefaultDashChunkSourceFactory(cachelessDataSourceFactory),
cachelessDataSourceFactory
)
.setLoadErrorHandlingPolicy(
new DefaultLoadErrorHandlingPolicy(MANIFEST_MINIMUM_RETRY));
}
private DefaultDashChunkSource.Factory getDefaultDashChunkSourceFactory(
final DataSource.Factory dataSourceFactory
) {
2021-10-22 12:07:25 +02:00
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
2021-11-12 19:40:00 +01:00
return new DefaultDashChunkSource.Factory(
2021-10-22 12:07:25 +02:00
MediaParserChunkExtractor.FACTORY,
2021-11-12 19:40:00 +01:00
dataSourceFactory,
1
);
2021-10-22 12:07:25 +02:00
}
2021-11-12 19:40:00 +01:00
return new DefaultDashChunkSource.Factory(dataSourceFactory);
}
public HlsMediaSource.Factory getHlsMediaSourceFactory() {
2021-11-12 19:40:00 +01:00
final HlsMediaSource.Factory factory = new HlsMediaSource.Factory(cacheDataSourceFactory);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
return factory;
2021-10-22 12:07:25 +02:00
}
2021-11-12 19:40:00 +01:00
// *** >= Android 11 / R / API 30 ***
return factory.setExtractorFactory(MediaParserHlsMediaChunkExtractor.FACTORY);
}
public DashMediaSource.Factory getDashMediaSourceFactory() {
2021-11-12 19:40:00 +01:00
return new DashMediaSource.Factory(
getDefaultDashChunkSourceFactory(cacheDataSourceFactory),
cacheDataSourceFactory
);
}
2019-10-07 09:41:44 +02:00
public ProgressiveMediaSource.Factory getExtractorMediaSourceFactory() {
2021-11-12 19:40:00 +01:00
final ProgressiveMediaSource.Factory factory;
2021-10-22 12:07:25 +02:00
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
2021-11-12 19:40:00 +01:00
factory = new ProgressiveMediaSource.Factory(
cacheDataSourceFactory,
MediaParserExtractorAdapter.FACTORY
);
2021-10-22 12:07:25 +02:00
} else {
2021-11-12 19:40:00 +01:00
factory = new ProgressiveMediaSource.Factory(cacheDataSourceFactory);
2021-10-22 12:07:25 +02:00
}
2021-11-12 19:40:00 +01:00
return factory.setLoadErrorHandlingPolicy(
new DefaultLoadErrorHandlingPolicy(EXTRACTOR_MINIMUM_RETRY));
}
public SingleSampleMediaSource.Factory getSampleMediaSourceFactory() {
return new SingleSampleMediaSource.Factory(cacheDataSourceFactory);
}
}