From af42912e76c6a78969b795fb83d9311409c432ed Mon Sep 17 00:00:00 2001 From: Asen-O-Nikolov <98342935+Asen-O-Nikolov@users.noreply.github.com> Date: Mon, 29 Jan 2024 20:08:50 +0200 Subject: [PATCH] fix(Remuxer): Safari segment overlap ensure PTS order (#6132) * fix(Remuxer): Safari segment overlap ensure PTS alignment --- src/remux/mp4-remuxer.ts | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/remux/mp4-remuxer.ts b/src/remux/mp4-remuxer.ts index 8e194f6a209..3dd815508de 100644 --- a/src/remux/mp4-remuxer.ts +++ b/src/remux/mp4-remuxer.ts @@ -544,12 +544,27 @@ export default class MP4Remuxer implements Remuxer { inputSamples[0].dts = firstDTS; inputSamples[0].pts = firstPTS; } else { + let isPTSOrderRetained = true; for (let i = 0; i < inputSamples.length; i++) { - if (inputSamples[i].dts > firstPTS) { + if (inputSamples[i].dts > firstPTS && isPTSOrderRetained) { break; } + + const prevPTS = inputSamples[i].pts; inputSamples[i].dts -= delta; inputSamples[i].pts -= delta; + + // check to see if this sample's PTS order has changed + // relative to the next one + if (i < inputSamples.length - 1) { + const nextSamplePTS = inputSamples[i + 1].pts; + const currentSamplePTS = inputSamples[i].pts; + + const currentOrder = nextSamplePTS <= currentSamplePTS; + const prevOrder = nextSamplePTS <= prevPTS; + + isPTSOrderRetained = currentOrder == prevOrder; + } } } logger.log(