feat: implement startPosition (#3355)
* feat(android): implement startPosition * feat(ios): implement startPosition * feat: implement startPosition type * docs: fix typo * docs: update startPosition * refactor: put startPosition inside source prop - put startPosition inside source prop - rename existing prop (startTime, endTime) * docs: update startPosition property description * fix: fix invalid assignments * refactor: remove redundant optional chaining * feat: allow "0" to work too
This commit is contained in:
@@ -192,8 +192,9 @@ public 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 long startPositionMs = -1;
|
||||
private long cropStartMs = -1;
|
||||
private long cropEndMs = -1;
|
||||
private String extension;
|
||||
private boolean repeat;
|
||||
private String audioTrackType;
|
||||
@@ -662,7 +663,7 @@ public class ReactExoplayerView extends FrameLayout implements
|
||||
|
||||
private void initializePlayerSource(ReactExoplayerView self, DrmSessionManager drmSessionManager) {
|
||||
ArrayList<MediaSource> mediaSourceList = buildTextSources();
|
||||
MediaSource videoSource = buildMediaSource(self.srcUri, self.extension, drmSessionManager, startTimeMs, endTimeMs);
|
||||
MediaSource videoSource = buildMediaSource(self.srcUri, self.extension, drmSessionManager, cropStartMs, cropEndMs);
|
||||
MediaSource mediaSourceWithAds = null;
|
||||
if (adTagUrl != null) {
|
||||
MediaSource.Factory mediaSourceFactory = new DefaultMediaSourceFactory(mediaDataSourceFactory)
|
||||
@@ -703,7 +704,12 @@ public class ReactExoplayerView extends FrameLayout implements
|
||||
if (haveResumePosition) {
|
||||
player.seekTo(resumeWindow, resumePosition);
|
||||
}
|
||||
player.prepare(mediaSource, !haveResumePosition, false);
|
||||
if (startPositionMs >= 0) {
|
||||
player.setMediaSource(mediaSource, startPositionMs);
|
||||
} else {
|
||||
player.setMediaSource(mediaSource, !haveResumePosition);
|
||||
}
|
||||
player.prepare();
|
||||
playerNeedsSource = false;
|
||||
|
||||
reLayout(exoPlayerView);
|
||||
@@ -761,7 +767,7 @@ public class ReactExoplayerView extends FrameLayout implements
|
||||
}
|
||||
}
|
||||
|
||||
private MediaSource buildMediaSource(Uri uri, String overrideExtension, DrmSessionManager drmSessionManager, long startTimeMs, long endTimeMs) {
|
||||
private MediaSource buildMediaSource(Uri uri, String overrideExtension, DrmSessionManager drmSessionManager, long cropStartMs, long cropEndMs) {
|
||||
if (uri == null) {
|
||||
throw new IllegalStateException("Invalid video uri");
|
||||
}
|
||||
@@ -822,12 +828,12 @@ public class ReactExoplayerView extends FrameLayout implements
|
||||
)
|
||||
.createMediaSource(mediaItem);
|
||||
|
||||
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);
|
||||
if (cropStartMs >= 0 && cropEndMs >= 0) {
|
||||
return new ClippingMediaSource(mediaSource, cropStartMs * 1000, cropEndMs * 1000);
|
||||
} else if (cropStartMs >= 0) {
|
||||
return new ClippingMediaSource(mediaSource, cropStartMs * 1000, TIME_END_OF_SOURCE);
|
||||
} else if (cropEndMs >= 0) {
|
||||
return new ClippingMediaSource(mediaSource, 0, cropEndMs * 1000);
|
||||
}
|
||||
|
||||
return mediaSource;
|
||||
@@ -1500,13 +1506,14 @@ public class ReactExoplayerView extends FrameLayout implements
|
||||
|
||||
// ReactExoplayerViewManager public api
|
||||
|
||||
public void setSrc(final Uri uri, final long startTimeMs, final long endTimeMs, final String extension, Map<String, String> headers) {
|
||||
public void setSrc(final Uri uri, final long startPositionMs, final long cropStartMs, final long cropEndMs, final String extension, Map<String, String> headers) {
|
||||
if (uri != null) {
|
||||
boolean isSourceEqual = uri.equals(srcUri) && startTimeMs == this.startTimeMs && endTimeMs == this.endTimeMs;
|
||||
boolean isSourceEqual = uri.equals(srcUri) && cropStartMs == this.cropStartMs && cropEndMs == this.cropEndMs;
|
||||
hasDrmFailed = false;
|
||||
this.srcUri = uri;
|
||||
this.startTimeMs = startTimeMs;
|
||||
this.endTimeMs = endTimeMs;
|
||||
this.startPositionMs = startPositionMs;
|
||||
this.cropStartMs = cropStartMs;
|
||||
this.cropEndMs = cropEndMs;
|
||||
this.extension = extension;
|
||||
this.requestHeaders = headers;
|
||||
this.mediaDataSourceFactory =
|
||||
@@ -1524,8 +1531,9 @@ public class ReactExoplayerView extends FrameLayout implements
|
||||
player.stop();
|
||||
player.clearMediaItems();
|
||||
this.srcUri = null;
|
||||
this.startTimeMs = -1;
|
||||
this.endTimeMs = -1;
|
||||
this.startPositionMs = -1;
|
||||
this.cropStartMs = -1;
|
||||
this.cropEndMs = -1;
|
||||
this.extension = null;
|
||||
this.requestHeaders = null;
|
||||
this.mediaDataSourceFactory = null;
|
||||
|
||||
Reference in New Issue
Block a user