diff --git a/src/dash/utils/SegmentsUtils.js b/src/dash/utils/SegmentsUtils.js index b1a8b67f99..c380644bb9 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 - // 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); + // refTime serves as an anchor time to compare the availability time of the segments against. + const refTime = timelineConverter.getClientReferenceTime(); 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 7d91efe862..b0822ad6b7 100644 --- a/src/dash/utils/TimelineConverter.js +++ b/src/dash/utils/TimelineConverter.js @@ -67,6 +67,14 @@ function TimelineConverter() { clientServerTimeShift = value; } + /** + * Returns a "now" reference time for the client to compare the availability time of a segment against. + * Takes the client/server drift into account + */ + function getClientReferenceTime() { + return Date.now() - (timelineAnchorAvailabilityOffset * 1000) + (clientServerTimeShift * 1000); + } + function _calcAvailabilityTimeFromPresentationTime(presentationEndTime, representation, isDynamic, calculateAvailabilityEndTime) { let availabilityTime; let mpd = representation.adaptation.period.mpd; @@ -78,7 +86,7 @@ function TimelineConverter() { // When not present, the value is infinite. if (isDynamic && mpd.timeShiftBufferDepth !== Number.POSITIVE_INFINITY) { // SAET = SAST + TSBD + seg@duration - availabilityTime = new Date(availabilityStartTime.getTime() + ((presentationEndTime - clientServerTimeShift + mpd.timeShiftBufferDepth) * 1000)); + availabilityTime = new Date(availabilityStartTime.getTime() + ((presentationEndTime + mpd.timeShiftBufferDepth) * 1000)); } else { availabilityTime = mpd.availabilityEndTime; } @@ -88,7 +96,7 @@ function TimelineConverter() { // ASAST = SAST - ATO const availabilityTimeOffset = representation.availabilityTimeOffset; // presentationEndTime = Period@start + seg@presentationStartTime + Segment@duration - availabilityTime = new Date(availabilityStartTime.getTime() + (presentationEndTime - clientServerTimeShift - availabilityTimeOffset) * 1000); + availabilityTime = new Date(availabilityStartTime.getTime() + (presentationEndTime - availabilityTimeOffset) * 1000); } else { // in static mpd, all segments are available at the same time availabilityTime = availabilityStartTime; @@ -268,10 +276,6 @@ function TimelineConverter() { timelineAnchorAvailabilityOffset = now - range.end; } - function getTimelineAnchorAvailabilityOffset() { - return timelineAnchorAvailabilityOffset; - } - function _adjustTimeBasedOnPeriodRanges(streams, time, isEndOfDvrWindow = false) { try { let i = 0; @@ -360,7 +364,7 @@ function TimelineConverter() { initialize, getClientTimeOffset, setClientTimeOffset, - getTimelineAnchorAvailabilityOffset, + getClientReferenceTime, calcAvailabilityStartTimeFromPresentationTime, calcAvailabilityEndTimeFromPresentationTime, calcPresentationTimeFromWallTime,