Skip to content

Commit d3081f6

Browse files
wjywbsavelad
authored andcommitted
perf: ts parser O(n^2) performance bug. (#6035)
This caused high cpu usage when the ts file segments are large.
1 parent 1528eef commit d3081f6

File tree

1 file changed

+15
-16
lines changed

1 file changed

+15
-16
lines changed

lib/util/ts_parser.js

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ shaka.util.TsParser = class {
3232
/** @private {?string} */
3333
this.videoCodec_ = null;
3434

35-
/** @private {!Array.<Uint8Array>} */
35+
/** @private {!Array.<!Array.<Uint8Array>>} */
3636
this.videoData_ = [];
3737

3838
/** @private {!Array.<shaka.extern.MPEG_PES>} */
@@ -44,7 +44,7 @@ shaka.util.TsParser = class {
4444
/** @private {?string} */
4545
this.audioCodec_ = null;
4646

47-
/** @private {!Array.<Uint8Array>} */
47+
/** @private {!Array.<!Array.<Uint8Array>>} */
4848
this.audioData_ = [];
4949

5050
/** @private {!Array.<shaka.extern.MPEG_PES>} */
@@ -53,7 +53,7 @@ shaka.util.TsParser = class {
5353
/** @private {?number} */
5454
this.id3Pid_ = null;
5555

56-
/** @private {!Array.<Uint8Array>} */
56+
/** @private {!Array.<!Array.<Uint8Array>>} */
5757
this.id3Data_ = [];
5858
}
5959

@@ -79,7 +79,6 @@ shaka.util.TsParser = class {
7979
*/
8080
parse(data) {
8181
const packetLength = shaka.util.TsParser.PacketLength_;
82-
const Uint8ArrayUtils = shaka.util.Uint8ArrayUtils;
8382

8483
// A TS fragment should contain at least 3 TS packets, a PAT, a PMT, and
8584
// one PID.
@@ -162,38 +161,35 @@ shaka.util.TsParser = class {
162161
case this.videoPid_: {
163162
const videoData = data.subarray(offset, start + packetLength);
164163
if (payloadUnitStartIndicator) {
165-
this.videoData_.push(videoData);
164+
this.videoData_.push([videoData]);
166165
} else if (this.videoData_.length) {
167166
const prevVideoData = this.videoData_[this.videoData_.length - 1];
168167
if (prevVideoData) {
169-
this.videoData_[this.videoData_.length - 1] =
170-
Uint8ArrayUtils.concat(prevVideoData, videoData);
168+
this.videoData_[this.videoData_.length - 1].push(videoData);
171169
}
172170
}
173171
break;
174172
}
175173
case this.audioPid_: {
176174
const audioData = data.subarray(offset, start + packetLength);
177175
if (payloadUnitStartIndicator) {
178-
this.audioData_.push(audioData);
176+
this.audioData_.push([audioData]);
179177
} else if (this.audioData_.length) {
180178
const prevAudioData = this.audioData_[this.audioData_.length - 1];
181179
if (prevAudioData) {
182-
this.audioData_[this.audioData_.length - 1] =
183-
Uint8ArrayUtils.concat(prevAudioData, audioData);
180+
this.audioData_[this.audioData_.length - 1].push(audioData);
184181
}
185182
}
186183
break;
187184
}
188185
case this.id3Pid_: {
189186
const id3Data = data.subarray(offset, start + packetLength);
190187
if (payloadUnitStartIndicator) {
191-
this.id3Data_.push(id3Data);
188+
this.id3Data_.push([id3Data]);
192189
} else if (this.id3Data_.length) {
193190
const prevId3Data = this.id3Data_[this.id3Data_.length - 1];
194191
if (prevId3Data) {
195-
this.id3Data_[this.id3Data_.length - 1] =
196-
Uint8ArrayUtils.concat(prevId3Data, id3Data);
192+
this.id3Data_[this.id3Data_.length - 1].push(id3Data);
197193
}
198194
}
199195
break;
@@ -588,7 +584,8 @@ shaka.util.TsParser = class {
588584
getMetadata() {
589585
const timescale = shaka.util.TsParser.Timescale;
590586
const metadata = [];
591-
for (const id3Data of this.id3Data_) {
587+
for (const id3DataArray of this.id3Data_) {
588+
const id3Data = shaka.util.Uint8ArrayUtils.concat(...id3DataArray);
592589
const pes = this.parsePES_(id3Data);
593590
if (pes) {
594591
metadata.push({
@@ -612,7 +609,8 @@ shaka.util.TsParser = class {
612609
getAudioData() {
613610
if (this.audioData_.length && !this.audioPes_.length) {
614611
let sort = false;
615-
for (const audioData of this.audioData_) {
612+
for (const audioDataArray of this.audioData_) {
613+
const audioData = shaka.util.Uint8ArrayUtils.concat(...audioDataArray);
616614
const pes = this.parsePES_(audioData);
617615
let previousPes = this.audioPes_.length ?
618616
this.audioPes_[this.audioPes_.length - 1] : null;
@@ -654,7 +652,8 @@ shaka.util.TsParser = class {
654652
getVideoData(naluProcessing = true) {
655653
if (this.videoData_.length && !this.videoPes_.length) {
656654
let sort = false;
657-
for (const videoData of this.videoData_) {
655+
for (const videoDataArray of this.videoData_) {
656+
const videoData = shaka.util.Uint8ArrayUtils.concat(...videoDataArray);
658657
const pes = this.parsePES_(videoData);
659658
let previousPes = this.videoPes_.length ?
660659
this.videoPes_[this.videoPes_.length - 1] : null;

0 commit comments

Comments
 (0)