hls.js 1.5.14-0.canary.10431 → 1.5.14-0.canary.10432
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/hls.js +316 -232
- package/dist/hls.js.d.ts +4 -2
- package/dist/hls.js.map +1 -1
- package/dist/hls.light.js +316 -235
- package/dist/hls.light.js.map +1 -1
- package/dist/hls.light.min.js +1 -1
- package/dist/hls.light.min.js.map +1 -1
- package/dist/hls.light.mjs +244 -168
- package/dist/hls.light.mjs.map +1 -1
- package/dist/hls.min.js +1 -1
- package/dist/hls.min.js.map +1 -1
- package/dist/hls.mjs +244 -165
- package/dist/hls.mjs.map +1 -1
- package/dist/hls.worker.js +1 -1
- package/dist/hls.worker.js.map +1 -1
- package/package.json +1 -1
- package/src/controller/base-stream-controller.ts +5 -4
- package/src/demux/audio/aacdemuxer.ts +3 -3
- package/src/demux/audio/ac3-demuxer.ts +1 -1
- package/src/demux/inject-worker.ts +38 -4
- package/src/demux/transmuxer-interface.ts +98 -67
- package/src/demux/transmuxer-worker.ts +110 -76
- package/src/demux/transmuxer.ts +29 -16
- package/src/demux/tsdemuxer.ts +47 -24
- package/src/hls.ts +2 -1
- package/src/remux/mp4-remuxer.ts +24 -23
- package/src/remux/passthrough-remuxer.ts +22 -7
- package/src/version.ts +1 -0
package/dist/hls.js
CHANGED
@@ -522,7 +522,7 @@
|
|
522
522
|
// Some browsers don't allow to use bind on console object anyway
|
523
523
|
// fallback to default if needed
|
524
524
|
try {
|
525
|
-
newLogger.log("Debug logs enabled for \"" + context + "\" in hls.js version " + "1.5.14-0.canary.
|
525
|
+
newLogger.log("Debug logs enabled for \"" + context + "\" in hls.js version " + "1.5.14-0.canary.10432");
|
526
526
|
} catch (e) {
|
527
527
|
/* log fn threw an exception. All logger methods are no-ops. */
|
528
528
|
return createLogger();
|
@@ -10188,6 +10188,10 @@
|
|
10188
10188
|
};
|
10189
10189
|
_proto.onHandlerDestroying = function onHandlerDestroying() {
|
10190
10190
|
this.stopLoad();
|
10191
|
+
if (this.transmuxer) {
|
10192
|
+
this.transmuxer.destroy();
|
10193
|
+
this.transmuxer = null;
|
10194
|
+
}
|
10191
10195
|
_TaskLoop.prototype.onHandlerDestroying.call(this);
|
10192
10196
|
// @ts-ignore
|
10193
10197
|
this.hls = this.onMediaSeeking = this.onMediaEnded = null;
|
@@ -11303,10 +11307,8 @@
|
|
11303
11307
|
return this.playlistLabel() + " " + frag.level + " (frag:[" + ((_ref3 = pts ? frag.startPTS : frag.start) != null ? _ref3 : NaN).toFixed(3) + "-" + ((_ref4 = pts ? frag.endPTS : frag.end) != null ? _ref4 : NaN).toFixed(3) + "]";
|
11304
11308
|
};
|
11305
11309
|
_proto.resetTransmuxer = function resetTransmuxer() {
|
11306
|
-
|
11307
|
-
|
11308
|
-
this.transmuxer = null;
|
11309
|
-
}
|
11310
|
+
var _this$transmuxer2;
|
11311
|
+
(_this$transmuxer2 = this.transmuxer) == null ? void 0 : _this$transmuxer2.reset();
|
11310
11312
|
};
|
11311
11313
|
_proto.recoverWorkerError = function recoverWorkerError(data) {
|
11312
11314
|
if (data.event === 'demuxerWorker') {
|
@@ -12054,7 +12056,7 @@
|
|
12054
12056
|
|
12055
12057
|
// Source for probe info - https://wiki.multimedia.cx/index.php?title=ADTS
|
12056
12058
|
;
|
12057
|
-
AACDemuxer.probe = function probe$2(data) {
|
12059
|
+
AACDemuxer.probe = function probe$2(data, logger) {
|
12058
12060
|
if (!data) {
|
12059
12061
|
return false;
|
12060
12062
|
}
|
@@ -13723,7 +13725,8 @@
|
|
13723
13725
|
|
13724
13726
|
var PACKET_LENGTH = 188;
|
13725
13727
|
var TSDemuxer = /*#__PURE__*/function () {
|
13726
|
-
function TSDemuxer(observer, config, typeSupported) {
|
13728
|
+
function TSDemuxer(observer, config, typeSupported, logger) {
|
13729
|
+
this.logger = void 0;
|
13727
13730
|
this.observer = void 0;
|
13728
13731
|
this.config = void 0;
|
13729
13732
|
this.typeSupported = void 0;
|
@@ -13743,9 +13746,10 @@
|
|
13743
13746
|
this.observer = observer;
|
13744
13747
|
this.config = config;
|
13745
13748
|
this.typeSupported = typeSupported;
|
13749
|
+
this.logger = logger;
|
13746
13750
|
this.videoParser = null;
|
13747
13751
|
}
|
13748
|
-
TSDemuxer.probe = function probe(data) {
|
13752
|
+
TSDemuxer.probe = function probe(data, logger) {
|
13749
13753
|
var syncOffset = TSDemuxer.syncOffset(data);
|
13750
13754
|
if (syncOffset > 0) {
|
13751
13755
|
logger.warn("MPEG2-TS detected but first sync word found @ offset " + syncOffset);
|
@@ -13912,7 +13916,7 @@
|
|
13912
13916
|
switch (pid) {
|
13913
13917
|
case videoPid:
|
13914
13918
|
if (stt) {
|
13915
|
-
if (videoData && (pes = parsePES(videoData))) {
|
13919
|
+
if (videoData && (pes = parsePES(videoData, this.logger))) {
|
13916
13920
|
if (this.videoParser === null) {
|
13917
13921
|
switch (videoTrack.segmentCodec) {
|
13918
13922
|
case 'avc':
|
@@ -13941,7 +13945,7 @@
|
|
13941
13945
|
break;
|
13942
13946
|
case audioPid:
|
13943
13947
|
if (stt) {
|
13944
|
-
if (audioData && (pes = parsePES(audioData))) {
|
13948
|
+
if (audioData && (pes = parsePES(audioData, this.logger))) {
|
13945
13949
|
switch (audioTrack.segmentCodec) {
|
13946
13950
|
case 'aac':
|
13947
13951
|
this.parseAACPES(audioTrack, pes);
|
@@ -13968,7 +13972,7 @@
|
|
13968
13972
|
break;
|
13969
13973
|
case id3Pid:
|
13970
13974
|
if (stt) {
|
13971
|
-
if (id3Data && (pes = parsePES(id3Data))) {
|
13975
|
+
if (id3Data && (pes = parsePES(id3Data, this.logger))) {
|
13972
13976
|
this.parseID3PES(id3Track, pes);
|
13973
13977
|
}
|
13974
13978
|
id3Data = {
|
@@ -13986,14 +13990,14 @@
|
|
13986
13990
|
offset += data[offset] + 1;
|
13987
13991
|
}
|
13988
13992
|
pmtId = this._pmtId = parsePAT(data, offset);
|
13989
|
-
// logger.log('PMT PID:' + this._pmtId);
|
13993
|
+
// this.logger.log('PMT PID:' + this._pmtId);
|
13990
13994
|
break;
|
13991
13995
|
case pmtId:
|
13992
13996
|
{
|
13993
13997
|
if (stt) {
|
13994
13998
|
offset += data[offset] + 1;
|
13995
13999
|
}
|
13996
|
-
var parsedPIDs = parsePMT(data, offset, this.typeSupported, isSampleAes, this.observer);
|
14000
|
+
var parsedPIDs = parsePMT(data, offset, this.typeSupported, isSampleAes, this.observer, this.logger);
|
13997
14001
|
|
13998
14002
|
// only update track id if track PID found while parsing PMT
|
13999
14003
|
// this is to avoid resetting the PID to -1 in case
|
@@ -14016,7 +14020,7 @@
|
|
14016
14020
|
id3Track.pid = id3Pid;
|
14017
14021
|
}
|
14018
14022
|
if (unknownPID !== null && !pmtParsed) {
|
14019
|
-
logger.warn("MPEG-TS PMT found at " + start + " after unknown PID '" + unknownPID + "'. Backtracking to sync byte @" + syncOffset + " to parse all TS packets.");
|
14023
|
+
this.logger.warn("MPEG-TS PMT found at " + start + " after unknown PID '" + unknownPID + "'. Backtracking to sync byte @" + syncOffset + " to parse all TS packets.");
|
14020
14024
|
unknownPID = null;
|
14021
14025
|
// we set it to -188, the += 188 in the for loop will reset start to 0
|
14022
14026
|
start = syncOffset - 188;
|
@@ -14036,7 +14040,7 @@
|
|
14036
14040
|
}
|
14037
14041
|
}
|
14038
14042
|
if (tsPacketErrors > 0) {
|
14039
|
-
emitParsingError(this.observer, new Error("Found " + tsPacketErrors + " TS packet/s that do not start with 0x47"));
|
14043
|
+
emitParsingError(this.observer, new Error("Found " + tsPacketErrors + " TS packet/s that do not start with 0x47"), undefined, this.logger);
|
14040
14044
|
}
|
14041
14045
|
videoTrack.pesData = videoData;
|
14042
14046
|
audioTrack.pesData = audioData;
|
@@ -14082,7 +14086,7 @@
|
|
14082
14086
|
var id3Data = id3Track.pesData;
|
14083
14087
|
// try to parse last PES packets
|
14084
14088
|
var pes;
|
14085
|
-
if (videoData && (pes = parsePES(videoData))) {
|
14089
|
+
if (videoData && (pes = parsePES(videoData, this.logger))) {
|
14086
14090
|
if (this.videoParser === null) {
|
14087
14091
|
switch (videoTrack.segmentCodec) {
|
14088
14092
|
case 'avc':
|
@@ -14103,7 +14107,7 @@
|
|
14103
14107
|
// either avcData null or PES truncated, keep it for next frag parsing
|
14104
14108
|
videoTrack.pesData = videoData;
|
14105
14109
|
}
|
14106
|
-
if (audioData && (pes = parsePES(audioData))) {
|
14110
|
+
if (audioData && (pes = parsePES(audioData, this.logger))) {
|
14107
14111
|
switch (audioTrack.segmentCodec) {
|
14108
14112
|
case 'aac':
|
14109
14113
|
this.parseAACPES(audioTrack, pes);
|
@@ -14120,13 +14124,13 @@
|
|
14120
14124
|
audioTrack.pesData = null;
|
14121
14125
|
} else {
|
14122
14126
|
if (audioData != null && audioData.size) {
|
14123
|
-
logger.log('last AAC PES packet truncated,might overlap between fragments');
|
14127
|
+
this.logger.log('last AAC PES packet truncated,might overlap between fragments');
|
14124
14128
|
}
|
14125
14129
|
|
14126
14130
|
// either audioData null or PES truncated, keep it for next frag parsing
|
14127
14131
|
audioTrack.pesData = audioData;
|
14128
14132
|
}
|
14129
|
-
if (id3Data && (pes = parsePES(id3Data))) {
|
14133
|
+
if (id3Data && (pes = parsePES(id3Data, this.logger))) {
|
14130
14134
|
this.parseID3PES(id3Track, pes);
|
14131
14135
|
id3Track.pesData = null;
|
14132
14136
|
} else {
|
@@ -14198,7 +14202,7 @@
|
|
14198
14202
|
} else {
|
14199
14203
|
reason = 'No ADTS header found in AAC PES';
|
14200
14204
|
}
|
14201
|
-
emitParsingError(this.observer, new Error(reason), recoverable);
|
14205
|
+
emitParsingError(this.observer, new Error(reason), recoverable, this.logger);
|
14202
14206
|
if (!recoverable) {
|
14203
14207
|
return;
|
14204
14208
|
}
|
@@ -14213,7 +14217,7 @@
|
|
14213
14217
|
var frameDuration = getFrameDuration(track.samplerate);
|
14214
14218
|
pts = aacOverFlow.sample.pts + frameDuration;
|
14215
14219
|
} else {
|
14216
|
-
logger.warn('[tsdemuxer]: AAC PES unknown PTS');
|
14220
|
+
this.logger.warn('[tsdemuxer]: AAC PES unknown PTS');
|
14217
14221
|
return;
|
14218
14222
|
}
|
14219
14223
|
|
@@ -14243,7 +14247,7 @@
|
|
14243
14247
|
var offset = 0;
|
14244
14248
|
var pts = pes.pts;
|
14245
14249
|
if (pts === undefined) {
|
14246
|
-
logger.warn('[tsdemuxer]: MPEG PES unknown PTS');
|
14250
|
+
this.logger.warn('[tsdemuxer]: MPEG PES unknown PTS');
|
14247
14251
|
return;
|
14248
14252
|
}
|
14249
14253
|
while (offset < length) {
|
@@ -14267,7 +14271,7 @@
|
|
14267
14271
|
var data = pes.data;
|
14268
14272
|
var pts = pes.pts;
|
14269
14273
|
if (pts === undefined) {
|
14270
|
-
logger.warn('[tsdemuxer]: AC3 PES unknown PTS');
|
14274
|
+
this.logger.warn('[tsdemuxer]: AC3 PES unknown PTS');
|
14271
14275
|
return;
|
14272
14276
|
}
|
14273
14277
|
var length = data.length;
|
@@ -14281,7 +14285,7 @@
|
|
14281
14285
|
};
|
14282
14286
|
_proto.parseID3PES = function parseID3PES(id3Track, pes) {
|
14283
14287
|
if (pes.pts === undefined) {
|
14284
|
-
logger.warn('[tsdemuxer]: ID3 PES unknown PTS');
|
14288
|
+
this.logger.warn('[tsdemuxer]: ID3 PES unknown PTS');
|
14285
14289
|
return;
|
14286
14290
|
}
|
14287
14291
|
var id3Sample = _extends({}, pes, {
|
@@ -14300,7 +14304,7 @@
|
|
14300
14304
|
// skip the PSI header and parse the first PMT entry
|
14301
14305
|
return (data[offset + 10] & 0x1f) << 8 | data[offset + 11];
|
14302
14306
|
}
|
14303
|
-
function parsePMT(data, offset, typeSupported, isSampleAes, observer) {
|
14307
|
+
function parsePMT(data, offset, typeSupported, isSampleAes, observer, logger) {
|
14304
14308
|
var result = {
|
14305
14309
|
audioPid: -1,
|
14306
14310
|
videoPid: -1,
|
@@ -14322,7 +14326,7 @@
|
|
14322
14326
|
case 0xcf:
|
14323
14327
|
// SAMPLE-AES AAC
|
14324
14328
|
if (!isSampleAes) {
|
14325
|
-
logEncryptedSamplesFoundInUnencryptedStream('ADTS AAC');
|
14329
|
+
logEncryptedSamplesFoundInUnencryptedStream('ADTS AAC', this.logger);
|
14326
14330
|
break;
|
14327
14331
|
}
|
14328
14332
|
/* falls through */
|
@@ -14344,7 +14348,7 @@
|
|
14344
14348
|
case 0xdb:
|
14345
14349
|
// SAMPLE-AES AVC
|
14346
14350
|
if (!isSampleAes) {
|
14347
|
-
logEncryptedSamplesFoundInUnencryptedStream('H.264');
|
14351
|
+
logEncryptedSamplesFoundInUnencryptedStream('H.264', this.logger);
|
14348
14352
|
break;
|
14349
14353
|
}
|
14350
14354
|
/* falls through */
|
@@ -14372,7 +14376,7 @@
|
|
14372
14376
|
case 0xc1:
|
14373
14377
|
// SAMPLE-AES AC3
|
14374
14378
|
if (!isSampleAes) {
|
14375
|
-
logEncryptedSamplesFoundInUnencryptedStream('AC-3');
|
14379
|
+
logEncryptedSamplesFoundInUnencryptedStream('AC-3', this.logger);
|
14376
14380
|
break;
|
14377
14381
|
}
|
14378
14382
|
/* falls through */
|
@@ -14418,7 +14422,7 @@
|
|
14418
14422
|
case 0xc2: // SAMPLE-AES EC3
|
14419
14423
|
/* falls through */
|
14420
14424
|
case 0x87:
|
14421
|
-
emitParsingError(observer, new Error('Unsupported EC-3 in M2TS found'));
|
14425
|
+
emitParsingError(observer, new Error('Unsupported EC-3 in M2TS found'), undefined, this.logger);
|
14422
14426
|
return result;
|
14423
14427
|
case 0x24:
|
14424
14428
|
// ITU-T Rec. H.265 and ISO/IEC 23008-2 (HEVC)
|
@@ -14437,7 +14441,7 @@
|
|
14437
14441
|
}
|
14438
14442
|
return result;
|
14439
14443
|
}
|
14440
|
-
function emitParsingError(observer, error, levelRetry) {
|
14444
|
+
function emitParsingError(observer, error, levelRetry, logger) {
|
14441
14445
|
logger.warn("parsing error: " + error.message);
|
14442
14446
|
observer.emit(Events.ERROR, Events.ERROR, {
|
14443
14447
|
type: ErrorTypes.MEDIA_ERROR,
|
@@ -14448,10 +14452,10 @@
|
|
14448
14452
|
reason: error.message
|
14449
14453
|
});
|
14450
14454
|
}
|
14451
|
-
function logEncryptedSamplesFoundInUnencryptedStream(type) {
|
14455
|
+
function logEncryptedSamplesFoundInUnencryptedStream(type, logger) {
|
14452
14456
|
logger.log(type + " with AES-128-CBC encryption found in unencrypted stream");
|
14453
14457
|
}
|
14454
|
-
function parsePES(stream) {
|
14458
|
+
function parsePES(stream, logger) {
|
14455
14459
|
var i = 0;
|
14456
14460
|
var frag;
|
14457
14461
|
var pesLen;
|
@@ -15366,7 +15370,8 @@
|
|
15366
15370
|
var chromeVersion = null;
|
15367
15371
|
var safariWebkitVersion = null;
|
15368
15372
|
var MP4Remuxer = /*#__PURE__*/function () {
|
15369
|
-
function MP4Remuxer(observer, config, typeSupported,
|
15373
|
+
function MP4Remuxer(observer, config, typeSupported, logger) {
|
15374
|
+
this.logger = void 0;
|
15370
15375
|
this.observer = void 0;
|
15371
15376
|
this.config = void 0;
|
15372
15377
|
this.typeSupported = void 0;
|
@@ -15382,6 +15387,7 @@
|
|
15382
15387
|
this.observer = observer;
|
15383
15388
|
this.config = config;
|
15384
15389
|
this.typeSupported = typeSupported;
|
15390
|
+
this.logger = logger;
|
15385
15391
|
this.ISGenerated = false;
|
15386
15392
|
if (chromeVersion === null) {
|
15387
15393
|
var userAgent = navigator.userAgent || '';
|
@@ -15399,16 +15405,16 @@
|
|
15399
15405
|
this.config = this.videoTrackConfig = this._initPTS = this._initDTS = null;
|
15400
15406
|
};
|
15401
15407
|
_proto.resetTimeStamp = function resetTimeStamp(defaultTimeStamp) {
|
15402
|
-
logger.log('[mp4-remuxer]: initPTS & initDTS reset');
|
15408
|
+
this.logger.log('[mp4-remuxer]: initPTS & initDTS reset');
|
15403
15409
|
this._initPTS = this._initDTS = defaultTimeStamp;
|
15404
15410
|
};
|
15405
15411
|
_proto.resetNextTimestamp = function resetNextTimestamp() {
|
15406
|
-
logger.log('[mp4-remuxer]: reset next timestamp');
|
15412
|
+
this.logger.log('[mp4-remuxer]: reset next timestamp');
|
15407
15413
|
this.isVideoContiguous = false;
|
15408
15414
|
this.isAudioContiguous = false;
|
15409
15415
|
};
|
15410
15416
|
_proto.resetInitSegment = function resetInitSegment() {
|
15411
|
-
logger.log('[mp4-remuxer]: ISGenerated flag reset');
|
15417
|
+
this.logger.log('[mp4-remuxer]: ISGenerated flag reset');
|
15412
15418
|
this.ISGenerated = false;
|
15413
15419
|
this.videoTrackConfig = undefined;
|
15414
15420
|
};
|
@@ -15427,7 +15433,7 @@
|
|
15427
15433
|
}
|
15428
15434
|
}, videoSamples[0].pts);
|
15429
15435
|
if (rolloverDetected) {
|
15430
|
-
logger.debug('PTS rollover detected');
|
15436
|
+
this.logger.debug('PTS rollover detected');
|
15431
15437
|
}
|
15432
15438
|
return startPTS;
|
15433
15439
|
};
|
@@ -15471,14 +15477,14 @@
|
|
15471
15477
|
if (!isVideoContiguous && this.config.forceKeyFrameOnDiscontinuity) {
|
15472
15478
|
independent = true;
|
15473
15479
|
if (firstKeyFrameIndex > 0) {
|
15474
|
-
logger.warn("[mp4-remuxer]: Dropped " + firstKeyFrameIndex + " out of " + length + " video samples due to a missing keyframe");
|
15480
|
+
this.logger.warn("[mp4-remuxer]: Dropped " + firstKeyFrameIndex + " out of " + length + " video samples due to a missing keyframe");
|
15475
15481
|
var startPTS = this.getVideoStartPts(videoTrack.samples);
|
15476
15482
|
videoTrack.samples = videoTrack.samples.slice(firstKeyFrameIndex);
|
15477
15483
|
videoTrack.dropped += firstKeyFrameIndex;
|
15478
15484
|
videoTimeOffset += (videoTrack.samples[0].pts - startPTS) / videoTrack.inputTimeScale;
|
15479
15485
|
firstKeyFramePTS = videoTimeOffset;
|
15480
15486
|
} else if (firstKeyFrameIndex === -1) {
|
15481
|
-
logger.warn("[mp4-remuxer]: No keyframe found out of " + length + " video samples");
|
15487
|
+
this.logger.warn("[mp4-remuxer]: No keyframe found out of " + length + " video samples");
|
15482
15488
|
independent = false;
|
15483
15489
|
}
|
15484
15490
|
}
|
@@ -15500,7 +15506,7 @@
|
|
15500
15506
|
if (enoughAudioSamples) {
|
15501
15507
|
// if initSegment was generated without audio samples, regenerate it again
|
15502
15508
|
if (!audioTrack.samplerate) {
|
15503
|
-
logger.warn('[mp4-remuxer]: regenerate InitSegment as audio detected');
|
15509
|
+
this.logger.warn('[mp4-remuxer]: regenerate InitSegment as audio detected');
|
15504
15510
|
initSegment = this.generateIS(audioTrack, videoTrack, timeOffset, accurateTimeOffset);
|
15505
15511
|
}
|
15506
15512
|
audio = this.remuxAudio(audioTrack, audioTimeOffset, this.isAudioContiguous, accurateTimeOffset, hasVideo || enoughVideoSamples || playlistType === PlaylistLevelType.AUDIO ? videoTimeOffset : undefined);
|
@@ -15508,7 +15514,7 @@
|
|
15508
15514
|
var audioTrackLength = audio ? audio.endPTS - audio.startPTS : 0;
|
15509
15515
|
// if initSegment was generated without video samples, regenerate it again
|
15510
15516
|
if (!videoTrack.inputTimeScale) {
|
15511
|
-
logger.warn('[mp4-remuxer]: regenerate InitSegment as video detected');
|
15517
|
+
this.logger.warn('[mp4-remuxer]: regenerate InitSegment as video detected');
|
15512
15518
|
initSegment = this.generateIS(audioTrack, videoTrack, timeOffset, accurateTimeOffset);
|
15513
15519
|
}
|
15514
15520
|
video = this.remuxVideo(videoTrack, videoTimeOffset, isVideoContiguous, audioTrackLength);
|
@@ -15714,9 +15720,9 @@
|
|
15714
15720
|
var foundOverlap = delta < -1;
|
15715
15721
|
if (foundHole || foundOverlap) {
|
15716
15722
|
if (foundHole) {
|
15717
|
-
logger.warn((track.segmentCodec || '').toUpperCase() + ": " + toMsFromMpegTsClock(delta, true) + " ms (" + delta + "dts) hole between fragments detected at " + timeOffset.toFixed(3));
|
15723
|
+
this.logger.warn((track.segmentCodec || '').toUpperCase() + ": " + toMsFromMpegTsClock(delta, true) + " ms (" + delta + "dts) hole between fragments detected at " + timeOffset.toFixed(3));
|
15718
15724
|
} else {
|
15719
|
-
logger.warn((track.segmentCodec || '').toUpperCase() + ": " + toMsFromMpegTsClock(-delta, true) + " ms (" + delta + "dts) overlapping between fragments detected at " + timeOffset.toFixed(3));
|
15725
|
+
this.logger.warn((track.segmentCodec || '').toUpperCase() + ": " + toMsFromMpegTsClock(-delta, true) + " ms (" + delta + "dts) overlapping between fragments detected at " + timeOffset.toFixed(3));
|
15720
15726
|
}
|
15721
15727
|
if (!foundOverlap || nextAvcDts >= inputSamples[0].pts || chromeVersion) {
|
15722
15728
|
firstDTS = nextAvcDts;
|
@@ -15745,7 +15751,7 @@
|
|
15745
15751
|
}
|
15746
15752
|
}
|
15747
15753
|
}
|
15748
|
-
logger.log("Video: Initial PTS/DTS adjusted: " + toMsFromMpegTsClock(firstPTS, true) + "/" + toMsFromMpegTsClock(firstDTS, true) + ", delta: " + toMsFromMpegTsClock(delta, true) + " ms");
|
15754
|
+
this.logger.log("Video: Initial PTS/DTS adjusted: " + toMsFromMpegTsClock(firstPTS, true) + "/" + toMsFromMpegTsClock(firstDTS, true) + ", delta: " + toMsFromMpegTsClock(delta, true) + " ms");
|
15749
15755
|
}
|
15750
15756
|
}
|
15751
15757
|
}
|
@@ -15845,7 +15851,7 @@
|
|
15845
15851
|
} else {
|
15846
15852
|
stretchedLastFrame = true;
|
15847
15853
|
}
|
15848
|
-
logger.log("[mp4-remuxer]: It is approximately " + deltaToFrameEnd / 90 + " ms to the next segment; using duration " + mp4SampleDuration / 90 + " ms for the last video frame.");
|
15854
|
+
this.logger.log("[mp4-remuxer]: It is approximately " + deltaToFrameEnd / 90 + " ms to the next segment; using duration " + mp4SampleDuration / 90 + " ms for the last video frame.");
|
15849
15855
|
} else {
|
15850
15856
|
mp4SampleDuration = lastFrameDuration;
|
15851
15857
|
}
|
@@ -15873,7 +15879,7 @@
|
|
15873
15879
|
// Fix for "CNN special report, with CC" in test-streams (Safari browser only)
|
15874
15880
|
// Ignore DTS when frame durations are irregular. Safari MSE does not handle this leading to gaps.
|
15875
15881
|
if (maxPtsDelta - minPtsDelta < maxDtsDelta - minDtsDelta && averageSampleDuration / maxDtsDelta < 0.025 && outputSamples[0].cts === 0) {
|
15876
|
-
logger.warn('Found irregular gaps in sample duration. Using PTS instead of DTS to determine MP4 sample duration.');
|
15882
|
+
this.logger.warn('Found irregular gaps in sample duration. Using PTS instead of DTS to determine MP4 sample duration.');
|
15877
15883
|
var dts = firstDTS;
|
15878
15884
|
for (var _i4 = 0, len = outputSamples.length; _i4 < len; _i4++) {
|
15879
15885
|
var nextDts = dts + outputSamples[_i4].duration;
|
@@ -16000,7 +16006,7 @@
|
|
16000
16006
|
// When remuxing with video, if we're overlapping by more than a duration, drop this sample to stay in sync
|
16001
16007
|
if (delta <= -maxAudioFramesDrift * inputSampleDuration && alignedWithVideo) {
|
16002
16008
|
if (i === 0) {
|
16003
|
-
logger.warn("Audio frame @ " + (pts / inputTimeScale).toFixed(3) + "s overlaps nextAudioPts by " + Math.round(1000 * delta / inputTimeScale) + " ms.");
|
16009
|
+
this.logger.warn("Audio frame @ " + (pts / inputTimeScale).toFixed(3) + "s overlaps nextAudioPts by " + Math.round(1000 * delta / inputTimeScale) + " ms.");
|
16004
16010
|
this.nextAudioPts = nextAudioPts = nextPts = pts;
|
16005
16011
|
}
|
16006
16012
|
} // eslint-disable-line brace-style
|
@@ -16022,12 +16028,12 @@
|
|
16022
16028
|
if (i === 0) {
|
16023
16029
|
this.nextAudioPts = nextAudioPts = nextPts;
|
16024
16030
|
}
|
16025
|
-
logger.warn("[mp4-remuxer]: Injecting " + missing + " audio frame @ " + (nextPts / inputTimeScale).toFixed(3) + "s due to " + Math.round(1000 * delta / inputTimeScale) + " ms gap.");
|
16031
|
+
this.logger.warn("[mp4-remuxer]: Injecting " + missing + " audio frame @ " + (nextPts / inputTimeScale).toFixed(3) + "s due to " + Math.round(1000 * delta / inputTimeScale) + " ms gap.");
|
16026
16032
|
for (var j = 0; j < missing; j++) {
|
16027
16033
|
var newStamp = Math.max(nextPts, 0);
|
16028
16034
|
var fillFrame = AAC.getSilentFrame(track.parsedCodec || track.manifestCodec || track.codec, track.channelCount);
|
16029
16035
|
if (!fillFrame) {
|
16030
|
-
logger.log('[mp4-remuxer]: Unable to get silent frame for given audio codec; duplicating last frame instead.');
|
16036
|
+
this.logger.log('[mp4-remuxer]: Unable to get silent frame for given audio codec; duplicating last frame instead.');
|
16031
16037
|
fillFrame = sample.unit.subarray();
|
16032
16038
|
}
|
16033
16039
|
inputSamples.splice(i, 0, {
|
@@ -16227,7 +16233,8 @@
|
|
16227
16233
|
};
|
16228
16234
|
|
16229
16235
|
var PassThroughRemuxer = /*#__PURE__*/function () {
|
16230
|
-
function PassThroughRemuxer() {
|
16236
|
+
function PassThroughRemuxer(observer, config, typeSupported, logger) {
|
16237
|
+
this.logger = void 0;
|
16231
16238
|
this.emitInitSegment = false;
|
16232
16239
|
this.audioCodec = void 0;
|
16233
16240
|
this.videoCodec = void 0;
|
@@ -16235,6 +16242,7 @@
|
|
16235
16242
|
this.initPTS = null;
|
16236
16243
|
this.initTracks = void 0;
|
16237
16244
|
this.lastEndTime = null;
|
16245
|
+
this.logger = logger;
|
16238
16246
|
}
|
16239
16247
|
var _proto = PassThroughRemuxer.prototype;
|
16240
16248
|
_proto.destroy = function destroy() {};
|
@@ -16291,7 +16299,7 @@
|
|
16291
16299
|
id: 'main'
|
16292
16300
|
};
|
16293
16301
|
} else {
|
16294
|
-
logger.warn('[passthrough-remuxer.ts]: initSegment does not contain moov or trak boxes.');
|
16302
|
+
this.logger.warn('[passthrough-remuxer.ts]: initSegment does not contain moov or trak boxes.');
|
16295
16303
|
}
|
16296
16304
|
this.initTracks = tracks;
|
16297
16305
|
};
|
@@ -16331,7 +16339,7 @@
|
|
16331
16339
|
}
|
16332
16340
|
if (!((_initData2 = initData) != null && _initData2.length)) {
|
16333
16341
|
// We can't remux if the initSegment could not be generated
|
16334
|
-
logger.warn('[passthrough-remuxer.ts]: Failed to generate initSegment.');
|
16342
|
+
this.logger.warn('[passthrough-remuxer.ts]: Failed to generate initSegment.');
|
16335
16343
|
return result;
|
16336
16344
|
}
|
16337
16345
|
if (this.emitInitSegment) {
|
@@ -16344,7 +16352,7 @@
|
|
16344
16352
|
if (isInvalidInitPts(initPTS, decodeTime, timeOffset, duration) || initSegment.timescale !== initPTS.timescale && accurateTimeOffset) {
|
16345
16353
|
initSegment.initPTS = decodeTime - timeOffset;
|
16346
16354
|
if (initPTS && initPTS.timescale === 1) {
|
16347
|
-
logger.warn("Adjusting initPTS @" + timeOffset + " from " + initPTS.baseTime / initPTS.timescale + " to " + initSegment.initPTS);
|
16355
|
+
this.logger.warn("Adjusting initPTS @" + timeOffset + " from " + initPTS.baseTime / initPTS.timescale + " to " + initSegment.initPTS);
|
16348
16356
|
}
|
16349
16357
|
this.initPTS = initPTS = {
|
16350
16358
|
baseTime: initSegment.initPTS,
|
@@ -16357,7 +16365,7 @@
|
|
16357
16365
|
if (duration > 0) {
|
16358
16366
|
this.lastEndTime = endTime;
|
16359
16367
|
} else {
|
16360
|
-
logger.warn('Duration parsed from mp4 should be greater than zero');
|
16368
|
+
this.logger.warn('Duration parsed from mp4 should be greater than zero');
|
16361
16369
|
this.resetNextTimestamp();
|
16362
16370
|
}
|
16363
16371
|
var hasAudio = !!initData.audio;
|
@@ -16416,12 +16424,12 @@
|
|
16416
16424
|
return getCodecCompatibleName(parsedCodec, preferManagedMediaSource);
|
16417
16425
|
}
|
16418
16426
|
var result = 'mp4a.40.5';
|
16419
|
-
logger.info("Parsed audio codec \"" + parsedCodec + "\" or audio object type not handled. Using \"" + result + "\"");
|
16427
|
+
this.logger.info("Parsed audio codec \"" + parsedCodec + "\" or audio object type not handled. Using \"" + result + "\"");
|
16420
16428
|
return result;
|
16421
16429
|
}
|
16422
16430
|
// Provide defaults based on codec type
|
16423
16431
|
// This allows for some playback of some fmp4 playlists without CODECS defined in manifest
|
16424
|
-
logger.warn("Unhandled video codec \"" + parsedCodec + "\"");
|
16432
|
+
this.logger.warn("Unhandled video codec \"" + parsedCodec + "\"");
|
16425
16433
|
if (parsedCodec === 'hvc1' || parsedCodec === 'hev1') {
|
16426
16434
|
return 'hvc1.1.6.L120.90';
|
16427
16435
|
}
|
@@ -16436,8 +16444,7 @@
|
|
16436
16444
|
try {
|
16437
16445
|
now = self.performance.now.bind(self.performance);
|
16438
16446
|
} catch (err) {
|
16439
|
-
|
16440
|
-
now = optionalSelf == null ? void 0 : optionalSelf.Date.now;
|
16447
|
+
now = Date.now;
|
16441
16448
|
}
|
16442
16449
|
var muxConfig = [{
|
16443
16450
|
demux: MP4Demuxer,
|
@@ -16459,8 +16466,9 @@
|
|
16459
16466
|
});
|
16460
16467
|
}
|
16461
16468
|
var Transmuxer = /*#__PURE__*/function () {
|
16462
|
-
function Transmuxer(observer, typeSupported, config, vendor, id) {
|
16463
|
-
this.
|
16469
|
+
function Transmuxer(observer, typeSupported, config, vendor, id, logger) {
|
16470
|
+
this.asyncResult = false;
|
16471
|
+
this.logger = void 0;
|
16464
16472
|
this.observer = void 0;
|
16465
16473
|
this.typeSupported = void 0;
|
16466
16474
|
this.config = void 0;
|
@@ -16478,6 +16486,7 @@
|
|
16478
16486
|
this.config = config;
|
16479
16487
|
this.vendor = vendor;
|
16480
16488
|
this.id = id;
|
16489
|
+
this.logger = logger;
|
16481
16490
|
}
|
16482
16491
|
var _proto = Transmuxer.prototype;
|
16483
16492
|
_proto.configure = function configure(transmuxConfig) {
|
@@ -16529,6 +16538,7 @@
|
|
16529
16538
|
}
|
16530
16539
|
uintData = new Uint8Array(decryptedData);
|
16531
16540
|
} else {
|
16541
|
+
this.asyncResult = true;
|
16532
16542
|
this.decryptionPromise = decrypter.webCryptoDecrypt(uintData, keyData.key.buffer, keyData.iv.buffer, aesMode).then(function (decryptedData) {
|
16533
16543
|
// Calling push here is important; if flush() is called while this is still resolving, this ensures that
|
16534
16544
|
// the decrypted data has been transmuxed
|
@@ -16543,7 +16553,7 @@
|
|
16543
16553
|
if (resetMuxers) {
|
16544
16554
|
var error = this.configureTransmuxer(uintData);
|
16545
16555
|
if (error) {
|
16546
|
-
logger.warn("[transmuxer] " + error.message);
|
16556
|
+
this.logger.warn("[transmuxer] " + error.message);
|
16547
16557
|
this.observer.emit(Events.ERROR, Events.ERROR, {
|
16548
16558
|
type: ErrorTypes.MEDIA_ERROR,
|
16549
16559
|
details: ErrorDetails.FRAG_PARSING_ERROR,
|
@@ -16565,6 +16575,7 @@
|
|
16565
16575
|
this.resetContiguity();
|
16566
16576
|
}
|
16567
16577
|
var result = this.transmux(uintData, keyData, timeOffset, accurateTimeOffset, chunkMeta);
|
16578
|
+
this.asyncResult = isPromise(result);
|
16568
16579
|
var currentState = this.currentTransmuxState;
|
16569
16580
|
currentState.contiguous = true;
|
16570
16581
|
currentState.discontinuity = false;
|
@@ -16583,6 +16594,7 @@
|
|
16583
16594
|
currentTransmuxState = this.currentTransmuxState,
|
16584
16595
|
decryptionPromise = this.decryptionPromise;
|
16585
16596
|
if (decryptionPromise) {
|
16597
|
+
this.asyncResult = true;
|
16586
16598
|
// Upon resolution, the decryption promise calls push() and returns its TransmuxerResult up the stack. Therefore
|
16587
16599
|
// only flushing is required for async decryption
|
16588
16600
|
return decryptionPromise.then(function () {
|
@@ -16606,10 +16618,15 @@
|
|
16606
16618
|
if (!demuxer || !remuxer) {
|
16607
16619
|
// If probing failed, then Hls.js has been given content its not able to handle
|
16608
16620
|
stats.executeEnd = now();
|
16609
|
-
|
16621
|
+
var emptyResults = [emptyResult(chunkMeta)];
|
16622
|
+
if (this.asyncResult) {
|
16623
|
+
return Promise.resolve(emptyResults);
|
16624
|
+
}
|
16625
|
+
return emptyResults;
|
16610
16626
|
}
|
16611
16627
|
var demuxResultOrPromise = demuxer.flush(timeOffset);
|
16612
16628
|
if (isPromise(demuxResultOrPromise)) {
|
16629
|
+
this.asyncResult = true;
|
16613
16630
|
// Decrypt final SAMPLE-AES samples
|
16614
16631
|
return demuxResultOrPromise.then(function (demuxResult) {
|
16615
16632
|
_this2.flushRemux(transmuxResults, demuxResult, chunkMeta);
|
@@ -16617,6 +16634,9 @@
|
|
16617
16634
|
});
|
16618
16635
|
}
|
16619
16636
|
this.flushRemux(transmuxResults, demuxResultOrPromise, chunkMeta);
|
16637
|
+
if (this.asyncResult) {
|
16638
|
+
return Promise.resolve(transmuxResults);
|
16639
|
+
}
|
16620
16640
|
return transmuxResults;
|
16621
16641
|
};
|
16622
16642
|
_proto.flushRemux = function flushRemux(transmuxResults, demuxResult, chunkMeta) {
|
@@ -16627,7 +16647,7 @@
|
|
16627
16647
|
var _this$currentTransmux = this.currentTransmuxState,
|
16628
16648
|
accurateTimeOffset = _this$currentTransmux.accurateTimeOffset,
|
16629
16649
|
timeOffset = _this$currentTransmux.timeOffset;
|
16630
|
-
logger.log("[transmuxer.ts]: Flushed
|
16650
|
+
this.logger.log("[transmuxer.ts]: Flushed " + this.id + " sn: " + chunkMeta.sn + (chunkMeta.part > -1 ? ' p: ' + chunkMeta.part : '') + " of " + (this.id === PlaylistLevelType.MAIN ? 'level' : 'track') + " " + chunkMeta.level);
|
16631
16651
|
var remuxResult = this.remuxer.remux(audioTrack, videoTrack, id3Track, textTrack, timeOffset, accurateTimeOffset, true, this.id);
|
16632
16652
|
transmuxResults.push({
|
16633
16653
|
remuxResult: remuxResult,
|
@@ -16706,13 +16726,13 @@
|
|
16706
16726
|
_proto.configureTransmuxer = function configureTransmuxer(data) {
|
16707
16727
|
var config = this.config,
|
16708
16728
|
observer = this.observer,
|
16709
|
-
typeSupported = this.typeSupported
|
16710
|
-
|
16729
|
+
typeSupported = this.typeSupported;
|
16730
|
+
this.vendor;
|
16711
16731
|
// probe for content type
|
16712
16732
|
var mux;
|
16713
16733
|
for (var i = 0, len = muxConfig.length; i < len; i++) {
|
16714
16734
|
var _muxConfig$i$demux;
|
16715
|
-
if ((_muxConfig$i$demux = muxConfig[i].demux) != null && _muxConfig$i$demux.probe(data)) {
|
16735
|
+
if ((_muxConfig$i$demux = muxConfig[i].demux) != null && _muxConfig$i$demux.probe(data, this.logger)) {
|
16716
16736
|
mux = muxConfig[i];
|
16717
16737
|
break;
|
16718
16738
|
}
|
@@ -16726,10 +16746,10 @@
|
|
16726
16746
|
var Remuxer = mux.remux;
|
16727
16747
|
var Demuxer = mux.demux;
|
16728
16748
|
if (!remuxer || !(remuxer instanceof Remuxer)) {
|
16729
|
-
this.remuxer = new Remuxer(observer, config, typeSupported,
|
16749
|
+
this.remuxer = new Remuxer(observer, config, typeSupported, this.logger);
|
16730
16750
|
}
|
16731
16751
|
if (!demuxer || !(demuxer instanceof Demuxer)) {
|
16732
|
-
this.demuxer = new Demuxer(observer, config, typeSupported);
|
16752
|
+
this.demuxer = new Demuxer(observer, config, typeSupported, this.logger);
|
16733
16753
|
this.probe = Demuxer.probe;
|
16734
16754
|
}
|
16735
16755
|
};
|
@@ -17133,63 +17153,54 @@
|
|
17133
17153
|
var eventemitter3Exports = eventemitter3.exports;
|
17134
17154
|
var EventEmitter = /*@__PURE__*/getDefaultExportFromCjs(eventemitter3Exports);
|
17135
17155
|
|
17156
|
+
var transmuxers = [];
|
17136
17157
|
if (typeof __IN_WORKER__ !== 'undefined' && __IN_WORKER__) {
|
17137
|
-
startWorker(
|
17158
|
+
startWorker();
|
17138
17159
|
}
|
17139
|
-
function startWorker(
|
17140
|
-
var observer = new EventEmitter();
|
17141
|
-
var forwardMessage = function forwardMessage(ev, data) {
|
17142
|
-
self.postMessage({
|
17143
|
-
event: ev,
|
17144
|
-
data: data
|
17145
|
-
});
|
17146
|
-
};
|
17147
|
-
|
17148
|
-
// forward events to main thread
|
17149
|
-
observer.on(Events.FRAG_DECRYPTED, forwardMessage);
|
17150
|
-
observer.on(Events.ERROR, forwardMessage);
|
17151
|
-
|
17152
|
-
// forward logger events to main thread
|
17153
|
-
var forwardWorkerLogs = function forwardWorkerLogs(logger) {
|
17154
|
-
var _loop = function _loop(logFn) {
|
17155
|
-
var func = function func(message) {
|
17156
|
-
forwardMessage('workerLog', {
|
17157
|
-
logType: logFn,
|
17158
|
-
message: message
|
17159
|
-
});
|
17160
|
-
};
|
17161
|
-
logger[logFn] = func;
|
17162
|
-
};
|
17163
|
-
for (var logFn in logger) {
|
17164
|
-
_loop(logFn);
|
17165
|
-
}
|
17166
|
-
};
|
17160
|
+
function startWorker() {
|
17167
17161
|
self.addEventListener('message', function (ev) {
|
17168
17162
|
var data = ev.data;
|
17163
|
+
var instanceNo = data.instanceNo;
|
17164
|
+
if (instanceNo === undefined) {
|
17165
|
+
return;
|
17166
|
+
}
|
17167
|
+
var transmuxer = transmuxers[instanceNo];
|
17168
|
+
if (data.cmd === 'reset') {
|
17169
|
+
delete transmuxers[data.resetNo];
|
17170
|
+
if (transmuxer) {
|
17171
|
+
transmuxer.destroy();
|
17172
|
+
}
|
17173
|
+
data.cmd = 'init';
|
17174
|
+
}
|
17175
|
+
if (data.cmd === 'init') {
|
17176
|
+
var config = JSON.parse(data.config);
|
17177
|
+
var observer = new EventEmitter();
|
17178
|
+
observer.on(Events.FRAG_DECRYPTED, forwardMessage);
|
17179
|
+
observer.on(Events.ERROR, forwardMessage);
|
17180
|
+
var logger = enableLogs(config.debug, data.id);
|
17181
|
+
forwardWorkerLogs(logger, instanceNo);
|
17182
|
+
transmuxers[instanceNo] = new Transmuxer(observer, data.typeSupported, config, '', data.id, logger);
|
17183
|
+
forwardMessage('init', null, instanceNo);
|
17184
|
+
return;
|
17185
|
+
}
|
17186
|
+
if (!transmuxer) {
|
17187
|
+
return;
|
17188
|
+
}
|
17169
17189
|
switch (data.cmd) {
|
17170
|
-
case 'init':
|
17171
|
-
{
|
17172
|
-
var config = JSON.parse(data.config);
|
17173
|
-
self.transmuxer = new Transmuxer(observer, data.typeSupported, config, '', data.id);
|
17174
|
-
var logger = enableLogs(config.debug, data.id);
|
17175
|
-
forwardWorkerLogs(logger);
|
17176
|
-
forwardMessage('init', null);
|
17177
|
-
break;
|
17178
|
-
}
|
17179
17190
|
case 'configure':
|
17180
17191
|
{
|
17181
|
-
|
17192
|
+
transmuxer.configure(data.config);
|
17182
17193
|
break;
|
17183
17194
|
}
|
17184
17195
|
case 'demux':
|
17185
17196
|
{
|
17186
|
-
var transmuxResult =
|
17197
|
+
var transmuxResult = transmuxer.push(data.data, data.decryptdata, data.chunkMeta, data.state);
|
17187
17198
|
if (isPromise(transmuxResult)) {
|
17188
|
-
self.transmuxer.async = true;
|
17189
17199
|
transmuxResult.then(function (data) {
|
17190
|
-
emitTransmuxComplete(self, data);
|
17200
|
+
emitTransmuxComplete(self, data, instanceNo);
|
17191
17201
|
}).catch(function (error) {
|
17192
17202
|
forwardMessage(Events.ERROR, {
|
17203
|
+
instanceNo: instanceNo,
|
17193
17204
|
type: ErrorTypes.MEDIA_ERROR,
|
17194
17205
|
details: ErrorDetails.FRAG_PARSING_ERROR,
|
17195
17206
|
chunkMeta: data.chunkMeta,
|
@@ -17197,25 +17208,20 @@
|
|
17197
17208
|
error: error,
|
17198
17209
|
err: error,
|
17199
17210
|
reason: "transmuxer-worker push error"
|
17200
|
-
});
|
17211
|
+
}, instanceNo);
|
17201
17212
|
});
|
17202
17213
|
} else {
|
17203
|
-
self
|
17204
|
-
emitTransmuxComplete(self, transmuxResult);
|
17214
|
+
emitTransmuxComplete(self, transmuxResult, instanceNo);
|
17205
17215
|
}
|
17206
17216
|
break;
|
17207
17217
|
}
|
17208
17218
|
case 'flush':
|
17209
17219
|
{
|
17210
|
-
var
|
17211
|
-
var _transmuxResult =
|
17212
|
-
|
17213
|
-
if (asyncFlush || self.transmuxer.async) {
|
17214
|
-
if (!isPromise(_transmuxResult)) {
|
17215
|
-
_transmuxResult = Promise.resolve(_transmuxResult);
|
17216
|
-
}
|
17220
|
+
var chunkMeta = data.chunkMeta;
|
17221
|
+
var _transmuxResult = transmuxer.flush(chunkMeta);
|
17222
|
+
if (isPromise(_transmuxResult)) {
|
17217
17223
|
_transmuxResult.then(function (results) {
|
17218
|
-
handleFlushResult(self, results,
|
17224
|
+
handleFlushResult(self, results, chunkMeta, instanceNo);
|
17219
17225
|
}).catch(function (error) {
|
17220
17226
|
forwardMessage(Events.ERROR, {
|
17221
17227
|
type: ErrorTypes.MEDIA_ERROR,
|
@@ -17225,17 +17231,17 @@
|
|
17225
17231
|
error: error,
|
17226
17232
|
err: error,
|
17227
17233
|
reason: "transmuxer-worker flush error"
|
17228
|
-
});
|
17234
|
+
}, instanceNo);
|
17229
17235
|
});
|
17230
17236
|
} else {
|
17231
|
-
handleFlushResult(self, _transmuxResult,
|
17237
|
+
handleFlushResult(self, _transmuxResult, chunkMeta, instanceNo);
|
17232
17238
|
}
|
17233
17239
|
break;
|
17234
17240
|
}
|
17235
17241
|
}
|
17236
17242
|
});
|
17237
17243
|
}
|
17238
|
-
function emitTransmuxComplete(self, transmuxResult) {
|
17244
|
+
function emitTransmuxComplete(self, transmuxResult, instanceNo) {
|
17239
17245
|
if (isEmptyResult(transmuxResult.remuxResult)) {
|
17240
17246
|
return false;
|
17241
17247
|
}
|
@@ -17251,7 +17257,8 @@
|
|
17251
17257
|
}
|
17252
17258
|
self.postMessage({
|
17253
17259
|
event: 'transmuxComplete',
|
17254
|
-
data: transmuxResult
|
17260
|
+
data: transmuxResult,
|
17261
|
+
instanceNo: instanceNo
|
17255
17262
|
}, transferable);
|
17256
17263
|
return true;
|
17257
17264
|
}
|
@@ -17266,77 +17273,200 @@
|
|
17266
17273
|
transferable.push(track.data2.buffer);
|
17267
17274
|
}
|
17268
17275
|
}
|
17269
|
-
function handleFlushResult(self, results, chunkMeta) {
|
17276
|
+
function handleFlushResult(self, results, chunkMeta, instanceNo) {
|
17270
17277
|
var parsed = results.reduce(function (parsed, result) {
|
17271
|
-
return emitTransmuxComplete(self, result) || parsed;
|
17278
|
+
return emitTransmuxComplete(self, result, instanceNo) || parsed;
|
17272
17279
|
}, false);
|
17273
17280
|
if (!parsed) {
|
17274
17281
|
// Emit at least one "transmuxComplete" message even if media is not found to update stream-controller state to PARSING
|
17275
17282
|
self.postMessage({
|
17276
17283
|
event: 'transmuxComplete',
|
17277
|
-
data: results[0]
|
17284
|
+
data: results[0],
|
17285
|
+
instanceNo: instanceNo
|
17278
17286
|
});
|
17279
17287
|
}
|
17280
17288
|
self.postMessage({
|
17281
17289
|
event: 'flush',
|
17282
|
-
data: chunkMeta
|
17290
|
+
data: chunkMeta,
|
17291
|
+
instanceNo: instanceNo
|
17283
17292
|
});
|
17284
17293
|
}
|
17294
|
+
function forwardMessage(event, data, instanceNo) {
|
17295
|
+
self.postMessage({
|
17296
|
+
event: event,
|
17297
|
+
data: data,
|
17298
|
+
instanceNo: instanceNo
|
17299
|
+
});
|
17300
|
+
}
|
17301
|
+
function forwardWorkerLogs(logger, instanceNo) {
|
17302
|
+
var _loop = function _loop(logFn) {
|
17303
|
+
var func = function func(message) {
|
17304
|
+
forwardMessage('workerLog', {
|
17305
|
+
logType: logFn,
|
17306
|
+
message: message
|
17307
|
+
}, instanceNo);
|
17308
|
+
};
|
17309
|
+
logger[logFn] = func;
|
17310
|
+
};
|
17311
|
+
for (var logFn in logger) {
|
17312
|
+
_loop(logFn);
|
17313
|
+
}
|
17314
|
+
}
|
17285
17315
|
function isEmptyResult(remuxResult) {
|
17286
17316
|
return !remuxResult.audio && !remuxResult.video && !remuxResult.text && !remuxResult.id3 && !remuxResult.initSegment;
|
17287
17317
|
}
|
17288
17318
|
|
17319
|
+
var version = "1.5.14-0.canary.10432";
|
17320
|
+
|
17289
17321
|
// ensure the worker ends up in the bundle
|
17290
17322
|
// If the worker should not be included this gets aliased to empty.js
|
17323
|
+
var workerStore = {};
|
17291
17324
|
function hasUMDWorker() {
|
17292
17325
|
return typeof __HLS_WORKER_BUNDLE__ === 'function';
|
17293
17326
|
}
|
17294
17327
|
function injectWorker() {
|
17328
|
+
var workerContext = workerStore[version];
|
17329
|
+
if (workerContext) {
|
17330
|
+
workerContext.clientCount++;
|
17331
|
+
return workerContext;
|
17332
|
+
}
|
17295
17333
|
var blob = new self.Blob(["var exports={};var module={exports:exports};function define(f){f()};define.amd=true;(" + __HLS_WORKER_BUNDLE__.toString() + ")(true);"], {
|
17296
17334
|
type: 'text/javascript'
|
17297
17335
|
});
|
17298
17336
|
var objectURL = self.URL.createObjectURL(blob);
|
17299
17337
|
var worker = new self.Worker(objectURL);
|
17300
|
-
|
17338
|
+
var result = {
|
17301
17339
|
worker: worker,
|
17302
|
-
objectURL: objectURL
|
17340
|
+
objectURL: objectURL,
|
17341
|
+
clientCount: 1
|
17303
17342
|
};
|
17343
|
+
workerStore[version] = result;
|
17344
|
+
return result;
|
17304
17345
|
}
|
17305
17346
|
function loadWorker(path) {
|
17347
|
+
var workerContext = workerStore[path];
|
17348
|
+
if (workerContext) {
|
17349
|
+
workerContext.clientCount++;
|
17350
|
+
return workerContext;
|
17351
|
+
}
|
17306
17352
|
var scriptURL = new self.URL(path, self.location.href).href;
|
17307
17353
|
var worker = new self.Worker(scriptURL);
|
17308
|
-
|
17354
|
+
var result = {
|
17309
17355
|
worker: worker,
|
17310
|
-
scriptURL: scriptURL
|
17356
|
+
scriptURL: scriptURL,
|
17357
|
+
clientCount: 1
|
17311
17358
|
};
|
17359
|
+
workerStore[path] = result;
|
17360
|
+
return result;
|
17361
|
+
}
|
17362
|
+
function removeWorkerFromStore(path) {
|
17363
|
+
var workerContext = workerStore[path || version];
|
17364
|
+
if (workerContext) {
|
17365
|
+
var clientCount = workerContext.clientCount--;
|
17366
|
+
if (clientCount === 1) {
|
17367
|
+
var worker = workerContext.worker,
|
17368
|
+
objectURL = workerContext.objectURL;
|
17369
|
+
delete workerStore[path || version];
|
17370
|
+
if (objectURL) {
|
17371
|
+
// revoke the Object URL that was used to create transmuxer worker, so as not to leak it
|
17372
|
+
self.URL.revokeObjectURL(objectURL);
|
17373
|
+
}
|
17374
|
+
worker.terminate();
|
17375
|
+
}
|
17376
|
+
}
|
17312
17377
|
}
|
17313
17378
|
|
17379
|
+
var transmuxerInstanceCount = 0;
|
17314
17380
|
var TransmuxerInterface = /*#__PURE__*/function () {
|
17315
|
-
function TransmuxerInterface(
|
17381
|
+
function TransmuxerInterface(_hls, id, onTransmuxComplete, onFlush) {
|
17316
17382
|
var _this = this;
|
17317
17383
|
this.error = null;
|
17318
17384
|
this.hls = void 0;
|
17319
17385
|
this.id = void 0;
|
17386
|
+
this.instanceNo = transmuxerInstanceCount++;
|
17320
17387
|
this.observer = void 0;
|
17321
17388
|
this.frag = null;
|
17322
17389
|
this.part = null;
|
17323
17390
|
this.useWorker = void 0;
|
17324
17391
|
this.workerContext = null;
|
17325
|
-
this.onwmsg = void 0;
|
17326
17392
|
this.transmuxer = null;
|
17327
17393
|
this.onTransmuxComplete = void 0;
|
17328
17394
|
this.onFlush = void 0;
|
17329
|
-
|
17330
|
-
|
17395
|
+
this.onWorkerMessage = function (event) {
|
17396
|
+
var data = event.data;
|
17397
|
+
var hls = _this.hls;
|
17398
|
+
if (!hls || !(data != null && data.event) || data.instanceNo !== _this.instanceNo) {
|
17399
|
+
return;
|
17400
|
+
}
|
17401
|
+
switch (data.event) {
|
17402
|
+
case 'init':
|
17403
|
+
{
|
17404
|
+
var _this$workerContext;
|
17405
|
+
var objectURL = (_this$workerContext = _this.workerContext) == null ? void 0 : _this$workerContext.objectURL;
|
17406
|
+
if (objectURL) {
|
17407
|
+
// revoke the Object URL that was used to create transmuxer worker, so as not to leak it
|
17408
|
+
self.URL.revokeObjectURL(objectURL);
|
17409
|
+
}
|
17410
|
+
break;
|
17411
|
+
}
|
17412
|
+
case 'transmuxComplete':
|
17413
|
+
{
|
17414
|
+
_this.handleTransmuxComplete(data.data);
|
17415
|
+
break;
|
17416
|
+
}
|
17417
|
+
case 'flush':
|
17418
|
+
{
|
17419
|
+
_this.onFlush(data.data);
|
17420
|
+
break;
|
17421
|
+
}
|
17422
|
+
|
17423
|
+
// pass logs from the worker thread to the main logger
|
17424
|
+
case 'workerLog':
|
17425
|
+
{
|
17426
|
+
if (hls.logger[data.data.logType]) {
|
17427
|
+
hls.logger[data.data.logType](data.data.message);
|
17428
|
+
}
|
17429
|
+
break;
|
17430
|
+
}
|
17431
|
+
default:
|
17432
|
+
{
|
17433
|
+
data.data = data.data || {};
|
17434
|
+
data.data.frag = _this.frag;
|
17435
|
+
data.data.part = _this.part;
|
17436
|
+
data.data.id = _this.id;
|
17437
|
+
hls.trigger(data.event, data.data);
|
17438
|
+
break;
|
17439
|
+
}
|
17440
|
+
}
|
17441
|
+
};
|
17442
|
+
this.onWorkerError = function (event) {
|
17443
|
+
if (!_this.hls) {
|
17444
|
+
return;
|
17445
|
+
}
|
17446
|
+
var error = new Error(event.message + " (" + event.filename + ":" + event.lineno + ")");
|
17447
|
+
_this.hls.config.enableWorker = false;
|
17448
|
+
_this.hls.logger.warn("Error in \"" + _this.id + "\" Web Worker, fallback to inline");
|
17449
|
+
_this.hls.trigger(Events.ERROR, {
|
17450
|
+
type: ErrorTypes.OTHER_ERROR,
|
17451
|
+
details: ErrorDetails.INTERNAL_EXCEPTION,
|
17452
|
+
fatal: false,
|
17453
|
+
event: 'demuxerWorker',
|
17454
|
+
error: error
|
17455
|
+
});
|
17456
|
+
};
|
17457
|
+
var config = _hls.config;
|
17458
|
+
this.hls = _hls;
|
17331
17459
|
this.id = id;
|
17332
17460
|
this.useWorker = !!config.enableWorker;
|
17333
17461
|
this.onTransmuxComplete = onTransmuxComplete;
|
17334
17462
|
this.onFlush = onFlush;
|
17335
17463
|
var forwardMessage = function forwardMessage(ev, data) {
|
17336
17464
|
data = data || {};
|
17337
|
-
data.frag = _this.frag;
|
17338
|
-
data.id = _this.id;
|
17465
|
+
data.frag = _this.frag || undefined;
|
17339
17466
|
if (ev === Events.ERROR) {
|
17467
|
+
data = data;
|
17468
|
+
data.parent = _this.id;
|
17469
|
+
data.part = _this.part;
|
17340
17470
|
_this.error = data.error;
|
17341
17471
|
}
|
17342
17472
|
_this.hls.trigger(ev, data);
|
@@ -17348,6 +17478,7 @@
|
|
17348
17478
|
this.observer.on(Events.ERROR, forwardMessage);
|
17349
17479
|
var m2tsTypeSupported = getM2TSSupportedAudioTypes(config.preferManagedMediaSource);
|
17350
17480
|
if (this.useWorker && typeof Worker !== 'undefined') {
|
17481
|
+
var logger = this.hls.logger;
|
17351
17482
|
var canCreateWorker = config.workerPath || hasUMDWorker();
|
17352
17483
|
if (canCreateWorker) {
|
17353
17484
|
try {
|
@@ -17358,61 +17489,60 @@
|
|
17358
17489
|
logger.log("injecting Web Worker for \"" + id + "\"");
|
17359
17490
|
this.workerContext = injectWorker();
|
17360
17491
|
}
|
17361
|
-
this.onwmsg = function (event) {
|
17362
|
-
return _this.onWorkerMessage(event);
|
17363
|
-
};
|
17364
17492
|
var worker = this.workerContext.worker;
|
17365
|
-
worker.addEventListener('message', this.
|
17366
|
-
worker.
|
17367
|
-
var error = new Error(event.message + " (" + event.filename + ":" + event.lineno + ")");
|
17368
|
-
config.enableWorker = false;
|
17369
|
-
logger.warn("Error in \"" + id + "\" Web Worker, fallback to inline");
|
17370
|
-
_this.hls.trigger(Events.ERROR, {
|
17371
|
-
type: ErrorTypes.OTHER_ERROR,
|
17372
|
-
details: ErrorDetails.INTERNAL_EXCEPTION,
|
17373
|
-
fatal: false,
|
17374
|
-
event: 'demuxerWorker',
|
17375
|
-
error: error
|
17376
|
-
});
|
17377
|
-
};
|
17493
|
+
worker.addEventListener('message', this.onWorkerMessage);
|
17494
|
+
worker.addEventListener('error', this.onWorkerError);
|
17378
17495
|
worker.postMessage({
|
17496
|
+
instanceNo: this.instanceNo,
|
17379
17497
|
cmd: 'init',
|
17380
17498
|
typeSupported: m2tsTypeSupported,
|
17381
|
-
vendor: '',
|
17382
17499
|
id: id,
|
17383
17500
|
config: JSON.stringify(config)
|
17384
17501
|
});
|
17385
17502
|
} catch (err) {
|
17386
17503
|
logger.warn("Error setting up \"" + id + "\" Web Worker, fallback to inline", err);
|
17387
|
-
this.
|
17504
|
+
this.terminateWorker();
|
17388
17505
|
this.error = null;
|
17389
|
-
this.transmuxer = new Transmuxer(this.observer, m2tsTypeSupported, config, '', id);
|
17506
|
+
this.transmuxer = new Transmuxer(this.observer, m2tsTypeSupported, config, '', id, _hls.logger);
|
17390
17507
|
}
|
17391
17508
|
return;
|
17392
17509
|
}
|
17393
17510
|
}
|
17394
|
-
this.transmuxer = new Transmuxer(this.observer, m2tsTypeSupported, config, '', id);
|
17511
|
+
this.transmuxer = new Transmuxer(this.observer, m2tsTypeSupported, config, '', id, _hls.logger);
|
17395
17512
|
}
|
17396
17513
|
var _proto = TransmuxerInterface.prototype;
|
17397
|
-
_proto.
|
17514
|
+
_proto.reset = function reset() {
|
17515
|
+
this.frag = null;
|
17516
|
+
this.part = null;
|
17398
17517
|
if (this.workerContext) {
|
17399
|
-
var
|
17400
|
-
|
17401
|
-
|
17402
|
-
|
17403
|
-
|
17404
|
-
|
17405
|
-
|
17406
|
-
|
17407
|
-
|
17408
|
-
|
17518
|
+
var instanceNo = this.instanceNo;
|
17519
|
+
this.instanceNo = transmuxerInstanceCount++;
|
17520
|
+
var config = this.hls.config;
|
17521
|
+
var m2tsTypeSupported = getM2TSSupportedAudioTypes(config.preferManagedMediaSource);
|
17522
|
+
this.workerContext.worker.postMessage({
|
17523
|
+
instanceNo: this.instanceNo,
|
17524
|
+
cmd: 'reset',
|
17525
|
+
resetNo: instanceNo,
|
17526
|
+
typeSupported: m2tsTypeSupported,
|
17527
|
+
id: this.id,
|
17528
|
+
config: JSON.stringify(config)
|
17529
|
+
});
|
17530
|
+
}
|
17531
|
+
};
|
17532
|
+
_proto.terminateWorker = function terminateWorker() {
|
17533
|
+
if (this.workerContext) {
|
17534
|
+
var worker = this.workerContext.worker;
|
17409
17535
|
this.workerContext = null;
|
17536
|
+
worker.removeEventListener('message', this.onWorkerMessage);
|
17537
|
+
worker.removeEventListener('error', this.onWorkerError);
|
17538
|
+
removeWorkerFromStore(this.hls.config.workerPath);
|
17410
17539
|
}
|
17411
17540
|
};
|
17412
17541
|
_proto.destroy = function destroy() {
|
17413
17542
|
if (this.workerContext) {
|
17414
|
-
this.
|
17415
|
-
|
17543
|
+
this.terminateWorker();
|
17544
|
+
// @ts-ignore
|
17545
|
+
this.onWorkerMessage = this.onWorkerError = null;
|
17416
17546
|
} else {
|
17417
17547
|
var transmuxer = this.transmuxer;
|
17418
17548
|
if (transmuxer) {
|
@@ -17425,6 +17555,7 @@
|
|
17425
17555
|
observer.removeAllListeners();
|
17426
17556
|
}
|
17427
17557
|
this.frag = null;
|
17558
|
+
this.part = null;
|
17428
17559
|
// @ts-ignore
|
17429
17560
|
this.observer = null;
|
17430
17561
|
// @ts-ignore
|
@@ -17435,7 +17566,8 @@
|
|
17435
17566
|
_lastFrag$initSegment,
|
17436
17567
|
_this2 = this;
|
17437
17568
|
chunkMeta.transmuxing.start = self.performance.now();
|
17438
|
-
var
|
17569
|
+
var instanceNo = this.instanceNo,
|
17570
|
+
transmuxer = this.transmuxer;
|
17439
17571
|
var timeOffset = part ? part.start : frag.start;
|
17440
17572
|
// TODO: push "clear-lead" decrypt data for unencrypted fragments in streams with encrypted ones
|
17441
17573
|
var decryptdata = frag.decryptdata;
|
@@ -17456,7 +17588,7 @@
|
|
17456
17588
|
var initSegmentChange = !(lastFrag && ((_frag$initSegment = frag.initSegment) == null ? void 0 : _frag$initSegment.url) === ((_lastFrag$initSegment = lastFrag.initSegment) == null ? void 0 : _lastFrag$initSegment.url));
|
17457
17589
|
var state = new TransmuxState(discontinuity, contiguous, accurateTimeOffset, trackSwitch, timeOffset, initSegmentChange);
|
17458
17590
|
if (!contiguous || discontinuity || initSegmentChange) {
|
17459
|
-
logger.log("[transmuxer-interface, " + frag.type + "]: Starting new transmux session for sn: " + chunkMeta.sn + " p: " + chunkMeta.part + " level: " + chunkMeta.level + " id: " + chunkMeta.id + "\n discontinuity: " + discontinuity + "\n trackSwitch: " + trackSwitch + "\n contiguous: " + contiguous + "\n accurateTimeOffset: " + accurateTimeOffset + "\n timeOffset: " + timeOffset + "\n initSegmentChange: " + initSegmentChange);
|
17591
|
+
this.hls.logger.log("[transmuxer-interface, " + frag.type + "]: Starting new transmux session for sn: " + chunkMeta.sn + " p: " + chunkMeta.part + " level: " + chunkMeta.level + " id: " + chunkMeta.id + "\n discontinuity: " + discontinuity + "\n trackSwitch: " + trackSwitch + "\n contiguous: " + contiguous + "\n accurateTimeOffset: " + accurateTimeOffset + "\n timeOffset: " + timeOffset + "\n initSegmentChange: " + initSegmentChange);
|
17460
17592
|
var config = new TransmuxConfig(audioCodec, videoCodec, initSegmentData, duration, defaultInitPTS);
|
17461
17593
|
this.configureTransmuxer(config);
|
17462
17594
|
}
|
@@ -17467,6 +17599,7 @@
|
|
17467
17599
|
if (this.workerContext) {
|
17468
17600
|
// post fragment payload as transferable objects for ArrayBuffer (no copy)
|
17469
17601
|
this.workerContext.worker.postMessage({
|
17602
|
+
instanceNo: instanceNo,
|
17470
17603
|
cmd: 'demux',
|
17471
17604
|
data: data,
|
17472
17605
|
decryptdata: decryptdata,
|
@@ -17476,14 +17609,12 @@
|
|
17476
17609
|
} else if (transmuxer) {
|
17477
17610
|
var transmuxResult = transmuxer.push(data, decryptdata, chunkMeta, state);
|
17478
17611
|
if (isPromise(transmuxResult)) {
|
17479
|
-
transmuxer.async = true;
|
17480
17612
|
transmuxResult.then(function (data) {
|
17481
17613
|
_this2.handleTransmuxComplete(data);
|
17482
17614
|
}).catch(function (error) {
|
17483
17615
|
_this2.transmuxerError(error, chunkMeta, 'transmuxer-interface push error');
|
17484
17616
|
});
|
17485
17617
|
} else {
|
17486
|
-
transmuxer.async = false;
|
17487
17618
|
this.handleTransmuxComplete(transmuxResult);
|
17488
17619
|
}
|
17489
17620
|
}
|
@@ -17491,19 +17622,17 @@
|
|
17491
17622
|
_proto.flush = function flush(chunkMeta) {
|
17492
17623
|
var _this3 = this;
|
17493
17624
|
chunkMeta.transmuxing.start = self.performance.now();
|
17494
|
-
var
|
17625
|
+
var instanceNo = this.instanceNo,
|
17626
|
+
transmuxer = this.transmuxer;
|
17495
17627
|
if (this.workerContext) {
|
17496
17628
|
this.workerContext.worker.postMessage({
|
17629
|
+
instanceNo: instanceNo,
|
17497
17630
|
cmd: 'flush',
|
17498
17631
|
chunkMeta: chunkMeta
|
17499
17632
|
});
|
17500
17633
|
} else if (transmuxer) {
|
17501
17634
|
var transmuxResult = transmuxer.flush(chunkMeta);
|
17502
|
-
|
17503
|
-
if (asyncFlush || transmuxer.async) {
|
17504
|
-
if (!isPromise(transmuxResult)) {
|
17505
|
-
transmuxResult = Promise.resolve(transmuxResult);
|
17506
|
-
}
|
17635
|
+
if (isPromise(transmuxResult)) {
|
17507
17636
|
transmuxResult.then(function (data) {
|
17508
17637
|
_this3.handleFlushResult(data, chunkMeta);
|
17509
17638
|
}).catch(function (error) {
|
@@ -17524,6 +17653,7 @@
|
|
17524
17653
|
details: ErrorDetails.FRAG_PARSING_ERROR,
|
17525
17654
|
chunkMeta: chunkMeta,
|
17526
17655
|
frag: this.frag || undefined,
|
17656
|
+
part: this.part || undefined,
|
17527
17657
|
fatal: false,
|
17528
17658
|
error: error,
|
17529
17659
|
err: error,
|
@@ -17537,58 +17667,12 @@
|
|
17537
17667
|
});
|
17538
17668
|
this.onFlush(chunkMeta);
|
17539
17669
|
};
|
17540
|
-
_proto.onWorkerMessage = function onWorkerMessage(event) {
|
17541
|
-
var data = event.data;
|
17542
|
-
if (!(data != null && data.event)) {
|
17543
|
-
logger.warn("worker message received with no " + (data ? 'event name' : 'data'));
|
17544
|
-
return;
|
17545
|
-
}
|
17546
|
-
var hls = this.hls;
|
17547
|
-
if (!this.hls) {
|
17548
|
-
return;
|
17549
|
-
}
|
17550
|
-
switch (data.event) {
|
17551
|
-
case 'init':
|
17552
|
-
{
|
17553
|
-
var _this$workerContext2;
|
17554
|
-
var objectURL = (_this$workerContext2 = this.workerContext) == null ? void 0 : _this$workerContext2.objectURL;
|
17555
|
-
if (objectURL) {
|
17556
|
-
// revoke the Object URL that was used to create transmuxer worker, so as not to leak it
|
17557
|
-
self.URL.revokeObjectURL(objectURL);
|
17558
|
-
}
|
17559
|
-
break;
|
17560
|
-
}
|
17561
|
-
case 'transmuxComplete':
|
17562
|
-
{
|
17563
|
-
this.handleTransmuxComplete(data.data);
|
17564
|
-
break;
|
17565
|
-
}
|
17566
|
-
case 'flush':
|
17567
|
-
{
|
17568
|
-
this.onFlush(data.data);
|
17569
|
-
break;
|
17570
|
-
}
|
17571
|
-
|
17572
|
-
// pass logs from the worker thread to the main logger
|
17573
|
-
case 'workerLog':
|
17574
|
-
if (logger[data.data.logType]) {
|
17575
|
-
logger[data.data.logType](data.data.message);
|
17576
|
-
}
|
17577
|
-
break;
|
17578
|
-
default:
|
17579
|
-
{
|
17580
|
-
data.data = data.data || {};
|
17581
|
-
data.data.frag = this.frag;
|
17582
|
-
data.data.id = this.id;
|
17583
|
-
hls.trigger(data.event, data.data);
|
17584
|
-
break;
|
17585
|
-
}
|
17586
|
-
}
|
17587
|
-
};
|
17588
17670
|
_proto.configureTransmuxer = function configureTransmuxer(config) {
|
17589
|
-
var
|
17671
|
+
var instanceNo = this.instanceNo,
|
17672
|
+
transmuxer = this.transmuxer;
|
17590
17673
|
if (this.workerContext) {
|
17591
17674
|
this.workerContext.worker.postMessage({
|
17675
|
+
instanceNo: instanceNo,
|
17592
17676
|
cmd: 'configure',
|
17593
17677
|
config: config
|
17594
17678
|
});
|
@@ -30787,7 +30871,7 @@
|
|
30787
30871
|
* Get the video-dev/hls.js package version.
|
30788
30872
|
*/
|
30789
30873
|
function get() {
|
30790
|
-
return
|
30874
|
+
return version;
|
30791
30875
|
}
|
30792
30876
|
}, {
|
30793
30877
|
key: "Events",
|