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.light.js
CHANGED
@@ -493,7 +493,7 @@
|
|
493
493
|
// Some browsers don't allow to use bind on console object anyway
|
494
494
|
// fallback to default if needed
|
495
495
|
try {
|
496
|
-
newLogger.log("Debug logs enabled for \"" + context + "\" in hls.js version " + "1.5.14-0.canary.
|
496
|
+
newLogger.log("Debug logs enabled for \"" + context + "\" in hls.js version " + "1.5.14-0.canary.10432");
|
497
497
|
} catch (e) {
|
498
498
|
/* log fn threw an exception. All logger methods are no-ops. */
|
499
499
|
return createLogger();
|
@@ -13010,6 +13010,10 @@
|
|
13010
13010
|
};
|
13011
13011
|
_proto.onHandlerDestroying = function onHandlerDestroying() {
|
13012
13012
|
this.stopLoad();
|
13013
|
+
if (this.transmuxer) {
|
13014
|
+
this.transmuxer.destroy();
|
13015
|
+
this.transmuxer = null;
|
13016
|
+
}
|
13013
13017
|
_TaskLoop.prototype.onHandlerDestroying.call(this);
|
13014
13018
|
// @ts-ignore
|
13015
13019
|
this.hls = this.onMediaSeeking = this.onMediaEnded = null;
|
@@ -14125,10 +14129,8 @@
|
|
14125
14129
|
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) + "]";
|
14126
14130
|
};
|
14127
14131
|
_proto.resetTransmuxer = function resetTransmuxer() {
|
14128
|
-
|
14129
|
-
|
14130
|
-
this.transmuxer = null;
|
14131
|
-
}
|
14132
|
+
var _this$transmuxer2;
|
14133
|
+
(_this$transmuxer2 = this.transmuxer) == null ? void 0 : _this$transmuxer2.reset();
|
14132
14134
|
};
|
14133
14135
|
_proto.recoverWorkerError = function recoverWorkerError(data) {
|
14134
14136
|
if (data.event === 'demuxerWorker') {
|
@@ -14866,7 +14868,7 @@
|
|
14866
14868
|
|
14867
14869
|
// Source for probe info - https://wiki.multimedia.cx/index.php?title=ADTS
|
14868
14870
|
;
|
14869
|
-
AACDemuxer.probe = function probe$2(data) {
|
14871
|
+
AACDemuxer.probe = function probe$2(data, logger) {
|
14870
14872
|
if (!data) {
|
14871
14873
|
return false;
|
14872
14874
|
}
|
@@ -15815,7 +15817,8 @@
|
|
15815
15817
|
|
15816
15818
|
var PACKET_LENGTH = 188;
|
15817
15819
|
var TSDemuxer = /*#__PURE__*/function () {
|
15818
|
-
function TSDemuxer(observer, config, typeSupported) {
|
15820
|
+
function TSDemuxer(observer, config, typeSupported, logger) {
|
15821
|
+
this.logger = void 0;
|
15819
15822
|
this.observer = void 0;
|
15820
15823
|
this.config = void 0;
|
15821
15824
|
this.typeSupported = void 0;
|
@@ -15835,9 +15838,10 @@
|
|
15835
15838
|
this.observer = observer;
|
15836
15839
|
this.config = config;
|
15837
15840
|
this.typeSupported = typeSupported;
|
15841
|
+
this.logger = logger;
|
15838
15842
|
this.videoParser = null;
|
15839
15843
|
}
|
15840
|
-
TSDemuxer.probe = function probe(data) {
|
15844
|
+
TSDemuxer.probe = function probe(data, logger) {
|
15841
15845
|
var syncOffset = TSDemuxer.syncOffset(data);
|
15842
15846
|
if (syncOffset > 0) {
|
15843
15847
|
logger.warn("MPEG2-TS detected but first sync word found @ offset " + syncOffset);
|
@@ -16004,7 +16008,7 @@
|
|
16004
16008
|
switch (pid) {
|
16005
16009
|
case videoPid:
|
16006
16010
|
if (stt) {
|
16007
|
-
if (videoData && (pes = parsePES(videoData))) {
|
16011
|
+
if (videoData && (pes = parsePES(videoData, this.logger))) {
|
16008
16012
|
if (this.videoParser === null) {
|
16009
16013
|
switch (videoTrack.segmentCodec) {
|
16010
16014
|
case 'avc':
|
@@ -16028,7 +16032,7 @@
|
|
16028
16032
|
break;
|
16029
16033
|
case audioPid:
|
16030
16034
|
if (stt) {
|
16031
|
-
if (audioData && (pes = parsePES(audioData))) {
|
16035
|
+
if (audioData && (pes = parsePES(audioData, this.logger))) {
|
16032
16036
|
switch (audioTrack.segmentCodec) {
|
16033
16037
|
case 'aac':
|
16034
16038
|
this.parseAACPES(audioTrack, pes);
|
@@ -16050,7 +16054,7 @@
|
|
16050
16054
|
break;
|
16051
16055
|
case id3Pid:
|
16052
16056
|
if (stt) {
|
16053
|
-
if (id3Data && (pes = parsePES(id3Data))) {
|
16057
|
+
if (id3Data && (pes = parsePES(id3Data, this.logger))) {
|
16054
16058
|
this.parseID3PES(id3Track, pes);
|
16055
16059
|
}
|
16056
16060
|
id3Data = {
|
@@ -16068,14 +16072,14 @@
|
|
16068
16072
|
offset += data[offset] + 1;
|
16069
16073
|
}
|
16070
16074
|
pmtId = this._pmtId = parsePAT(data, offset);
|
16071
|
-
// logger.log('PMT PID:' + this._pmtId);
|
16075
|
+
// this.logger.log('PMT PID:' + this._pmtId);
|
16072
16076
|
break;
|
16073
16077
|
case pmtId:
|
16074
16078
|
{
|
16075
16079
|
if (stt) {
|
16076
16080
|
offset += data[offset] + 1;
|
16077
16081
|
}
|
16078
|
-
var parsedPIDs = parsePMT(data, offset, this.typeSupported, isSampleAes, this.observer);
|
16082
|
+
var parsedPIDs = parsePMT(data, offset, this.typeSupported, isSampleAes, this.observer, this.logger);
|
16079
16083
|
|
16080
16084
|
// only update track id if track PID found while parsing PMT
|
16081
16085
|
// this is to avoid resetting the PID to -1 in case
|
@@ -16098,7 +16102,7 @@
|
|
16098
16102
|
id3Track.pid = id3Pid;
|
16099
16103
|
}
|
16100
16104
|
if (unknownPID !== null && !pmtParsed) {
|
16101
|
-
logger.warn("MPEG-TS PMT found at " + start + " after unknown PID '" + unknownPID + "'. Backtracking to sync byte @" + syncOffset + " to parse all TS packets.");
|
16105
|
+
this.logger.warn("MPEG-TS PMT found at " + start + " after unknown PID '" + unknownPID + "'. Backtracking to sync byte @" + syncOffset + " to parse all TS packets.");
|
16102
16106
|
unknownPID = null;
|
16103
16107
|
// we set it to -188, the += 188 in the for loop will reset start to 0
|
16104
16108
|
start = syncOffset - 188;
|
@@ -16118,7 +16122,7 @@
|
|
16118
16122
|
}
|
16119
16123
|
}
|
16120
16124
|
if (tsPacketErrors > 0) {
|
16121
|
-
emitParsingError(this.observer, new Error("Found " + tsPacketErrors + " TS packet/s that do not start with 0x47"));
|
16125
|
+
emitParsingError(this.observer, new Error("Found " + tsPacketErrors + " TS packet/s that do not start with 0x47"), undefined, this.logger);
|
16122
16126
|
}
|
16123
16127
|
videoTrack.pesData = videoData;
|
16124
16128
|
audioTrack.pesData = audioData;
|
@@ -16164,7 +16168,7 @@
|
|
16164
16168
|
var id3Data = id3Track.pesData;
|
16165
16169
|
// try to parse last PES packets
|
16166
16170
|
var pes;
|
16167
|
-
if (videoData && (pes = parsePES(videoData))) {
|
16171
|
+
if (videoData && (pes = parsePES(videoData, this.logger))) {
|
16168
16172
|
if (this.videoParser === null) {
|
16169
16173
|
switch (videoTrack.segmentCodec) {
|
16170
16174
|
case 'avc':
|
@@ -16180,7 +16184,7 @@
|
|
16180
16184
|
// either avcData null or PES truncated, keep it for next frag parsing
|
16181
16185
|
videoTrack.pesData = videoData;
|
16182
16186
|
}
|
16183
|
-
if (audioData && (pes = parsePES(audioData))) {
|
16187
|
+
if (audioData && (pes = parsePES(audioData, this.logger))) {
|
16184
16188
|
switch (audioTrack.segmentCodec) {
|
16185
16189
|
case 'aac':
|
16186
16190
|
this.parseAACPES(audioTrack, pes);
|
@@ -16192,13 +16196,13 @@
|
|
16192
16196
|
audioTrack.pesData = null;
|
16193
16197
|
} else {
|
16194
16198
|
if (audioData != null && audioData.size) {
|
16195
|
-
logger.log('last AAC PES packet truncated,might overlap between fragments');
|
16199
|
+
this.logger.log('last AAC PES packet truncated,might overlap between fragments');
|
16196
16200
|
}
|
16197
16201
|
|
16198
16202
|
// either audioData null or PES truncated, keep it for next frag parsing
|
16199
16203
|
audioTrack.pesData = audioData;
|
16200
16204
|
}
|
16201
|
-
if (id3Data && (pes = parsePES(id3Data))) {
|
16205
|
+
if (id3Data && (pes = parsePES(id3Data, this.logger))) {
|
16202
16206
|
this.parseID3PES(id3Track, pes);
|
16203
16207
|
id3Track.pesData = null;
|
16204
16208
|
} else {
|
@@ -16270,7 +16274,7 @@
|
|
16270
16274
|
} else {
|
16271
16275
|
reason = 'No ADTS header found in AAC PES';
|
16272
16276
|
}
|
16273
|
-
emitParsingError(this.observer, new Error(reason), recoverable);
|
16277
|
+
emitParsingError(this.observer, new Error(reason), recoverable, this.logger);
|
16274
16278
|
if (!recoverable) {
|
16275
16279
|
return;
|
16276
16280
|
}
|
@@ -16285,7 +16289,7 @@
|
|
16285
16289
|
var frameDuration = getFrameDuration(track.samplerate);
|
16286
16290
|
pts = aacOverFlow.sample.pts + frameDuration;
|
16287
16291
|
} else {
|
16288
|
-
logger.warn('[tsdemuxer]: AAC PES unknown PTS');
|
16292
|
+
this.logger.warn('[tsdemuxer]: AAC PES unknown PTS');
|
16289
16293
|
return;
|
16290
16294
|
}
|
16291
16295
|
|
@@ -16315,7 +16319,7 @@
|
|
16315
16319
|
var offset = 0;
|
16316
16320
|
var pts = pes.pts;
|
16317
16321
|
if (pts === undefined) {
|
16318
|
-
logger.warn('[tsdemuxer]: MPEG PES unknown PTS');
|
16322
|
+
this.logger.warn('[tsdemuxer]: MPEG PES unknown PTS');
|
16319
16323
|
return;
|
16320
16324
|
}
|
16321
16325
|
while (offset < length) {
|
@@ -16338,7 +16342,7 @@
|
|
16338
16342
|
};
|
16339
16343
|
_proto.parseID3PES = function parseID3PES(id3Track, pes) {
|
16340
16344
|
if (pes.pts === undefined) {
|
16341
|
-
logger.warn('[tsdemuxer]: ID3 PES unknown PTS');
|
16345
|
+
this.logger.warn('[tsdemuxer]: ID3 PES unknown PTS');
|
16342
16346
|
return;
|
16343
16347
|
}
|
16344
16348
|
var id3Sample = _extends({}, pes, {
|
@@ -16357,7 +16361,7 @@
|
|
16357
16361
|
// skip the PSI header and parse the first PMT entry
|
16358
16362
|
return (data[offset + 10] & 0x1f) << 8 | data[offset + 11];
|
16359
16363
|
}
|
16360
|
-
function parsePMT(data, offset, typeSupported, isSampleAes, observer) {
|
16364
|
+
function parsePMT(data, offset, typeSupported, isSampleAes, observer, logger) {
|
16361
16365
|
var result = {
|
16362
16366
|
audioPid: -1,
|
16363
16367
|
videoPid: -1,
|
@@ -16379,7 +16383,7 @@
|
|
16379
16383
|
case 0xcf:
|
16380
16384
|
// SAMPLE-AES AAC
|
16381
16385
|
if (!isSampleAes) {
|
16382
|
-
logEncryptedSamplesFoundInUnencryptedStream('ADTS AAC');
|
16386
|
+
logEncryptedSamplesFoundInUnencryptedStream('ADTS AAC', this.logger);
|
16383
16387
|
break;
|
16384
16388
|
}
|
16385
16389
|
/* falls through */
|
@@ -16401,7 +16405,7 @@
|
|
16401
16405
|
case 0xdb:
|
16402
16406
|
// SAMPLE-AES AVC
|
16403
16407
|
if (!isSampleAes) {
|
16404
|
-
logEncryptedSamplesFoundInUnencryptedStream('H.264');
|
16408
|
+
logEncryptedSamplesFoundInUnencryptedStream('H.264', this.logger);
|
16405
16409
|
break;
|
16406
16410
|
}
|
16407
16411
|
/* falls through */
|
@@ -16429,7 +16433,7 @@
|
|
16429
16433
|
case 0xc1:
|
16430
16434
|
// SAMPLE-AES AC3
|
16431
16435
|
if (!isSampleAes) {
|
16432
|
-
logEncryptedSamplesFoundInUnencryptedStream('AC-3');
|
16436
|
+
logEncryptedSamplesFoundInUnencryptedStream('AC-3', this.logger);
|
16433
16437
|
break;
|
16434
16438
|
}
|
16435
16439
|
/* falls through */
|
@@ -16465,12 +16469,12 @@
|
|
16465
16469
|
case 0xc2: // SAMPLE-AES EC3
|
16466
16470
|
/* falls through */
|
16467
16471
|
case 0x87:
|
16468
|
-
emitParsingError(observer, new Error('Unsupported EC-3 in M2TS found'));
|
16472
|
+
emitParsingError(observer, new Error('Unsupported EC-3 in M2TS found'), undefined, this.logger);
|
16469
16473
|
return result;
|
16470
16474
|
case 0x24:
|
16471
16475
|
// ITU-T Rec. H.265 and ISO/IEC 23008-2 (HEVC)
|
16472
16476
|
{
|
16473
|
-
emitParsingError(observer, new Error('Unsupported HEVC in M2TS found'));
|
16477
|
+
emitParsingError(observer, new Error('Unsupported HEVC in M2TS found'), undefined, this.logger);
|
16474
16478
|
return result;
|
16475
16479
|
}
|
16476
16480
|
}
|
@@ -16480,7 +16484,7 @@
|
|
16480
16484
|
}
|
16481
16485
|
return result;
|
16482
16486
|
}
|
16483
|
-
function emitParsingError(observer, error, levelRetry) {
|
16487
|
+
function emitParsingError(observer, error, levelRetry, logger) {
|
16484
16488
|
logger.warn("parsing error: " + error.message);
|
16485
16489
|
observer.emit(Events.ERROR, Events.ERROR, {
|
16486
16490
|
type: ErrorTypes.MEDIA_ERROR,
|
@@ -16491,10 +16495,10 @@
|
|
16491
16495
|
reason: error.message
|
16492
16496
|
});
|
16493
16497
|
}
|
16494
|
-
function logEncryptedSamplesFoundInUnencryptedStream(type) {
|
16498
|
+
function logEncryptedSamplesFoundInUnencryptedStream(type, logger) {
|
16495
16499
|
logger.log(type + " with AES-128-CBC encryption found in unencrypted stream");
|
16496
16500
|
}
|
16497
|
-
function parsePES(stream) {
|
16501
|
+
function parsePES(stream, logger) {
|
16498
16502
|
var i = 0;
|
16499
16503
|
var frag;
|
16500
16504
|
var pesLen;
|
@@ -17391,7 +17395,8 @@
|
|
17391
17395
|
var chromeVersion = null;
|
17392
17396
|
var safariWebkitVersion = null;
|
17393
17397
|
var MP4Remuxer = /*#__PURE__*/function () {
|
17394
|
-
function MP4Remuxer(observer, config, typeSupported,
|
17398
|
+
function MP4Remuxer(observer, config, typeSupported, logger) {
|
17399
|
+
this.logger = void 0;
|
17395
17400
|
this.observer = void 0;
|
17396
17401
|
this.config = void 0;
|
17397
17402
|
this.typeSupported = void 0;
|
@@ -17407,6 +17412,7 @@
|
|
17407
17412
|
this.observer = observer;
|
17408
17413
|
this.config = config;
|
17409
17414
|
this.typeSupported = typeSupported;
|
17415
|
+
this.logger = logger;
|
17410
17416
|
this.ISGenerated = false;
|
17411
17417
|
if (chromeVersion === null) {
|
17412
17418
|
var userAgent = navigator.userAgent || '';
|
@@ -17424,16 +17430,16 @@
|
|
17424
17430
|
this.config = this.videoTrackConfig = this._initPTS = this._initDTS = null;
|
17425
17431
|
};
|
17426
17432
|
_proto.resetTimeStamp = function resetTimeStamp(defaultTimeStamp) {
|
17427
|
-
logger.log('[mp4-remuxer]: initPTS & initDTS reset');
|
17433
|
+
this.logger.log('[mp4-remuxer]: initPTS & initDTS reset');
|
17428
17434
|
this._initPTS = this._initDTS = defaultTimeStamp;
|
17429
17435
|
};
|
17430
17436
|
_proto.resetNextTimestamp = function resetNextTimestamp() {
|
17431
|
-
logger.log('[mp4-remuxer]: reset next timestamp');
|
17437
|
+
this.logger.log('[mp4-remuxer]: reset next timestamp');
|
17432
17438
|
this.isVideoContiguous = false;
|
17433
17439
|
this.isAudioContiguous = false;
|
17434
17440
|
};
|
17435
17441
|
_proto.resetInitSegment = function resetInitSegment() {
|
17436
|
-
logger.log('[mp4-remuxer]: ISGenerated flag reset');
|
17442
|
+
this.logger.log('[mp4-remuxer]: ISGenerated flag reset');
|
17437
17443
|
this.ISGenerated = false;
|
17438
17444
|
this.videoTrackConfig = undefined;
|
17439
17445
|
};
|
@@ -17452,7 +17458,7 @@
|
|
17452
17458
|
}
|
17453
17459
|
}, videoSamples[0].pts);
|
17454
17460
|
if (rolloverDetected) {
|
17455
|
-
logger.debug('PTS rollover detected');
|
17461
|
+
this.logger.debug('PTS rollover detected');
|
17456
17462
|
}
|
17457
17463
|
return startPTS;
|
17458
17464
|
};
|
@@ -17496,14 +17502,14 @@
|
|
17496
17502
|
if (!isVideoContiguous && this.config.forceKeyFrameOnDiscontinuity) {
|
17497
17503
|
independent = true;
|
17498
17504
|
if (firstKeyFrameIndex > 0) {
|
17499
|
-
logger.warn("[mp4-remuxer]: Dropped " + firstKeyFrameIndex + " out of " + length + " video samples due to a missing keyframe");
|
17505
|
+
this.logger.warn("[mp4-remuxer]: Dropped " + firstKeyFrameIndex + " out of " + length + " video samples due to a missing keyframe");
|
17500
17506
|
var startPTS = this.getVideoStartPts(videoTrack.samples);
|
17501
17507
|
videoTrack.samples = videoTrack.samples.slice(firstKeyFrameIndex);
|
17502
17508
|
videoTrack.dropped += firstKeyFrameIndex;
|
17503
17509
|
videoTimeOffset += (videoTrack.samples[0].pts - startPTS) / videoTrack.inputTimeScale;
|
17504
17510
|
firstKeyFramePTS = videoTimeOffset;
|
17505
17511
|
} else if (firstKeyFrameIndex === -1) {
|
17506
|
-
logger.warn("[mp4-remuxer]: No keyframe found out of " + length + " video samples");
|
17512
|
+
this.logger.warn("[mp4-remuxer]: No keyframe found out of " + length + " video samples");
|
17507
17513
|
independent = false;
|
17508
17514
|
}
|
17509
17515
|
}
|
@@ -17525,7 +17531,7 @@
|
|
17525
17531
|
if (enoughAudioSamples) {
|
17526
17532
|
// if initSegment was generated without audio samples, regenerate it again
|
17527
17533
|
if (!audioTrack.samplerate) {
|
17528
|
-
logger.warn('[mp4-remuxer]: regenerate InitSegment as audio detected');
|
17534
|
+
this.logger.warn('[mp4-remuxer]: regenerate InitSegment as audio detected');
|
17529
17535
|
initSegment = this.generateIS(audioTrack, videoTrack, timeOffset, accurateTimeOffset);
|
17530
17536
|
}
|
17531
17537
|
audio = this.remuxAudio(audioTrack, audioTimeOffset, this.isAudioContiguous, accurateTimeOffset, hasVideo || enoughVideoSamples || playlistType === PlaylistLevelType.AUDIO ? videoTimeOffset : undefined);
|
@@ -17533,7 +17539,7 @@
|
|
17533
17539
|
var audioTrackLength = audio ? audio.endPTS - audio.startPTS : 0;
|
17534
17540
|
// if initSegment was generated without video samples, regenerate it again
|
17535
17541
|
if (!videoTrack.inputTimeScale) {
|
17536
|
-
logger.warn('[mp4-remuxer]: regenerate InitSegment as video detected');
|
17542
|
+
this.logger.warn('[mp4-remuxer]: regenerate InitSegment as video detected');
|
17537
17543
|
initSegment = this.generateIS(audioTrack, videoTrack, timeOffset, accurateTimeOffset);
|
17538
17544
|
}
|
17539
17545
|
video = this.remuxVideo(videoTrack, videoTimeOffset, isVideoContiguous, audioTrackLength);
|
@@ -17739,9 +17745,9 @@
|
|
17739
17745
|
var foundOverlap = delta < -1;
|
17740
17746
|
if (foundHole || foundOverlap) {
|
17741
17747
|
if (foundHole) {
|
17742
|
-
logger.warn((track.segmentCodec || '').toUpperCase() + ": " + toMsFromMpegTsClock(delta, true) + " ms (" + delta + "dts) hole between fragments detected at " + timeOffset.toFixed(3));
|
17748
|
+
this.logger.warn((track.segmentCodec || '').toUpperCase() + ": " + toMsFromMpegTsClock(delta, true) + " ms (" + delta + "dts) hole between fragments detected at " + timeOffset.toFixed(3));
|
17743
17749
|
} else {
|
17744
|
-
logger.warn((track.segmentCodec || '').toUpperCase() + ": " + toMsFromMpegTsClock(-delta, true) + " ms (" + delta + "dts) overlapping between fragments detected at " + timeOffset.toFixed(3));
|
17750
|
+
this.logger.warn((track.segmentCodec || '').toUpperCase() + ": " + toMsFromMpegTsClock(-delta, true) + " ms (" + delta + "dts) overlapping between fragments detected at " + timeOffset.toFixed(3));
|
17745
17751
|
}
|
17746
17752
|
if (!foundOverlap || nextAvcDts >= inputSamples[0].pts || chromeVersion) {
|
17747
17753
|
firstDTS = nextAvcDts;
|
@@ -17770,7 +17776,7 @@
|
|
17770
17776
|
}
|
17771
17777
|
}
|
17772
17778
|
}
|
17773
|
-
logger.log("Video: Initial PTS/DTS adjusted: " + toMsFromMpegTsClock(firstPTS, true) + "/" + toMsFromMpegTsClock(firstDTS, true) + ", delta: " + toMsFromMpegTsClock(delta, true) + " ms");
|
17779
|
+
this.logger.log("Video: Initial PTS/DTS adjusted: " + toMsFromMpegTsClock(firstPTS, true) + "/" + toMsFromMpegTsClock(firstDTS, true) + ", delta: " + toMsFromMpegTsClock(delta, true) + " ms");
|
17774
17780
|
}
|
17775
17781
|
}
|
17776
17782
|
}
|
@@ -17870,7 +17876,7 @@
|
|
17870
17876
|
} else {
|
17871
17877
|
stretchedLastFrame = true;
|
17872
17878
|
}
|
17873
|
-
logger.log("[mp4-remuxer]: It is approximately " + deltaToFrameEnd / 90 + " ms to the next segment; using duration " + mp4SampleDuration / 90 + " ms for the last video frame.");
|
17879
|
+
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.");
|
17874
17880
|
} else {
|
17875
17881
|
mp4SampleDuration = lastFrameDuration;
|
17876
17882
|
}
|
@@ -17898,7 +17904,7 @@
|
|
17898
17904
|
// Fix for "CNN special report, with CC" in test-streams (Safari browser only)
|
17899
17905
|
// Ignore DTS when frame durations are irregular. Safari MSE does not handle this leading to gaps.
|
17900
17906
|
if (maxPtsDelta - minPtsDelta < maxDtsDelta - minDtsDelta && averageSampleDuration / maxDtsDelta < 0.025 && outputSamples[0].cts === 0) {
|
17901
|
-
logger.warn('Found irregular gaps in sample duration. Using PTS instead of DTS to determine MP4 sample duration.');
|
17907
|
+
this.logger.warn('Found irregular gaps in sample duration. Using PTS instead of DTS to determine MP4 sample duration.');
|
17902
17908
|
var dts = firstDTS;
|
17903
17909
|
for (var _i4 = 0, len = outputSamples.length; _i4 < len; _i4++) {
|
17904
17910
|
var nextDts = dts + outputSamples[_i4].duration;
|
@@ -18025,7 +18031,7 @@
|
|
18025
18031
|
// When remuxing with video, if we're overlapping by more than a duration, drop this sample to stay in sync
|
18026
18032
|
if (delta <= -maxAudioFramesDrift * inputSampleDuration && alignedWithVideo) {
|
18027
18033
|
if (i === 0) {
|
18028
|
-
logger.warn("Audio frame @ " + (pts / inputTimeScale).toFixed(3) + "s overlaps nextAudioPts by " + Math.round(1000 * delta / inputTimeScale) + " ms.");
|
18034
|
+
this.logger.warn("Audio frame @ " + (pts / inputTimeScale).toFixed(3) + "s overlaps nextAudioPts by " + Math.round(1000 * delta / inputTimeScale) + " ms.");
|
18029
18035
|
this.nextAudioPts = nextAudioPts = nextPts = pts;
|
18030
18036
|
}
|
18031
18037
|
} // eslint-disable-line brace-style
|
@@ -18047,12 +18053,12 @@
|
|
18047
18053
|
if (i === 0) {
|
18048
18054
|
this.nextAudioPts = nextAudioPts = nextPts;
|
18049
18055
|
}
|
18050
|
-
logger.warn("[mp4-remuxer]: Injecting " + missing + " audio frame @ " + (nextPts / inputTimeScale).toFixed(3) + "s due to " + Math.round(1000 * delta / inputTimeScale) + " ms gap.");
|
18056
|
+
this.logger.warn("[mp4-remuxer]: Injecting " + missing + " audio frame @ " + (nextPts / inputTimeScale).toFixed(3) + "s due to " + Math.round(1000 * delta / inputTimeScale) + " ms gap.");
|
18051
18057
|
for (var j = 0; j < missing; j++) {
|
18052
18058
|
var newStamp = Math.max(nextPts, 0);
|
18053
18059
|
var fillFrame = AAC.getSilentFrame(track.parsedCodec || track.manifestCodec || track.codec, track.channelCount);
|
18054
18060
|
if (!fillFrame) {
|
18055
|
-
logger.log('[mp4-remuxer]: Unable to get silent frame for given audio codec; duplicating last frame instead.');
|
18061
|
+
this.logger.log('[mp4-remuxer]: Unable to get silent frame for given audio codec; duplicating last frame instead.');
|
18056
18062
|
fillFrame = sample.unit.subarray();
|
18057
18063
|
}
|
18058
18064
|
inputSamples.splice(i, 0, {
|
@@ -18252,7 +18258,8 @@
|
|
18252
18258
|
};
|
18253
18259
|
|
18254
18260
|
var PassThroughRemuxer = /*#__PURE__*/function () {
|
18255
|
-
function PassThroughRemuxer() {
|
18261
|
+
function PassThroughRemuxer(observer, config, typeSupported, logger) {
|
18262
|
+
this.logger = void 0;
|
18256
18263
|
this.emitInitSegment = false;
|
18257
18264
|
this.audioCodec = void 0;
|
18258
18265
|
this.videoCodec = void 0;
|
@@ -18260,6 +18267,7 @@
|
|
18260
18267
|
this.initPTS = null;
|
18261
18268
|
this.initTracks = void 0;
|
18262
18269
|
this.lastEndTime = null;
|
18270
|
+
this.logger = logger;
|
18263
18271
|
}
|
18264
18272
|
var _proto = PassThroughRemuxer.prototype;
|
18265
18273
|
_proto.destroy = function destroy() {};
|
@@ -18316,7 +18324,7 @@
|
|
18316
18324
|
id: 'main'
|
18317
18325
|
};
|
18318
18326
|
} else {
|
18319
|
-
logger.warn('[passthrough-remuxer.ts]: initSegment does not contain moov or trak boxes.');
|
18327
|
+
this.logger.warn('[passthrough-remuxer.ts]: initSegment does not contain moov or trak boxes.');
|
18320
18328
|
}
|
18321
18329
|
this.initTracks = tracks;
|
18322
18330
|
};
|
@@ -18356,7 +18364,7 @@
|
|
18356
18364
|
}
|
18357
18365
|
if (!((_initData2 = initData) != null && _initData2.length)) {
|
18358
18366
|
// We can't remux if the initSegment could not be generated
|
18359
|
-
logger.warn('[passthrough-remuxer.ts]: Failed to generate initSegment.');
|
18367
|
+
this.logger.warn('[passthrough-remuxer.ts]: Failed to generate initSegment.');
|
18360
18368
|
return result;
|
18361
18369
|
}
|
18362
18370
|
if (this.emitInitSegment) {
|
@@ -18369,7 +18377,7 @@
|
|
18369
18377
|
if (isInvalidInitPts(initPTS, decodeTime, timeOffset, duration) || initSegment.timescale !== initPTS.timescale && accurateTimeOffset) {
|
18370
18378
|
initSegment.initPTS = decodeTime - timeOffset;
|
18371
18379
|
if (initPTS && initPTS.timescale === 1) {
|
18372
|
-
logger.warn("Adjusting initPTS @" + timeOffset + " from " + initPTS.baseTime / initPTS.timescale + " to " + initSegment.initPTS);
|
18380
|
+
this.logger.warn("Adjusting initPTS @" + timeOffset + " from " + initPTS.baseTime / initPTS.timescale + " to " + initSegment.initPTS);
|
18373
18381
|
}
|
18374
18382
|
this.initPTS = initPTS = {
|
18375
18383
|
baseTime: initSegment.initPTS,
|
@@ -18382,7 +18390,7 @@
|
|
18382
18390
|
if (duration > 0) {
|
18383
18391
|
this.lastEndTime = endTime;
|
18384
18392
|
} else {
|
18385
|
-
logger.warn('Duration parsed from mp4 should be greater than zero');
|
18393
|
+
this.logger.warn('Duration parsed from mp4 should be greater than zero');
|
18386
18394
|
this.resetNextTimestamp();
|
18387
18395
|
}
|
18388
18396
|
var hasAudio = !!initData.audio;
|
@@ -18441,12 +18449,12 @@
|
|
18441
18449
|
return getCodecCompatibleName(parsedCodec, preferManagedMediaSource);
|
18442
18450
|
}
|
18443
18451
|
var result = 'mp4a.40.5';
|
18444
|
-
logger.info("Parsed audio codec \"" + parsedCodec + "\" or audio object type not handled. Using \"" + result + "\"");
|
18452
|
+
this.logger.info("Parsed audio codec \"" + parsedCodec + "\" or audio object type not handled. Using \"" + result + "\"");
|
18445
18453
|
return result;
|
18446
18454
|
}
|
18447
18455
|
// Provide defaults based on codec type
|
18448
18456
|
// This allows for some playback of some fmp4 playlists without CODECS defined in manifest
|
18449
|
-
logger.warn("Unhandled video codec \"" + parsedCodec + "\"");
|
18457
|
+
this.logger.warn("Unhandled video codec \"" + parsedCodec + "\"");
|
18450
18458
|
if (parsedCodec === 'hvc1' || parsedCodec === 'hev1') {
|
18451
18459
|
return 'hvc1.1.6.L120.90';
|
18452
18460
|
}
|
@@ -18456,16 +18464,12 @@
|
|
18456
18464
|
return 'avc1.42e01e';
|
18457
18465
|
}
|
18458
18466
|
|
18459
|
-
/** returns `undefined` is `self` is missing, e.g. in node */
|
18460
|
-
var optionalSelf = typeof self !== 'undefined' ? self : undefined;
|
18461
|
-
|
18462
18467
|
var now;
|
18463
18468
|
// performance.now() not available on WebWorker, at least on Safari Desktop
|
18464
18469
|
try {
|
18465
18470
|
now = self.performance.now.bind(self.performance);
|
18466
18471
|
} catch (err) {
|
18467
|
-
|
18468
|
-
now = optionalSelf == null ? void 0 : optionalSelf.Date.now;
|
18472
|
+
now = Date.now;
|
18469
18473
|
}
|
18470
18474
|
var muxConfig = [{
|
18471
18475
|
demux: MP4Demuxer,
|
@@ -18481,8 +18485,9 @@
|
|
18481
18485
|
remux: MP4Remuxer
|
18482
18486
|
}];
|
18483
18487
|
var Transmuxer = /*#__PURE__*/function () {
|
18484
|
-
function Transmuxer(observer, typeSupported, config, vendor, id) {
|
18485
|
-
this.
|
18488
|
+
function Transmuxer(observer, typeSupported, config, vendor, id, logger) {
|
18489
|
+
this.asyncResult = false;
|
18490
|
+
this.logger = void 0;
|
18486
18491
|
this.observer = void 0;
|
18487
18492
|
this.typeSupported = void 0;
|
18488
18493
|
this.config = void 0;
|
@@ -18500,6 +18505,7 @@
|
|
18500
18505
|
this.config = config;
|
18501
18506
|
this.vendor = vendor;
|
18502
18507
|
this.id = id;
|
18508
|
+
this.logger = logger;
|
18503
18509
|
}
|
18504
18510
|
var _proto = Transmuxer.prototype;
|
18505
18511
|
_proto.configure = function configure(transmuxConfig) {
|
@@ -18551,6 +18557,7 @@
|
|
18551
18557
|
}
|
18552
18558
|
uintData = new Uint8Array(decryptedData);
|
18553
18559
|
} else {
|
18560
|
+
this.asyncResult = true;
|
18554
18561
|
this.decryptionPromise = decrypter.webCryptoDecrypt(uintData, keyData.key.buffer, keyData.iv.buffer, aesMode).then(function (decryptedData) {
|
18555
18562
|
// Calling push here is important; if flush() is called while this is still resolving, this ensures that
|
18556
18563
|
// the decrypted data has been transmuxed
|
@@ -18565,7 +18572,7 @@
|
|
18565
18572
|
if (resetMuxers) {
|
18566
18573
|
var error = this.configureTransmuxer(uintData);
|
18567
18574
|
if (error) {
|
18568
|
-
logger.warn("[transmuxer] " + error.message);
|
18575
|
+
this.logger.warn("[transmuxer] " + error.message);
|
18569
18576
|
this.observer.emit(Events.ERROR, Events.ERROR, {
|
18570
18577
|
type: ErrorTypes.MEDIA_ERROR,
|
18571
18578
|
details: ErrorDetails.FRAG_PARSING_ERROR,
|
@@ -18587,6 +18594,7 @@
|
|
18587
18594
|
this.resetContiguity();
|
18588
18595
|
}
|
18589
18596
|
var result = this.transmux(uintData, keyData, timeOffset, accurateTimeOffset, chunkMeta);
|
18597
|
+
this.asyncResult = isPromise(result);
|
18590
18598
|
var currentState = this.currentTransmuxState;
|
18591
18599
|
currentState.contiguous = true;
|
18592
18600
|
currentState.discontinuity = false;
|
@@ -18605,6 +18613,7 @@
|
|
18605
18613
|
currentTransmuxState = this.currentTransmuxState,
|
18606
18614
|
decryptionPromise = this.decryptionPromise;
|
18607
18615
|
if (decryptionPromise) {
|
18616
|
+
this.asyncResult = true;
|
18608
18617
|
// Upon resolution, the decryption promise calls push() and returns its TransmuxerResult up the stack. Therefore
|
18609
18618
|
// only flushing is required for async decryption
|
18610
18619
|
return decryptionPromise.then(function () {
|
@@ -18628,10 +18637,15 @@
|
|
18628
18637
|
if (!demuxer || !remuxer) {
|
18629
18638
|
// If probing failed, then Hls.js has been given content its not able to handle
|
18630
18639
|
stats.executeEnd = now();
|
18631
|
-
|
18640
|
+
var emptyResults = [emptyResult(chunkMeta)];
|
18641
|
+
if (this.asyncResult) {
|
18642
|
+
return Promise.resolve(emptyResults);
|
18643
|
+
}
|
18644
|
+
return emptyResults;
|
18632
18645
|
}
|
18633
18646
|
var demuxResultOrPromise = demuxer.flush(timeOffset);
|
18634
18647
|
if (isPromise(demuxResultOrPromise)) {
|
18648
|
+
this.asyncResult = true;
|
18635
18649
|
// Decrypt final SAMPLE-AES samples
|
18636
18650
|
return demuxResultOrPromise.then(function (demuxResult) {
|
18637
18651
|
_this2.flushRemux(transmuxResults, demuxResult, chunkMeta);
|
@@ -18639,6 +18653,9 @@
|
|
18639
18653
|
});
|
18640
18654
|
}
|
18641
18655
|
this.flushRemux(transmuxResults, demuxResultOrPromise, chunkMeta);
|
18656
|
+
if (this.asyncResult) {
|
18657
|
+
return Promise.resolve(transmuxResults);
|
18658
|
+
}
|
18642
18659
|
return transmuxResults;
|
18643
18660
|
};
|
18644
18661
|
_proto.flushRemux = function flushRemux(transmuxResults, demuxResult, chunkMeta) {
|
@@ -18649,7 +18666,7 @@
|
|
18649
18666
|
var _this$currentTransmux = this.currentTransmuxState,
|
18650
18667
|
accurateTimeOffset = _this$currentTransmux.accurateTimeOffset,
|
18651
18668
|
timeOffset = _this$currentTransmux.timeOffset;
|
18652
|
-
logger.log("[transmuxer.ts]: Flushed
|
18669
|
+
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);
|
18653
18670
|
var remuxResult = this.remuxer.remux(audioTrack, videoTrack, id3Track, textTrack, timeOffset, accurateTimeOffset, true, this.id);
|
18654
18671
|
transmuxResults.push({
|
18655
18672
|
remuxResult: remuxResult,
|
@@ -18728,13 +18745,13 @@
|
|
18728
18745
|
_proto.configureTransmuxer = function configureTransmuxer(data) {
|
18729
18746
|
var config = this.config,
|
18730
18747
|
observer = this.observer,
|
18731
|
-
typeSupported = this.typeSupported
|
18732
|
-
|
18748
|
+
typeSupported = this.typeSupported;
|
18749
|
+
this.vendor;
|
18733
18750
|
// probe for content type
|
18734
18751
|
var mux;
|
18735
18752
|
for (var i = 0, len = muxConfig.length; i < len; i++) {
|
18736
18753
|
var _muxConfig$i$demux;
|
18737
|
-
if ((_muxConfig$i$demux = muxConfig[i].demux) != null && _muxConfig$i$demux.probe(data)) {
|
18754
|
+
if ((_muxConfig$i$demux = muxConfig[i].demux) != null && _muxConfig$i$demux.probe(data, this.logger)) {
|
18738
18755
|
mux = muxConfig[i];
|
18739
18756
|
break;
|
18740
18757
|
}
|
@@ -18748,10 +18765,10 @@
|
|
18748
18765
|
var Remuxer = mux.remux;
|
18749
18766
|
var Demuxer = mux.demux;
|
18750
18767
|
if (!remuxer || !(remuxer instanceof Remuxer)) {
|
18751
|
-
this.remuxer = new Remuxer(observer, config, typeSupported,
|
18768
|
+
this.remuxer = new Remuxer(observer, config, typeSupported, this.logger);
|
18752
18769
|
}
|
18753
18770
|
if (!demuxer || !(demuxer instanceof Demuxer)) {
|
18754
|
-
this.demuxer = new Demuxer(observer, config, typeSupported);
|
18771
|
+
this.demuxer = new Demuxer(observer, config, typeSupported, this.logger);
|
18755
18772
|
this.probe = Demuxer.probe;
|
18756
18773
|
}
|
18757
18774
|
};
|
@@ -19155,63 +19172,54 @@
|
|
19155
19172
|
var eventemitter3Exports = eventemitter3.exports;
|
19156
19173
|
var EventEmitter = /*@__PURE__*/getDefaultExportFromCjs(eventemitter3Exports);
|
19157
19174
|
|
19175
|
+
var transmuxers = [];
|
19158
19176
|
if (typeof __IN_WORKER__ !== 'undefined' && __IN_WORKER__) {
|
19159
|
-
startWorker(
|
19177
|
+
startWorker();
|
19160
19178
|
}
|
19161
|
-
function startWorker(
|
19162
|
-
var observer = new EventEmitter();
|
19163
|
-
var forwardMessage = function forwardMessage(ev, data) {
|
19164
|
-
self.postMessage({
|
19165
|
-
event: ev,
|
19166
|
-
data: data
|
19167
|
-
});
|
19168
|
-
};
|
19169
|
-
|
19170
|
-
// forward events to main thread
|
19171
|
-
observer.on(Events.FRAG_DECRYPTED, forwardMessage);
|
19172
|
-
observer.on(Events.ERROR, forwardMessage);
|
19173
|
-
|
19174
|
-
// forward logger events to main thread
|
19175
|
-
var forwardWorkerLogs = function forwardWorkerLogs(logger) {
|
19176
|
-
var _loop = function _loop(logFn) {
|
19177
|
-
var func = function func(message) {
|
19178
|
-
forwardMessage('workerLog', {
|
19179
|
-
logType: logFn,
|
19180
|
-
message: message
|
19181
|
-
});
|
19182
|
-
};
|
19183
|
-
logger[logFn] = func;
|
19184
|
-
};
|
19185
|
-
for (var logFn in logger) {
|
19186
|
-
_loop(logFn);
|
19187
|
-
}
|
19188
|
-
};
|
19179
|
+
function startWorker() {
|
19189
19180
|
self.addEventListener('message', function (ev) {
|
19190
19181
|
var data = ev.data;
|
19182
|
+
var instanceNo = data.instanceNo;
|
19183
|
+
if (instanceNo === undefined) {
|
19184
|
+
return;
|
19185
|
+
}
|
19186
|
+
var transmuxer = transmuxers[instanceNo];
|
19187
|
+
if (data.cmd === 'reset') {
|
19188
|
+
delete transmuxers[data.resetNo];
|
19189
|
+
if (transmuxer) {
|
19190
|
+
transmuxer.destroy();
|
19191
|
+
}
|
19192
|
+
data.cmd = 'init';
|
19193
|
+
}
|
19194
|
+
if (data.cmd === 'init') {
|
19195
|
+
var config = JSON.parse(data.config);
|
19196
|
+
var observer = new EventEmitter();
|
19197
|
+
observer.on(Events.FRAG_DECRYPTED, forwardMessage);
|
19198
|
+
observer.on(Events.ERROR, forwardMessage);
|
19199
|
+
var logger = enableLogs(config.debug, data.id);
|
19200
|
+
forwardWorkerLogs(logger, instanceNo);
|
19201
|
+
transmuxers[instanceNo] = new Transmuxer(observer, data.typeSupported, config, '', data.id, logger);
|
19202
|
+
forwardMessage('init', null, instanceNo);
|
19203
|
+
return;
|
19204
|
+
}
|
19205
|
+
if (!transmuxer) {
|
19206
|
+
return;
|
19207
|
+
}
|
19191
19208
|
switch (data.cmd) {
|
19192
|
-
case 'init':
|
19193
|
-
{
|
19194
|
-
var config = JSON.parse(data.config);
|
19195
|
-
self.transmuxer = new Transmuxer(observer, data.typeSupported, config, '', data.id);
|
19196
|
-
var logger = enableLogs(config.debug, data.id);
|
19197
|
-
forwardWorkerLogs(logger);
|
19198
|
-
forwardMessage('init', null);
|
19199
|
-
break;
|
19200
|
-
}
|
19201
19209
|
case 'configure':
|
19202
19210
|
{
|
19203
|
-
|
19211
|
+
transmuxer.configure(data.config);
|
19204
19212
|
break;
|
19205
19213
|
}
|
19206
19214
|
case 'demux':
|
19207
19215
|
{
|
19208
|
-
var transmuxResult =
|
19216
|
+
var transmuxResult = transmuxer.push(data.data, data.decryptdata, data.chunkMeta, data.state);
|
19209
19217
|
if (isPromise(transmuxResult)) {
|
19210
|
-
self.transmuxer.async = true;
|
19211
19218
|
transmuxResult.then(function (data) {
|
19212
|
-
emitTransmuxComplete(self, data);
|
19219
|
+
emitTransmuxComplete(self, data, instanceNo);
|
19213
19220
|
}).catch(function (error) {
|
19214
19221
|
forwardMessage(Events.ERROR, {
|
19222
|
+
instanceNo: instanceNo,
|
19215
19223
|
type: ErrorTypes.MEDIA_ERROR,
|
19216
19224
|
details: ErrorDetails.FRAG_PARSING_ERROR,
|
19217
19225
|
chunkMeta: data.chunkMeta,
|
@@ -19219,25 +19227,20 @@
|
|
19219
19227
|
error: error,
|
19220
19228
|
err: error,
|
19221
19229
|
reason: "transmuxer-worker push error"
|
19222
|
-
});
|
19230
|
+
}, instanceNo);
|
19223
19231
|
});
|
19224
19232
|
} else {
|
19225
|
-
self
|
19226
|
-
emitTransmuxComplete(self, transmuxResult);
|
19233
|
+
emitTransmuxComplete(self, transmuxResult, instanceNo);
|
19227
19234
|
}
|
19228
19235
|
break;
|
19229
19236
|
}
|
19230
19237
|
case 'flush':
|
19231
19238
|
{
|
19232
|
-
var
|
19233
|
-
var _transmuxResult =
|
19234
|
-
|
19235
|
-
if (asyncFlush || self.transmuxer.async) {
|
19236
|
-
if (!isPromise(_transmuxResult)) {
|
19237
|
-
_transmuxResult = Promise.resolve(_transmuxResult);
|
19238
|
-
}
|
19239
|
+
var chunkMeta = data.chunkMeta;
|
19240
|
+
var _transmuxResult = transmuxer.flush(chunkMeta);
|
19241
|
+
if (isPromise(_transmuxResult)) {
|
19239
19242
|
_transmuxResult.then(function (results) {
|
19240
|
-
handleFlushResult(self, results,
|
19243
|
+
handleFlushResult(self, results, chunkMeta, instanceNo);
|
19241
19244
|
}).catch(function (error) {
|
19242
19245
|
forwardMessage(Events.ERROR, {
|
19243
19246
|
type: ErrorTypes.MEDIA_ERROR,
|
@@ -19247,17 +19250,17 @@
|
|
19247
19250
|
error: error,
|
19248
19251
|
err: error,
|
19249
19252
|
reason: "transmuxer-worker flush error"
|
19250
|
-
});
|
19253
|
+
}, instanceNo);
|
19251
19254
|
});
|
19252
19255
|
} else {
|
19253
|
-
handleFlushResult(self, _transmuxResult,
|
19256
|
+
handleFlushResult(self, _transmuxResult, chunkMeta, instanceNo);
|
19254
19257
|
}
|
19255
19258
|
break;
|
19256
19259
|
}
|
19257
19260
|
}
|
19258
19261
|
});
|
19259
19262
|
}
|
19260
|
-
function emitTransmuxComplete(self, transmuxResult) {
|
19263
|
+
function emitTransmuxComplete(self, transmuxResult, instanceNo) {
|
19261
19264
|
if (isEmptyResult(transmuxResult.remuxResult)) {
|
19262
19265
|
return false;
|
19263
19266
|
}
|
@@ -19273,7 +19276,8 @@
|
|
19273
19276
|
}
|
19274
19277
|
self.postMessage({
|
19275
19278
|
event: 'transmuxComplete',
|
19276
|
-
data: transmuxResult
|
19279
|
+
data: transmuxResult,
|
19280
|
+
instanceNo: instanceNo
|
19277
19281
|
}, transferable);
|
19278
19282
|
return true;
|
19279
19283
|
}
|
@@ -19288,77 +19292,200 @@
|
|
19288
19292
|
transferable.push(track.data2.buffer);
|
19289
19293
|
}
|
19290
19294
|
}
|
19291
|
-
function handleFlushResult(self, results, chunkMeta) {
|
19295
|
+
function handleFlushResult(self, results, chunkMeta, instanceNo) {
|
19292
19296
|
var parsed = results.reduce(function (parsed, result) {
|
19293
|
-
return emitTransmuxComplete(self, result) || parsed;
|
19297
|
+
return emitTransmuxComplete(self, result, instanceNo) || parsed;
|
19294
19298
|
}, false);
|
19295
19299
|
if (!parsed) {
|
19296
19300
|
// Emit at least one "transmuxComplete" message even if media is not found to update stream-controller state to PARSING
|
19297
19301
|
self.postMessage({
|
19298
19302
|
event: 'transmuxComplete',
|
19299
|
-
data: results[0]
|
19303
|
+
data: results[0],
|
19304
|
+
instanceNo: instanceNo
|
19300
19305
|
});
|
19301
19306
|
}
|
19302
19307
|
self.postMessage({
|
19303
19308
|
event: 'flush',
|
19304
|
-
data: chunkMeta
|
19309
|
+
data: chunkMeta,
|
19310
|
+
instanceNo: instanceNo
|
19311
|
+
});
|
19312
|
+
}
|
19313
|
+
function forwardMessage(event, data, instanceNo) {
|
19314
|
+
self.postMessage({
|
19315
|
+
event: event,
|
19316
|
+
data: data,
|
19317
|
+
instanceNo: instanceNo
|
19305
19318
|
});
|
19306
19319
|
}
|
19320
|
+
function forwardWorkerLogs(logger, instanceNo) {
|
19321
|
+
var _loop = function _loop(logFn) {
|
19322
|
+
var func = function func(message) {
|
19323
|
+
forwardMessage('workerLog', {
|
19324
|
+
logType: logFn,
|
19325
|
+
message: message
|
19326
|
+
}, instanceNo);
|
19327
|
+
};
|
19328
|
+
logger[logFn] = func;
|
19329
|
+
};
|
19330
|
+
for (var logFn in logger) {
|
19331
|
+
_loop(logFn);
|
19332
|
+
}
|
19333
|
+
}
|
19307
19334
|
function isEmptyResult(remuxResult) {
|
19308
19335
|
return !remuxResult.audio && !remuxResult.video && !remuxResult.text && !remuxResult.id3 && !remuxResult.initSegment;
|
19309
19336
|
}
|
19310
19337
|
|
19338
|
+
var version = "1.5.14-0.canary.10432";
|
19339
|
+
|
19311
19340
|
// ensure the worker ends up in the bundle
|
19312
19341
|
// If the worker should not be included this gets aliased to empty.js
|
19342
|
+
var workerStore = {};
|
19313
19343
|
function hasUMDWorker() {
|
19314
19344
|
return typeof __HLS_WORKER_BUNDLE__ === 'function';
|
19315
19345
|
}
|
19316
19346
|
function injectWorker() {
|
19347
|
+
var workerContext = workerStore[version];
|
19348
|
+
if (workerContext) {
|
19349
|
+
workerContext.clientCount++;
|
19350
|
+
return workerContext;
|
19351
|
+
}
|
19317
19352
|
var blob = new self.Blob(["var exports={};var module={exports:exports};function define(f){f()};define.amd=true;(" + __HLS_WORKER_BUNDLE__.toString() + ")(true);"], {
|
19318
19353
|
type: 'text/javascript'
|
19319
19354
|
});
|
19320
19355
|
var objectURL = self.URL.createObjectURL(blob);
|
19321
19356
|
var worker = new self.Worker(objectURL);
|
19322
|
-
|
19357
|
+
var result = {
|
19323
19358
|
worker: worker,
|
19324
|
-
objectURL: objectURL
|
19359
|
+
objectURL: objectURL,
|
19360
|
+
clientCount: 1
|
19325
19361
|
};
|
19362
|
+
workerStore[version] = result;
|
19363
|
+
return result;
|
19326
19364
|
}
|
19327
19365
|
function loadWorker(path) {
|
19366
|
+
var workerContext = workerStore[path];
|
19367
|
+
if (workerContext) {
|
19368
|
+
workerContext.clientCount++;
|
19369
|
+
return workerContext;
|
19370
|
+
}
|
19328
19371
|
var scriptURL = new self.URL(path, self.location.href).href;
|
19329
19372
|
var worker = new self.Worker(scriptURL);
|
19330
|
-
|
19373
|
+
var result = {
|
19331
19374
|
worker: worker,
|
19332
|
-
scriptURL: scriptURL
|
19375
|
+
scriptURL: scriptURL,
|
19376
|
+
clientCount: 1
|
19333
19377
|
};
|
19378
|
+
workerStore[path] = result;
|
19379
|
+
return result;
|
19380
|
+
}
|
19381
|
+
function removeWorkerFromStore(path) {
|
19382
|
+
var workerContext = workerStore[path || version];
|
19383
|
+
if (workerContext) {
|
19384
|
+
var clientCount = workerContext.clientCount--;
|
19385
|
+
if (clientCount === 1) {
|
19386
|
+
var worker = workerContext.worker,
|
19387
|
+
objectURL = workerContext.objectURL;
|
19388
|
+
delete workerStore[path || version];
|
19389
|
+
if (objectURL) {
|
19390
|
+
// revoke the Object URL that was used to create transmuxer worker, so as not to leak it
|
19391
|
+
self.URL.revokeObjectURL(objectURL);
|
19392
|
+
}
|
19393
|
+
worker.terminate();
|
19394
|
+
}
|
19395
|
+
}
|
19334
19396
|
}
|
19335
19397
|
|
19398
|
+
var transmuxerInstanceCount = 0;
|
19336
19399
|
var TransmuxerInterface = /*#__PURE__*/function () {
|
19337
|
-
function TransmuxerInterface(
|
19400
|
+
function TransmuxerInterface(_hls, id, onTransmuxComplete, onFlush) {
|
19338
19401
|
var _this = this;
|
19339
19402
|
this.error = null;
|
19340
19403
|
this.hls = void 0;
|
19341
19404
|
this.id = void 0;
|
19405
|
+
this.instanceNo = transmuxerInstanceCount++;
|
19342
19406
|
this.observer = void 0;
|
19343
19407
|
this.frag = null;
|
19344
19408
|
this.part = null;
|
19345
19409
|
this.useWorker = void 0;
|
19346
19410
|
this.workerContext = null;
|
19347
|
-
this.onwmsg = void 0;
|
19348
19411
|
this.transmuxer = null;
|
19349
19412
|
this.onTransmuxComplete = void 0;
|
19350
19413
|
this.onFlush = void 0;
|
19351
|
-
|
19352
|
-
|
19414
|
+
this.onWorkerMessage = function (event) {
|
19415
|
+
var data = event.data;
|
19416
|
+
var hls = _this.hls;
|
19417
|
+
if (!hls || !(data != null && data.event) || data.instanceNo !== _this.instanceNo) {
|
19418
|
+
return;
|
19419
|
+
}
|
19420
|
+
switch (data.event) {
|
19421
|
+
case 'init':
|
19422
|
+
{
|
19423
|
+
var _this$workerContext;
|
19424
|
+
var objectURL = (_this$workerContext = _this.workerContext) == null ? void 0 : _this$workerContext.objectURL;
|
19425
|
+
if (objectURL) {
|
19426
|
+
// revoke the Object URL that was used to create transmuxer worker, so as not to leak it
|
19427
|
+
self.URL.revokeObjectURL(objectURL);
|
19428
|
+
}
|
19429
|
+
break;
|
19430
|
+
}
|
19431
|
+
case 'transmuxComplete':
|
19432
|
+
{
|
19433
|
+
_this.handleTransmuxComplete(data.data);
|
19434
|
+
break;
|
19435
|
+
}
|
19436
|
+
case 'flush':
|
19437
|
+
{
|
19438
|
+
_this.onFlush(data.data);
|
19439
|
+
break;
|
19440
|
+
}
|
19441
|
+
|
19442
|
+
// pass logs from the worker thread to the main logger
|
19443
|
+
case 'workerLog':
|
19444
|
+
{
|
19445
|
+
if (hls.logger[data.data.logType]) {
|
19446
|
+
hls.logger[data.data.logType](data.data.message);
|
19447
|
+
}
|
19448
|
+
break;
|
19449
|
+
}
|
19450
|
+
default:
|
19451
|
+
{
|
19452
|
+
data.data = data.data || {};
|
19453
|
+
data.data.frag = _this.frag;
|
19454
|
+
data.data.part = _this.part;
|
19455
|
+
data.data.id = _this.id;
|
19456
|
+
hls.trigger(data.event, data.data);
|
19457
|
+
break;
|
19458
|
+
}
|
19459
|
+
}
|
19460
|
+
};
|
19461
|
+
this.onWorkerError = function (event) {
|
19462
|
+
if (!_this.hls) {
|
19463
|
+
return;
|
19464
|
+
}
|
19465
|
+
var error = new Error(event.message + " (" + event.filename + ":" + event.lineno + ")");
|
19466
|
+
_this.hls.config.enableWorker = false;
|
19467
|
+
_this.hls.logger.warn("Error in \"" + _this.id + "\" Web Worker, fallback to inline");
|
19468
|
+
_this.hls.trigger(Events.ERROR, {
|
19469
|
+
type: ErrorTypes.OTHER_ERROR,
|
19470
|
+
details: ErrorDetails.INTERNAL_EXCEPTION,
|
19471
|
+
fatal: false,
|
19472
|
+
event: 'demuxerWorker',
|
19473
|
+
error: error
|
19474
|
+
});
|
19475
|
+
};
|
19476
|
+
var config = _hls.config;
|
19477
|
+
this.hls = _hls;
|
19353
19478
|
this.id = id;
|
19354
19479
|
this.useWorker = !!config.enableWorker;
|
19355
19480
|
this.onTransmuxComplete = onTransmuxComplete;
|
19356
19481
|
this.onFlush = onFlush;
|
19357
19482
|
var forwardMessage = function forwardMessage(ev, data) {
|
19358
19483
|
data = data || {};
|
19359
|
-
data.frag = _this.frag;
|
19360
|
-
data.id = _this.id;
|
19484
|
+
data.frag = _this.frag || undefined;
|
19361
19485
|
if (ev === Events.ERROR) {
|
19486
|
+
data = data;
|
19487
|
+
data.parent = _this.id;
|
19488
|
+
data.part = _this.part;
|
19362
19489
|
_this.error = data.error;
|
19363
19490
|
}
|
19364
19491
|
_this.hls.trigger(ev, data);
|
@@ -19370,6 +19497,7 @@
|
|
19370
19497
|
this.observer.on(Events.ERROR, forwardMessage);
|
19371
19498
|
var m2tsTypeSupported = getM2TSSupportedAudioTypes(config.preferManagedMediaSource);
|
19372
19499
|
if (this.useWorker && typeof Worker !== 'undefined') {
|
19500
|
+
var logger = this.hls.logger;
|
19373
19501
|
var canCreateWorker = config.workerPath || hasUMDWorker();
|
19374
19502
|
if (canCreateWorker) {
|
19375
19503
|
try {
|
@@ -19380,61 +19508,60 @@
|
|
19380
19508
|
logger.log("injecting Web Worker for \"" + id + "\"");
|
19381
19509
|
this.workerContext = injectWorker();
|
19382
19510
|
}
|
19383
|
-
this.onwmsg = function (event) {
|
19384
|
-
return _this.onWorkerMessage(event);
|
19385
|
-
};
|
19386
19511
|
var worker = this.workerContext.worker;
|
19387
|
-
worker.addEventListener('message', this.
|
19388
|
-
worker.
|
19389
|
-
var error = new Error(event.message + " (" + event.filename + ":" + event.lineno + ")");
|
19390
|
-
config.enableWorker = false;
|
19391
|
-
logger.warn("Error in \"" + id + "\" Web Worker, fallback to inline");
|
19392
|
-
_this.hls.trigger(Events.ERROR, {
|
19393
|
-
type: ErrorTypes.OTHER_ERROR,
|
19394
|
-
details: ErrorDetails.INTERNAL_EXCEPTION,
|
19395
|
-
fatal: false,
|
19396
|
-
event: 'demuxerWorker',
|
19397
|
-
error: error
|
19398
|
-
});
|
19399
|
-
};
|
19512
|
+
worker.addEventListener('message', this.onWorkerMessage);
|
19513
|
+
worker.addEventListener('error', this.onWorkerError);
|
19400
19514
|
worker.postMessage({
|
19515
|
+
instanceNo: this.instanceNo,
|
19401
19516
|
cmd: 'init',
|
19402
19517
|
typeSupported: m2tsTypeSupported,
|
19403
|
-
vendor: '',
|
19404
19518
|
id: id,
|
19405
19519
|
config: JSON.stringify(config)
|
19406
19520
|
});
|
19407
19521
|
} catch (err) {
|
19408
19522
|
logger.warn("Error setting up \"" + id + "\" Web Worker, fallback to inline", err);
|
19409
|
-
this.
|
19523
|
+
this.terminateWorker();
|
19410
19524
|
this.error = null;
|
19411
|
-
this.transmuxer = new Transmuxer(this.observer, m2tsTypeSupported, config, '', id);
|
19525
|
+
this.transmuxer = new Transmuxer(this.observer, m2tsTypeSupported, config, '', id, _hls.logger);
|
19412
19526
|
}
|
19413
19527
|
return;
|
19414
19528
|
}
|
19415
19529
|
}
|
19416
|
-
this.transmuxer = new Transmuxer(this.observer, m2tsTypeSupported, config, '', id);
|
19530
|
+
this.transmuxer = new Transmuxer(this.observer, m2tsTypeSupported, config, '', id, _hls.logger);
|
19417
19531
|
}
|
19418
19532
|
var _proto = TransmuxerInterface.prototype;
|
19419
|
-
_proto.
|
19533
|
+
_proto.reset = function reset() {
|
19534
|
+
this.frag = null;
|
19535
|
+
this.part = null;
|
19420
19536
|
if (this.workerContext) {
|
19421
|
-
var
|
19422
|
-
|
19423
|
-
|
19424
|
-
|
19425
|
-
|
19426
|
-
|
19427
|
-
|
19428
|
-
|
19429
|
-
|
19430
|
-
|
19537
|
+
var instanceNo = this.instanceNo;
|
19538
|
+
this.instanceNo = transmuxerInstanceCount++;
|
19539
|
+
var config = this.hls.config;
|
19540
|
+
var m2tsTypeSupported = getM2TSSupportedAudioTypes(config.preferManagedMediaSource);
|
19541
|
+
this.workerContext.worker.postMessage({
|
19542
|
+
instanceNo: this.instanceNo,
|
19543
|
+
cmd: 'reset',
|
19544
|
+
resetNo: instanceNo,
|
19545
|
+
typeSupported: m2tsTypeSupported,
|
19546
|
+
id: this.id,
|
19547
|
+
config: JSON.stringify(config)
|
19548
|
+
});
|
19549
|
+
}
|
19550
|
+
};
|
19551
|
+
_proto.terminateWorker = function terminateWorker() {
|
19552
|
+
if (this.workerContext) {
|
19553
|
+
var worker = this.workerContext.worker;
|
19431
19554
|
this.workerContext = null;
|
19555
|
+
worker.removeEventListener('message', this.onWorkerMessage);
|
19556
|
+
worker.removeEventListener('error', this.onWorkerError);
|
19557
|
+
removeWorkerFromStore(this.hls.config.workerPath);
|
19432
19558
|
}
|
19433
19559
|
};
|
19434
19560
|
_proto.destroy = function destroy() {
|
19435
19561
|
if (this.workerContext) {
|
19436
|
-
this.
|
19437
|
-
|
19562
|
+
this.terminateWorker();
|
19563
|
+
// @ts-ignore
|
19564
|
+
this.onWorkerMessage = this.onWorkerError = null;
|
19438
19565
|
} else {
|
19439
19566
|
var transmuxer = this.transmuxer;
|
19440
19567
|
if (transmuxer) {
|
@@ -19447,6 +19574,7 @@
|
|
19447
19574
|
observer.removeAllListeners();
|
19448
19575
|
}
|
19449
19576
|
this.frag = null;
|
19577
|
+
this.part = null;
|
19450
19578
|
// @ts-ignore
|
19451
19579
|
this.observer = null;
|
19452
19580
|
// @ts-ignore
|
@@ -19457,7 +19585,8 @@
|
|
19457
19585
|
_lastFrag$initSegment,
|
19458
19586
|
_this2 = this;
|
19459
19587
|
chunkMeta.transmuxing.start = self.performance.now();
|
19460
|
-
var
|
19588
|
+
var instanceNo = this.instanceNo,
|
19589
|
+
transmuxer = this.transmuxer;
|
19461
19590
|
var timeOffset = part ? part.start : frag.start;
|
19462
19591
|
// TODO: push "clear-lead" decrypt data for unencrypted fragments in streams with encrypted ones
|
19463
19592
|
var decryptdata = frag.decryptdata;
|
@@ -19478,7 +19607,7 @@
|
|
19478
19607
|
var initSegmentChange = !(lastFrag && ((_frag$initSegment = frag.initSegment) == null ? void 0 : _frag$initSegment.url) === ((_lastFrag$initSegment = lastFrag.initSegment) == null ? void 0 : _lastFrag$initSegment.url));
|
19479
19608
|
var state = new TransmuxState(discontinuity, contiguous, accurateTimeOffset, trackSwitch, timeOffset, initSegmentChange);
|
19480
19609
|
if (!contiguous || discontinuity || initSegmentChange) {
|
19481
|
-
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);
|
19610
|
+
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);
|
19482
19611
|
var config = new TransmuxConfig(audioCodec, videoCodec, initSegmentData, duration, defaultInitPTS);
|
19483
19612
|
this.configureTransmuxer(config);
|
19484
19613
|
}
|
@@ -19489,6 +19618,7 @@
|
|
19489
19618
|
if (this.workerContext) {
|
19490
19619
|
// post fragment payload as transferable objects for ArrayBuffer (no copy)
|
19491
19620
|
this.workerContext.worker.postMessage({
|
19621
|
+
instanceNo: instanceNo,
|
19492
19622
|
cmd: 'demux',
|
19493
19623
|
data: data,
|
19494
19624
|
decryptdata: decryptdata,
|
@@ -19498,14 +19628,12 @@
|
|
19498
19628
|
} else if (transmuxer) {
|
19499
19629
|
var transmuxResult = transmuxer.push(data, decryptdata, chunkMeta, state);
|
19500
19630
|
if (isPromise(transmuxResult)) {
|
19501
|
-
transmuxer.async = true;
|
19502
19631
|
transmuxResult.then(function (data) {
|
19503
19632
|
_this2.handleTransmuxComplete(data);
|
19504
19633
|
}).catch(function (error) {
|
19505
19634
|
_this2.transmuxerError(error, chunkMeta, 'transmuxer-interface push error');
|
19506
19635
|
});
|
19507
19636
|
} else {
|
19508
|
-
transmuxer.async = false;
|
19509
19637
|
this.handleTransmuxComplete(transmuxResult);
|
19510
19638
|
}
|
19511
19639
|
}
|
@@ -19513,19 +19641,17 @@
|
|
19513
19641
|
_proto.flush = function flush(chunkMeta) {
|
19514
19642
|
var _this3 = this;
|
19515
19643
|
chunkMeta.transmuxing.start = self.performance.now();
|
19516
|
-
var
|
19644
|
+
var instanceNo = this.instanceNo,
|
19645
|
+
transmuxer = this.transmuxer;
|
19517
19646
|
if (this.workerContext) {
|
19518
19647
|
this.workerContext.worker.postMessage({
|
19648
|
+
instanceNo: instanceNo,
|
19519
19649
|
cmd: 'flush',
|
19520
19650
|
chunkMeta: chunkMeta
|
19521
19651
|
});
|
19522
19652
|
} else if (transmuxer) {
|
19523
19653
|
var transmuxResult = transmuxer.flush(chunkMeta);
|
19524
|
-
|
19525
|
-
if (asyncFlush || transmuxer.async) {
|
19526
|
-
if (!isPromise(transmuxResult)) {
|
19527
|
-
transmuxResult = Promise.resolve(transmuxResult);
|
19528
|
-
}
|
19654
|
+
if (isPromise(transmuxResult)) {
|
19529
19655
|
transmuxResult.then(function (data) {
|
19530
19656
|
_this3.handleFlushResult(data, chunkMeta);
|
19531
19657
|
}).catch(function (error) {
|
@@ -19546,6 +19672,7 @@
|
|
19546
19672
|
details: ErrorDetails.FRAG_PARSING_ERROR,
|
19547
19673
|
chunkMeta: chunkMeta,
|
19548
19674
|
frag: this.frag || undefined,
|
19675
|
+
part: this.part || undefined,
|
19549
19676
|
fatal: false,
|
19550
19677
|
error: error,
|
19551
19678
|
err: error,
|
@@ -19559,58 +19686,12 @@
|
|
19559
19686
|
});
|
19560
19687
|
this.onFlush(chunkMeta);
|
19561
19688
|
};
|
19562
|
-
_proto.onWorkerMessage = function onWorkerMessage(event) {
|
19563
|
-
var data = event.data;
|
19564
|
-
if (!(data != null && data.event)) {
|
19565
|
-
logger.warn("worker message received with no " + (data ? 'event name' : 'data'));
|
19566
|
-
return;
|
19567
|
-
}
|
19568
|
-
var hls = this.hls;
|
19569
|
-
if (!this.hls) {
|
19570
|
-
return;
|
19571
|
-
}
|
19572
|
-
switch (data.event) {
|
19573
|
-
case 'init':
|
19574
|
-
{
|
19575
|
-
var _this$workerContext2;
|
19576
|
-
var objectURL = (_this$workerContext2 = this.workerContext) == null ? void 0 : _this$workerContext2.objectURL;
|
19577
|
-
if (objectURL) {
|
19578
|
-
// revoke the Object URL that was used to create transmuxer worker, so as not to leak it
|
19579
|
-
self.URL.revokeObjectURL(objectURL);
|
19580
|
-
}
|
19581
|
-
break;
|
19582
|
-
}
|
19583
|
-
case 'transmuxComplete':
|
19584
|
-
{
|
19585
|
-
this.handleTransmuxComplete(data.data);
|
19586
|
-
break;
|
19587
|
-
}
|
19588
|
-
case 'flush':
|
19589
|
-
{
|
19590
|
-
this.onFlush(data.data);
|
19591
|
-
break;
|
19592
|
-
}
|
19593
|
-
|
19594
|
-
// pass logs from the worker thread to the main logger
|
19595
|
-
case 'workerLog':
|
19596
|
-
if (logger[data.data.logType]) {
|
19597
|
-
logger[data.data.logType](data.data.message);
|
19598
|
-
}
|
19599
|
-
break;
|
19600
|
-
default:
|
19601
|
-
{
|
19602
|
-
data.data = data.data || {};
|
19603
|
-
data.data.frag = this.frag;
|
19604
|
-
data.data.id = this.id;
|
19605
|
-
hls.trigger(data.event, data.data);
|
19606
|
-
break;
|
19607
|
-
}
|
19608
|
-
}
|
19609
|
-
};
|
19610
19689
|
_proto.configureTransmuxer = function configureTransmuxer(config) {
|
19611
|
-
var
|
19690
|
+
var instanceNo = this.instanceNo,
|
19691
|
+
transmuxer = this.transmuxer;
|
19612
19692
|
if (this.workerContext) {
|
19613
19693
|
this.workerContext.worker.postMessage({
|
19694
|
+
instanceNo: instanceNo,
|
19614
19695
|
cmd: 'configure',
|
19615
19696
|
config: config
|
19616
19697
|
});
|
@@ -21986,7 +22067,7 @@
|
|
21986
22067
|
* Get the video-dev/hls.js package version.
|
21987
22068
|
*/
|
21988
22069
|
function get() {
|
21989
|
-
return
|
22070
|
+
return version;
|
21990
22071
|
}
|
21991
22072
|
}, {
|
21992
22073
|
key: "Events",
|