hls.js 1.5.14-0.canary.10431 → 1.5.14-0.canary.10432

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