Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

LL-HLS first media playlist load delivery directive issue #6076

Closed
TheKeveloper opened this issue Jan 4, 2024 · 7 comments · Fixed by #6080
Closed

LL-HLS first media playlist load delivery directive issue #6076

TheKeveloper opened this issue Jan 4, 2024 · 7 comments · Fixed by #6080

Comments

@TheKeveloper
Copy link

TheKeveloper commented Jan 4, 2024

What do you want to do with Hls.js?

I'm filing this as a question since it's not clear to me whether this is intended behavior or not, but happy to re-file as a bug if that would make more sense.

I'm trying to play a Low-Latency HLS playlist, and it seems that hls.js is sending requests with delivery directives that request parts that are farther into the future than I would expect.

The following playlist is returned on initial load

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-SERVER-CONTROL:CAN-BLOCK-RELOAD=YES,PART-HOLD-BACK=3.204,CAN-SKIP-UNTIL=42.0
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:299
#EXT-X-PART-INF:PART-TARGET=1.068
#EXT-X-MAP:URI="header-ugp3momn6_vo_sfm4s_m3u8.cmfv"
#EXT-X-PROGRAM-DATE-TIME:2024-01-04T03:59:48.496+00:00
#EXTINF:10.01,
media-ugp3momn6_vo_sfm4s_299_m3u8.cmfv
#EXT-X-PROGRAM-DATE-TIME:2024-01-04T03:59:58.513+00:00
#EXTINF:5.005,
media-ugp3momn6_vo_sfm4s_300_m3u8.cmfv
#EXT-X-PROGRAM-DATE-TIME:2024-01-04T04:00:03.515+00:00
#EXT-X-PART:DURATION=1.001,URI="media-ugp3momn6_vo_sfm4s_301.0_m3u8.cmfv",INDEPENDENT=YES
#EXT-X-PART:DURATION=1.001,URI="media-ugp3momn6_vo_sfm4s_301.1_m3u8.cmfv"
#EXT-X-PART:DURATION=1.001,URI="media-ugp3momn6_vo_sfm4s_301.2_m3u8.cmfv"
#EXT-X-PART:DURATION=1.001,URI="media-ugp3momn6_vo_sfm4s_301.3_m3u8.cmfv"
#EXT-X-PART:DURATION=1.001,URI="media-ugp3momn6_vo_sfm4s_301.4_m3u8.cmfv"
#EXTINF:5.005,
media-ugp3momn6_vo_sfm4s_301_m3u8.cmfv
#EXT-X-PROGRAM-DATE-TIME:2024-01-04T04:00:08.524+00:00
#EXT-X-PART:DURATION=1.001,URI="media-ugp3momn6_vo_sfm4s_302.0_m3u8.cmfv",INDEPENDENT=YES
#EXT-X-PART:DURATION=1.001,URI="media-ugp3momn6_vo_sfm4s_302.1_m3u8.cmfv"
#EXT-X-PART:DURATION=1.001,URI="media-ugp3momn6_vo_sfm4s_302.2_m3u8.cmfv"
#EXT-X-PART:DURATION=1.001,URI="media-ugp3momn6_vo_sfm4s_302.3_m3u8.cmfv"
#EXT-X-PART:DURATION=1.001,URI="media-ugp3momn6_vo_sfm4s_302.4_m3u8.cmfv"
#EXTINF:5.005,
media-ugp3momn6_vo_sfm4s_302_m3u8.cmfv
#EXT-X-PROGRAM-DATE-TIME:2024-01-04T04:00:13.520+00:00
#EXT-X-PART:DURATION=1.001,URI="media-ugp3momn6_vo_sfm4s_303.0_m3u8.cmfv",INDEPENDENT=YES
#EXT-X-PART:DURATION=1.001,URI="media-ugp3momn6_vo_sfm4s_303.1_m3u8.cmfv"
#EXT-X-PART:DURATION=1.001,URI="media-ugp3momn6_vo_sfm4s_303.2_m3u8.cmfv"
#EXT-X-PART:DURATION=1.001,URI="media-ugp3momn6_vo_sfm4s_303.3_m3u8.cmfv"
#EXT-X-PART:DURATION=1.001,URI="media-ugp3momn6_vo_sfm4s_303.4_m3u8.cmfv"
#EXTINF:5.005,
media-ugp3momn6_vo_sfm4s_303_m3u8.cmfv
#EXT-X-PROGRAM-DATE-TIME:2024-01-04T04:00:18.529+00:00
#EXT-X-PART:DURATION=1.001,URI="media-ugp3momn6_vo_sfm4s_304.0_m3u8.cmfv",INDEPENDENT=YES
#EXT-X-PART:DURATION=1.001,URI="media-ugp3momn6_vo_sfm4s_304.1_m3u8.cmfv"
#EXT-X-PART:DURATION=1.001,URI="media-ugp3momn6_vo_sfm4s_304.2_m3u8.cmfv"
#EXT-X-PRELOAD-HINT:TYPE=PART,URI="media-ugp3momn6_vo_sfm4s_304.3_m3u8.cmfv"

The next request made by hls.js has the following delivery directives

_HLS_msn=305&_HLS_part=6&_HLS_skip=YES

The HLS server stalls and eventually returns an error. It's a bit surprising to me that the delivery directive specifies waiting for a part that is essentially a full segment into the future. Naively I would expect it the delivery directive to specify the first part of the next segment: _HLS_msn=305&_HLS_part=0&_HLS_skip=YES.

This only happens on the initial segment load, right after a request to the media playlist. Once one of the requests with a delivery directive is successful, all subsequent requests succeed and the video plays smoothly. However, sometimes the player will never get a successful response and continue retrying requests with delivery directives that specify a segment and part that are too far into the future and the video will just buffer indefinitely.

It's not clear to me what determines whether the first request is successful. It seems vaguely like if Chrome is resource constrained (e.g. a lot of other tabs open), the player is more likely to get stuck on the initial load.

The HlsConfig I have is

{
      enableWorker: true
      loader: MyCustomLoader,
      liveSyncDuration: 3,
      maxBufferLength: 60_000_000,
      maxBufferSize: 30, 
      forceKeyFrameOnDiscontinuity: false,
}

The main question I have is: is there a way to customize the delivery directives such that we never try to load a part more than x seconds/parts into the future?

Another option would be retry with the same delivery directives, but even then it seems that I'm guaranteed to spend at least a full segment of time buffering when it would be preferable to load the video faster.

Unfortunately I don't control the behavior of the HLS server so I'm mainly looking for how I can change the HLS client behavior.

Any other help or debugging tips would also be greatly appreciated. Thank you!

What have you tried so far?

No response

@TheKeveloper TheKeveloper added Needs Triage If there is a suspected stream issue, apply this label to triage if it is something we should fix. Question labels Jan 4, 2024
@robwalch
Copy link
Collaborator

robwalch commented Jan 4, 2024

Hi @TheKeveloper,

What is the value of the "age" header on the initial Media Playlist response?

HLS.js implements the algorithm in Appendix C to acquire an up-to-date version of the Media Playlist:

https://datatracker.ietf.org/doc/html/draft-pantos-hls-rfc8216bis/#appendix-C

Please share the console logs from one of these sessions. The logs include information about how the delivery directives were determined.

A URL to the HLS asset would help as well.

@robwalch robwalch added Need info and removed Needs Triage If there is a suspected stream issue, apply this label to triage if it is something we should fix. labels Jan 4, 2024
@TheKeveloper
Copy link
Author

Hey @robwalch thanks for the quick response!

We don't do any caching so we don't have an age header. Unfortunately I can't link to the HLS asset since the server is not public.

Based on my read of the algorithm that you linked, my rough guess is that something like the following is going on:

We use the time to complete the request as an estimate for how far in the future we should specify the delivery directives to be. If the page is resource/network constrained, the time estimate is longer so the delivery directives are farther in the future. If we get lucky and a request loads quickly, then we have delivery directives that don't load too far into the future, and subsequent loads work.

The above guess is just based on the fact that the bad loading behavior really only seems to happen on pages that have a lot of other things going on or if I have many other tabs open.

I have the following console logs from chrome for a case where the player just continuously buffered

hls.min.js:1 [log] >
hls.min.js:1 [log] > stopLoad
hls.min.js:1 [log] > loadSource:https://{base-path}/playlist.m3u8
hls.min.js:1 [log] > [stream-controller]: Trigger BUFFER_RESET
hls.min.js:1 [log] > attachMedia
hls.min.js:1 [log] > [buffer-controller]: Media source opened
hls.min.js:1 [log] > [subtitle-stream-controller]: STOPPED->IDLE
hls.min.js:1 [log] > [level-controller]: manifest loaded, 1 level(s) found, first bitrate: 4539463
hls.min.js:1 [log] > 1 bufferCodec event(s) expected
hls.min.js:1 [log] > startLoad(-1)
hls.min.js:1 [log] > [level-controller]: switching to level 0 from -1
hls.min.js:1 [log] > [level-controller]: Attempt loading level index 0 with URL-id 0 https://{base-path}/chunklist_vo_sfm4s.m3u8
hls.min.js:1 [log] > [stream-controller]: STOPPED->IDLE
hls.min.js:1 [log] > [subtitle-stream-controller]: IDLE->STOPPED
hls.min.js:1 [log] > [subtitle-stream-controller]: STOPPED->IDLE
hls.min.js:1 [log] > [level-controller]: CDN Tune-in age: 0s last advanced 754.72s goal: 9 skip sn 1 to part 7
hls.min.js:1 [log] > [level-controller]: Attempt loading level index 0 at sn 610 part 7 with URL-id 0 https://{base-path}/chunklist_vo_sfm4s.m3u8?_HLS_msn=610&_HLS_part=7&_HLS_skip=YES
hls.min.js:1 [log] > [stream-controller]: IDLE->WAITING_LEVEL
hls.min.js:1 [log] > [stream-controller]: Level 0 loaded [604,608], cc [0, 0] duration:34.033
hls.min.js:1 [log] > [stream-controller]: Live playlist sliding: 0.00 start-sn: na->604 prev-sn: na fragments: 5
hls.min.js:1 [log] > [buffer-controller]: Updating Media Source duration to 34.033
console.js:213 [warn] > [playlist-loader]: A network error occurred while loading level level: 0 id: 0 group-id: "null"
overrideMethod @ console.js:213
e.handleNetworkError @ hls.min.js:1
e.loaderror @ hls.min.js:1
handleError @ HlsWorkerLoader.js:56
onMessage @ HlsWorkerLoader.js:77
Show 5 more frames
Show less
console.js:213 [warn] > [level-controller]: retry playlist loading #1 in 2000 ms after "levelLoadError"
overrideMethod @ console.js:213
e.retryLoadingOrFail @ hls.min.js:1
d.recoverLevel @ hls.min.js:1
d.onError @ hls.min.js:1
u.emit @ hls.min.js:1
l.emit @ hls.min.js:1
l.trigger @ hls.min.js:1
e.handleNetworkError @ hls.min.js:1
e.loaderror @ hls.min.js:1
handleError @ HlsWorkerLoader.js:56
onMessage @ HlsWorkerLoader.js:77
Show 11 more frames
Show less
hls.min.js:1 [log] > [level-controller]: Attempt loading level index 0 with URL-id 0 https://{base-path}/chunklist_vo_sfm4s.m3u8
hls.min.js:1 [log] > [level-controller]: live playlist 0 REFRESHED 610-2
hls.min.js:1 [log] > [level-controller]: CDN Tune-in age: 0s last advanced 754.72s goal: 9 skip sn 1 to part 6
hls.min.js:1 [log] > [level-controller]: Attempt loading level index 0 at sn 611 part 6 with URL-id 0 https://{base-path}/chunklist_vo_sfm4s.m3u8?_HLS_msn=611&_HLS_part=6&_HLS_skip=YES
hls.min.js:1 [log] > [stream-controller]: Level 0 loaded [605,609], cc [0, 0] duration:33.032
hls.min.js:1 [log] > [buffer-controller]: Updating Media Source duration to 38.037
console.js:213 [warn] > [playlist-loader]: A network timeout occurred while loading level level: 0 id: 0 group-id: "null"
overrideMethod @ console.js:213
e.handleNetworkError @ hls.min.js:1
e.loadtimeout @ hls.min.js:1
handleTimeout @ HlsWorkerLoader.js:69
onMessage @ HlsWorkerLoader.js:80
Show 5 more frames
Show less
console.js:213 [warn] > [level-controller]: retry playlist loading #1 after "levelLoadTimeOut"
overrideMethod @ console.js:213
e.retryLoadingOrFail @ hls.min.js:1
d.recoverLevel @ hls.min.js:1
d.onError @ hls.min.js:1
u.emit @ hls.min.js:1
l.emit @ hls.min.js:1
l.trigger @ hls.min.js:1
e.handleNetworkError @ hls.min.js:1
e.loadtimeout @ hls.min.js:1
handleTimeout @ HlsWorkerLoader.js:69
onMessage @ HlsWorkerLoader.js:80
Show 11 more frames
Show less
hls.min.js:1 [log] > [level-controller]: Attempt loading level index 0 with URL-id 0 https://{base-path}/chunklist_vo_sfm4s.m3u8
hls.min.js:1 [log] > [level-controller]: live playlist 0 REFRESHED 610-7
hls.min.js:1 [log] > [level-controller]: CDN Tune-in age: 0s last advanced 754.72s goal: 9 skip sn 1 to part 11
hls.min.js:1 [log] > [level-controller]: Attempt loading level index 0 at sn 611 part 11 with URL-id 0 https://{base-path}/chunklist_vo_sfm4s.m3u8?_HLS_msn=611&_HLS_part=11&_HLS_skip=YES
hls.min.js:1 [log] > [stream-controller]: Level 0 loaded [605,609], cc [0, 0] duration:38.03699999999999
hls.min.js:1 [log] > [buffer-controller]: Updating Media Source duration to 43.042
console.js:213 [warn] > [playlist-loader]: A network error occurred while loading level level: 0 id: 0 group-id: "null"
overrideMethod @ console.js:213
e.handleNetworkError @ hls.min.js:1
e.loaderror @ hls.min.js:1
handleError @ HlsWorkerLoader.js:56
onMessage @ HlsWorkerLoader.js:77
Show 5 more frames
Show less
console.js:213 [warn] > [level-controller]: retry playlist loading #1 in 2000 ms after "levelLoadError"
overrideMethod @ console.js:213
e.retryLoadingOrFail @ hls.min.js:1
d.recoverLevel @ hls.min.js:1
d.onError @ hls.min.js:1
u.emit @ hls.min.js:1
l.emit @ hls.min.js:1
l.trigger @ hls.min.js:1
e.handleNetworkError @ hls.min.js:1
e.loaderror @ hls.min.js:1
handleError @ HlsWorkerLoader.js:56
onMessage @ HlsWorkerLoader.js:77
Show 11 more frames
Show less
hls.min.js:1 [log] > [level-controller]: Attempt loading level index 0 with URL-id 0 https://{base-path}/chunklist_vo_sfm4s.m3u8
hls.min.js:1 [log] > [level-controller]: live playlist 0 REFRESHED 611-2
hls.min.js:1 [log] > [level-controller]: CDN Tune-in age: 0s last advanced 754.72s goal: 9 skip sn 1 to part 6
hls.min.js:1 [log] > [level-controller]: Attempt loading level index 0 at sn 612 part 6 with URL-id 0 https://{base-path}/chunklist_vo_sfm4s.m3u8?_HLS_msn=612&_HLS_part=6&_HLS_skip=YES
hls.min.js:1 [log] > [stream-controller]: Level 0 loaded [606,610], cc [0, 0] duration:33.032
hls.min.js:1 [log] > [buffer-controller]: Updating Media Source duration to 48.047

@robwalch
Copy link
Collaborator

robwalch commented Jan 5, 2024

Not a Contribution

The above guess is just based on the fact that the bad loading behavior really only seems to happen on pages that have a lot of other things going on or if I have many other tabs open.

CDN Tune-in age: 0s last advanced 754.72s goal: 9 skip sn 1 to part 6

If other things are going on, that's OK - up to a point. There's a tolerance for up to 1.5 times the target duration (9 seconds in your case) for the directives to try and catchup.

Here, the page/clock stalled (maybe you were debugging?) for 754 seconds after the first playlist response, and before estimating the goal. So really we're many minutes behind the live edge. Only advancing 9 seconds will not catch up. It tries, but the problem here is not that we're requesting segments too far ahead (greater than the Media Sequence Number of the last Media Segment plus two should return HTTP 400) but too far in the past. When the request fails for old media (ideally with HTTP 404 or 410) HLS.js should make another request without these directives.

From what I can tell this works as expected. If there is a valid reason why there is more than 1.5* the target duration between playlist response and next request that you think we should handle, please clarify - the page itself blocking for that long is a page issue (maybe one not performant enough to handle LL-HLS playback?). We might consider an enhancement that omits segment directives if the estimated age is great enough, or even fallback to standard HLS latency.

robwalch added a commit that referenced this issue Jan 5, 2024
…han three target durations

Fix Media Playlist 'advanced' state when no Multivariant Playlist is provided
Related to #6076
@robwalch robwalch linked a pull request Jan 5, 2024 that will close this issue
3 tasks
@robwalch
Copy link
Collaborator

robwalch commented Jan 5, 2024

@TheKeveloper let me know if #6080 resolves this issue or better meets your expectations based on your testing. I'm only able to reproduce the issue when artificially pausing JS execution by debugging. Another scenario would be backrounding the page on a mobile device or putting the device to sleep and waking it after more than a couple of target durations. Hopefully you don't have anything else running on the page blocking for that long. This change should prevent some of those stale requests from being made after the execution resumes.

@TheKeveloper
Copy link
Author

@robwalch I think the above delay is probably a red herring due to some debugging I was doing. Sorry about the confusion there!

Here's a more recent attempt where the video also fails to load

hls.mjs:412 [log] > Debug logs enabled for "Hls instance" in hls.js version 1.4.14
hls.mjs:25349 [log] > stopLoad
hls.mjs:25320 [log] > loadSource:https://{base-path}/playlist.m3u8
hls.mjs:15334 [log] > [stream-controller]: Trigger BUFFER_RESET
hls.mjs:25294 [log] > attachMedia
hls.mjs:18448 [log] > [buffer-controller]: Media source opened
hls.mjs:9577 [log] > [subtitle-stream-controller]: STOPPED->IDLE
hls.mjs:6142 [log] > [level-controller]: manifest loaded, 1 level(s) found, first bitrate: 4374459
hls.mjs:18547 [log] > 1 bufferCodec event(s) expected
hls.mjs:25339 [log] > startLoad(-1)
hls.mjs:6211 [log] > [level-controller]: Switching to level 0 from level -1
hls.mjs:6352 [log] > [level-controller]: Loading level index 0 with URI 1/1 https://{base-path}/chunklist_vo_sfm4s.m3u8
hls.mjs:9577 [log] > [stream-controller]: STOPPED->IDLE
hls.mjs:9577 [log] > [subtitle-stream-controller]: IDLE->STOPPED
hls.mjs:9577 [log] > [subtitle-stream-controller]: STOPPED->IDLE
hls.mjs:5849 [log] > [level-controller]: CDN Tune-in age: 0s last advanced 22.08s goal: 9 skip sn 1 to part 7
hls.mjs:6352 [log] > [level-controller]: Loading level index 0 at sn 993 part 7 with URI 1/1 https://{base-path}/chunklist_vo_sfm4s.m3u8?_HLS_msn=993&_HLS_part=7&_HLS_skip=YES
hls.mjs:9577 [log] > [stream-controller]: IDLE->WAITING_LEVEL
hls.mjs:15389 [log] > [stream-controller]: Level 0 loaded [987,991][part-992-3], cc [0, 0] duration:34.032999999999994
hls.mjs:9290 [log] > [stream-controller]: Live playlist sliding: 0.00 start-sn: na->987 prev-sn: na fragments: 5
hls.mjs:19015 [log] > [buffer-controller]: Updating Media Source duration to 34.033
console.js:213 [warn] > [playlist-loader]: A network error (status 0) occurred while loading level: 0 id: 0
overrideMethod @ console.js:213
handleNetworkError @ hls.mjs:3838
onError @ hls.mjs:3696
HlsWorkerLoader.handleError @ HlsWorkerLoader.js:56
HlsWorkerLoader.onMessage @ HlsWorkerLoader.js:77
Show 5 more frames
Show less
console.js:213 [warn] > [level-controller]: Retrying playlist loading 1/2 after "levelLoadError" in 1000ms
overrideMethod @ console.js:213
checkRetry @ hls.mjs:5932
onError @ hls.mjs:6272
emit @ hls.mjs:14148
emit @ hls.mjs:25244
trigger @ hls.mjs:25248
handleNetworkError @ hls.mjs:3881
onError @ hls.mjs:3696
HlsWorkerLoader.handleError @ HlsWorkerLoader.js:56
HlsWorkerLoader.onMessage @ HlsWorkerLoader.js:77
Show 10 more frames
Show less
hls.mjs:6352 [log] > [level-controller]: Loading level index 0 with URI 1/1 https://{base-path}/chunklist_vo_sfm4s.m3u8
hls.mjs:5803 [log] > [level-controller]: live playlist 0 REFRESHED 993-1
hls.mjs:5849 [log] > [level-controller]: CDN Tune-in age: 0s last advanced 22.08s goal: 9 skip sn 1 to part 5
hls.mjs:6352 [log] > [level-controller]: Loading level index 0 at sn 994 part 5 with URI 1/1 https://{base-path}/chunklist_vo_sfm4s.m3u8?_HLS_msn=994&_HLS_part=5&_HLS_skip=YES
hls.mjs:15389 [log] > [stream-controller]: Level 0 loaded [988,992][part-993-1], cc [0, 0] duration:32.03099999999999
hls.mjs:19015 [log] > [buffer-controller]: Updating Media Source duration to 37.036
console.js:213 [warn] > [playlist-loader]: A network error (status 0) occurred while loading level: 0 id: 0
overrideMethod @ console.js:213
handleNetworkError @ hls.mjs:3838
onError @ hls.mjs:3696
HlsWorkerLoader.handleError @ HlsWorkerLoader.js:56
HlsWorkerLoader.onMessage @ HlsWorkerLoader.js:77
Show 5 more frames
Show less
console.js:213 [warn] > [level-controller]: Retrying playlist loading 1/2 after "levelLoadError" in 1000ms
overrideMethod @ console.js:213
checkRetry @ hls.mjs:5932
onError @ hls.mjs:6272
emit @ hls.mjs:14148
emit @ hls.mjs:25244
trigger @ hls.mjs:25248
handleNetworkError @ hls.mjs:3881
onError @ hls.mjs:3696
HlsWorkerLoader.handleError @ HlsWorkerLoader.js:56
HlsWorkerLoader.onMessage @ HlsWorkerLoader.js:77
Show 10 more frames
Show less
hls.mjs:6352 [log] > [level-controller]: Loading level index 0 with URI 1/1 https://{base-path}/chunklist_vo_sfm4s.m3u8
hls.mjs:5803 [log] > [level-controller]: live playlist 0 REFRESHED 994-1
hls.mjs:5849 [log] > [level-controller]: CDN Tune-in age: 0s last advanced 22.08s goal: 9 skip sn 1 to part 5
hls.mjs:6352 [log] > [level-controller]: Loading level index 0 at sn 995 part 5 with URI 1/1 https://{base-path}/chunklist_vo_sfm4s.m3u8?_HLS_msn=995&_HLS_part=5&_HLS_skip=YES
hls.mjs:15389 [log] > [stream-controller]: Level 0 loaded [989,993][part-994-1], cc [0, 0] duration:32.032
hls.mjs:19015 [log] > [buffer-controller]: Updating Media Source duration to 42.041
console.js:213 [warn] > [playlist-loader]: A network timeout occurred while loading level: 0 id: 0
overrideMethod @ console.js:213
handleNetworkError @ hls.mjs:3838
onTimeout @ hls.mjs:3699
HlsWorkerLoader.handleTimeout @ HlsWorkerLoader.js:69
HlsWorkerLoader.onMessage @ HlsWorkerLoader.js:80
Show 5 more frames
Show less
console.js:213 [warn] > [level-controller]: Retrying playlist loading 1/2 after "levelLoadTimeOut" without delivery-directives
overrideMethod @ console.js:213
checkRetry @ hls.mjs:5926
onError @ hls.mjs:6272
emit @ hls.mjs:14148
emit @ hls.mjs:25244
trigger @ hls.mjs:25248
handleNetworkError @ hls.mjs:3881
onTimeout @ hls.mjs:3699
HlsWorkerLoader.handleTimeout @ HlsWorkerLoader.js:69
HlsWorkerLoader.onMessage @ HlsWorkerLoader.js:80
Show 10 more frames
Show less
hls.mjs:6352 [log] > [level-controller]: Loading level index 0 with URI 1/1 https://{base-path}/chunklist_vo_sfm4s.m3u8
hls.mjs:5803 [log] > [level-controller]: live playlist 0 REFRESHED 994-5
hls.mjs:5849 [log] > [level-controller]: CDN Tune-in age: 0s last advanced 22.08s goal: 9 skip sn 1 to part 9
hls.mjs:6352 [log] > [level-controller]: Loading level index 0 at sn 995 part 9 with URI 1/1 https://{base-path}/chunklist_vo_sfm4s.m3u8?_HLS_msn=995&_HLS_part=9&_HLS_skip=YES
hls.mjs:15389 [log] > [stream-controller]: Level 0 loaded [989,993][part-994-5], cc [0, 0] duration:36.035999999999994

I'll give the PR that you linked a shot, since it the target duration is 5s here, so we're falling 3 target durations behind.

Still a little unclear why that would be happening since the request to the server completes in about 50ms according to Chrome and it doesn't seem like anything on the browser is stalling that long?

@robwalch
Copy link
Collaborator

robwalch commented Jan 5, 2024

Not a Contribution

...last advanced 22.08s goal: 9 skip sn 1 to part 5

Interesting that you're getting a consistent advancedDateTime of 22.08. I'm curious to know what the loader stats look like (is stats.loading.first being manipulated?), and if there's something fishy going on with your clock (using performance.now() and Date.now()).

advancedDateTime should be the date-time that the headers or first byte was received for the playlist. Since stats.loading.first is expected to be a performance measurement, we subtract performance.now() - stats.loading.first from Date.now() to get this date-time value.

@TheKeveloper
Copy link
Author

Ah, okay, I think it must be related to our custom HLS worker loader, since the loader stats do get modified there.

I tested it out without using a custom worker loader and things seem to work great. I think a lot of this code was written on a much older version of hls.js so I'm going to look into whether with more recent versions we're able to forgo using the custom worker loader.

I think this should be considered resolved, thank you so much for all of your help!

robwalch added a commit that referenced this issue Feb 7, 2024
…han three target durations

Fix Media Playlist 'advanced' state when no Multivariant Playlist is provided
Related to #6076
robwalch added a commit that referenced this issue Feb 8, 2024
…han three target durations

Fix Media Playlist 'advanced' state when no Multivariant Playlist is provided
Related to #6076
eowino added a commit to DiceTechnology/hls.js that referenced this issue Apr 5, 2024
* chore(deps): update typescript-eslint monorepo to v6.17.0

* chore(deps): update babel monorepo to v7.23.7

* chore(deps): update dependency rollup to v4.9.2

* chore(deps): update dependency rollup to v4.9.4

* Fix codec parsing for AVC streams (video-dev#6077)

* Force auto level on emergency switch down (video-dev#6082)

Update estimates on frag load timeout
Do not abort request in _abandonRulesCheck
Remove two segment forward buffer length limit in _abandonRulesCheck
Reset estimate when candidate bitrate is lower than adjusted estimate
Resolves video-dev#6079

* chore(deps): update dependency wrangler to v3.22.2

* chore(deps): update dependency wrangler to v3.22.4

* chore(deps): update dependency @microsoft/api-documenter to v7.23.16

* chore(deps): update dependency @microsoft/api-extractor to v7.39.1

* Null CMCD callbacks on destroy (video-dev#6098)

* Fix regression where subtitle options with AUTOSELECT and FORCED are enabled at start (video-dev#6094)

* Do not enable subtitle options with AUTOSELECT=YES attribute
* Update and add initial selection tests for subtitle-controller
* Only pick forced subtitle option if it is the only one
Add default field to audio and subtitle selection options and forced field to subtitle selection option
* Address TextTrack change event overriding subtitle preference
Fix _TRACKS_UPDATED and _TRACK_SWITCH event order when preference is selected
* Do not auto select subtitle options with FORCED=YES attribute

* Update artifact actions (video-dev#6099)

* Update functional tests to run on Safari using MacOS 13 (video-dev#6101)

* Update functional tests to run on Safari using MacOS 13

* Skip smooth switch test in Safari on streams with overlapping appends

* Omit VOD "ended" event tests with overlapping appends from Safari

* chore(deps): update dependency chai to v4.4.0

* chore(deps): update dependency chai to v4.4.1

* chore(deps): update typescript-eslint monorepo to v6.18.0

* chore(deps): update typescript-eslint monorepo to v6.18.1

* Use AAC SBR (HE-AAC) workaround on Pale Moon (video-dev#6111)

* Patch/v1.4.0 doris (#79)

* Patch/v1.3.3 doris (#76)

* MPEG-TS probe improvement (video-dev#5186)

Fixes video-dev#5183

* Support AES-128 Encrypted Low-Latency HLS Parts (video-dev#5214)

* Log error and detach if MediaSource 'sourceopen' is interrupted (video-dev#5206)

* fix: merge DiceTechnology/hls.js changes.

* fix: Transition from Clear to DRM content

* fix:Sometimes play AES-128 stream failed

* test: modify test case

---------

Co-authored-by: Rob Walch <robwalch@users.noreply.github.com>

* 1.3.4

* docs: modify api doc.

* chore: Modify version.

---------

Co-authored-by: Rob Walch <robwalch@users.noreply.github.com>
Co-authored-by: Hongfei Huang <hongfei.huang@endeavorstreaming.com>

* Patch/v1.4.1 doris (#80)

* reference v1 jsdelivr url in v1 api doc

people should be using that over latest so that things don't break when we release v2 with potentially breaking changes. Main readme already used v1 url

* chore(deps): update dependency @rollup/plugin-alias to v4.0.4

* chore(deps): update dependency @microsoft/api-documenter to v7.21.7

* chore(deps): update dependency @rollup/plugin-typescript to v11.1.0

* chore(deps): update dependency @rollup/plugin-node-resolve to v15.0.2

* chore(deps): update dependency wrangler to v2.15.0

* chore(deps): update dependency @rollup/plugin-alias to v5

* Fix readme logos & add Mux logo (video-dev#5390)

* docs: replace broken logo with Mux

* docs: fix TED logo

* docs: replace broken logos

* chore(deps): update dependency lint-staged to v13.2.1

* chore(deps): update dependency typescript to v5.0.4

* chore(deps): update dependency eslint to v8.38.0

* chore(deps): update dependency es-check to v7.1.1

* chore(deps): update dependency @rollup/plugin-terser to v0.4.1

* chore(deps): update typescript-eslint monorepo to v5.58.0

* chore(deps): update dependency semver to v7.4.0

* chore(deps): update dependency @rollup/plugin-commonjs to v24.1.0

* chore(deps): update dependency semver to v7.5.0

* chore(deps): update typescript-eslint monorepo to v5.59.0

* Setup npm provenance statements (video-dev#5406)

* give publish job permissions for npm provenance

* add `—provenance` flag to `npm publish`

* remove unneeded `contents` permission

* chore(deps): update dependency chromedriver to v112 (video-dev#5393)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Tom Jenkinson <tjenkinson@users.noreply.github.com>

* set `internalChecksAsSuccess` renovate option

* chore(deps): update dependency wrangler to v2.15.1

* set renovate `prNotPendingHours` to 0

* chore(deps): update dependency wrangler to v2.16.0

* chore(deps): update dependency rollup to v3.20.3

* chore(deps): update dependency rollup to v3.20.7

* chore(deps): update dependency rollup to v3.21.0

* chore(deps): update tjenkinson/gh-action-auto-merge-dependency-updates digest to 01b22a9 (video-dev#5324)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* tweak renovate options again

see renovatebot/renovate#21720

* reset remainderData in resetContiguity (video-dev#5410)

* docs: add Media Chrome for custom UI (video-dev#5391)

* Perform playlist retries before redundant failover and level switch (video-dev#5420)

(Pathway switch is still prioritized over retries when available)
Fixes video-dev#5419

* chore(deps): update dependency sinon to v15.0.4

* chore(deps): update dependency karma-chrome-launcher to v3.2.0

* chore(deps): update dependency selenium-webdriver to v4.9.0

* Update audio-track-controller.ts (video-dev#5431)

Sometimes STABLE-RENDITION_ID of tracks is undefined. Adding a guard for it, otherwise audio track doesn't switch.

* chore(deps): update dependency eslint to v8.39.0

* chore(deps): update dependency karma to v6.4.2

* chore(deps): update dependency prettier to v2.8.8

* Fix incorrect HEVC main profile codec id (video-dev#5438)

* fix: move `types` condition to the front (video-dev#5439)

* chore(deps): update dependency wrangler to v2.17.0

* chore(deps): update typescript-eslint monorepo to v5.59.1

* chore(deps): update typescript-eslint monorepo to v5.59.2

* Fix Low-Latency part and fragment tracking (video-dev#5423)

* Fix Low-Latency part and fragment tracking regression introduced in video-dev#5102

* Fix issues with reuse of player instance when loading additional assets
Fixes video-dev#5425

* Reset SourceBuffers in `loadSource()` when the asset URL has changed, or buffer-controller setup has begun

* Remove old parts from the fragment tracker on frag buffered

* Remove old parts from the fragment tracker on frag buffered

* Reset eme-controller key format promise on manifest loading

* chore(deps): update dependency lint-staged to v13.2.2

* Always use MediaSource returned by utils module (video-dev#5448)

* chore(deps): update dependency @microsoft/api-documenter to v7.22.0

* chore(deps): update dependency @microsoft/api-documenter to v7.22.4

* chore: Modify version

* chore: remove package-lock.json

---------

Co-authored-by: Tom Jenkinson <tjenkinson@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: hlsjs-ci <40664919+hlsjs-ci@users.noreply.github.com>
Co-authored-by: Wesley Luyten <me@wesleyluyten.com>
Co-authored-by: Billy Chiu <billychiu98@gmail.com>
Co-authored-by: Rob Walch <robwalch@users.noreply.github.com>
Co-authored-by: Agajan J <agajan.tm@gmail.com>
Co-authored-by: Sta Zhu <zhusidayoyo@hotmail.com>
Co-authored-by: Mateusz Burzyński <mateuszburzynski@gmail.com>
Co-authored-by: yajin2021 <gene.jin@endeavorstreaming.com>

* Update DiceTechnology/hls.js to v1.4.3(#81)

* Patch/v1.4.4 doris (#82)

* reference v1 jsdelivr url in v1 api doc

people should be using that over latest so that things don't break when we release v2 with potentially breaking changes. Main readme already used v1 url

* chore(deps): update dependency @rollup/plugin-alias to v4.0.4

* chore(deps): update dependency @microsoft/api-documenter to v7.21.7

* chore(deps): update dependency @rollup/plugin-typescript to v11.1.0

* chore(deps): update dependency @rollup/plugin-node-resolve to v15.0.2

* chore(deps): update dependency wrangler to v2.15.0

* chore(deps): update dependency @rollup/plugin-alias to v5

* Fix readme logos & add Mux logo (video-dev#5390)

* docs: replace broken logo with Mux

* docs: fix TED logo

* docs: replace broken logos

* chore(deps): update dependency lint-staged to v13.2.1

* chore(deps): update dependency typescript to v5.0.4

* chore(deps): update dependency eslint to v8.38.0

* chore(deps): update dependency es-check to v7.1.1

* chore(deps): update dependency @rollup/plugin-terser to v0.4.1

* chore(deps): update typescript-eslint monorepo to v5.58.0

* chore(deps): update dependency semver to v7.4.0

* chore(deps): update dependency @rollup/plugin-commonjs to v24.1.0

* chore(deps): update dependency semver to v7.5.0

* chore(deps): update typescript-eslint monorepo to v5.59.0

* Setup npm provenance statements (video-dev#5406)

* give publish job permissions for npm provenance

* add `—provenance` flag to `npm publish`

* remove unneeded `contents` permission

* chore(deps): update dependency chromedriver to v112 (video-dev#5393)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Tom Jenkinson <tjenkinson@users.noreply.github.com>

* set `internalChecksAsSuccess` renovate option

* chore(deps): update dependency wrangler to v2.15.1

* set renovate `prNotPendingHours` to 0

* chore(deps): update dependency wrangler to v2.16.0

* chore(deps): update dependency rollup to v3.20.3

* chore(deps): update dependency rollup to v3.20.7

* chore(deps): update dependency rollup to v3.21.0

* chore(deps): update tjenkinson/gh-action-auto-merge-dependency-updates digest to 01b22a9 (video-dev#5324)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* tweak renovate options again

see renovatebot/renovate#21720

* reset remainderData in resetContiguity (video-dev#5410)

* docs: add Media Chrome for custom UI (video-dev#5391)

* Perform playlist retries before redundant failover and level switch (video-dev#5420)

(Pathway switch is still prioritized over retries when available)
Fixes video-dev#5419

* chore(deps): update dependency sinon to v15.0.4

* chore(deps): update dependency karma-chrome-launcher to v3.2.0

* chore(deps): update dependency selenium-webdriver to v4.9.0

* Update audio-track-controller.ts (video-dev#5431)

Sometimes STABLE-RENDITION_ID of tracks is undefined. Adding a guard for it, otherwise audio track doesn't switch.

* chore(deps): update dependency eslint to v8.39.0

* chore(deps): update dependency karma to v6.4.2

* chore(deps): update dependency prettier to v2.8.8

* Fix incorrect HEVC main profile codec id (video-dev#5438)

* fix: move `types` condition to the front (video-dev#5439)

* chore(deps): update dependency wrangler to v2.17.0

* chore(deps): update typescript-eslint monorepo to v5.59.1

* chore(deps): update typescript-eslint monorepo to v5.59.2

* Fix Low-Latency part and fragment tracking (video-dev#5423)

* Fix Low-Latency part and fragment tracking regression introduced in video-dev#5102

* Fix issues with reuse of player instance when loading additional assets
Fixes video-dev#5425

* Reset SourceBuffers in `loadSource()` when the asset URL has changed, or buffer-controller setup has begun

* Remove old parts from the fragment tracker on frag buffered

* Remove old parts from the fragment tracker on frag buffered

* Reset eme-controller key format promise on manifest loading

* chore(deps): update dependency lint-staged to v13.2.2

* Always use MediaSource returned by utils module (video-dev#5448)

* chore(deps): update dependency @microsoft/api-documenter to v7.22.0

* chore(deps): update dependency @microsoft/api-documenter to v7.22.4

* chore(deps): update babel monorepo to v7.21.5

* chore(deps): update dependency @microsoft/api-extractor to v7.34.5

* chore(deps): update dependency @babel/core to v7.21.8

* chore(deps): update dependency @microsoft/api-extractor to v7.34.6

* chore(deps): update dependency @microsoft/api-extractor to v7.34.8

* chore(deps): update dependency @types/chai to v4.3.5

* chore(deps): update dependency rollup to v3.21.1

* chore(deps): update dependency rollup to v3.21.5

* chore(deps): update dependency eventemitter3 to v5.0.1

* fix: partial audiovideo fragments not being treated as partial (video-dev#5460)

Fragments which contain both audio and video also need to be checked if
they are partial. We check for them individually, but there are cases
when only the one flag is set.

* Fix AV desync regression in v1.4.0 when mp4 audio track timestamps start before video track timestamps (video-dev#5471)

Fixes video-dev#5452

* chore(deps): update dependency wrangler to v2.18.0

* chore(deps): update dependency chromedriver to v112.0.1

* chore(deps): update dependency wrangler to v2.20.0

* Allow live level loading to recover from net::ERR_NETWORK_IO_SUSPENDED errors (video-dev#5473)

* Remove startLoad() as recovery method from API.md doc (video-dev#5478)

video-dev#5476

* Fix first fragment ejection tracking (video-dev#5480)

Fixes video-dev#5482

* Provide light ESM dist file (video-dev#5486)

* Playlist loading errors are fatal after all levels and retries exhausted (video-dev#5498)

Fixes video-dev#5488

* Adjust parsed TS AVC samples when start PTS overlaps with last DTS (video-dev#5500)

Resolves video-dev#5477

* Fix TS probing false positives by requiring 2-3 packet start bytes to be matched or more if first byte does not match sync word (video-dev#5503)

Fixes video-dev#5501

* Use input timescale when normalizing metadata cue timestamps (video-dev#5505)

Fixes video-dev#5504

* chore: change package.json

---------

Co-authored-by: Tom Jenkinson <tjenkinson@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: hlsjs-ci <40664919+hlsjs-ci@users.noreply.github.com>
Co-authored-by: Wesley Luyten <me@wesleyluyten.com>
Co-authored-by: Billy Chiu <billychiu98@gmail.com>
Co-authored-by: Rob Walch <robwalch@users.noreply.github.com>
Co-authored-by: Agajan J <agajan.tm@gmail.com>
Co-authored-by: Sta Zhu <zhusidayoyo@hotmail.com>
Co-authored-by: Mateusz Burzyński <mateuszburzynski@gmail.com>
Co-authored-by: Troy <troybensonsa@gmail.com>
Co-authored-by: Chocobozzz <chocobozzz@cpy.re>

* 1.5.1

* chore(deps): update dependency rollup to v4.9.5

* chore(deps): update dependency @rollup/plugin-typescript to v11.1.6

* chore(deps): update dependency @babel/preset-env to v7.23.8

* chore(deps): update typescript-eslint monorepo to v6.19.0

* chore(deps): update typescript-eslint monorepo to v6.19.1

* Use WebCrypto by default and only use software as a fallback if enabled (video-dev#6015)

Fixes use of  `enableSoftwareAES` to match the docs and the intended behavior when added in video-dev#99

* Null inline class JavaScript Event callback properties on destroy (video-dev#6102)

* chore(deps): update dependency @microsoft/api-documenter to v7.23.17

* chore(deps): update dependency @microsoft/api-documenter to v7.23.18

* chore(deps): update dependency @microsoft/api-documenter to v7.23.19

* chore(deps): update dependency wrangler to v3.22.5

* chore(deps): update dependency wrangler to v3.24.0

* Remove user-agent check from "mp4a.40.34" to "mp3" and "audio/mpeg" fallback (video-dev#6130)

Fixes video-dev#6125

* Adding AES-256 and AES-256-CTR encryption modes

* fix: generate silent aac frame based on original codec (video-dev#6123)

* Lazy init CEA608 parsers (2) (video-dev#6127)

* Use average for level sorting and abandon rules check (video-dev#6135)

Fixes video-dev#6122

* User unique logger configurations across instances of Hls(js)
Resolves video-dev#2461

* chore(deps): update dependency @svta/common-media-library to v0.6.2

* Use average for level sorting and abandon rules check (video-dev#6135) (video-dev#6146)

Fixes video-dev#6122

* Add MEDIA_ENDED event (forwards "ended" event, or emits when stalling begins near end of VOD) (video-dev#6141)

* chore(deps): update dependency chromedriver to v120.0.2

* chore(deps): update dependency rollup to v4.9.6

* feat: add support for CMCD nor (video-dev#6091)

* feat: add support for CMCD nor
* deps: update @svta/common-media-library to version 0.6.2
Resolves video-dev#6088

* fix(Remuxer): Safari segment overlap ensure PTS order (video-dev#6132)

* fix(Remuxer): Safari segment overlap ensure PTS alignment

* Fix regression in hls.light.js selection (video-dev#6155)

Fixes video-dev#6151

* chore(deps): update dependency selenium-webdriver to v4.17.0

* chore(deps): update dependency @microsoft/api-extractor to v7.39.2

* chore(deps): update dependency @microsoft/api-extractor to v7.39.4

* Fix regression in hls.light.js selection (video-dev#6157)

Fixes video-dev#6151

* chore(deps): update dependency husky to v9 (video-dev#6165)

* chore(deps): update dependency husky to v9

* Make changes for new husky

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Tom Jenkinson <tom@tjenkinson.me>

* chore(deps): update actions/cache action to v4 (video-dev#6143)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update dependency prettier to v3.2.4 (video-dev#6124)

* chore(deps): update dependency prettier to v3.2.4

* Run prettier

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Tom Jenkinson <tom@tjenkinson.me>

* Disable `AppleAdvancedHevcAvcHls` stream for now due to cors errors (video-dev#6176)

* chore(deps): update babel monorepo to v7.23.9

* chore(deps): update dependency @microsoft/api-documenter to v7.23.20

* chore(deps): update dependency wrangler to v3.25.0

* chore(deps): update dependency chromedriver to v121 (video-dev#6162)

* chore(deps): update dependency wrangler to v3.26.0

* chore(deps): replace dependency npm-run-all with npm-run-all2 5.0.0 (video-dev#6153)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update dependency npm-run-all2 to v5.0.2

* chore(deps): update dependency husky to v9.0.7

* chore(deps): update dependency husky to v9.0.10

* chore(deps): update typescript-eslint monorepo to v6.20.0

* chore(deps): update typescript-eslint monorepo to v6.21.0

* Revert "Disable `AppleAdvancedHevcAvcHls` stream for now due to cors errors (…" (video-dev#6187)

This reverts commit e3f4d4d.

* Use main playlist details to determine start position of audio and subtitle streaming controllers
Fixes video-dev#6126

* Fix regression that removed (unofficial) support for `startLevel` above max level index
Fixes video-dev#6172

* Account for overlapping sidx subsegment durations by parsing earlierstPresentationTime
Fixes video-dev#6191

* Use main playlist details to determine start position of audio and subtitle streaming controllers
Fixes video-dev#6126

(cherry picked from commit 35c773d)

* Fix regression that removed (unofficial) support for `startLevel` above max level index
Fixes video-dev#6172

(cherry picked from commit 88d54a9)

* Account for overlapping sidx subsegment durations by parsing earlierstPresentationTime
Fixes video-dev#6191

(cherry picked from commit aadb239)

* Handle ManagedMediaSource endStreaming events without aborting requests

* Feature/mpeg ts hevc (video-dev#5847)

* Modify video parser and ts-demuxer to support NALu streams other than AVC
* Process HEVC in mpeg-ts container
---------
Co-authored-by: vladimir.vyatkin <vladimir.vyatkin@portal59.ru>

* Do not include HEVC in TS support in hls.light (compiled out by __USE_M2TS_ADVANCED_CODECS__)

* chore(deps): update dependency lint-staged to v15.2.1

* chore(deps): update dependency lint-staged to v15.2.2

* Update API.md for CMCD `includeKeys`

* Global exported logger uses the log methods from last call to `enableLogs`
Follow up to video-dev#6131

* Skip segment and part directives when last LL-HLS response is older than three target durations
Fix Media Playlist 'advanced' state when no Multivariant Playlist is provided
Related to video-dev#6076

* Switch between part and fragment loading at start and on segment boundary appends

* Fix subtitle stream controller buffered TimeRanges

* chore(deps): update dependency semver to v7.6.0

* chore(deps): update dependency @microsoft/api-documenter to v7.23.21

* chore(deps): update dependency @microsoft/api-documenter to v7.23.23

* chore(deps): update dependency @microsoft/api-extractor to v7.39.5

* chore(deps): update dependency @microsoft/api-extractor to v7.40.1

* Fix subtitle stream controller buffered TimeRanges

* chore(deps): update dependency wrangler to v3.27.0

* chore(deps): update dependency wrangler to v3.28.2

* chore(deps): update dependency mocha to v10.3.0

* Fix issues with detached and destroyed level selection (video-dev#6216)

* Fix issues with detached and destroyed level selection (video-dev#6216)

* chore(deps): update dependency rollup to v4.10.0

* chore(deps): update dependency rollup to v4.12.0

* fix index offset in sidx parsing (video-dev#6221)

* fix index offset in sidx parsing (video-dev#6221)

(cherry picked from commit e18d394)

* Add no-op comment to empty statement (fix lint error)

* Block audio append queue to keep AV appends in lock-step

* Reduce length of ESDS box guard statement

* rutube logo for they use section

* chore(deps): update dependency husky to v9.0.11

* Don't flush buffer on cap-level change when in manual selection mode (video-dev#6223)

* Don't switch level if current already greater or equal
* Don't switch level if autoLevel disabled
---------
Co-authored-by: Vladimir Polomanov <vpolomanov@rutube.ru>

* Fix audio/subtitles stream controllers restarting on switch after stopped
Update stream controller access specifiers

* Cleanup buffer-helper functions and remove nested try-catch statements

* Fix pauseBuffering() dev regression

* chore(deps): update dependency chromedriver to v121.0.1

* chore(deps): update dependency eslint-plugin-mocha to v10.3.0

* chore(deps): update dependency chromedriver to v121.0.2

* chore(deps): update dependency wrangler to v3.28.3

* chore(deps): update dependency @microsoft/api-documenter to v7.23.24

* chore(deps): update dependency @microsoft/api-extractor to v7.40.2

* chore(deps): update dependency @microsoft/api-extractor to v7.40.6

* chore(deps): update dependency wrangler to v3.29.0

* chore(deps): update dependency @microsoft/api-documenter to v7.23.30

* Fix compatibility of ManagedMediaSource implementation with Edge 18
Fixes video-dev#6243

* chore(deps): update dependency selenium-webdriver to v4.18.1

* Clean up base-stream-controller

* Don't pass log functions with player id to global logger

* Clear media from cap-level-controller on detach

* remove iphone compatibility note since its supported through mms

* added more info for iOS 17.1+ support

* Run Prettier to address lint error

* chore(deps): update dependency @types/chai to v4.3.12

* Ensure media element references are removed after calling detachMedia

* chore(deps): update dependency eslint to v8.57.0

* chore(deps): update dependency karma to v6.4.3

* chore(deps): update dependency @microsoft/api-extractor to v7.41.0

* chore(deps): update dependency @microsoft/api-extractor to v7.42.2

* chore(deps): update dependency @microsoft/api-documenter to v7.23.31

* chore(deps): update dependency @microsoft/api-documenter to v7.23.35

* chore(deps): update dependency wrangler to v3.30.0

* chore(deps): update dependency wrangler to v3.31.0

* chore(deps): update babel monorepo to v7.24.0

* chore(deps): update dependency @svta/common-media-library to v0.6.3

* chore(deps): update dependency @svta/common-media-library to v0.6.4

* chore(deps): update dependency chromedriver to v122 (video-dev#6250)

* chore(deps): update typescript-eslint monorepo to v7 (video-dev#6225)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update dependency npm-run-all2 to v6 (video-dev#6179)

* chore(deps): update dependency @microsoft/api-documenter to v7.23.36

* chore(deps): update dependency @microsoft/api-documenter to v7.23.37

* chore(deps): update dependency @microsoft/api-extractor to v7.42.3

* chore(deps): update typescript-eslint monorepo to v7.1.1

* chore(deps): update typescript-eslint monorepo to v7.2.0

* chore(deps): update dependency rollup to v4.12.1

* chore(deps): update dependency rollup to v4.13.0

* chore(deps): update dependency typescript to v5.4.2

* chore(deps): update dependency eslint-plugin-mocha to v10.4.0

* chore(deps): update dependency eslint-plugin-mocha to v10.4.1

* chore(deps): update dependency wrangler to v3.32.0

* chore(deps): update dependency wrangler to v3.34.2

* chore(deps): update dependency chromedriver to v122.0.5

* chore(deps): update dependency chromedriver to v122.0.6

* 1.5.7

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: hlsjs-ci <40664919+hlsjs-ci@users.noreply.github.com>
Co-authored-by: Jakub Perżyło <qizot1405@gmail.com>
Co-authored-by: Rob Walch <robwalch@users.noreply.github.com>
Co-authored-by: Tom Jenkinson <tjenkinson@users.noreply.github.com>
Co-authored-by: Pat Nafarrete <pnaf@users.noreply.github.com>
Co-authored-by: yajin2021 <83813017+yajin2021@users.noreply.github.com>
Co-authored-by: Hongfei Huang <hongfei.huang@endeavorstreaming.com>
Co-authored-by: Hongfei Huang <83795629+hongfeih-es@users.noreply.github.com>
Co-authored-by: Wesley Luyten <me@wesleyluyten.com>
Co-authored-by: Billy Chiu <billychiu98@gmail.com>
Co-authored-by: Agajan J <agajan.tm@gmail.com>
Co-authored-by: Sta Zhu <zhusidayoyo@hotmail.com>
Co-authored-by: Mateusz Burzyński <mateuszburzynski@gmail.com>
Co-authored-by: yajin2021 <gene.jin@endeavorstreaming.com>
Co-authored-by: Troy <troybensonsa@gmail.com>
Co-authored-by: Chocobozzz <chocobozzz@cpy.re>
Co-authored-by: root <root@jvarydeb>
Co-authored-by: FredTsang <zengzhifeng@cvte.com>
Co-authored-by: Rob Walch <rwalch@apple.com>
Co-authored-by: Casey Occhialini <1508707+littlespex@users.noreply.github.com>
Co-authored-by: Asen-O-Nikolov <98342935+Asen-O-Nikolov@users.noreply.github.com>
Co-authored-by: Tom Jenkinson <tom@tjenkinson.me>
Co-authored-by: Vladmir Vyatkin <voldemarpro@hotmail.com>
Co-authored-by: Nikola Hristov <nklhtv@gmail.com>
Co-authored-by: Pavel Fomin <pfomin@rutube.ru>
Co-authored-by: Vladimir Polomanov <67444538+corndev27@users.noreply.github.com>
Co-authored-by: Felix Groove <felix.groove@lhind.dlh.de>
Co-authored-by: Rob Walch <rob@jwplayer.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
Development

Successfully merging a pull request may close this issue.

2 participants