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