MSE: B-frame tail PTS overshoot in coded-frame processing
93e7a14
MSE Coded Frame Processing is the spec algorithm that determines how incoming encoded frames interact with already-buffered content. Steps 1.14/1.15 handle overlap removal: when a new frame's presentation range overlaps existing buffered content, the overlapping content is erased. B-frames (bidirectional predictive frames) have PTS > DTS because they decode before they display; at the tail of an fMP4 segment, the last sample's trun.sample_duration is a decode-grid placeholder rather than a real presentation duration, so frameEndTime = pts + duration can slightly exceed the next buffered sample's PTS without representing a true editorial overlap. This commit adds a per-track "B-frame tail + within-timeFudgeFactor" heuristic that redirects to a forward-shift path, atomically mutating three coupled structures: the SampleMap's presentation-order submap, its decode-order submap, and TrackBuffer::m_decodeQueue. New helpers createCopyWithAdjustedStartTime, adjustSampleStartTime, and replaceSample implement the shift.
fMP4 tail B-frame: dts=50 pts=80 dur=30 => frameEnd=110
Next buffered content sync: pts=100
Before: erase [50,110) removes pts=100 sync => buffered gap, playback stalls
After: overshoot=10ms < fudge, B-frame tail => shift sync pts 100->110, no gap
Significance
The fix prevents live-stream stalls at ad splice points, but the new code atomically mutates three coupled sample-bookkeeping structures — each a potential source of subtle state and lifetime bugs.
Audit directions
a Aaaaaaaaaaaaaaaaaaaaaaaaaaaa Aaaaaaaaaaaa Aaaaaaaaaaaaa Aaa Aaaaaa Aaaaaaaa Aaaaaaaaaaaaaaaaa Aa Aaaa Aaaaaaa Aaaaaaa Aaaaaaaaaa Aaaa Aaa Aaaaaaaa Aaaaaaaa Aaa Aa Aaaaaaaa Aaaaaaa Aaaaaaaa Aa Aaa Aaaaaaaaaa a Aaaaaaaaaaaaa Aaaaaa Aaaaaaaa Aaa Aaaaaa Aa Aaaa Aaaaaa Aaa Aaaaaaaaaaaa a Aaaaa Aaaaa Aaaaaaaaaaaa Aa Aaaaa Aaaaaaa a Aaa Aaa Aaaaaaaaaa Aaaa Aaa Aa Aaaaa
a Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Aaaaaaaaaaaaaa Aaaaaaaaaaaaaa Aaaaaaaaaaa Aaa Aaaaaaaa Aaaaaa Aaaaaaaaaaaaaaaaaaaaa Aaaa Aaaaaaaaaaaa Aaaa Aaaaaaaaa Aaa Aaaaaaaa Aaaaa Aaaaaaa Aaa Aaaaaaaa Aaaaa Aa Aaaaaaaa Aa a Aaaaaaaaaa Aaaaaaaaa Aaaaaaa Aaa Aaaaaaa Aaaaaaa Aaa Aaa Aaaaaaaaaaa Aa a Aaaaa Aaa Aaa Aaaaaa Aaaaaaa a Aaaaaaaa Aaaaa Aaaa Aaaaaa Aaa Aaaaaaaaaaaaaaaaaa Aaaaaaaa Aaaaaa
a Aaaaaaaaaaa Aaaaaaaaaaaaaaaaaaaa Aaaaaaa Aaaaaaaa Aaaaaa Aaa Aaaaaa Aaaa Aaa Aaaaaaaa Aaaaaa Aaa Aaaaaaaaaaa Aaaaaaaa Aaaa Aaaaaaaaaaa Aaaaaaaaaaa Aaaaaaa Aaaaa Aaaa Aaa Aaaaa Aaaaaaa Aaaaaaaa Aaa Aaaaa Aaaa Aa Aaaa Aa a Aaaaaaaa Aaaaa Aaaaaa Aaa Aaaaaaaa Aaaaaaa Aaaaaa Aaa a Aaaaaa Aaa Aaaa Aaaaaaaa Aaaaaaa Aaa
a Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Aaa Aaaaaaaaaaaa Aaaaaaaaaaaaaaaaaa Aaa Aaaaaa Aa Aaaaaaa Aa Aaaa Aaaaaaaaaaa Aa Aaa Aaaaaaaaaaaa Aaaaaaaa Aaaaa Aaaa Aaaaaaa Aaaaaaaa Aa Aaaaaaaaa Aaaaaaaaa Aaaaa Aaa Aaaaaaa Aaaaaaaaaaaa Aaa Aaaaaa Aaa Aaaaaa Aaaaa Aaaaaaaaa Aaaaaaaaaaaa Aaaaaaaaaaa Aaaaaaaa a Aaaaaaaaa Aaaaa a a Aaaaaaaaaaa Aaaaa Aaaaaaa Aaa Aaaaaaaa Aaaaaaa Aaa Aaa Aaa Aaaaaaaa Aaaaaaaaaa Aaaaaaa Aaaaaaa Aaaa Aaaaaaaa Aa Aaa Aaaaaaa Aaaa Aaaaaa Aaaaaaaaaaaaa Aaaaaaaaaaaaaaaaaaaa Aaa Aaaaaaaaaaaaaaaaa Aaaaaaaaaa Aa Aaa Aaaa Aaaaaaaaaa Aaaaa Aaaaaa
🔒New timing-mutation paths across three coupled MSE bookkeeping structures — edge cases in the heuristic guard and map operations are worth careful investigation.
더 확인하려면 구독해 주세요