mirror of
https://github.com/samsonjs/media.git
synced 2026-04-27 15:07:40 +00:00
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:
parent
06f4983ffb
commit
9cf87290ec
2 changed files with 14 additions and 20 deletions
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue