Commit 9cf87290 by tonihei Committed by Oliver Woodman

Always use period duration for end of stream messages.

The transition in EPII happens based on the duration of the periods, not
the windows. So use this duration in case they are not the same.

Also make sure to send the message at duration-1 because the playback position
at the duration is technically already the first position in the next item.

PiperOrigin-RevId: 294669335
parent 06f4983f
......@@ -2305,20 +2305,10 @@ import java.util.concurrent.atomic.AtomicBoolean;
Timeline.Window window,
Timeline.Period period) {
int windowIndex = timeline.getPeriodByUid(messageInfo.resolvedPeriodUid, period).windowIndex;
timeline.getWindow(windowIndex, window);
if (!window.isDynamic && window.durationUs != C.TIME_UNSET) {
Pair<Object, Long> periodPosition =
timeline.getPeriodPosition(window, period, windowIndex, window.durationUs);
messageInfo.setResolvedPosition(
/* periodIndex= */ timeline.getIndexOfPeriod(periodPosition.first),
/* periodTimeUs= */ periodPosition.second,
/* periodUid= */ periodPosition.first);
} else {
int lastPeriodIndex = timeline.getWindow(windowIndex, window).lastPeriodIndex;
Object lastPeriodUid = timeline.getUidOfPeriod(lastPeriodIndex);
messageInfo.setResolvedPosition(
lastPeriodIndex, /* periodTimeUs= */ Long.MAX_VALUE, lastPeriodUid);
}
int lastPeriodIndex = timeline.getWindow(windowIndex, window).lastPeriodIndex;
Object lastPeriodUid = timeline.getPeriod(lastPeriodIndex, period, /* setIds= */ true).uid;
long positionUs = period.durationUs != C.TIME_UNSET ? period.durationUs - 1 : Long.MAX_VALUE;
messageInfo.setResolvedPosition(lastPeriodIndex, positionUs, lastPeriodUid);
}
/**
......
......@@ -1892,14 +1892,18 @@ public final class ExoPlayerTest {
new ActionSchedule.Builder("testSendMessagesAtStartAndEndOfPeriod")
.sendMessage(targetStartFirstPeriod, /* windowIndex= */ 0, /* positionMs= */ 0)
.sendMessage(
targetEndMiddlePeriodResolved, /* windowIndex= */ 0, /* positionMs= */ duration1Ms)
targetEndMiddlePeriodResolved,
/* windowIndex= */ 0,
/* positionMs= */ duration1Ms - 1)
.sendMessage(
targetEndMiddlePeriodUnresolved,
/* windowIndex= */ 0,
/* positionMs= */ C.TIME_END_OF_SOURCE)
.sendMessage(targetStartMiddlePeriod, /* windowIndex= */ 1, /* positionMs= */ 0)
.sendMessage(
targetEndLastPeriodResolved, /* windowIndex= */ 1, /* positionMs= */ duration2Ms)
targetEndLastPeriodResolved,
/* windowIndex= */ 1,
/* positionMs= */ duration2Ms - 1)
.sendMessage(
targetEndLastPeriodUnresolved,
/* windowIndex= */ 1,
......@@ -1916,17 +1920,17 @@ public final class ExoPlayerTest {
assertThat(targetStartFirstPeriod.windowIndex).isEqualTo(0);
assertThat(targetStartFirstPeriod.positionMs).isAtLeast(0L);
assertThat(targetEndMiddlePeriodResolved.windowIndex).isEqualTo(0);
assertThat(targetEndMiddlePeriodResolved.positionMs).isAtLeast(duration1Ms);
assertThat(targetEndMiddlePeriodResolved.positionMs).isAtLeast(duration1Ms - 1);
assertThat(targetEndMiddlePeriodUnresolved.windowIndex).isEqualTo(0);
assertThat(targetEndMiddlePeriodUnresolved.positionMs).isAtLeast(duration1Ms);
assertThat(targetEndMiddlePeriodUnresolved.positionMs).isAtLeast(duration1Ms - 1);
assertThat(targetEndMiddlePeriodResolved.positionMs)
.isEqualTo(targetEndMiddlePeriodUnresolved.positionMs);
assertThat(targetStartMiddlePeriod.windowIndex).isEqualTo(1);
assertThat(targetStartMiddlePeriod.positionMs).isAtLeast(0L);
assertThat(targetEndLastPeriodResolved.windowIndex).isEqualTo(1);
assertThat(targetEndLastPeriodResolved.positionMs).isAtLeast(duration2Ms);
assertThat(targetEndLastPeriodResolved.positionMs).isAtLeast(duration2Ms - 1);
assertThat(targetEndLastPeriodUnresolved.windowIndex).isEqualTo(1);
assertThat(targetEndLastPeriodUnresolved.positionMs).isAtLeast(duration2Ms);
assertThat(targetEndLastPeriodUnresolved.positionMs).isAtLeast(duration2Ms - 1);
assertThat(targetEndLastPeriodResolved.positionMs)
.isEqualTo(targetEndLastPeriodUnresolved.positionMs);
}
......
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