From df8dbb9caaa2391c14288782884546c5c7b4ac69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Velad=20Galv=C3=A1n?= Date: Mon, 22 Jan 2024 18:03:36 +0100 Subject: [PATCH] fix: Fix nalu parsing in TS (#6137) Fixes https://github.com/shaka-project/shaka-player/issues/6136 --- lib/util/ts_parser.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/lib/util/ts_parser.js b/lib/util/ts_parser.js index 331dcac4d2..ec38a8fd0b 100644 --- a/lib/util/ts_parser.js +++ b/lib/util/ts_parser.js @@ -446,10 +446,11 @@ shaka.util.TsParser = class { * * @param {shaka.extern.MPEG_PES} pes * @param {?shaka.extern.VideoNalu=} lastNalu + * @param {?number=} lastState * @return {!Array.} * @export */ - parseNalus(pes, lastNalu) { + parseNalus(pes, lastNalu, lastState) { const timescale = shaka.util.TsParser.Timescale; const time = pes.pts ? pes.pts / timescale : null; const data = pes.data; @@ -465,7 +466,7 @@ shaka.util.TsParser = class { // precede each NALU. A start code is 2 or 3 0x00 bytes followed with a // 0x01 byte. e.g. 0x000001 or 0x00000001. // More info in: https://stackoverflow.com/questions/24884827/possible-locations-for-sequence-picture-parameter-sets-for-h-264-stream/24890903#24890903 - let numZeros = 0; + let numZeros = lastState || 0; /** @type {!Array.} */ const nalus = []; @@ -490,7 +491,7 @@ shaka.util.TsParser = class { const startCodeSize = numZeros > 3 ? 3 : numZeros; const lastByteToKeep = i - startCodeSize; // Optimization - if (lastByteToKeep != 0) { + if (lastState && lastByteToKeep != 0) { const prevData = data.subarray(0, lastByteToKeep); lastNalu.data = shaka.util.Uint8ArrayUtils.concat( lastNalu.data, prevData); @@ -572,6 +573,7 @@ shaka.util.TsParser = class { lastNalu.fullData = shaka.util.Uint8ArrayUtils.concat( lastNalu.fullData, data); } + lastState = Math.min(3, numZeros); return nalus; } @@ -676,8 +678,9 @@ shaka.util.TsParser = class { } if (naluProcessing) { let lastNalu; + let lastState; for (const pes of this.videoPes_) { - pes.nalus = this.parseNalus(pes, lastNalu); + pes.nalus = this.parseNalus(pes, lastNalu, lastState); if (pes.nalus.length) { lastNalu = pes.nalus[pes.nalus.length - 1]; }