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