mirror of
https://github.com/video-dev/hls.js.git
synced 2026-05-17 13:30:38 +00:00
Pad initial PTS of remuxed TS to avoid Chrome PTS overlap coded frame eviction
Fixes #6374
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user