Skip to content

Occasional Conformance Violation: INVALID_DVR_WINDOW errors seen #4893

@markriley9999

Description

@markriley9999

conformance-violation-161125 - Copy.mpd.txt

  • Link to playable MPD file:
  • Dash.js version: v4.7.4
  • Browser name/version: multiple (edge, chrome, vewd etc)
  • OS name/version:

I see occasional Conformance Violation: INVALID_DVR_WINDOW errors (say every hour or so), affecting multiple devices at the same point in time.

I have captured an example mpd, at the point of failure, here.

At this point in time there are 2 periods:

The tail end of the first period - as you can see it's now very short, with only a single short duration segment remaining.
I think this is pertinent as this the point at which I see repeatedly see the failure happen.

    <Period duration="PT0.681S"
            id="881659269"
            start="PT16458H42M19.319S">
...
                <SegmentTimeline>
                    <S d="34000"
                       t="88165926966000"/>
                </SegmentTimeline>
...

And the remaining period (containing the live edge):
This period is ~15 mins long,

    <Period id="881659270"
            start="PT16458H42M20S">
...
                <SegmentTimeline>
                    <S d="200000"
                       t="88165927000000"/>
                    <S d="100000"
                       r="447"
                       t="88165927200000"/>
                </SegmentTimeline>
...

The issue seems to be transient, in that it shortly recovers (however, unfortunately our player catches this error and stops playback!)

I've also noticed that setting 'fallbackToSegmentTimeline: false' allows that stream to play continuously without issues (ie if there really is an issue in the mpd it would appear to be benign).

At the point of the INVALID_DVR_WINDOW error being triggered, ie via:

        if (settings.get().streaming.timeShiftBuffer.fallbackToSegmentTimeline) {
            const timelineRefData = _calcTimeShiftBufferWindowForDynamicTimelineManifest(streams);
            if (timelineRefData.range.end < range.start) {
                eventBus.trigger(MediaPlayerEvents.CONFORMANCE_VIOLATION, {
                    level: ConformanceViolationConstants.LEVELS.WARNING,
                    event: ConformanceViolationConstants.EVENTS.INVALID_DVR_WINDOW
                });
                _adjustTimelineAnchorAvailabilityOffset(timelineRefData.now, timelineRefData.range);
                return timelineRefData.range;
            }
        }

Looking at timelineRefData, i see:

         "timelineRefData": {
            "range": {
               "start": "59251339.319000006",
               "end": "59251339.99900007"
            },
            "now": "59252242.6215"
         }

The calculated duration is (only!) 0.680000064s - where timeShiftBufferDepth="PT15M1S"
So, it would appear that in this case, only the 1st period is taken into account.

Checking the same stream at a later point, say 10s later, the timelineRefData calc then returns a range covering all the periods.

So there appears to be a transient issue - where for some reason, the manifest derived range calcs are occasionally incorrect (but corrects itself shortly after).

I've looked at the mpd, and I cannot see anything obvious - but as I mentioned earlier, this consistently happens when there are 2 periods, where the first period is very short, ie <1s....

Any help would be very much appreciated!

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions