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