hls.js 1.5.14-0.canary.10429 → 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 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.10429");
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();
@@ -9004,30 +9004,14 @@
9004
9004
  }
9005
9005
  return null;
9006
9006
  }
9007
- function shouldAlignOnDiscontinuities(lastFrag, switchDetails, details) {
9008
- if (switchDetails) {
9009
- if (details.endCC > details.startCC || lastFrag && lastFrag.cc < details.startCC) {
9007
+ function shouldAlignOnDiscontinuities(refDetails, details) {
9008
+ if (refDetails) {
9009
+ if (details.startCC < refDetails.endCC && details.endCC > refDetails.startCC) {
9010
9010
  return true;
9011
9011
  }
9012
9012
  }
9013
9013
  return false;
9014
9014
  }
9015
-
9016
- // Find the first frag in the previous level which matches the CC of the first frag of the new level
9017
- function findDiscontinuousReferenceFrag(prevDetails, curDetails) {
9018
- var prevFrags = prevDetails.fragments;
9019
- var curFrags = curDetails.fragments;
9020
- if (!curFrags.length || !prevFrags.length) {
9021
- logger.log('No fragments to align');
9022
- return;
9023
- }
9024
- var prevStartFrag = findFirstFragWithCC(prevFrags, curFrags[0].cc);
9025
- if (!prevStartFrag || prevStartFrag && !prevStartFrag.startPTS) {
9026
- logger.log('No frag in previous level to align on');
9027
- return;
9028
- }
9029
- return prevStartFrag;
9030
- }
9031
9015
  function adjustFragmentStart(frag, sliding) {
9032
9016
  if (frag) {
9033
9017
  var start = frag.start + sliding;
@@ -9062,7 +9046,7 @@
9062
9046
  if (!switchDetails) {
9063
9047
  return;
9064
9048
  }
9065
- alignDiscontinuities(lastFrag, details, switchDetails);
9049
+ alignDiscontinuities(details, switchDetails);
9066
9050
  if (!details.alignedSliding && switchDetails) {
9067
9051
  // If the PTS wasn't figured out via discontinuity sequence that means there was no CC increase within the level.
9068
9052
  // Aligning via Program Date Time should therefore be reliable, since PDT should be the same within the same
@@ -9078,20 +9062,24 @@
9078
9062
  }
9079
9063
 
9080
9064
  /**
9081
- * Computes the PTS if a new level's fragments using the PTS of a fragment in the last level which shares the same
9082
- * discontinuity sequence.
9083
- * @param lastFrag - The last Fragment which shares the same discontinuity sequence
9065
+ * Ajust the start of fragments in `details` by the difference in time between fragments of the latest
9066
+ * shared discontinuity sequence change.
9084
9067
  * @param lastLevel - The details of the last loaded level
9085
9068
  * @param details - The details of the new level
9086
9069
  */
9087
- function alignDiscontinuities(lastFrag, details, switchDetails) {
9088
- if (shouldAlignOnDiscontinuities(lastFrag, switchDetails, details)) {
9089
- var referenceFrag = findDiscontinuousReferenceFrag(switchDetails, details);
9090
- if (referenceFrag && isFiniteNumber(referenceFrag.start)) {
9091
- logger.log("Adjusting PTS using last level due to CC increase within current level " + details.url);
9092
- adjustSlidingStart(referenceFrag.start, details);
9093
- }
9070
+ function alignDiscontinuities(details, refDetails) {
9071
+ if (!shouldAlignOnDiscontinuities(refDetails, details)) {
9072
+ return;
9094
9073
  }
9074
+ var targetCC = Math.min(refDetails.endCC, details.endCC);
9075
+ var refFrag = findFirstFragWithCC(refDetails.fragments, targetCC);
9076
+ var frag = findFirstFragWithCC(details.fragments, targetCC);
9077
+ if (!refFrag || !frag) {
9078
+ return;
9079
+ }
9080
+ logger.log("Aligning playlist at start of dicontinuity sequence " + targetCC);
9081
+ var delta = refFrag.start - frag.start;
9082
+ adjustSlidingStart(delta, details);
9095
9083
  }
9096
9084
 
9097
9085
  /**
@@ -10200,6 +10188,10 @@
10200
10188
  };
10201
10189
  _proto.onHandlerDestroying = function onHandlerDestroying() {
10202
10190
  this.stopLoad();
10191
+ if (this.transmuxer) {
10192
+ this.transmuxer.destroy();
10193
+ this.transmuxer = null;
10194
+ }
10203
10195
  _TaskLoop.prototype.onHandlerDestroying.call(this);
10204
10196
  // @ts-ignore
10205
10197
  this.hls = this.onMediaSeeking = this.onMediaEnded = null;
@@ -10247,7 +10239,7 @@
10247
10239
  return;
10248
10240
  }
10249
10241
  if ('payload' in data) {
10250
- _this3.log("Loaded fragment " + frag.sn + " of level " + frag.level);
10242
+ _this3.log("Loaded " + frag.type + " sn: " + frag.sn + " of " + _this3.playlistLabel() + " " + frag.level);
10251
10243
  _this3.hls.trigger(Events.FRAG_LOADED, data);
10252
10244
  }
10253
10245
 
@@ -10391,9 +10383,9 @@
10391
10383
  return !frag || !fragCurrent || frag.sn !== fragCurrent.sn || frag.level !== fragCurrent.level;
10392
10384
  };
10393
10385
  _proto.fragBufferedComplete = function fragBufferedComplete(frag, part) {
10394
- var _frag$startPTS, _frag$endPTS, _this$fragCurrent, _this$fragPrevious;
10386
+ var _this$fragCurrent, _this$fragPrevious;
10395
10387
  var media = this.mediaBuffer ? this.mediaBuffer : this.media;
10396
- this.log("Buffered " + frag.type + " sn: " + frag.sn + (part ? ' part: ' + part.index : '') + " of " + (this.playlistType === PlaylistLevelType.MAIN ? 'level' : 'track') + " " + frag.level + " (frag:[" + ((_frag$startPTS = frag.startPTS) != null ? _frag$startPTS : NaN).toFixed(3) + "-" + ((_frag$endPTS = frag.endPTS) != null ? _frag$endPTS : NaN).toFixed(3) + "] > buffer:" + (media ? TimeRanges.toString(BufferHelper.getBuffered(media)) : '(detached)') + ")");
10388
+ this.log("Buffered " + frag.type + " sn: " + frag.sn + (part ? ' part: ' + part.index : '') + " of " + this.fragInfo(frag) + " > buffer:" + (media ? TimeRanges.toString(BufferHelper.getBuffered(media)) : '(detached)') + ")");
10397
10389
  if (frag.sn !== 'initSegment') {
10398
10390
  var _this$levels;
10399
10391
  if (frag.type !== PlaylistLevelType.SUBTITLE) {
@@ -10455,7 +10447,7 @@
10455
10447
  }
10456
10448
  var keyLoadingPromise = null;
10457
10449
  if (frag.encrypted && !((_frag$decryptdata = frag.decryptdata) != null && _frag$decryptdata.key)) {
10458
- this.log("Loading key for " + frag.sn + " of [" + details.startSN + "-" + details.endSN + "], " + (this.playlistType === PlaylistLevelType.MAIN ? 'level' : 'track') + " " + frag.level);
10450
+ this.log("Loading key for " + frag.sn + " of [" + details.startSN + "-" + details.endSN + "], " + this.playlistLabel() + " " + frag.level);
10459
10451
  this.state = State.KEY_LOADING;
10460
10452
  this.fragCurrent = frag;
10461
10453
  keyLoadingPromise = this.keyLoader.load(frag).then(function (keyLoadedData) {
@@ -10494,7 +10486,7 @@
10494
10486
  var partIndex = this.getNextPart(partList, frag, targetBufferTime);
10495
10487
  if (partIndex > -1) {
10496
10488
  var part = partList[partIndex];
10497
- this.log("Loading part sn: " + frag.sn + " p: " + part.index + " cc: " + frag.cc + " of playlist [" + details.startSN + "-" + details.endSN + "] parts [0-" + partIndex + "-" + (partList.length - 1) + "] " + (this.playlistType === PlaylistLevelType.MAIN ? 'level' : 'track') + ": " + frag.level + ", target: " + parseFloat(targetBufferTime.toFixed(3)));
10489
+ this.log("Loading part sn: " + frag.sn + " p: " + part.index + " cc: " + frag.cc + " of playlist [" + details.startSN + "-" + details.endSN + "] parts [0-" + partIndex + "-" + (partList.length - 1) + "] " + this.playlistLabel() + ": " + frag.level + ", target: " + parseFloat(targetBufferTime.toFixed(3)));
10498
10490
  this.nextLoadPosition = part.start + part.duration;
10499
10491
  this.state = State.FRAG_LOADING;
10500
10492
  var _result;
@@ -10534,7 +10526,7 @@
10534
10526
  // Selected fragment hint for part but not loading parts
10535
10527
  return Promise.resolve(null);
10536
10528
  }
10537
- this.log("Loading fragment " + frag.sn + " cc: " + frag.cc + " " + (details ? 'of [' + details.startSN + '-' + details.endSN + '] ' : '') + (this.playlistType === PlaylistLevelType.MAIN ? 'level' : 'track') + ": " + frag.level + ", target: " + parseFloat(targetBufferTime.toFixed(3)));
10529
+ this.log("Loading " + frag.type + " sn: " + frag.sn + " of " + this.fragInfo(frag, false) + ") cc: " + frag.cc + " " + (details ? '[' + details.startSN + '-' + details.endSN + ']' : '') + ", target: " + parseFloat(targetBufferTime.toFixed(3)));
10538
10530
  // Don't update nextLoadPosition for fragments which are not buffered
10539
10531
  if (isFiniteNumber(frag.sn) && !this.bitrateTest) {
10540
10532
  this.nextLoadPosition = frag.start + frag.duration;
@@ -11298,16 +11290,25 @@
11298
11290
  // For this error fallthrough. Marking parsed will allow advancing to next fragment.
11299
11291
  }
11300
11292
  this.state = State.PARSED;
11293
+ this.log("Parsed " + frag.type + " sn: " + frag.sn + (part ? ' part: ' + part.index : '') + " of " + this.fragInfo(frag) + ")");
11301
11294
  this.hls.trigger(Events.FRAG_PARSED, {
11302
11295
  frag: frag,
11303
11296
  part: part
11304
11297
  });
11305
11298
  };
11306
- _proto.resetTransmuxer = function resetTransmuxer() {
11307
- if (this.transmuxer) {
11308
- this.transmuxer.destroy();
11309
- this.transmuxer = null;
11299
+ _proto.playlistLabel = function playlistLabel() {
11300
+ return this.playlistType === PlaylistLevelType.MAIN ? 'level' : 'track';
11301
+ };
11302
+ _proto.fragInfo = function fragInfo(frag, pts) {
11303
+ var _ref3, _ref4;
11304
+ if (pts === void 0) {
11305
+ pts = true;
11310
11306
  }
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) + "]";
11308
+ };
11309
+ _proto.resetTransmuxer = function resetTransmuxer() {
11310
+ var _this$transmuxer2;
11311
+ (_this$transmuxer2 = this.transmuxer) == null ? void 0 : _this$transmuxer2.reset();
11311
11312
  };
11312
11313
  _proto.recoverWorkerError = function recoverWorkerError(data) {
11313
11314
  if (data.event === 'demuxerWorker') {
@@ -12055,7 +12056,7 @@
12055
12056
 
12056
12057
  // Source for probe info - https://wiki.multimedia.cx/index.php?title=ADTS
12057
12058
  ;
12058
- AACDemuxer.probe = function probe$2(data) {
12059
+ AACDemuxer.probe = function probe$2(data, logger) {
12059
12060
  if (!data) {
12060
12061
  return false;
12061
12062
  }
@@ -13724,7 +13725,8 @@
13724
13725
 
13725
13726
  var PACKET_LENGTH = 188;
13726
13727
  var TSDemuxer = /*#__PURE__*/function () {
13727
- function TSDemuxer(observer, config, typeSupported) {
13728
+ function TSDemuxer(observer, config, typeSupported, logger) {
13729
+ this.logger = void 0;
13728
13730
  this.observer = void 0;
13729
13731
  this.config = void 0;
13730
13732
  this.typeSupported = void 0;
@@ -13744,9 +13746,10 @@
13744
13746
  this.observer = observer;
13745
13747
  this.config = config;
13746
13748
  this.typeSupported = typeSupported;
13749
+ this.logger = logger;
13747
13750
  this.videoParser = null;
13748
13751
  }
13749
- TSDemuxer.probe = function probe(data) {
13752
+ TSDemuxer.probe = function probe(data, logger) {
13750
13753
  var syncOffset = TSDemuxer.syncOffset(data);
13751
13754
  if (syncOffset > 0) {
13752
13755
  logger.warn("MPEG2-TS detected but first sync word found @ offset " + syncOffset);
@@ -13913,7 +13916,7 @@
13913
13916
  switch (pid) {
13914
13917
  case videoPid:
13915
13918
  if (stt) {
13916
- if (videoData && (pes = parsePES(videoData))) {
13919
+ if (videoData && (pes = parsePES(videoData, this.logger))) {
13917
13920
  if (this.videoParser === null) {
13918
13921
  switch (videoTrack.segmentCodec) {
13919
13922
  case 'avc':
@@ -13942,7 +13945,7 @@
13942
13945
  break;
13943
13946
  case audioPid:
13944
13947
  if (stt) {
13945
- if (audioData && (pes = parsePES(audioData))) {
13948
+ if (audioData && (pes = parsePES(audioData, this.logger))) {
13946
13949
  switch (audioTrack.segmentCodec) {
13947
13950
  case 'aac':
13948
13951
  this.parseAACPES(audioTrack, pes);
@@ -13969,7 +13972,7 @@
13969
13972
  break;
13970
13973
  case id3Pid:
13971
13974
  if (stt) {
13972
- if (id3Data && (pes = parsePES(id3Data))) {
13975
+ if (id3Data && (pes = parsePES(id3Data, this.logger))) {
13973
13976
  this.parseID3PES(id3Track, pes);
13974
13977
  }
13975
13978
  id3Data = {
@@ -13987,14 +13990,14 @@
13987
13990
  offset += data[offset] + 1;
13988
13991
  }
13989
13992
  pmtId = this._pmtId = parsePAT(data, offset);
13990
- // logger.log('PMT PID:' + this._pmtId);
13993
+ // this.logger.log('PMT PID:' + this._pmtId);
13991
13994
  break;
13992
13995
  case pmtId:
13993
13996
  {
13994
13997
  if (stt) {
13995
13998
  offset += data[offset] + 1;
13996
13999
  }
13997
- var parsedPIDs = parsePMT(data, offset, this.typeSupported, isSampleAes, this.observer);
14000
+ var parsedPIDs = parsePMT(data, offset, this.typeSupported, isSampleAes, this.observer, this.logger);
13998
14001
 
13999
14002
  // only update track id if track PID found while parsing PMT
14000
14003
  // this is to avoid resetting the PID to -1 in case
@@ -14017,7 +14020,7 @@
14017
14020
  id3Track.pid = id3Pid;
14018
14021
  }
14019
14022
  if (unknownPID !== null && !pmtParsed) {
14020
- 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.");
14021
14024
  unknownPID = null;
14022
14025
  // we set it to -188, the += 188 in the for loop will reset start to 0
14023
14026
  start = syncOffset - 188;
@@ -14037,7 +14040,7 @@
14037
14040
  }
14038
14041
  }
14039
14042
  if (tsPacketErrors > 0) {
14040
- 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);
14041
14044
  }
14042
14045
  videoTrack.pesData = videoData;
14043
14046
  audioTrack.pesData = audioData;
@@ -14083,7 +14086,7 @@
14083
14086
  var id3Data = id3Track.pesData;
14084
14087
  // try to parse last PES packets
14085
14088
  var pes;
14086
- if (videoData && (pes = parsePES(videoData))) {
14089
+ if (videoData && (pes = parsePES(videoData, this.logger))) {
14087
14090
  if (this.videoParser === null) {
14088
14091
  switch (videoTrack.segmentCodec) {
14089
14092
  case 'avc':
@@ -14104,7 +14107,7 @@
14104
14107
  // either avcData null or PES truncated, keep it for next frag parsing
14105
14108
  videoTrack.pesData = videoData;
14106
14109
  }
14107
- if (audioData && (pes = parsePES(audioData))) {
14110
+ if (audioData && (pes = parsePES(audioData, this.logger))) {
14108
14111
  switch (audioTrack.segmentCodec) {
14109
14112
  case 'aac':
14110
14113
  this.parseAACPES(audioTrack, pes);
@@ -14121,13 +14124,13 @@
14121
14124
  audioTrack.pesData = null;
14122
14125
  } else {
14123
14126
  if (audioData != null && audioData.size) {
14124
- logger.log('last AAC PES packet truncated,might overlap between fragments');
14127
+ this.logger.log('last AAC PES packet truncated,might overlap between fragments');
14125
14128
  }
14126
14129
 
14127
14130
  // either audioData null or PES truncated, keep it for next frag parsing
14128
14131
  audioTrack.pesData = audioData;
14129
14132
  }
14130
- if (id3Data && (pes = parsePES(id3Data))) {
14133
+ if (id3Data && (pes = parsePES(id3Data, this.logger))) {
14131
14134
  this.parseID3PES(id3Track, pes);
14132
14135
  id3Track.pesData = null;
14133
14136
  } else {
@@ -14199,7 +14202,7 @@
14199
14202
  } else {
14200
14203
  reason = 'No ADTS header found in AAC PES';
14201
14204
  }
14202
- emitParsingError(this.observer, new Error(reason), recoverable);
14205
+ emitParsingError(this.observer, new Error(reason), recoverable, this.logger);
14203
14206
  if (!recoverable) {
14204
14207
  return;
14205
14208
  }
@@ -14214,7 +14217,7 @@
14214
14217
  var frameDuration = getFrameDuration(track.samplerate);
14215
14218
  pts = aacOverFlow.sample.pts + frameDuration;
14216
14219
  } else {
14217
- logger.warn('[tsdemuxer]: AAC PES unknown PTS');
14220
+ this.logger.warn('[tsdemuxer]: AAC PES unknown PTS');
14218
14221
  return;
14219
14222
  }
14220
14223
 
@@ -14244,7 +14247,7 @@
14244
14247
  var offset = 0;
14245
14248
  var pts = pes.pts;
14246
14249
  if (pts === undefined) {
14247
- logger.warn('[tsdemuxer]: MPEG PES unknown PTS');
14250
+ this.logger.warn('[tsdemuxer]: MPEG PES unknown PTS');
14248
14251
  return;
14249
14252
  }
14250
14253
  while (offset < length) {
@@ -14268,7 +14271,7 @@
14268
14271
  var data = pes.data;
14269
14272
  var pts = pes.pts;
14270
14273
  if (pts === undefined) {
14271
- logger.warn('[tsdemuxer]: AC3 PES unknown PTS');
14274
+ this.logger.warn('[tsdemuxer]: AC3 PES unknown PTS');
14272
14275
  return;
14273
14276
  }
14274
14277
  var length = data.length;
@@ -14282,7 +14285,7 @@
14282
14285
  };
14283
14286
  _proto.parseID3PES = function parseID3PES(id3Track, pes) {
14284
14287
  if (pes.pts === undefined) {
14285
- logger.warn('[tsdemuxer]: ID3 PES unknown PTS');
14288
+ this.logger.warn('[tsdemuxer]: ID3 PES unknown PTS');
14286
14289
  return;
14287
14290
  }
14288
14291
  var id3Sample = _extends({}, pes, {
@@ -14301,7 +14304,7 @@
14301
14304
  // skip the PSI header and parse the first PMT entry
14302
14305
  return (data[offset + 10] & 0x1f) << 8 | data[offset + 11];
14303
14306
  }
14304
- function parsePMT(data, offset, typeSupported, isSampleAes, observer) {
14307
+ function parsePMT(data, offset, typeSupported, isSampleAes, observer, logger) {
14305
14308
  var result = {
14306
14309
  audioPid: -1,
14307
14310
  videoPid: -1,
@@ -14323,7 +14326,7 @@
14323
14326
  case 0xcf:
14324
14327
  // SAMPLE-AES AAC
14325
14328
  if (!isSampleAes) {
14326
- logEncryptedSamplesFoundInUnencryptedStream('ADTS AAC');
14329
+ logEncryptedSamplesFoundInUnencryptedStream('ADTS AAC', this.logger);
14327
14330
  break;
14328
14331
  }
14329
14332
  /* falls through */
@@ -14345,7 +14348,7 @@
14345
14348
  case 0xdb:
14346
14349
  // SAMPLE-AES AVC
14347
14350
  if (!isSampleAes) {
14348
- logEncryptedSamplesFoundInUnencryptedStream('H.264');
14351
+ logEncryptedSamplesFoundInUnencryptedStream('H.264', this.logger);
14349
14352
  break;
14350
14353
  }
14351
14354
  /* falls through */
@@ -14373,7 +14376,7 @@
14373
14376
  case 0xc1:
14374
14377
  // SAMPLE-AES AC3
14375
14378
  if (!isSampleAes) {
14376
- logEncryptedSamplesFoundInUnencryptedStream('AC-3');
14379
+ logEncryptedSamplesFoundInUnencryptedStream('AC-3', this.logger);
14377
14380
  break;
14378
14381
  }
14379
14382
  /* falls through */
@@ -14419,7 +14422,7 @@
14419
14422
  case 0xc2: // SAMPLE-AES EC3
14420
14423
  /* falls through */
14421
14424
  case 0x87:
14422
- emitParsingError(observer, new Error('Unsupported EC-3 in M2TS found'));
14425
+ emitParsingError(observer, new Error('Unsupported EC-3 in M2TS found'), undefined, this.logger);
14423
14426
  return result;
14424
14427
  case 0x24:
14425
14428
  // ITU-T Rec. H.265 and ISO/IEC 23008-2 (HEVC)
@@ -14438,7 +14441,7 @@
14438
14441
  }
14439
14442
  return result;
14440
14443
  }
14441
- function emitParsingError(observer, error, levelRetry) {
14444
+ function emitParsingError(observer, error, levelRetry, logger) {
14442
14445
  logger.warn("parsing error: " + error.message);
14443
14446
  observer.emit(Events.ERROR, Events.ERROR, {
14444
14447
  type: ErrorTypes.MEDIA_ERROR,
@@ -14449,10 +14452,10 @@
14449
14452
  reason: error.message
14450
14453
  });
14451
14454
  }
14452
- function logEncryptedSamplesFoundInUnencryptedStream(type) {
14455
+ function logEncryptedSamplesFoundInUnencryptedStream(type, logger) {
14453
14456
  logger.log(type + " with AES-128-CBC encryption found in unencrypted stream");
14454
14457
  }
14455
- function parsePES(stream) {
14458
+ function parsePES(stream, logger) {
14456
14459
  var i = 0;
14457
14460
  var frag;
14458
14461
  var pesLen;
@@ -15367,7 +15370,8 @@
15367
15370
  var chromeVersion = null;
15368
15371
  var safariWebkitVersion = null;
15369
15372
  var MP4Remuxer = /*#__PURE__*/function () {
15370
- function MP4Remuxer(observer, config, typeSupported, vendor) {
15373
+ function MP4Remuxer(observer, config, typeSupported, logger) {
15374
+ this.logger = void 0;
15371
15375
  this.observer = void 0;
15372
15376
  this.config = void 0;
15373
15377
  this.typeSupported = void 0;
@@ -15383,6 +15387,7 @@
15383
15387
  this.observer = observer;
15384
15388
  this.config = config;
15385
15389
  this.typeSupported = typeSupported;
15390
+ this.logger = logger;
15386
15391
  this.ISGenerated = false;
15387
15392
  if (chromeVersion === null) {
15388
15393
  var userAgent = navigator.userAgent || '';
@@ -15400,16 +15405,16 @@
15400
15405
  this.config = this.videoTrackConfig = this._initPTS = this._initDTS = null;
15401
15406
  };
15402
15407
  _proto.resetTimeStamp = function resetTimeStamp(defaultTimeStamp) {
15403
- logger.log('[mp4-remuxer]: initPTS & initDTS reset');
15408
+ this.logger.log('[mp4-remuxer]: initPTS & initDTS reset');
15404
15409
  this._initPTS = this._initDTS = defaultTimeStamp;
15405
15410
  };
15406
15411
  _proto.resetNextTimestamp = function resetNextTimestamp() {
15407
- logger.log('[mp4-remuxer]: reset next timestamp');
15412
+ this.logger.log('[mp4-remuxer]: reset next timestamp');
15408
15413
  this.isVideoContiguous = false;
15409
15414
  this.isAudioContiguous = false;
15410
15415
  };
15411
15416
  _proto.resetInitSegment = function resetInitSegment() {
15412
- logger.log('[mp4-remuxer]: ISGenerated flag reset');
15417
+ this.logger.log('[mp4-remuxer]: ISGenerated flag reset');
15413
15418
  this.ISGenerated = false;
15414
15419
  this.videoTrackConfig = undefined;
15415
15420
  };
@@ -15428,7 +15433,7 @@
15428
15433
  }
15429
15434
  }, videoSamples[0].pts);
15430
15435
  if (rolloverDetected) {
15431
- logger.debug('PTS rollover detected');
15436
+ this.logger.debug('PTS rollover detected');
15432
15437
  }
15433
15438
  return startPTS;
15434
15439
  };
@@ -15472,14 +15477,14 @@
15472
15477
  if (!isVideoContiguous && this.config.forceKeyFrameOnDiscontinuity) {
15473
15478
  independent = true;
15474
15479
  if (firstKeyFrameIndex > 0) {
15475
- 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");
15476
15481
  var startPTS = this.getVideoStartPts(videoTrack.samples);
15477
15482
  videoTrack.samples = videoTrack.samples.slice(firstKeyFrameIndex);
15478
15483
  videoTrack.dropped += firstKeyFrameIndex;
15479
15484
  videoTimeOffset += (videoTrack.samples[0].pts - startPTS) / videoTrack.inputTimeScale;
15480
15485
  firstKeyFramePTS = videoTimeOffset;
15481
15486
  } else if (firstKeyFrameIndex === -1) {
15482
- 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");
15483
15488
  independent = false;
15484
15489
  }
15485
15490
  }
@@ -15501,7 +15506,7 @@
15501
15506
  if (enoughAudioSamples) {
15502
15507
  // if initSegment was generated without audio samples, regenerate it again
15503
15508
  if (!audioTrack.samplerate) {
15504
- logger.warn('[mp4-remuxer]: regenerate InitSegment as audio detected');
15509
+ this.logger.warn('[mp4-remuxer]: regenerate InitSegment as audio detected');
15505
15510
  initSegment = this.generateIS(audioTrack, videoTrack, timeOffset, accurateTimeOffset);
15506
15511
  }
15507
15512
  audio = this.remuxAudio(audioTrack, audioTimeOffset, this.isAudioContiguous, accurateTimeOffset, hasVideo || enoughVideoSamples || playlistType === PlaylistLevelType.AUDIO ? videoTimeOffset : undefined);
@@ -15509,7 +15514,7 @@
15509
15514
  var audioTrackLength = audio ? audio.endPTS - audio.startPTS : 0;
15510
15515
  // if initSegment was generated without video samples, regenerate it again
15511
15516
  if (!videoTrack.inputTimeScale) {
15512
- logger.warn('[mp4-remuxer]: regenerate InitSegment as video detected');
15517
+ this.logger.warn('[mp4-remuxer]: regenerate InitSegment as video detected');
15513
15518
  initSegment = this.generateIS(audioTrack, videoTrack, timeOffset, accurateTimeOffset);
15514
15519
  }
15515
15520
  video = this.remuxVideo(videoTrack, videoTimeOffset, isVideoContiguous, audioTrackLength);
@@ -15715,9 +15720,9 @@
15715
15720
  var foundOverlap = delta < -1;
15716
15721
  if (foundHole || foundOverlap) {
15717
15722
  if (foundHole) {
15718
- 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));
15719
15724
  } else {
15720
- 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));
15721
15726
  }
15722
15727
  if (!foundOverlap || nextAvcDts >= inputSamples[0].pts || chromeVersion) {
15723
15728
  firstDTS = nextAvcDts;
@@ -15746,7 +15751,7 @@
15746
15751
  }
15747
15752
  }
15748
15753
  }
15749
- 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");
15750
15755
  }
15751
15756
  }
15752
15757
  }
@@ -15846,7 +15851,7 @@
15846
15851
  } else {
15847
15852
  stretchedLastFrame = true;
15848
15853
  }
15849
- 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.");
15850
15855
  } else {
15851
15856
  mp4SampleDuration = lastFrameDuration;
15852
15857
  }
@@ -15874,7 +15879,7 @@
15874
15879
  // Fix for "CNN special report, with CC" in test-streams (Safari browser only)
15875
15880
  // Ignore DTS when frame durations are irregular. Safari MSE does not handle this leading to gaps.
15876
15881
  if (maxPtsDelta - minPtsDelta < maxDtsDelta - minDtsDelta && averageSampleDuration / maxDtsDelta < 0.025 && outputSamples[0].cts === 0) {
15877
- 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.');
15878
15883
  var dts = firstDTS;
15879
15884
  for (var _i4 = 0, len = outputSamples.length; _i4 < len; _i4++) {
15880
15885
  var nextDts = dts + outputSamples[_i4].duration;
@@ -16001,7 +16006,7 @@
16001
16006
  // When remuxing with video, if we're overlapping by more than a duration, drop this sample to stay in sync
16002
16007
  if (delta <= -maxAudioFramesDrift * inputSampleDuration && alignedWithVideo) {
16003
16008
  if (i === 0) {
16004
- 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.");
16005
16010
  this.nextAudioPts = nextAudioPts = nextPts = pts;
16006
16011
  }
16007
16012
  } // eslint-disable-line brace-style
@@ -16023,12 +16028,12 @@
16023
16028
  if (i === 0) {
16024
16029
  this.nextAudioPts = nextAudioPts = nextPts;
16025
16030
  }
16026
- 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.");
16027
16032
  for (var j = 0; j < missing; j++) {
16028
16033
  var newStamp = Math.max(nextPts, 0);
16029
16034
  var fillFrame = AAC.getSilentFrame(track.parsedCodec || track.manifestCodec || track.codec, track.channelCount);
16030
16035
  if (!fillFrame) {
16031
- 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.');
16032
16037
  fillFrame = sample.unit.subarray();
16033
16038
  }
16034
16039
  inputSamples.splice(i, 0, {
@@ -16228,7 +16233,8 @@
16228
16233
  };
16229
16234
 
16230
16235
  var PassThroughRemuxer = /*#__PURE__*/function () {
16231
- function PassThroughRemuxer() {
16236
+ function PassThroughRemuxer(observer, config, typeSupported, logger) {
16237
+ this.logger = void 0;
16232
16238
  this.emitInitSegment = false;
16233
16239
  this.audioCodec = void 0;
16234
16240
  this.videoCodec = void 0;
@@ -16236,6 +16242,7 @@
16236
16242
  this.initPTS = null;
16237
16243
  this.initTracks = void 0;
16238
16244
  this.lastEndTime = null;
16245
+ this.logger = logger;
16239
16246
  }
16240
16247
  var _proto = PassThroughRemuxer.prototype;
16241
16248
  _proto.destroy = function destroy() {};
@@ -16292,7 +16299,7 @@
16292
16299
  id: 'main'
16293
16300
  };
16294
16301
  } else {
16295
- 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.');
16296
16303
  }
16297
16304
  this.initTracks = tracks;
16298
16305
  };
@@ -16332,7 +16339,7 @@
16332
16339
  }
16333
16340
  if (!((_initData2 = initData) != null && _initData2.length)) {
16334
16341
  // We can't remux if the initSegment could not be generated
16335
- logger.warn('[passthrough-remuxer.ts]: Failed to generate initSegment.');
16342
+ this.logger.warn('[passthrough-remuxer.ts]: Failed to generate initSegment.');
16336
16343
  return result;
16337
16344
  }
16338
16345
  if (this.emitInitSegment) {
@@ -16345,7 +16352,7 @@
16345
16352
  if (isInvalidInitPts(initPTS, decodeTime, timeOffset, duration) || initSegment.timescale !== initPTS.timescale && accurateTimeOffset) {
16346
16353
  initSegment.initPTS = decodeTime - timeOffset;
16347
16354
  if (initPTS && initPTS.timescale === 1) {
16348
- 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);
16349
16356
  }
16350
16357
  this.initPTS = initPTS = {
16351
16358
  baseTime: initSegment.initPTS,
@@ -16358,7 +16365,7 @@
16358
16365
  if (duration > 0) {
16359
16366
  this.lastEndTime = endTime;
16360
16367
  } else {
16361
- logger.warn('Duration parsed from mp4 should be greater than zero');
16368
+ this.logger.warn('Duration parsed from mp4 should be greater than zero');
16362
16369
  this.resetNextTimestamp();
16363
16370
  }
16364
16371
  var hasAudio = !!initData.audio;
@@ -16417,12 +16424,12 @@
16417
16424
  return getCodecCompatibleName(parsedCodec, preferManagedMediaSource);
16418
16425
  }
16419
16426
  var result = 'mp4a.40.5';
16420
- 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 + "\"");
16421
16428
  return result;
16422
16429
  }
16423
16430
  // Provide defaults based on codec type
16424
16431
  // This allows for some playback of some fmp4 playlists without CODECS defined in manifest
16425
- logger.warn("Unhandled video codec \"" + parsedCodec + "\"");
16432
+ this.logger.warn("Unhandled video codec \"" + parsedCodec + "\"");
16426
16433
  if (parsedCodec === 'hvc1' || parsedCodec === 'hev1') {
16427
16434
  return 'hvc1.1.6.L120.90';
16428
16435
  }
@@ -16437,8 +16444,7 @@
16437
16444
  try {
16438
16445
  now = self.performance.now.bind(self.performance);
16439
16446
  } catch (err) {
16440
- logger.debug('Unable to use Performance API on this environment');
16441
- now = optionalSelf == null ? void 0 : optionalSelf.Date.now;
16447
+ now = Date.now;
16442
16448
  }
16443
16449
  var muxConfig = [{
16444
16450
  demux: MP4Demuxer,
@@ -16460,8 +16466,9 @@
16460
16466
  });
16461
16467
  }
16462
16468
  var Transmuxer = /*#__PURE__*/function () {
16463
- function Transmuxer(observer, typeSupported, config, vendor, id) {
16464
- this.async = false;
16469
+ function Transmuxer(observer, typeSupported, config, vendor, id, logger) {
16470
+ this.asyncResult = false;
16471
+ this.logger = void 0;
16465
16472
  this.observer = void 0;
16466
16473
  this.typeSupported = void 0;
16467
16474
  this.config = void 0;
@@ -16479,6 +16486,7 @@
16479
16486
  this.config = config;
16480
16487
  this.vendor = vendor;
16481
16488
  this.id = id;
16489
+ this.logger = logger;
16482
16490
  }
16483
16491
  var _proto = Transmuxer.prototype;
16484
16492
  _proto.configure = function configure(transmuxConfig) {
@@ -16530,6 +16538,7 @@
16530
16538
  }
16531
16539
  uintData = new Uint8Array(decryptedData);
16532
16540
  } else {
16541
+ this.asyncResult = true;
16533
16542
  this.decryptionPromise = decrypter.webCryptoDecrypt(uintData, keyData.key.buffer, keyData.iv.buffer, aesMode).then(function (decryptedData) {
16534
16543
  // Calling push here is important; if flush() is called while this is still resolving, this ensures that
16535
16544
  // the decrypted data has been transmuxed
@@ -16544,7 +16553,7 @@
16544
16553
  if (resetMuxers) {
16545
16554
  var error = this.configureTransmuxer(uintData);
16546
16555
  if (error) {
16547
- logger.warn("[transmuxer] " + error.message);
16556
+ this.logger.warn("[transmuxer] " + error.message);
16548
16557
  this.observer.emit(Events.ERROR, Events.ERROR, {
16549
16558
  type: ErrorTypes.MEDIA_ERROR,
16550
16559
  details: ErrorDetails.FRAG_PARSING_ERROR,
@@ -16566,6 +16575,7 @@
16566
16575
  this.resetContiguity();
16567
16576
  }
16568
16577
  var result = this.transmux(uintData, keyData, timeOffset, accurateTimeOffset, chunkMeta);
16578
+ this.asyncResult = isPromise(result);
16569
16579
  var currentState = this.currentTransmuxState;
16570
16580
  currentState.contiguous = true;
16571
16581
  currentState.discontinuity = false;
@@ -16584,6 +16594,7 @@
16584
16594
  currentTransmuxState = this.currentTransmuxState,
16585
16595
  decryptionPromise = this.decryptionPromise;
16586
16596
  if (decryptionPromise) {
16597
+ this.asyncResult = true;
16587
16598
  // Upon resolution, the decryption promise calls push() and returns its TransmuxerResult up the stack. Therefore
16588
16599
  // only flushing is required for async decryption
16589
16600
  return decryptionPromise.then(function () {
@@ -16607,10 +16618,15 @@
16607
16618
  if (!demuxer || !remuxer) {
16608
16619
  // If probing failed, then Hls.js has been given content its not able to handle
16609
16620
  stats.executeEnd = now();
16610
- return [emptyResult(chunkMeta)];
16621
+ var emptyResults = [emptyResult(chunkMeta)];
16622
+ if (this.asyncResult) {
16623
+ return Promise.resolve(emptyResults);
16624
+ }
16625
+ return emptyResults;
16611
16626
  }
16612
16627
  var demuxResultOrPromise = demuxer.flush(timeOffset);
16613
16628
  if (isPromise(demuxResultOrPromise)) {
16629
+ this.asyncResult = true;
16614
16630
  // Decrypt final SAMPLE-AES samples
16615
16631
  return demuxResultOrPromise.then(function (demuxResult) {
16616
16632
  _this2.flushRemux(transmuxResults, demuxResult, chunkMeta);
@@ -16618,6 +16634,9 @@
16618
16634
  });
16619
16635
  }
16620
16636
  this.flushRemux(transmuxResults, demuxResultOrPromise, chunkMeta);
16637
+ if (this.asyncResult) {
16638
+ return Promise.resolve(transmuxResults);
16639
+ }
16621
16640
  return transmuxResults;
16622
16641
  };
16623
16642
  _proto.flushRemux = function flushRemux(transmuxResults, demuxResult, chunkMeta) {
@@ -16628,7 +16647,7 @@
16628
16647
  var _this$currentTransmux = this.currentTransmuxState,
16629
16648
  accurateTimeOffset = _this$currentTransmux.accurateTimeOffset,
16630
16649
  timeOffset = _this$currentTransmux.timeOffset;
16631
- logger.log("[transmuxer.ts]: Flushed fragment " + chunkMeta.sn + (chunkMeta.part > -1 ? ' p: ' + chunkMeta.part : '') + " of level " + chunkMeta.level);
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);
16632
16651
  var remuxResult = this.remuxer.remux(audioTrack, videoTrack, id3Track, textTrack, timeOffset, accurateTimeOffset, true, this.id);
16633
16652
  transmuxResults.push({
16634
16653
  remuxResult: remuxResult,
@@ -16707,13 +16726,13 @@
16707
16726
  _proto.configureTransmuxer = function configureTransmuxer(data) {
16708
16727
  var config = this.config,
16709
16728
  observer = this.observer,
16710
- typeSupported = this.typeSupported,
16711
- vendor = this.vendor;
16729
+ typeSupported = this.typeSupported;
16730
+ this.vendor;
16712
16731
  // probe for content type
16713
16732
  var mux;
16714
16733
  for (var i = 0, len = muxConfig.length; i < len; i++) {
16715
16734
  var _muxConfig$i$demux;
16716
- 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)) {
16717
16736
  mux = muxConfig[i];
16718
16737
  break;
16719
16738
  }
@@ -16727,10 +16746,10 @@
16727
16746
  var Remuxer = mux.remux;
16728
16747
  var Demuxer = mux.demux;
16729
16748
  if (!remuxer || !(remuxer instanceof Remuxer)) {
16730
- this.remuxer = new Remuxer(observer, config, typeSupported, vendor);
16749
+ this.remuxer = new Remuxer(observer, config, typeSupported, this.logger);
16731
16750
  }
16732
16751
  if (!demuxer || !(demuxer instanceof Demuxer)) {
16733
- this.demuxer = new Demuxer(observer, config, typeSupported);
16752
+ this.demuxer = new Demuxer(observer, config, typeSupported, this.logger);
16734
16753
  this.probe = Demuxer.probe;
16735
16754
  }
16736
16755
  };
@@ -17134,63 +17153,54 @@
17134
17153
  var eventemitter3Exports = eventemitter3.exports;
17135
17154
  var EventEmitter = /*@__PURE__*/getDefaultExportFromCjs(eventemitter3Exports);
17136
17155
 
17156
+ var transmuxers = [];
17137
17157
  if (typeof __IN_WORKER__ !== 'undefined' && __IN_WORKER__) {
17138
- startWorker(self);
17158
+ startWorker();
17139
17159
  }
17140
- function startWorker(self) {
17141
- var observer = new EventEmitter();
17142
- var forwardMessage = function forwardMessage(ev, data) {
17143
- self.postMessage({
17144
- event: ev,
17145
- data: data
17146
- });
17147
- };
17148
-
17149
- // forward events to main thread
17150
- observer.on(Events.FRAG_DECRYPTED, forwardMessage);
17151
- observer.on(Events.ERROR, forwardMessage);
17152
-
17153
- // forward logger events to main thread
17154
- var forwardWorkerLogs = function forwardWorkerLogs(logger) {
17155
- var _loop = function _loop(logFn) {
17156
- var func = function func(message) {
17157
- forwardMessage('workerLog', {
17158
- logType: logFn,
17159
- message: message
17160
- });
17161
- };
17162
- logger[logFn] = func;
17163
- };
17164
- for (var logFn in logger) {
17165
- _loop(logFn);
17166
- }
17167
- };
17160
+ function startWorker() {
17168
17161
  self.addEventListener('message', function (ev) {
17169
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
+ }
17170
17189
  switch (data.cmd) {
17171
- case 'init':
17172
- {
17173
- var config = JSON.parse(data.config);
17174
- self.transmuxer = new Transmuxer(observer, data.typeSupported, config, '', data.id);
17175
- var logger = enableLogs(config.debug, data.id);
17176
- forwardWorkerLogs(logger);
17177
- forwardMessage('init', null);
17178
- break;
17179
- }
17180
17190
  case 'configure':
17181
17191
  {
17182
- self.transmuxer.configure(data.config);
17192
+ transmuxer.configure(data.config);
17183
17193
  break;
17184
17194
  }
17185
17195
  case 'demux':
17186
17196
  {
17187
- var transmuxResult = self.transmuxer.push(data.data, data.decryptdata, data.chunkMeta, data.state);
17197
+ var transmuxResult = transmuxer.push(data.data, data.decryptdata, data.chunkMeta, data.state);
17188
17198
  if (isPromise(transmuxResult)) {
17189
- self.transmuxer.async = true;
17190
17199
  transmuxResult.then(function (data) {
17191
- emitTransmuxComplete(self, data);
17200
+ emitTransmuxComplete(self, data, instanceNo);
17192
17201
  }).catch(function (error) {
17193
17202
  forwardMessage(Events.ERROR, {
17203
+ instanceNo: instanceNo,
17194
17204
  type: ErrorTypes.MEDIA_ERROR,
17195
17205
  details: ErrorDetails.FRAG_PARSING_ERROR,
17196
17206
  chunkMeta: data.chunkMeta,
@@ -17198,25 +17208,20 @@
17198
17208
  error: error,
17199
17209
  err: error,
17200
17210
  reason: "transmuxer-worker push error"
17201
- });
17211
+ }, instanceNo);
17202
17212
  });
17203
17213
  } else {
17204
- self.transmuxer.async = false;
17205
- emitTransmuxComplete(self, transmuxResult);
17214
+ emitTransmuxComplete(self, transmuxResult, instanceNo);
17206
17215
  }
17207
17216
  break;
17208
17217
  }
17209
17218
  case 'flush':
17210
17219
  {
17211
- var id = data.chunkMeta;
17212
- var _transmuxResult = self.transmuxer.flush(id);
17213
- var asyncFlush = isPromise(_transmuxResult);
17214
- if (asyncFlush || self.transmuxer.async) {
17215
- if (!isPromise(_transmuxResult)) {
17216
- _transmuxResult = Promise.resolve(_transmuxResult);
17217
- }
17220
+ var chunkMeta = data.chunkMeta;
17221
+ var _transmuxResult = transmuxer.flush(chunkMeta);
17222
+ if (isPromise(_transmuxResult)) {
17218
17223
  _transmuxResult.then(function (results) {
17219
- handleFlushResult(self, results, id);
17224
+ handleFlushResult(self, results, chunkMeta, instanceNo);
17220
17225
  }).catch(function (error) {
17221
17226
  forwardMessage(Events.ERROR, {
17222
17227
  type: ErrorTypes.MEDIA_ERROR,
@@ -17226,17 +17231,17 @@
17226
17231
  error: error,
17227
17232
  err: error,
17228
17233
  reason: "transmuxer-worker flush error"
17229
- });
17234
+ }, instanceNo);
17230
17235
  });
17231
17236
  } else {
17232
- handleFlushResult(self, _transmuxResult, id);
17237
+ handleFlushResult(self, _transmuxResult, chunkMeta, instanceNo);
17233
17238
  }
17234
17239
  break;
17235
17240
  }
17236
17241
  }
17237
17242
  });
17238
17243
  }
17239
- function emitTransmuxComplete(self, transmuxResult) {
17244
+ function emitTransmuxComplete(self, transmuxResult, instanceNo) {
17240
17245
  if (isEmptyResult(transmuxResult.remuxResult)) {
17241
17246
  return false;
17242
17247
  }
@@ -17252,7 +17257,8 @@
17252
17257
  }
17253
17258
  self.postMessage({
17254
17259
  event: 'transmuxComplete',
17255
- data: transmuxResult
17260
+ data: transmuxResult,
17261
+ instanceNo: instanceNo
17256
17262
  }, transferable);
17257
17263
  return true;
17258
17264
  }
@@ -17267,77 +17273,200 @@
17267
17273
  transferable.push(track.data2.buffer);
17268
17274
  }
17269
17275
  }
17270
- function handleFlushResult(self, results, chunkMeta) {
17276
+ function handleFlushResult(self, results, chunkMeta, instanceNo) {
17271
17277
  var parsed = results.reduce(function (parsed, result) {
17272
- return emitTransmuxComplete(self, result) || parsed;
17278
+ return emitTransmuxComplete(self, result, instanceNo) || parsed;
17273
17279
  }, false);
17274
17280
  if (!parsed) {
17275
17281
  // Emit at least one "transmuxComplete" message even if media is not found to update stream-controller state to PARSING
17276
17282
  self.postMessage({
17277
17283
  event: 'transmuxComplete',
17278
- data: results[0]
17284
+ data: results[0],
17285
+ instanceNo: instanceNo
17279
17286
  });
17280
17287
  }
17281
17288
  self.postMessage({
17282
17289
  event: 'flush',
17283
- data: chunkMeta
17290
+ data: chunkMeta,
17291
+ instanceNo: instanceNo
17292
+ });
17293
+ }
17294
+ function forwardMessage(event, data, instanceNo) {
17295
+ self.postMessage({
17296
+ event: event,
17297
+ data: data,
17298
+ instanceNo: instanceNo
17284
17299
  });
17285
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
+ }
17286
17315
  function isEmptyResult(remuxResult) {
17287
17316
  return !remuxResult.audio && !remuxResult.video && !remuxResult.text && !remuxResult.id3 && !remuxResult.initSegment;
17288
17317
  }
17289
17318
 
17319
+ var version = "1.5.14-0.canary.10432";
17320
+
17290
17321
  // ensure the worker ends up in the bundle
17291
17322
  // If the worker should not be included this gets aliased to empty.js
17323
+ var workerStore = {};
17292
17324
  function hasUMDWorker() {
17293
17325
  return typeof __HLS_WORKER_BUNDLE__ === 'function';
17294
17326
  }
17295
17327
  function injectWorker() {
17328
+ var workerContext = workerStore[version];
17329
+ if (workerContext) {
17330
+ workerContext.clientCount++;
17331
+ return workerContext;
17332
+ }
17296
17333
  var blob = new self.Blob(["var exports={};var module={exports:exports};function define(f){f()};define.amd=true;(" + __HLS_WORKER_BUNDLE__.toString() + ")(true);"], {
17297
17334
  type: 'text/javascript'
17298
17335
  });
17299
17336
  var objectURL = self.URL.createObjectURL(blob);
17300
17337
  var worker = new self.Worker(objectURL);
17301
- return {
17338
+ var result = {
17302
17339
  worker: worker,
17303
- objectURL: objectURL
17340
+ objectURL: objectURL,
17341
+ clientCount: 1
17304
17342
  };
17343
+ workerStore[version] = result;
17344
+ return result;
17305
17345
  }
17306
17346
  function loadWorker(path) {
17347
+ var workerContext = workerStore[path];
17348
+ if (workerContext) {
17349
+ workerContext.clientCount++;
17350
+ return workerContext;
17351
+ }
17307
17352
  var scriptURL = new self.URL(path, self.location.href).href;
17308
17353
  var worker = new self.Worker(scriptURL);
17309
- return {
17354
+ var result = {
17310
17355
  worker: worker,
17311
- scriptURL: scriptURL
17356
+ scriptURL: scriptURL,
17357
+ clientCount: 1
17312
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
+ }
17313
17377
  }
17314
17378
 
17379
+ var transmuxerInstanceCount = 0;
17315
17380
  var TransmuxerInterface = /*#__PURE__*/function () {
17316
- function TransmuxerInterface(hls, id, onTransmuxComplete, onFlush) {
17381
+ function TransmuxerInterface(_hls, id, onTransmuxComplete, onFlush) {
17317
17382
  var _this = this;
17318
17383
  this.error = null;
17319
17384
  this.hls = void 0;
17320
17385
  this.id = void 0;
17386
+ this.instanceNo = transmuxerInstanceCount++;
17321
17387
  this.observer = void 0;
17322
17388
  this.frag = null;
17323
17389
  this.part = null;
17324
17390
  this.useWorker = void 0;
17325
17391
  this.workerContext = null;
17326
- this.onwmsg = void 0;
17327
17392
  this.transmuxer = null;
17328
17393
  this.onTransmuxComplete = void 0;
17329
17394
  this.onFlush = void 0;
17330
- var config = hls.config;
17331
- this.hls = hls;
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;
17332
17459
  this.id = id;
17333
17460
  this.useWorker = !!config.enableWorker;
17334
17461
  this.onTransmuxComplete = onTransmuxComplete;
17335
17462
  this.onFlush = onFlush;
17336
17463
  var forwardMessage = function forwardMessage(ev, data) {
17337
17464
  data = data || {};
17338
- data.frag = _this.frag;
17339
- data.id = _this.id;
17465
+ data.frag = _this.frag || undefined;
17340
17466
  if (ev === Events.ERROR) {
17467
+ data = data;
17468
+ data.parent = _this.id;
17469
+ data.part = _this.part;
17341
17470
  _this.error = data.error;
17342
17471
  }
17343
17472
  _this.hls.trigger(ev, data);
@@ -17349,6 +17478,7 @@
17349
17478
  this.observer.on(Events.ERROR, forwardMessage);
17350
17479
  var m2tsTypeSupported = getM2TSSupportedAudioTypes(config.preferManagedMediaSource);
17351
17480
  if (this.useWorker && typeof Worker !== 'undefined') {
17481
+ var logger = this.hls.logger;
17352
17482
  var canCreateWorker = config.workerPath || hasUMDWorker();
17353
17483
  if (canCreateWorker) {
17354
17484
  try {
@@ -17359,61 +17489,60 @@
17359
17489
  logger.log("injecting Web Worker for \"" + id + "\"");
17360
17490
  this.workerContext = injectWorker();
17361
17491
  }
17362
- this.onwmsg = function (event) {
17363
- return _this.onWorkerMessage(event);
17364
- };
17365
17492
  var worker = this.workerContext.worker;
17366
- worker.addEventListener('message', this.onwmsg);
17367
- worker.onerror = function (event) {
17368
- var error = new Error(event.message + " (" + event.filename + ":" + event.lineno + ")");
17369
- config.enableWorker = false;
17370
- logger.warn("Error in \"" + id + "\" Web Worker, fallback to inline");
17371
- _this.hls.trigger(Events.ERROR, {
17372
- type: ErrorTypes.OTHER_ERROR,
17373
- details: ErrorDetails.INTERNAL_EXCEPTION,
17374
- fatal: false,
17375
- event: 'demuxerWorker',
17376
- error: error
17377
- });
17378
- };
17493
+ worker.addEventListener('message', this.onWorkerMessage);
17494
+ worker.addEventListener('error', this.onWorkerError);
17379
17495
  worker.postMessage({
17496
+ instanceNo: this.instanceNo,
17380
17497
  cmd: 'init',
17381
17498
  typeSupported: m2tsTypeSupported,
17382
- vendor: '',
17383
17499
  id: id,
17384
17500
  config: JSON.stringify(config)
17385
17501
  });
17386
17502
  } catch (err) {
17387
17503
  logger.warn("Error setting up \"" + id + "\" Web Worker, fallback to inline", err);
17388
- this.resetWorker();
17504
+ this.terminateWorker();
17389
17505
  this.error = null;
17390
- this.transmuxer = new Transmuxer(this.observer, m2tsTypeSupported, config, '', id);
17506
+ this.transmuxer = new Transmuxer(this.observer, m2tsTypeSupported, config, '', id, _hls.logger);
17391
17507
  }
17392
17508
  return;
17393
17509
  }
17394
17510
  }
17395
- this.transmuxer = new Transmuxer(this.observer, m2tsTypeSupported, config, '', id);
17511
+ this.transmuxer = new Transmuxer(this.observer, m2tsTypeSupported, config, '', id, _hls.logger);
17396
17512
  }
17397
17513
  var _proto = TransmuxerInterface.prototype;
17398
- _proto.resetWorker = function resetWorker() {
17514
+ _proto.reset = function reset() {
17515
+ this.frag = null;
17516
+ this.part = null;
17399
17517
  if (this.workerContext) {
17400
- var _this$workerContext = this.workerContext,
17401
- worker = _this$workerContext.worker,
17402
- objectURL = _this$workerContext.objectURL;
17403
- if (objectURL) {
17404
- // revoke the Object URL that was used to create transmuxer worker, so as not to leak it
17405
- self.URL.revokeObjectURL(objectURL);
17406
- }
17407
- worker.removeEventListener('message', this.onwmsg);
17408
- worker.onerror = null;
17409
- worker.terminate();
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;
17410
17535
  this.workerContext = null;
17536
+ worker.removeEventListener('message', this.onWorkerMessage);
17537
+ worker.removeEventListener('error', this.onWorkerError);
17538
+ removeWorkerFromStore(this.hls.config.workerPath);
17411
17539
  }
17412
17540
  };
17413
17541
  _proto.destroy = function destroy() {
17414
17542
  if (this.workerContext) {
17415
- this.resetWorker();
17416
- this.onwmsg = undefined;
17543
+ this.terminateWorker();
17544
+ // @ts-ignore
17545
+ this.onWorkerMessage = this.onWorkerError = null;
17417
17546
  } else {
17418
17547
  var transmuxer = this.transmuxer;
17419
17548
  if (transmuxer) {
@@ -17426,6 +17555,7 @@
17426
17555
  observer.removeAllListeners();
17427
17556
  }
17428
17557
  this.frag = null;
17558
+ this.part = null;
17429
17559
  // @ts-ignore
17430
17560
  this.observer = null;
17431
17561
  // @ts-ignore
@@ -17436,7 +17566,8 @@
17436
17566
  _lastFrag$initSegment,
17437
17567
  _this2 = this;
17438
17568
  chunkMeta.transmuxing.start = self.performance.now();
17439
- var transmuxer = this.transmuxer;
17569
+ var instanceNo = this.instanceNo,
17570
+ transmuxer = this.transmuxer;
17440
17571
  var timeOffset = part ? part.start : frag.start;
17441
17572
  // TODO: push "clear-lead" decrypt data for unencrypted fragments in streams with encrypted ones
17442
17573
  var decryptdata = frag.decryptdata;
@@ -17457,7 +17588,7 @@
17457
17588
  var initSegmentChange = !(lastFrag && ((_frag$initSegment = frag.initSegment) == null ? void 0 : _frag$initSegment.url) === ((_lastFrag$initSegment = lastFrag.initSegment) == null ? void 0 : _lastFrag$initSegment.url));
17458
17589
  var state = new TransmuxState(discontinuity, contiguous, accurateTimeOffset, trackSwitch, timeOffset, initSegmentChange);
17459
17590
  if (!contiguous || discontinuity || initSegmentChange) {
17460
- 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);
17461
17592
  var config = new TransmuxConfig(audioCodec, videoCodec, initSegmentData, duration, defaultInitPTS);
17462
17593
  this.configureTransmuxer(config);
17463
17594
  }
@@ -17468,6 +17599,7 @@
17468
17599
  if (this.workerContext) {
17469
17600
  // post fragment payload as transferable objects for ArrayBuffer (no copy)
17470
17601
  this.workerContext.worker.postMessage({
17602
+ instanceNo: instanceNo,
17471
17603
  cmd: 'demux',
17472
17604
  data: data,
17473
17605
  decryptdata: decryptdata,
@@ -17477,14 +17609,12 @@
17477
17609
  } else if (transmuxer) {
17478
17610
  var transmuxResult = transmuxer.push(data, decryptdata, chunkMeta, state);
17479
17611
  if (isPromise(transmuxResult)) {
17480
- transmuxer.async = true;
17481
17612
  transmuxResult.then(function (data) {
17482
17613
  _this2.handleTransmuxComplete(data);
17483
17614
  }).catch(function (error) {
17484
17615
  _this2.transmuxerError(error, chunkMeta, 'transmuxer-interface push error');
17485
17616
  });
17486
17617
  } else {
17487
- transmuxer.async = false;
17488
17618
  this.handleTransmuxComplete(transmuxResult);
17489
17619
  }
17490
17620
  }
@@ -17492,19 +17622,17 @@
17492
17622
  _proto.flush = function flush(chunkMeta) {
17493
17623
  var _this3 = this;
17494
17624
  chunkMeta.transmuxing.start = self.performance.now();
17495
- var transmuxer = this.transmuxer;
17625
+ var instanceNo = this.instanceNo,
17626
+ transmuxer = this.transmuxer;
17496
17627
  if (this.workerContext) {
17497
17628
  this.workerContext.worker.postMessage({
17629
+ instanceNo: instanceNo,
17498
17630
  cmd: 'flush',
17499
17631
  chunkMeta: chunkMeta
17500
17632
  });
17501
17633
  } else if (transmuxer) {
17502
17634
  var transmuxResult = transmuxer.flush(chunkMeta);
17503
- var asyncFlush = isPromise(transmuxResult);
17504
- if (asyncFlush || transmuxer.async) {
17505
- if (!isPromise(transmuxResult)) {
17506
- transmuxResult = Promise.resolve(transmuxResult);
17507
- }
17635
+ if (isPromise(transmuxResult)) {
17508
17636
  transmuxResult.then(function (data) {
17509
17637
  _this3.handleFlushResult(data, chunkMeta);
17510
17638
  }).catch(function (error) {
@@ -17525,6 +17653,7 @@
17525
17653
  details: ErrorDetails.FRAG_PARSING_ERROR,
17526
17654
  chunkMeta: chunkMeta,
17527
17655
  frag: this.frag || undefined,
17656
+ part: this.part || undefined,
17528
17657
  fatal: false,
17529
17658
  error: error,
17530
17659
  err: error,
@@ -17538,58 +17667,12 @@
17538
17667
  });
17539
17668
  this.onFlush(chunkMeta);
17540
17669
  };
17541
- _proto.onWorkerMessage = function onWorkerMessage(event) {
17542
- var data = event.data;
17543
- if (!(data != null && data.event)) {
17544
- logger.warn("worker message received with no " + (data ? 'event name' : 'data'));
17545
- return;
17546
- }
17547
- var hls = this.hls;
17548
- if (!this.hls) {
17549
- return;
17550
- }
17551
- switch (data.event) {
17552
- case 'init':
17553
- {
17554
- var _this$workerContext2;
17555
- var objectURL = (_this$workerContext2 = this.workerContext) == null ? void 0 : _this$workerContext2.objectURL;
17556
- if (objectURL) {
17557
- // revoke the Object URL that was used to create transmuxer worker, so as not to leak it
17558
- self.URL.revokeObjectURL(objectURL);
17559
- }
17560
- break;
17561
- }
17562
- case 'transmuxComplete':
17563
- {
17564
- this.handleTransmuxComplete(data.data);
17565
- break;
17566
- }
17567
- case 'flush':
17568
- {
17569
- this.onFlush(data.data);
17570
- break;
17571
- }
17572
-
17573
- // pass logs from the worker thread to the main logger
17574
- case 'workerLog':
17575
- if (logger[data.data.logType]) {
17576
- logger[data.data.logType](data.data.message);
17577
- }
17578
- break;
17579
- default:
17580
- {
17581
- data.data = data.data || {};
17582
- data.data.frag = this.frag;
17583
- data.data.id = this.id;
17584
- hls.trigger(data.event, data.data);
17585
- break;
17586
- }
17587
- }
17588
- };
17589
17670
  _proto.configureTransmuxer = function configureTransmuxer(config) {
17590
- var transmuxer = this.transmuxer;
17671
+ var instanceNo = this.instanceNo,
17672
+ transmuxer = this.transmuxer;
17591
17673
  if (this.workerContext) {
17592
17674
  this.workerContext.worker.postMessage({
17675
+ instanceNo: instanceNo,
17593
17676
  cmd: 'configure',
17594
17677
  config: config
17595
17678
  });
@@ -30788,7 +30871,7 @@
30788
30871
  * Get the video-dev/hls.js package version.
30789
30872
  */
30790
30873
  function get() {
30791
- return "1.5.14-0.canary.10429";
30874
+ return version;
30792
30875
  }
30793
30876
  }, {
30794
30877
  key: "Events",