Merge remote-tracking branch 'upstream/master'

This commit is contained in:
Craig Martin
2023-07-27 16:24:11 -04:00
18 changed files with 212 additions and 111 deletions

View File

@@ -4,6 +4,7 @@ import static com.google.android.exoplayer2.C.CONTENT_TYPE_DASH;
import static com.google.android.exoplayer2.C.CONTENT_TYPE_HLS;
import static com.google.android.exoplayer2.C.CONTENT_TYPE_OTHER;
import static com.google.android.exoplayer2.C.CONTENT_TYPE_SS;
import static com.google.android.exoplayer2.C.TIME_END_OF_SOURCE;
import android.annotation.SuppressLint;
import android.app.Activity;
@@ -94,6 +95,7 @@ import com.google.android.exoplayer2.source.dash.manifest.Representation;
import com.google.android.exoplayer2.ext.ima.ImaAdsLoader;
import com.google.android.exoplayer2.source.ads.AdsMediaSource;
import com.google.android.exoplayer2.source.DefaultMediaSourceFactory;
import com.google.android.exoplayer2.source.ClippingMediaSource;
import com.google.common.collect.ImmutableList;
import java.net.CookieHandler;
@@ -210,6 +212,8 @@ class ReactExoplayerView extends FrameLayout implements
// Props from React
private int backBufferDurationMs = DefaultLoadControl.DEFAULT_BACK_BUFFER_DURATION_MS;
private Uri srcUri;
private long startTimeMs = -1;
private long endTimeMs = -1;
private String extension;
private boolean repeat;
private String audioTrackType;
@@ -717,7 +721,8 @@ class ReactExoplayerView extends FrameLayout implements
private void initializePlayerSource(ReactExoplayerView self, DrmSessionManager drmSessionManager) {
ArrayList<MediaSource> mediaSourceList = buildTextSources();
MediaSource videoSource = buildMediaSource(self.srcUri, self.extension, drmSessionManager);
MediaSource videoSource = buildMediaSource(self.srcUri, self.extension, drmSessionManager, startTimeMs,
endTimeMs);
MediaSource mediaSourceWithAds = null;
if (adTagUrl != null) {
MediaSource.Factory mediaSourceFactory = new DefaultMediaSourceFactory(mediaDataSourceFactory)
@@ -815,7 +820,8 @@ class ReactExoplayerView extends FrameLayout implements
}
}
private MediaSource buildMediaSource(Uri uri, String overrideExtension, DrmSessionManager drmSessionManager) {
private MediaSource buildMediaSource(Uri uri, String overrideExtension, DrmSessionManager drmSessionManager,
long startTimeMs, long endTimeMs) {
if (uri == null) {
throw new IllegalStateException("Invalid video uri");
}
@@ -831,7 +837,7 @@ class ReactExoplayerView extends FrameLayout implements
}
MediaItem mediaItem = mediaItemBuilder.build();
MediaSource mediaSource = null;
DrmSessionManagerProvider drmProvider = null;
if (drmSessionManager != null) {
drmProvider = new DrmSessionManagerProvider() {
@@ -845,35 +851,49 @@ class ReactExoplayerView extends FrameLayout implements
}
switch (type) {
case CONTENT_TYPE_SS:
return new SsMediaSource.Factory(
mediaSource = new SsMediaSource.Factory(
new DefaultSsChunkSource.Factory(mediaDataSourceFactory),
buildDataSourceFactory(false)).setDrmSessionManagerProvider(drmProvider)
.setLoadErrorHandlingPolicy(
config.buildLoadErrorHandlingPolicy(minLoadRetryCount))
.createMediaSource(mediaItem);
break;
case CONTENT_TYPE_DASH:
return new DashMediaSource.Factory(
mediaSource = new DashMediaSource.Factory(
new DefaultDashChunkSource.Factory(mediaDataSourceFactory),
buildDataSourceFactory(false)).setDrmSessionManagerProvider(drmProvider)
.setLoadErrorHandlingPolicy(
config.buildLoadErrorHandlingPolicy(minLoadRetryCount))
.createMediaSource(mediaItem);
break;
case CONTENT_TYPE_HLS:
return new HlsMediaSource.Factory(
mediaSource = new HlsMediaSource.Factory(
mediaDataSourceFactory).setDrmSessionManagerProvider(drmProvider)
.setLoadErrorHandlingPolicy(
config.buildLoadErrorHandlingPolicy(minLoadRetryCount))
.createMediaSource(mediaItem);
break;
case CONTENT_TYPE_OTHER:
return new ProgressiveMediaSource.Factory(
mediaSource = new ProgressiveMediaSource.Factory(
mediaDataSourceFactory).setDrmSessionManagerProvider(drmProvider)
.setLoadErrorHandlingPolicy(
config.buildLoadErrorHandlingPolicy(minLoadRetryCount))
.createMediaSource(mediaItem);
break;
default: {
throw new IllegalStateException("Unsupported type: " + type);
}
}
if (startTimeMs >= 0 && endTimeMs >= 0) {
return new ClippingMediaSource(mediaSource, startTimeMs * 1000, endTimeMs * 1000);
} else if (startTimeMs >= 0) {
return new ClippingMediaSource(mediaSource, startTimeMs * 1000, TIME_END_OF_SOURCE);
} else if (endTimeMs >= 0) {
return new ClippingMediaSource(mediaSource, 0, endTimeMs * 1000);
}
return mediaSource;
}
private ArrayList<MediaSource> buildTextSources() {
@@ -1530,11 +1550,15 @@ class ReactExoplayerView extends FrameLayout implements
// ReactExoplayerViewManager public api
public void setSrc(final Uri uri, final String extension, Map<String, String> headers) {
public void setSrc(final Uri uri, final long startTimeMs, final long endTimeMs, final String extension,
Map<String, String> headers) {
if (uri != null) {
boolean isSourceEqual = uri.equals(srcUri);
boolean isSourceEqual = uri.equals(srcUri) && startTimeMs == this.startTimeMs
&& endTimeMs == this.endTimeMs;
hasDrmFailed = false;
this.srcUri = uri;
this.startTimeMs = startTimeMs;
this.endTimeMs = endTimeMs;
this.extension = extension;
this.requestHeaders = headers;
this.mediaDataSourceFactory = DataSourceUtil.getDefaultDataSourceFactory(this.themedReactContext,
@@ -1552,6 +1576,8 @@ class ReactExoplayerView extends FrameLayout implements
player.stop();
player.clearMediaItems();
this.srcUri = null;
this.startTimeMs = -1;
this.endTimeMs = -1;
this.extension = null;
this.requestHeaders = null;
this.mediaDataSourceFactory = null;