Skip to content

Commit 66bc8f9

Browse files
authored
Fix wrong timing calculation for client/server clock drift. (#3759)
* Fix wrong timing calculation for client/server clock drift.
1 parent 5e31f9f commit 66bc8f9

File tree

2 files changed

+11
-11
lines changed

2 files changed

+11
-11
lines changed

src/dash/utils/SegmentsUtils.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,8 +164,8 @@ function isSegmentAvailable(timelineConverter, representation, segment, isDynami
164164
// SAST = Period@start + seg@presentationStartTime + seg@duration
165165
// ASAST = SAST - ATO
166166
// SAET = SAST + TSBD + seg@duration
167-
168-
const refTime = timelineConverter.getAvailabilityWindowAnchorTime();
167+
// refTime serves as an anchor time to compare the availability time of the segments against. Note that we already compensated for the client/server drift when calculating the availability time of a segment. Thats why we do not subtract clientServerTimeShift here again.
168+
const refTime = Date.now() - ((timelineConverter.getTimelineAnchorAvailabilityOffset()) * 1000);
169169
return segment.availabilityStartTime.getTime() <= refTime && (!isFinite(segment.availabilityEndTime) || segment.availabilityEndTime.getTime() >= refTime);
170170
}
171171

src/dash/utils/TimelineConverter.js

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ function TimelineConverter() {
6767
clientServerTimeShift = value;
6868
}
6969

70-
function calcAvailabilityTimeFromPresentationTime(presentationEndTime, representation, isDynamic, calculateAvailabilityEndTime) {
70+
function _calcAvailabilityTimeFromPresentationTime(presentationEndTime, representation, isDynamic, calculateAvailabilityEndTime) {
7171
let availabilityTime;
7272
let mpd = representation.adaptation.period.mpd;
7373
const availabilityStartTime = mpd.availabilityStartTime;
@@ -99,15 +99,15 @@ function TimelineConverter() {
9999
}
100100

101101
function calcAvailabilityStartTimeFromPresentationTime(presentationEndTime, representation, isDynamic) {
102-
return calcAvailabilityTimeFromPresentationTime.call(this, presentationEndTime, representation, isDynamic);
102+
return _calcAvailabilityTimeFromPresentationTime(presentationEndTime, representation, isDynamic);
103103
}
104104

105105
function calcAvailabilityEndTimeFromPresentationTime(presentationEndTime, representation, isDynamic) {
106-
return calcAvailabilityTimeFromPresentationTime.call(this, presentationEndTime, representation, isDynamic, true);
106+
return _calcAvailabilityTimeFromPresentationTime(presentationEndTime, representation, isDynamic, true);
107107
}
108108

109109
function calcPresentationTimeFromWallTime(wallTime, period) {
110-
return ((wallTime.getTime() - period.mpd.availabilityStartTime.getTime() - clientServerTimeShift * 1000) / 1000);
110+
return ((wallTime.getTime() - period.mpd.availabilityStartTime.getTime() + clientServerTimeShift * 1000) / 1000);
111111
}
112112

113113
function calcPresentationTimeFromMediaTime(mediaTime, representation) {
@@ -138,10 +138,6 @@ function TimelineConverter() {
138138
return wallTime;
139139
}
140140

141-
function getAvailabilityWindowAnchorTime() {
142-
return Date.now() - ((timelineAnchorAvailabilityOffset + clientServerTimeShift) * 1000);
143-
}
144-
145141
/**
146142
* Calculates the timeshiftbuffer range. This range might overlap multiple periods and is not limited to period boundaries. However, we make sure that the range is potentially covered by period.
147143
* @param {Array} streams
@@ -272,6 +268,10 @@ function TimelineConverter() {
272268
timelineAnchorAvailabilityOffset = now - range.end;
273269
}
274270

271+
function getTimelineAnchorAvailabilityOffset() {
272+
return timelineAnchorAvailabilityOffset;
273+
}
274+
275275
function _adjustTimeBasedOnPeriodRanges(streams, time, isEndOfDvrWindow = false) {
276276
try {
277277
let i = 0;
@@ -360,7 +360,7 @@ function TimelineConverter() {
360360
initialize,
361361
getClientTimeOffset,
362362
setClientTimeOffset,
363-
getAvailabilityWindowAnchorTime,
363+
getTimelineAnchorAvailabilityOffset,
364364
calcAvailabilityStartTimeFromPresentationTime,
365365
calcAvailabilityEndTimeFromPresentationTime,
366366
calcPresentationTimeFromWallTime,

0 commit comments

Comments
 (0)