diff --git a/src/dash/utils/SegmentsUtils.js b/src/dash/utils/SegmentsUtils.js index 4a29b47c33..b1a8b67f99 100644 --- a/src/dash/utils/SegmentsUtils.js +++ b/src/dash/utils/SegmentsUtils.js @@ -164,8 +164,8 @@ function isSegmentAvailable(timelineConverter, representation, segment, isDynami // SAST = Period@start + seg@presentationStartTime + seg@duration // ASAST = SAST - ATO // SAET = SAST + TSBD + seg@duration - - const refTime = timelineConverter.getAvailabilityWindowAnchorTime(); + // 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. + const refTime = Date.now() - ((timelineConverter.getTimelineAnchorAvailabilityOffset()) * 1000); return segment.availabilityStartTime.getTime() <= refTime && (!isFinite(segment.availabilityEndTime) || segment.availabilityEndTime.getTime() >= refTime); } diff --git a/src/dash/utils/TimelineConverter.js b/src/dash/utils/TimelineConverter.js index 2389f88672..7d91efe862 100644 --- a/src/dash/utils/TimelineConverter.js +++ b/src/dash/utils/TimelineConverter.js @@ -67,7 +67,7 @@ function TimelineConverter() { clientServerTimeShift = value; } - function calcAvailabilityTimeFromPresentationTime(presentationEndTime, representation, isDynamic, calculateAvailabilityEndTime) { + function _calcAvailabilityTimeFromPresentationTime(presentationEndTime, representation, isDynamic, calculateAvailabilityEndTime) { let availabilityTime; let mpd = representation.adaptation.period.mpd; const availabilityStartTime = mpd.availabilityStartTime; @@ -99,15 +99,15 @@ function TimelineConverter() { } function calcAvailabilityStartTimeFromPresentationTime(presentationEndTime, representation, isDynamic) { - return calcAvailabilityTimeFromPresentationTime.call(this, presentationEndTime, representation, isDynamic); + return _calcAvailabilityTimeFromPresentationTime(presentationEndTime, representation, isDynamic); } function calcAvailabilityEndTimeFromPresentationTime(presentationEndTime, representation, isDynamic) { - return calcAvailabilityTimeFromPresentationTime.call(this, presentationEndTime, representation, isDynamic, true); + return _calcAvailabilityTimeFromPresentationTime(presentationEndTime, representation, isDynamic, true); } function calcPresentationTimeFromWallTime(wallTime, period) { - return ((wallTime.getTime() - period.mpd.availabilityStartTime.getTime() - clientServerTimeShift * 1000) / 1000); + return ((wallTime.getTime() - period.mpd.availabilityStartTime.getTime() + clientServerTimeShift * 1000) / 1000); } function calcPresentationTimeFromMediaTime(mediaTime, representation) { @@ -138,10 +138,6 @@ function TimelineConverter() { return wallTime; } - function getAvailabilityWindowAnchorTime() { - return Date.now() - ((timelineAnchorAvailabilityOffset + clientServerTimeShift) * 1000); - } - /** * 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. * @param {Array} streams @@ -272,6 +268,10 @@ function TimelineConverter() { timelineAnchorAvailabilityOffset = now - range.end; } + function getTimelineAnchorAvailabilityOffset() { + return timelineAnchorAvailabilityOffset; + } + function _adjustTimeBasedOnPeriodRanges(streams, time, isEndOfDvrWindow = false) { try { let i = 0; @@ -360,7 +360,7 @@ function TimelineConverter() { initialize, getClientTimeOffset, setClientTimeOffset, - getAvailabilityWindowAnchorTime, + getTimelineAnchorAvailabilityOffset, calcAvailabilityStartTimeFromPresentationTime, calcAvailabilityEndTimeFromPresentationTime, calcPresentationTimeFromWallTime,