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
This commit is contained in:
tonihei 2020-02-12 16:04:35 +00:00 committed by Oliver Woodman
parent 06f4983ffb
commit 9cf87290ec
2 changed files with 14 additions and 20 deletions

View file

@ -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);
}
/**

View file

@ -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);
}