Pad initial PTS of remuxed TS to avoid Chrome PTS overlap coded frame eviction

Fixes #6374
This commit is contained in:
Rob Walch
2026-04-15 19:26:46 -07:00
committed by Rob Walch
parent c0db262418
commit 20431ad730
+15 -3
View File
@@ -801,14 +801,26 @@ export default class MP4Remuxer extends Logger implements Remuxer {
mp4SampleDuration = lastFrameDuration;
}
}
const compositionTimeOffset = Math.round(
VideoSample.pts - VideoSample.dts,
);
let compositionTimeOffset = Math.round(VideoSample.pts - VideoSample.dts);
minDtsDelta = Math.min(minDtsDelta, mp4SampleDuration);
maxDtsDelta = Math.max(maxDtsDelta, mp4SampleDuration);
minPtsDelta = Math.min(minPtsDelta, ptsDelta);
maxPtsDelta = Math.max(maxPtsDelta, ptsDelta);
// Increase composition time by one frame tick to avoid pts overlap frame eviction in Chrome
// Fixes https://github.com/video-dev/hls.js/issues/6374 (https://issues.chromium.org/u/1/issues/336839131)
if (!contiguous && i === 0 && compositionTimeOffset > mp4SampleDuration) {
const tickPaddedCompositionTime =
Math.round(compositionTimeOffset / averageSampleDuration) *
averageSampleDuration;
if (tickPaddedCompositionTime - compositionTimeOffset === 1) {
this.log(
`pad first CTS ${compositionTimeOffset} -> ${tickPaddedCompositionTime} of sn: ${chunkMeta.sn}`,
);
compositionTimeOffset = tickPaddedCompositionTime;
}
}
outputSamples.push(
createMp4Sample(
VideoSample.key,