Commit a526d3fa by tonihei Committed by Oliver Woodman

Keep window sequence number of playing period if queue is cleared.

This allows to keep the same window sequence number if playback fails and
is then retried without resetting the position.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=188339509
parent 2a737eec
...@@ -691,7 +691,7 @@ import java.util.Collections; ...@@ -691,7 +691,7 @@ import java.util.Collections;
resetRendererPosition(periodPositionUs); resetRendererPosition(periodPositionUs);
maybeContinueLoading(); maybeContinueLoading();
} else { } else {
queue.clear(); queue.clear(/* keepFrontPeriodUid= */ true);
resetRendererPosition(periodPositionUs); resetRendererPosition(periodPositionUs);
} }
...@@ -776,7 +776,7 @@ import java.util.Collections; ...@@ -776,7 +776,7 @@ import java.util.Collections;
} }
} }
enabledRenderers = new Renderer[0]; enabledRenderers = new Renderer[0];
queue.clear(); queue.clear(/* keepFrontPeriodUid= */ !resetPosition);
setIsLoading(false); setIsLoading(false);
if (resetPosition) { if (resetPosition) {
pendingInitialSeekPosition = null; pendingInitialSeekPosition = null;
......
...@@ -52,6 +52,8 @@ import com.google.android.exoplayer2.util.Assertions; ...@@ -52,6 +52,8 @@ import com.google.android.exoplayer2.util.Assertions;
private MediaPeriodHolder reading; private MediaPeriodHolder reading;
private MediaPeriodHolder loading; private MediaPeriodHolder loading;
private int length; private int length;
private Object oldFrontPeriodUid;
private long oldFrontPeriodWindowSequenceNumber;
/** Creates a new media period queue. */ /** Creates a new media period queue. */
public MediaPeriodQueue() { public MediaPeriodQueue() {
...@@ -162,6 +164,7 @@ import com.google.android.exoplayer2.util.Assertions; ...@@ -162,6 +164,7 @@ import com.google.android.exoplayer2.util.Assertions;
Assertions.checkState(hasPlayingPeriod()); Assertions.checkState(hasPlayingPeriod());
loading.next = newPeriodHolder; loading.next = newPeriodHolder;
} }
oldFrontPeriodUid = null;
loading = newPeriodHolder; loading = newPeriodHolder;
length++; length++;
return newPeriodHolder.mediaPeriod; return newPeriodHolder.mediaPeriod;
...@@ -276,12 +279,21 @@ import com.google.android.exoplayer2.util.Assertions; ...@@ -276,12 +279,21 @@ import com.google.android.exoplayer2.util.Assertions;
return removedReading; return removedReading;
} }
/** Clears the queue. */ /**
public void clear() { * Clears the queue.
*
* @param keepFrontPeriodUid Whether the queue should keep the id of the media period in the front
* of queue (typically the playing one) for later reuse.
*/
public void clear(boolean keepFrontPeriodUid) {
MediaPeriodHolder front = getFrontPeriod(); MediaPeriodHolder front = getFrontPeriod();
if (front != null) { if (front != null) {
oldFrontPeriodUid = keepFrontPeriodUid ? front.uid : null;
oldFrontPeriodWindowSequenceNumber = front.info.id.windowSequenceNumber;
front.release(); front.release();
removeAfter(front); removeAfter(front);
} else if (!keepFrontPeriodUid) {
oldFrontPeriodUid = null;
} }
playing = null; playing = null;
loading = null; loading = null;
...@@ -408,6 +420,17 @@ import com.google.android.exoplayer2.util.Assertions; ...@@ -408,6 +420,17 @@ import com.google.android.exoplayer2.util.Assertions;
*/ */
private long resolvePeriodIndexToWindowSequenceNumber(int periodIndex) { private long resolvePeriodIndexToWindowSequenceNumber(int periodIndex) {
Object periodUid = timeline.getPeriod(periodIndex, period, /* setIds= */ true).uid; Object periodUid = timeline.getPeriod(periodIndex, period, /* setIds= */ true).uid;
int windowIndex = period.windowIndex;
if (oldFrontPeriodUid != null) {
int oldFrontPeriodIndex = timeline.getIndexOfPeriod(oldFrontPeriodUid);
if (oldFrontPeriodIndex != C.INDEX_UNSET) {
int oldFrontWindowIndex = timeline.getPeriod(oldFrontPeriodIndex, period).windowIndex;
if (oldFrontWindowIndex == windowIndex) {
// Try to match old front uid after the queue has been cleared.
return oldFrontPeriodWindowSequenceNumber;
}
}
}
MediaPeriodHolder mediaPeriodHolder = getFrontPeriod(); MediaPeriodHolder mediaPeriodHolder = getFrontPeriod();
while (mediaPeriodHolder != null) { while (mediaPeriodHolder != null) {
if (mediaPeriodHolder.uid.equals(periodUid)) { if (mediaPeriodHolder.uid.equals(periodUid)) {
...@@ -416,7 +439,6 @@ import com.google.android.exoplayer2.util.Assertions; ...@@ -416,7 +439,6 @@ import com.google.android.exoplayer2.util.Assertions;
} }
mediaPeriodHolder = mediaPeriodHolder.next; mediaPeriodHolder = mediaPeriodHolder.next;
} }
int windowIndex = period.windowIndex;
mediaPeriodHolder = getFrontPeriod(); mediaPeriodHolder = getFrontPeriod();
while (mediaPeriodHolder != null) { while (mediaPeriodHolder != null) {
int indexOfHolderInTimeline = timeline.getIndexOfPeriod(mediaPeriodHolder.uid); int indexOfHolderInTimeline = timeline.getIndexOfPeriod(mediaPeriodHolder.uid);
......
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