Skip to content

Playback deadlock when seeking across continuities #7262

@eowino

Description

@eowino

What version of Hls.js are you using?

1.6.2

What browser (including version) are you using?

Chrome 136.0.7103.114

What OS (including version) are you using?

MacOS and Windows

Test stream

https://hlsjs.video-dev.org/demo/?src=https%3A%2F%2Fsample-videos-zyrkp2nj.s3-eu-west-1.amazonaws.com%2Fbig-buck-bunny%2Fhls%2Fmaster-test-20250521.m3u8&demoConfig=eyJlbmFibGVTdHJlYW1pbmciOnRydWUsImF1dG9SZWNvdmVyRXJyb3IiOnRydWUsInN0b3BPblN0YWxsIjpmYWxzZSwiZHVtcGZNUDQiOmZhbHNlLCJsZXZlbENhcHBpbmciOi0xLCJsaW1pdE1ldHJpY3MiOi0xfQ==

Configuration

{
  "debug": true,
  "enableWorker": true,
  "lowLatencyMode": true,
  "backBufferLength": 90
}

Additional player setup steps

No response

Checklist

Steps to reproduce

  1. Play the stream
  2. Seek to 360: video.currentTime = 360

Expected behaviour

The player should seek to your target position and continue playback

What actually happened?

[log] > [audio-stream-controller]: FRAG_LOADING->WAITING_INIT_PTS

The player goes into a deadlock because it selects the video and audio from different continuities, and is unable to locate the initPTS of the audio.

This is consistently reproducible on streams where the audio and video manifests are slightly offset, and the seek happens across continuities that the player hasn't buffered, hence it isn't yet aware of the initPTS of the audio segment.

Playing the stream without seeking doesn't cause the issue.

Console output

video.currentTime = 360; // perform seek

[log] > [stream-controller]: media seeking to 360.000, state: IDLE
[log] > [audio-stream-controller]: media seeking to 360.000, state: IDLE
[log] > [subtitle-stream-controller]: media seeking to 360.000, state: IDLE
[info] > [abr] buffer is empty, optimal quality level 0
[log] > [stream-controller]: Loading fragment 61 cc: 2 of [1-100] level: 0, target: 360
[log] > [stream-controller]: IDLE->FRAG_LOADING
[log] > [audio-stream-controller]: Loading fragment 60 cc: 1 of [1-100] track: 0, target: 360
[log] > [audio-stream-controller]: IDLE->FRAG_LOADING
[log] > [audio-stream-controller]: Unknown video PTS for cc 1, waiting for video PTS before demuxing audio frag 60 of [1 ,100],track 0
[log] > [audio-stream-controller]: FRAG_LOADING->WAITING_INIT_PTS
[log] > [audio-stream-controller]: Loaded fragment 60 of level 0
[log] > [transmuxer-interface, main]: Starting new transmux session for sn: 61 p: -1 level: 0 id: 1
        discontinuity: true
        trackSwitch: false
        contiguous: false
        accurateTimeOffset: true
        timeOffset: 360
        initSegmentChange: false
[log] > [mp4-remuxer]: ISGenerated flag reset
[log] > [mp4-remuxer]: initPTS & initDTS reset
[log] > [mp4-remuxer]: reset next timestamp
[log] > [stream-controller]: FRAG_LOADING->PARSING
[log] > [stream-controller]: Init video buffer, container:video/mp4, codecs[level/parsed]=[avc1.640029/avc1.640029]
[log] > [audio-stream-controller]: InitPTS for cc: 2 found from main: 9000
[log] > [audio-stream-controller]: Waiting fragment cc (1) cancelled because video is at cc 2
[log] > [audio-stream-controller]: WAITING_INIT_PTS->IDLE
[log] > [stream-controller]: Loaded fragment 61 of level 0
[log] > [transmuxer.ts]: Flushed fragment 61 of level 0
[log] > [stream-controller]: PARSING->PARSED
[log] > [audio-stream-controller]: Loading fragment 60 cc: 1 of [1-100] track: 0, target: 360
[log] > [audio-stream-controller]: IDLE->FRAG_LOADING
[log] > [audio-stream-controller]: Unknown video PTS for cc 1, waiting for video PTS before demuxing audio frag 60 of [1 ,100],track 0
[log] > [audio-stream-controller]: FRAG_LOADING->WAITING_INIT_PTS
[log] > [audio-stream-controller]: Loaded fragment 60 of level 0
[log] > [stream-controller]: Buffered main sn: 61 of level 0 (frag:[360.000-366.000] > buffer:[0.000-120.000][360.000-366.000])
[log] > [stream-controller]: PARSED->IDLE
[log] > [stream-controller]: Loading fragment 62 cc: 2 of [1-100] level: 0, target: 366
[log] > [stream-controller]: IDLE->FRAG_LOADING
[log] > [stream-controller]: FRAG_LOADING->PARSING
[log] > [stream-controller]: Loaded fragment 62 of level 0
[log] > [transmuxer.ts]: Flushed fragment 62 of level 0
[log] > [stream-controller]: PARSING->PARSED
[log] > [stream-controller]: Buffered main sn: 62 of level 0 (frag:[366.000-372.000] > buffer:[0.000-120.000][360.000-372.000])
[log] > [stream-controller]: PARSED->IDLE
[log] > [stream-controller]: Loading fragment 63 cc: 2 of [1-100] level: 0, target: 372
[log] > [stream-controller]: IDLE->FRAG_LOADING
[log] > [stream-controller]: FRAG_LOADING->PARSING
[log] > [stream-controller]: Loaded fragment 63 of level 0
[log] > [transmuxer.ts]: Flushed fragment 63 of level 0
[log] > [stream-controller]: PARSING->PARSED
[log] > [stream-controller]: Buffered main sn: 63 of level 0 (frag:[372.000-378.000] > buffer:[0.000-120.000][360.000-378.000])
[log] > [stream-controller]: PARSED->IDLE
[log] > [stream-controller]: Loading fragment 64 cc: 2 of [1-100] level: 0, target: 378
[log] > [stream-controller]: IDLE->FRAG_LOADING
[log] > [stream-controller]: FRAG_LOADING->PARSING
[log] > [stream-controller]: Loaded fragment 64 of level 0
[log] > [transmuxer.ts]: Flushed fragment 64 of level 0
[log] > [stream-controller]: PARSING->PARSED
[log] > [stream-controller]: Buffered main sn: 64 of level 0 (frag:[378.000-384.000] > buffer:[0.000-120.000][360.000-384.000])
[log] > [stream-controller]: PARSED->IDLE
[log] > [stream-controller]: Loading fragment 65 cc: 2 of [1-100] level: 0, target: 384
[log] > [stream-controller]: IDLE->FRAG_LOADING
[log] > [stream-controller]: FRAG_LOADING->PARSING
[log] > [stream-controller]: Loaded fragment 65 of level 0
[log] > [transmuxer.ts]: Flushed fragment 65 of level 0
[log] > [stream-controller]: PARSING->PARSED
[log] > [stream-controller]: Buffered main sn: 65 of level 0 (frag:[384.000-390.000] > buffer:[0.000-120.000][360.000-390.000])
[log] > [stream-controller]: PARSED->IDLE
[log] > [stream-controller]: Loading fragment 66 cc: 2 of [1-100] level: 0, target: 390
[log] > [stream-controller]: IDLE->FRAG_LOADING
[log] > [stream-controller]: FRAG_LOADING->PARSING
[log] > [stream-controller]: Loaded fragment 66 of level 0
[log] > [transmuxer.ts]: Flushed fragment 66 of level 0
[log] > [stream-controller]: PARSING->PARSED
[log] > [stream-controller]: Buffered main sn: 66 of level 0 (frag:[390.000-396.000] > buffer:[0.000-120.000][360.000-396.000])
[log] > [stream-controller]: PARSED->IDLE
[log] > [stream-controller]: Loading fragment 67 cc: 2 of [1-100] level: 0, target: 396
[log] > [stream-controller]: IDLE->FRAG_LOADING
[log] > [stream-controller]: FRAG_LOADING->PARSING
[log] > [stream-controller]: Loaded fragment 67 of level 0
[log] > [transmuxer.ts]: Flushed fragment 67 of level 0
[log] > [stream-controller]: PARSING->PARSED
[log] > [stream-controller]: Buffered main sn: 67 of level 0 (frag:[396.000-402.000] > buffer:[0.000-120.000][360.000-402.000])
[log] > [stream-controller]: PARSED->IDLE
[log] > [stream-controller]: Loading fragment 68 cc: 2 of [1-100] level: 0, target: 402
[log] > [stream-controller]: IDLE->FRAG_LOADING
[log] > [stream-controller]: FRAG_LOADING->PARSING
[log] > [stream-controller]: Loaded fragment 68 of level 0
[log] > [transmuxer.ts]: Flushed fragment 68 of level 0
[log] > [stream-controller]: PARSING->PARSED
[log] > [stream-controller]: Buffered main sn: 68 of level 0 (frag:[402.000-408.000] > buffer:[0.000-120.000][360.000-408.000])
[log] > [stream-controller]: PARSED->IDLE
[log] > [stream-controller]: Loading fragment 69 cc: 2 of [1-100] level: 0, target: 408
[log] > [stream-controller]: IDLE->FRAG_LOADING
[log] > [stream-controller]: FRAG_LOADING->PARSING
[log] > [stream-controller]: Loaded fragment 69 of level 0
[log] > [transmuxer.ts]: Flushed fragment 69 of level 0
[log] > [stream-controller]: PARSING->PARSED
[log] > [stream-controller]: Buffered main sn: 69 of level 0 (frag:[408.000-414.000] > buffer:[0.000-120.000][360.000-414.000])
[log] > [stream-controller]: PARSED->IDLE
[log] > [stream-controller]: Loading fragment 70 cc: 2 of [1-100] level: 0, target: 414
[log] > [stream-controller]: IDLE->FRAG_LOADING
[log] > [stream-controller]: FRAG_LOADING->PARSING
[log] > [stream-controller]: Loaded fragment 70 of level 0
[log] > [transmuxer.ts]: Flushed fragment 70 of level 0
[log] > [stream-controller]: PARSING->PARSED
[log] > [stream-controller]: Buffered main sn: 70 of level 0 (frag:[414.000-420.000] > buffer:[0.000-120.000][360.000-420.000])
[log] > [stream-controller]: PARSED->IDLE
[log] > [stream-controller]: Loading fragment 71 cc: 2 of [1-100] level: 0, target: 420
[log] > [stream-controller]: IDLE->FRAG_LOADING
[log] > [stream-controller]: FRAG_LOADING->PARSING
[log] > [stream-controller]: Loaded fragment 71 of level 0
[log] > [transmuxer.ts]: Flushed fragment 71 of level 0
[log] > [stream-controller]: PARSING->PARSED
[log] > [stream-controller]: Buffered main sn: 71 of level 0 (frag:[420.000-426.000] > buffer:[0.000-120.000][360.000-426.000])
[log] > [stream-controller]: PARSED->IDLE
[log] > [stream-controller]: Loading fragment 72 cc: 2 of [1-100] level: 0, target: 426
[log] > [stream-controller]: IDLE->FRAG_LOADING
[log] > [stream-controller]: FRAG_LOADING->PARSING
[log] > [stream-controller]: Loaded fragment 72 of level 0
[log] > [transmuxer.ts]: Flushed fragment 72 of level 0
[log] > [stream-controller]: PARSING->PARSED
[log] > [stream-controller]: Buffered main sn: 72 of level 0 (frag:[426.000-432.000] > buffer:[0.000-120.000][360.000-432.000])
[log] > [stream-controller]: PARSED->IDLE
[log] > [stream-controller]: Loading fragment 73 cc: 2 of [1-100] level: 0, target: 432
[log] > [stream-controller]: IDLE->FRAG_LOADING
[log] > [stream-controller]: FRAG_LOADING->PARSING
[log] > [stream-controller]: Loaded fragment 73 of level 0
[log] > [transmuxer.ts]: Flushed fragment 73 of level 0
[log] > [stream-controller]: PARSING->PARSED
[log] > [stream-controller]: Buffered main sn: 73 of level 0 (frag:[432.000-438.000] > buffer:[0.000-120.000][360.000-438.000])
[log] > [stream-controller]: PARSED->IDLE
[log] > [stream-controller]: Loading fragment 74 cc: 2 of [1-100] level: 0, target: 438
[log] > [stream-controller]: IDLE->FRAG_LOADING
[log] > [stream-controller]: FRAG_LOADING->PARSING
[log] > [stream-controller]: Loaded fragment 74 of level 0
[log] > [transmuxer.ts]: Flushed fragment 74 of level 0
[log] > [stream-controller]: PARSING->PARSED
[log] > [stream-controller]: Buffered main sn: 74 of level 0 (frag:[438.000-444.000] > buffer:[0.000-120.000][360.000-444.000])
[log] > [stream-controller]: PARSED->IDLE
[log] > [stream-controller]: Loading fragment 75 cc: 2 of [1-100] level: 0, target: 444
[log] > [stream-controller]: IDLE->FRAG_LOADING
[log] > [stream-controller]: FRAG_LOADING->PARSING

Chrome media internals output

N/A

Metadata

Metadata

Assignees

No one assigned

    Labels

    BugConfirmedBug report confirmed or reproduced.

    Type

    No type

    Projects

    Status

    Done

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions