Commit 4db6d6fb by tonihei Committed by Oliver Woodman

Automated g4 rollback of changelist 190628272.

*** Reason for rollback ***

b/76391022 was caused by a timestamp correction in StabilizableSimpleExoPlayer which will be fixed with this CL.

*** Original change description ***

Automated g4 rollback of changelist 189570277.

*** Reason for rollback ***

causes b/76391022, motion still playback in Photos is broken

*** Original change description ***

Used fixed time frame in clipping media period.

Currently, whenever the clipping is updated, we move the time frame of the
clipped period to start at 0. This causes problems when we are already playing
this period and the renderer position does no longer match the stream
positions.

This change keeps the time frame of the...

***

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=190906020
parent e716e315
...@@ -83,9 +83,12 @@ import com.google.android.exoplayer2.util.Assertions; ...@@ -83,9 +83,12 @@ import com.google.android.exoplayer2.util.Assertions;
mayRetainStreamFlags = new boolean[rendererCapabilities.length]; mayRetainStreamFlags = new boolean[rendererCapabilities.length];
MediaPeriod mediaPeriod = mediaSource.createPeriod(info.id, allocator); MediaPeriod mediaPeriod = mediaSource.createPeriod(info.id, allocator);
if (info.endPositionUs != C.TIME_END_OF_SOURCE) { if (info.endPositionUs != C.TIME_END_OF_SOURCE) {
ClippingMediaPeriod clippingMediaPeriod = new ClippingMediaPeriod(mediaPeriod, true); mediaPeriod =
clippingMediaPeriod.setClipping(0, info.endPositionUs); new ClippingMediaPeriod(
mediaPeriod = clippingMediaPeriod; mediaPeriod,
/* enableInitialDiscontinuity= */ true,
/* startUs= */ 0,
info.endPositionUs);
} }
this.mediaPeriod = mediaPeriod; this.mediaPeriod = mediaPeriod;
} }
......
...@@ -43,35 +43,36 @@ public final class ClippingMediaPeriod implements MediaPeriod, MediaPeriod.Callb ...@@ -43,35 +43,36 @@ public final class ClippingMediaPeriod implements MediaPeriod, MediaPeriod.Callb
/* package */ long endUs; /* package */ long endUs;
/** /**
* Creates a new clipping media period that provides a clipped view of the specified * Creates a new clipping media period that provides a clipped view of the specified {@link
* {@link MediaPeriod}'s sample streams. * MediaPeriod}'s sample streams.
* <p> *
* The clipping start/end positions must be specified by calling {@link #setClipping(long, long)} * <p>If the start point is guaranteed to be a key frame, pass {@code false} to {@code
* on the playback thread before preparation completes.
* <p>
* If the start point is guaranteed to be a key frame, pass {@code false} to {@code
* enableInitialPositionDiscontinuity} to suppress an initial discontinuity when the period is * enableInitialPositionDiscontinuity} to suppress an initial discontinuity when the period is
* first read from. * first read from.
* *
* @param mediaPeriod The media period to clip. * @param mediaPeriod The media period to clip.
* @param enableInitialDiscontinuity Whether the initial discontinuity should be enabled. * @param enableInitialDiscontinuity Whether the initial discontinuity should be enabled.
* @param startUs The clipping start time, in microseconds.
* @param endUs The clipping end time, in microseconds, or {@link C#TIME_END_OF_SOURCE} to
* indicate the end of the period.
*/ */
public ClippingMediaPeriod(MediaPeriod mediaPeriod, boolean enableInitialDiscontinuity) { public ClippingMediaPeriod(
MediaPeriod mediaPeriod, boolean enableInitialDiscontinuity, long startUs, long endUs) {
this.mediaPeriod = mediaPeriod; this.mediaPeriod = mediaPeriod;
sampleStreams = new ClippingSampleStream[0]; sampleStreams = new ClippingSampleStream[0];
pendingInitialDiscontinuityPositionUs = enableInitialDiscontinuity ? 0 : C.TIME_UNSET; pendingInitialDiscontinuityPositionUs = enableInitialDiscontinuity ? startUs : C.TIME_UNSET;
startUs = C.TIME_UNSET; this.startUs = startUs;
endUs = C.TIME_UNSET; this.endUs = endUs;
} }
/** /**
* Sets the clipping start/end times for this period, in microseconds. * Updates the clipping start/end times for this period, in microseconds.
* *
* @param startUs The clipping start time, in microseconds. * @param startUs The clipping start time, in microseconds.
* @param endUs The clipping end time, in microseconds, or {@link C#TIME_END_OF_SOURCE} to * @param endUs The clipping end time, in microseconds, or {@link C#TIME_END_OF_SOURCE} to
* indicate the end of the period. * indicate the end of the period.
*/ */
public void setClipping(long startUs, long endUs) { public void updateClipping(long startUs, long endUs) {
this.startUs = startUs; this.startUs = startUs;
this.endUs = endUs; this.endUs = endUs;
} }
...@@ -79,7 +80,7 @@ public final class ClippingMediaPeriod implements MediaPeriod, MediaPeriod.Callb ...@@ -79,7 +80,7 @@ public final class ClippingMediaPeriod implements MediaPeriod, MediaPeriod.Callb
@Override @Override
public void prepare(MediaPeriod.Callback callback, long positionUs) { public void prepare(MediaPeriod.Callback callback, long positionUs) {
this.callback = callback; this.callback = callback;
mediaPeriod.prepare(this, startUs + positionUs); mediaPeriod.prepare(this, positionUs);
} }
@Override @Override
...@@ -101,13 +102,19 @@ public final class ClippingMediaPeriod implements MediaPeriod, MediaPeriod.Callb ...@@ -101,13 +102,19 @@ public final class ClippingMediaPeriod implements MediaPeriod, MediaPeriod.Callb
sampleStreams[i] = (ClippingSampleStream) streams[i]; sampleStreams[i] = (ClippingSampleStream) streams[i];
childStreams[i] = sampleStreams[i] != null ? sampleStreams[i].childStream : null; childStreams[i] = sampleStreams[i] != null ? sampleStreams[i].childStream : null;
} }
long enablePositionUs = mediaPeriod.selectTracks(selections, mayRetainStreamFlags, long enablePositionUs =
childStreams, streamResetFlags, positionUs + startUs) - startUs; mediaPeriod.selectTracks(
pendingInitialDiscontinuityPositionUs = isPendingInitialDiscontinuity() && positionUs == 0 selections, mayRetainStreamFlags, childStreams, streamResetFlags, positionUs);
&& shouldKeepInitialDiscontinuity(startUs, selections) ? enablePositionUs : C.TIME_UNSET; pendingInitialDiscontinuityPositionUs =
Assertions.checkState(enablePositionUs == positionUs isPendingInitialDiscontinuity()
|| (enablePositionUs >= 0 && positionUs == startUs
&& (endUs == C.TIME_END_OF_SOURCE || startUs + enablePositionUs <= endUs))); && shouldKeepInitialDiscontinuity(startUs, selections)
? enablePositionUs
: C.TIME_UNSET;
Assertions.checkState(
enablePositionUs == positionUs
|| (enablePositionUs >= startUs
&& (endUs == C.TIME_END_OF_SOURCE || enablePositionUs <= endUs)));
for (int i = 0; i < streams.length; i++) { for (int i = 0; i < streams.length; i++) {
if (childStreams[i] == null) { if (childStreams[i] == null) {
sampleStreams[i] = null; sampleStreams[i] = null;
...@@ -121,12 +128,12 @@ public final class ClippingMediaPeriod implements MediaPeriod, MediaPeriod.Callb ...@@ -121,12 +128,12 @@ public final class ClippingMediaPeriod implements MediaPeriod, MediaPeriod.Callb
@Override @Override
public void discardBuffer(long positionUs, boolean toKeyframe) { public void discardBuffer(long positionUs, boolean toKeyframe) {
mediaPeriod.discardBuffer(positionUs + startUs, toKeyframe); mediaPeriod.discardBuffer(positionUs, toKeyframe);
} }
@Override @Override
public void reevaluateBuffer(long positionUs) { public void reevaluateBuffer(long positionUs) {
mediaPeriod.reevaluateBuffer(positionUs + startUs); mediaPeriod.reevaluateBuffer(positionUs);
} }
@Override @Override
...@@ -144,7 +151,7 @@ public final class ClippingMediaPeriod implements MediaPeriod, MediaPeriod.Callb ...@@ -144,7 +151,7 @@ public final class ClippingMediaPeriod implements MediaPeriod, MediaPeriod.Callb
} }
Assertions.checkState(discontinuityUs >= startUs); Assertions.checkState(discontinuityUs >= startUs);
Assertions.checkState(endUs == C.TIME_END_OF_SOURCE || discontinuityUs <= endUs); Assertions.checkState(endUs == C.TIME_END_OF_SOURCE || discontinuityUs <= endUs);
return discontinuityUs - startUs; return discontinuityUs;
} }
@Override @Override
...@@ -154,7 +161,7 @@ public final class ClippingMediaPeriod implements MediaPeriod, MediaPeriod.Callb ...@@ -154,7 +161,7 @@ public final class ClippingMediaPeriod implements MediaPeriod, MediaPeriod.Callb
|| (endUs != C.TIME_END_OF_SOURCE && bufferedPositionUs >= endUs)) { || (endUs != C.TIME_END_OF_SOURCE && bufferedPositionUs >= endUs)) {
return C.TIME_END_OF_SOURCE; return C.TIME_END_OF_SOURCE;
} }
return Math.max(0, bufferedPositionUs - startUs); return bufferedPositionUs;
} }
@Override @Override
...@@ -165,23 +172,21 @@ public final class ClippingMediaPeriod implements MediaPeriod, MediaPeriod.Callb ...@@ -165,23 +172,21 @@ public final class ClippingMediaPeriod implements MediaPeriod, MediaPeriod.Callb
sampleStream.clearSentEos(); sampleStream.clearSentEos();
} }
} }
long offsetPositionUs = positionUs + startUs; long seekUs = mediaPeriod.seekToUs(positionUs);
long seekUs = mediaPeriod.seekToUs(offsetPositionUs);
Assertions.checkState( Assertions.checkState(
seekUs == offsetPositionUs seekUs == positionUs
|| (seekUs >= startUs && (endUs == C.TIME_END_OF_SOURCE || seekUs <= endUs))); || (seekUs >= startUs && (endUs == C.TIME_END_OF_SOURCE || seekUs <= endUs)));
return seekUs - startUs; return seekUs;
} }
@Override @Override
public long getAdjustedSeekPositionUs(long positionUs, SeekParameters seekParameters) { public long getAdjustedSeekPositionUs(long positionUs, SeekParameters seekParameters) {
if (positionUs == 0) { if (positionUs == startUs) {
// Never adjust seeks to the start of the clipped view. // Never adjust seeks to the start of the clipped view.
return 0; return startUs;
} }
long offsetPositionUs = positionUs + startUs; SeekParameters clippedSeekParameters = clipSeekParameters(positionUs, seekParameters);
SeekParameters clippedSeekParameters = clipSeekParameters(offsetPositionUs, seekParameters); return mediaPeriod.getAdjustedSeekPositionUs(positionUs, clippedSeekParameters);
return mediaPeriod.getAdjustedSeekPositionUs(offsetPositionUs, clippedSeekParameters) - startUs;
} }
@Override @Override
...@@ -191,19 +196,18 @@ public final class ClippingMediaPeriod implements MediaPeriod, MediaPeriod.Callb ...@@ -191,19 +196,18 @@ public final class ClippingMediaPeriod implements MediaPeriod, MediaPeriod.Callb
|| (endUs != C.TIME_END_OF_SOURCE && nextLoadPositionUs >= endUs)) { || (endUs != C.TIME_END_OF_SOURCE && nextLoadPositionUs >= endUs)) {
return C.TIME_END_OF_SOURCE; return C.TIME_END_OF_SOURCE;
} }
return nextLoadPositionUs - startUs; return nextLoadPositionUs;
} }
@Override @Override
public boolean continueLoading(long positionUs) { public boolean continueLoading(long positionUs) {
return mediaPeriod.continueLoading(positionUs + startUs); return mediaPeriod.continueLoading(positionUs);
} }
// MediaPeriod.Callback implementation. // MediaPeriod.Callback implementation.
@Override @Override
public void onPrepared(MediaPeriod mediaPeriod) { public void onPrepared(MediaPeriod mediaPeriod) {
Assertions.checkState(startUs != C.TIME_UNSET && endUs != C.TIME_UNSET);
callback.onPrepared(this); callback.onPrepared(this);
} }
...@@ -216,17 +220,17 @@ public final class ClippingMediaPeriod implements MediaPeriod, MediaPeriod.Callb ...@@ -216,17 +220,17 @@ public final class ClippingMediaPeriod implements MediaPeriod, MediaPeriod.Callb
return pendingInitialDiscontinuityPositionUs != C.TIME_UNSET; return pendingInitialDiscontinuityPositionUs != C.TIME_UNSET;
} }
private SeekParameters clipSeekParameters(long offsetPositionUs, SeekParameters seekParameters) { private SeekParameters clipSeekParameters(long positionUs, SeekParameters seekParameters) {
long toleranceBeforeMs = Math.min(offsetPositionUs - startUs, seekParameters.toleranceBeforeUs); long toleranceBeforeUs = Math.min(positionUs - startUs, seekParameters.toleranceBeforeUs);
long toleranceAfterMs = long toleranceAfterUs =
endUs == C.TIME_END_OF_SOURCE endUs == C.TIME_END_OF_SOURCE
? seekParameters.toleranceAfterUs ? seekParameters.toleranceAfterUs
: Math.min(endUs - offsetPositionUs, seekParameters.toleranceAfterUs); : Math.min(endUs - positionUs, seekParameters.toleranceAfterUs);
if (toleranceBeforeMs == seekParameters.toleranceBeforeUs if (toleranceBeforeUs == seekParameters.toleranceBeforeUs
&& toleranceAfterMs == seekParameters.toleranceAfterUs) { && toleranceAfterUs == seekParameters.toleranceAfterUs) {
return seekParameters; return seekParameters;
} else { } else {
return new SeekParameters(toleranceBeforeMs, toleranceAfterMs); return new SeekParameters(toleranceBeforeUs, toleranceAfterUs);
} }
} }
...@@ -310,9 +314,6 @@ public final class ClippingMediaPeriod implements MediaPeriod, MediaPeriod.Callb ...@@ -310,9 +314,6 @@ public final class ClippingMediaPeriod implements MediaPeriod, MediaPeriod.Callb
sentEos = true; sentEos = true;
return C.RESULT_BUFFER_READ; return C.RESULT_BUFFER_READ;
} }
if (result == C.RESULT_BUFFER_READ && !buffer.isEndOfStream()) {
buffer.timeUs -= startUs;
}
return result; return result;
} }
...@@ -321,7 +322,7 @@ public final class ClippingMediaPeriod implements MediaPeriod, MediaPeriod.Callb ...@@ -321,7 +322,7 @@ public final class ClippingMediaPeriod implements MediaPeriod, MediaPeriod.Callb
if (isPendingInitialDiscontinuity()) { if (isPendingInitialDiscontinuity()) {
return C.RESULT_NOTHING_READ; return C.RESULT_NOTHING_READ;
} }
return childStream.skipData(startUs + positionUs); return childStream.skipData(positionUs);
} }
} }
......
...@@ -141,10 +141,13 @@ public final class ClippingMediaSource extends CompositeMediaSource<Void> { ...@@ -141,10 +141,13 @@ public final class ClippingMediaSource extends CompositeMediaSource<Void> {
@Override @Override
public MediaPeriod createPeriod(MediaPeriodId id, Allocator allocator) { public MediaPeriod createPeriod(MediaPeriodId id, Allocator allocator) {
ClippingMediaPeriod mediaPeriod = new ClippingMediaPeriod( ClippingMediaPeriod mediaPeriod =
mediaSource.createPeriod(id, allocator), enableInitialDiscontinuity); new ClippingMediaPeriod(
mediaSource.createPeriod(id, allocator),
enableInitialDiscontinuity,
periodStartUs,
periodEndUs);
mediaPeriods.add(mediaPeriod); mediaPeriods.add(mediaPeriod);
mediaPeriod.setClipping(periodStartUs, periodEndUs);
return mediaPeriod; return mediaPeriod;
} }
...@@ -183,7 +186,7 @@ public final class ClippingMediaSource extends CompositeMediaSource<Void> { ...@@ -183,7 +186,7 @@ public final class ClippingMediaSource extends CompositeMediaSource<Void> {
endUs == C.TIME_END_OF_SOURCE ? C.TIME_END_OF_SOURCE : windowPositionInPeriodUs + endUs; endUs == C.TIME_END_OF_SOURCE ? C.TIME_END_OF_SOURCE : windowPositionInPeriodUs + endUs;
int count = mediaPeriods.size(); int count = mediaPeriods.size();
for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) {
mediaPeriods.get(i).setClipping(periodStartUs, periodEndUs); mediaPeriods.get(i).updateClipping(periodStartUs, periodEndUs);
} }
} }
...@@ -246,7 +249,7 @@ public final class ClippingMediaSource extends CompositeMediaSource<Void> { ...@@ -246,7 +249,7 @@ public final class ClippingMediaSource extends CompositeMediaSource<Void> {
public Window getWindow(int windowIndex, Window window, boolean setIds, public Window getWindow(int windowIndex, Window window, boolean setIds,
long defaultPositionProjectionUs) { long defaultPositionProjectionUs) {
timeline.getWindow(/* windowIndex= */ 0, window, setIds, defaultPositionProjectionUs); timeline.getWindow(/* windowIndex= */ 0, window, setIds, defaultPositionProjectionUs);
window.positionInFirstPeriodUs = 0; window.positionInFirstPeriodUs += startUs;
window.durationUs = durationUs; window.durationUs = durationUs;
if (window.defaultPositionUs != C.TIME_UNSET) { if (window.defaultPositionUs != C.TIME_UNSET) {
window.defaultPositionUs = Math.max(window.defaultPositionUs, startUs); window.defaultPositionUs = Math.max(window.defaultPositionUs, startUs);
...@@ -267,10 +270,11 @@ public final class ClippingMediaSource extends CompositeMediaSource<Void> { ...@@ -267,10 +270,11 @@ public final class ClippingMediaSource extends CompositeMediaSource<Void> {
@Override @Override
public Period getPeriod(int periodIndex, Period period, boolean setIds) { public Period getPeriod(int periodIndex, Period period, boolean setIds) {
timeline.getPeriod(/* periodIndex= */ 0, period, setIds); timeline.getPeriod(/* periodIndex= */ 0, period, setIds);
long positionInClippedWindowUs = period.getPositionInWindowUs() - startUs;
long periodDurationUs =
durationUs == C.TIME_UNSET ? C.TIME_UNSET : durationUs - positionInClippedWindowUs;
return period.set( return period.set(
period.id, period.uid, /* windowIndex= */ 0, durationUs, /* positionInWindowUs= */ 0); period.id, period.uid, /* windowIndex= */ 0, periodDurationUs, positionInClippedWindowUs);
} }
} }
} }
...@@ -99,7 +99,7 @@ public final class ClippingMediaSourceTest { ...@@ -99,7 +99,7 @@ public final class ClippingMediaSourceTest {
assertThat(clippedTimeline.getWindow(0, window).getDurationUs()) assertThat(clippedTimeline.getWindow(0, window).getDurationUs())
.isEqualTo(TEST_PERIOD_DURATION_US - TEST_CLIP_AMOUNT_US); .isEqualTo(TEST_PERIOD_DURATION_US - TEST_CLIP_AMOUNT_US);
assertThat(clippedTimeline.getPeriod(0, period).getDurationUs()) assertThat(clippedTimeline.getPeriod(0, period).getDurationUs())
.isEqualTo(TEST_PERIOD_DURATION_US - TEST_CLIP_AMOUNT_US); .isEqualTo(TEST_PERIOD_DURATION_US);
} }
@Test @Test
...@@ -128,7 +128,7 @@ public final class ClippingMediaSourceTest { ...@@ -128,7 +128,7 @@ public final class ClippingMediaSourceTest {
assertThat(clippedTimeline.getWindow(0, window).getDurationUs()) assertThat(clippedTimeline.getWindow(0, window).getDurationUs())
.isEqualTo(TEST_PERIOD_DURATION_US - TEST_CLIP_AMOUNT_US * 3); .isEqualTo(TEST_PERIOD_DURATION_US - TEST_CLIP_AMOUNT_US * 3);
assertThat(clippedTimeline.getPeriod(0, period).getDurationUs()) assertThat(clippedTimeline.getPeriod(0, period).getDurationUs())
.isEqualTo(TEST_PERIOD_DURATION_US - TEST_CLIP_AMOUNT_US * 3); .isEqualTo(TEST_PERIOD_DURATION_US - TEST_CLIP_AMOUNT_US * 2);
} }
@Test @Test
...@@ -171,7 +171,7 @@ public final class ClippingMediaSourceTest { ...@@ -171,7 +171,7 @@ public final class ClippingMediaSourceTest {
assertThat(clippedTimeline.getWindow(0, window).getDurationUs()) assertThat(clippedTimeline.getWindow(0, window).getDurationUs())
.isEqualTo(TEST_PERIOD_DURATION_US - TEST_CLIP_AMOUNT_US * 3); .isEqualTo(TEST_PERIOD_DURATION_US - TEST_CLIP_AMOUNT_US * 3);
assertThat(clippedTimeline.getPeriod(0, period).getDurationUs()) assertThat(clippedTimeline.getPeriod(0, period).getDurationUs())
.isEqualTo(TEST_PERIOD_DURATION_US - TEST_CLIP_AMOUNT_US * 3); .isEqualTo(TEST_PERIOD_DURATION_US - TEST_CLIP_AMOUNT_US * 2);
} }
@Test @Test
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment