hls.js 1.5.10-0.canary.10320 → 1.5.10-0.canary.10326

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
@@ -580,7 +580,7 @@
580
580
  // Some browsers don't allow to use bind on console object anyway
581
581
  // fallback to default if needed
582
582
  try {
583
- newLogger.log("Debug logs enabled for \"" + context + "\" in hls.js version " + "1.5.10-0.canary.10320");
583
+ newLogger.log("Debug logs enabled for \"" + context + "\" in hls.js version " + "1.5.10-0.canary.10326");
584
584
  } catch (e) {
585
585
  /* log fn threw an exception. All logger methods are no-ops. */
586
586
  return createLogger();
@@ -5475,13 +5475,16 @@
5475
5475
  * @param maxFragLookUpTolerance - The amount of time that a fragment's start/end can be within in order to be considered contiguous
5476
5476
  * @returns a matching fragment or null
5477
5477
  */
5478
- function findFragmentByPTS(fragPrevious, fragments, bufferEnd, maxFragLookUpTolerance) {
5478
+ function findFragmentByPTS(fragPrevious, fragments, bufferEnd, maxFragLookUpTolerance, nextFragLookupTolerance) {
5479
5479
  if (bufferEnd === void 0) {
5480
5480
  bufferEnd = 0;
5481
5481
  }
5482
5482
  if (maxFragLookUpTolerance === void 0) {
5483
5483
  maxFragLookUpTolerance = 0;
5484
5484
  }
5485
+ if (nextFragLookupTolerance === void 0) {
5486
+ nextFragLookupTolerance = 0.005;
5487
+ }
5485
5488
  var fragNext = null;
5486
5489
  if (fragPrevious) {
5487
5490
  fragNext = fragments[fragPrevious.sn - fragments[0].sn + 1] || null;
@@ -5494,7 +5497,7 @@
5494
5497
  fragNext = fragments[0];
5495
5498
  }
5496
5499
  // Prefer the next fragment if it's within tolerance
5497
- if (fragNext && (!fragPrevious || fragPrevious.level === fragNext.level) && fragmentWithinToleranceTest(bufferEnd, maxFragLookUpTolerance, fragNext) === 0) {
5500
+ if (fragNext && ((!fragPrevious || fragPrevious.level === fragNext.level) && fragmentWithinToleranceTest(bufferEnd, maxFragLookUpTolerance, fragNext) === 0 || fragmentWithinFastStartSwitch(fragNext, fragPrevious, Math.min(nextFragLookupTolerance, maxFragLookUpTolerance)))) {
5498
5501
  return fragNext;
5499
5502
  }
5500
5503
  // We might be seeking past the tolerance so find the best match
@@ -5505,6 +5508,18 @@
5505
5508
  // If no match was found return the next fragment after fragPrevious, or null
5506
5509
  return fragNext;
5507
5510
  }
5511
+ function fragmentWithinFastStartSwitch(fragNext, fragPrevious, nextFragLookupTolerance) {
5512
+ if (fragPrevious && fragPrevious.start === 0 && fragPrevious.level < fragNext.level && (fragPrevious.endPTS || 0) > 0) {
5513
+ var firstDuration = fragPrevious.tagList.reduce(function (duration, tag) {
5514
+ if (tag[0] === 'INF') {
5515
+ duration += parseFloat(tag[1]);
5516
+ }
5517
+ return duration;
5518
+ }, nextFragLookupTolerance);
5519
+ return fragNext.start <= firstDuration;
5520
+ }
5521
+ return false;
5522
+ }
5508
5523
 
5509
5524
  /**
5510
5525
  * The test function used by the findFragmentBySn's BinarySearch to look for the best match to the current buffer conditions.
@@ -9271,8 +9286,6 @@
9271
9286
  this.config = null;
9272
9287
  this.context = null;
9273
9288
  this.xhrSetup = null;
9274
- // @ts-ignore
9275
- this.stats = null;
9276
9289
  };
9277
9290
  _proto.abortInternal = function abortInternal() {
9278
9291
  var loader = this.loader;
@@ -9319,13 +9332,14 @@
9319
9332
  var xhrSetup = this.xhrSetup;
9320
9333
  if (xhrSetup) {
9321
9334
  Promise.resolve().then(function () {
9322
- if (_this.stats.aborted) return;
9335
+ if (_this.loader !== xhr || _this.stats.aborted) return;
9323
9336
  return xhrSetup(xhr, context.url);
9324
9337
  }).catch(function (error) {
9338
+ if (_this.loader !== xhr || _this.stats.aborted) return;
9325
9339
  xhr.open('GET', context.url, true);
9326
9340
  return xhrSetup(xhr, context.url);
9327
9341
  }).then(function () {
9328
- if (_this.stats.aborted) return;
9342
+ if (_this.loader !== xhr || _this.stats.aborted) return;
9329
9343
  _this.openAndSendXhr(xhr, context, config);
9330
9344
  }).catch(function (error) {
9331
9345
  // IE11 throws an exception on xhr.open if attempting to access an HTTP resource over HTTPS
@@ -9442,8 +9456,8 @@
9442
9456
  }
9443
9457
  };
9444
9458
  _proto.loadtimeout = function loadtimeout() {
9445
- var _this$config;
9446
- var retryConfig = (_this$config = this.config) == null ? void 0 : _this$config.loadPolicy.timeoutRetry;
9459
+ if (!this.config) return;
9460
+ var retryConfig = this.config.loadPolicy.timeoutRetry;
9447
9461
  var retryCount = this.stats.retry;
9448
9462
  if (shouldRetry(retryConfig, retryCount, true)) {
9449
9463
  this.retry(retryConfig);
@@ -12791,7 +12805,7 @@
12791
12805
  if (_this3.state === State.STOPPED || _this3.state === State.ERROR) {
12792
12806
  return;
12793
12807
  }
12794
- _this3.warn(reason);
12808
+ _this3.warn("Frag error: " + ((reason == null ? void 0 : reason.message) || reason));
12795
12809
  _this3.resetFragmentLoading(frag);
12796
12810
  });
12797
12811
  };
@@ -13473,7 +13487,7 @@
13473
13487
  var fragments = levelDetails.fragments,
13474
13488
  endSN = levelDetails.endSN;
13475
13489
  var fragmentHint = levelDetails.fragmentHint;
13476
- var tolerance = config.maxFragLookUpTolerance;
13490
+ var maxFragLookUpTolerance = config.maxFragLookUpTolerance;
13477
13491
  var partList = levelDetails.partList;
13478
13492
  var loadingParts = !!(this.loadingParts && partList != null && partList.length && fragmentHint);
13479
13493
  if (loadingParts && fragmentHint && !this.bitrateTest) {
@@ -13483,7 +13497,7 @@
13483
13497
  }
13484
13498
  var frag;
13485
13499
  if (bufferEnd < end) {
13486
- var lookupTolerance = bufferEnd > end - tolerance ? 0 : tolerance;
13500
+ var lookupTolerance = bufferEnd > end - maxFragLookUpTolerance ? 0 : maxFragLookUpTolerance;
13487
13501
  // Remove the tolerance if it would put the bufferEnd past the actual end of stream
13488
13502
  // Uses buffer and sequence number to calculate switch segment (required if using EXT-X-DISCONTINUITY-SEQUENCE)
13489
13503
  frag = findFragmentByPTS(fragPrevious, fragments, bufferEnd, lookupTolerance);
@@ -15774,7 +15788,7 @@
15774
15788
  if (stt) {
15775
15789
  offset += data[offset] + 1;
15776
15790
  }
15777
- var parsedPIDs = parsePMT(data, offset, this.typeSupported, isSampleAes);
15791
+ var parsedPIDs = parsePMT(data, offset, this.typeSupported, isSampleAes, this.observer);
15778
15792
 
15779
15793
  // only update track id if track PID found while parsing PMT
15780
15794
  // this is to avoid resetting the PID to -1 in case
@@ -15817,14 +15831,7 @@
15817
15831
  }
15818
15832
  }
15819
15833
  if (tsPacketErrors > 0) {
15820
- var error = new Error("Found " + tsPacketErrors + " TS packet/s that do not start with 0x47");
15821
- this.observer.emit(Events.ERROR, Events.ERROR, {
15822
- type: ErrorTypes.MEDIA_ERROR,
15823
- details: ErrorDetails.FRAG_PARSING_ERROR,
15824
- fatal: false,
15825
- error: error,
15826
- reason: error.message
15827
- });
15834
+ emitParsingError(this.observer, new Error("Found " + tsPacketErrors + " TS packet/s that do not start with 0x47"));
15828
15835
  }
15829
15836
  videoTrack.pesData = videoData;
15830
15837
  audioTrack.pesData = audioData;
@@ -15976,16 +15983,7 @@
15976
15983
  } else {
15977
15984
  reason = 'No ADTS header found in AAC PES';
15978
15985
  }
15979
- var error = new Error(reason);
15980
- logger.warn("parsing error: " + reason);
15981
- this.observer.emit(Events.ERROR, Events.ERROR, {
15982
- type: ErrorTypes.MEDIA_ERROR,
15983
- details: ErrorDetails.FRAG_PARSING_ERROR,
15984
- fatal: false,
15985
- levelRetry: recoverable,
15986
- error: error,
15987
- reason: reason
15988
- });
15986
+ emitParsingError(this.observer, new Error(reason), recoverable);
15989
15987
  if (!recoverable) {
15990
15988
  return;
15991
15989
  }
@@ -16072,7 +16070,7 @@
16072
16070
  // skip the PSI header and parse the first PMT entry
16073
16071
  return (data[offset + 10] & 0x1f) << 8 | data[offset + 11];
16074
16072
  }
16075
- function parsePMT(data, offset, typeSupported, isSampleAes) {
16073
+ function parsePMT(data, offset, typeSupported, isSampleAes, observer) {
16076
16074
  var result = {
16077
16075
  audioPid: -1,
16078
16076
  videoPid: -1,
@@ -16180,11 +16178,13 @@
16180
16178
  case 0xc2: // SAMPLE-AES EC3
16181
16179
  /* falls through */
16182
16180
  case 0x87:
16183
- throw new Error('Unsupported EC-3 in M2TS found');
16181
+ emitParsingError(observer, new Error('Unsupported EC-3 in M2TS found'));
16182
+ return result;
16184
16183
  case 0x24:
16185
16184
  // ITU-T Rec. H.265 and ISO/IEC 23008-2 (HEVC)
16186
16185
  {
16187
- throw new Error('Unsupported HEVC in M2TS found');
16186
+ emitParsingError(observer, new Error('Unsupported HEVC in M2TS found'));
16187
+ return result;
16188
16188
  }
16189
16189
  }
16190
16190
  // move to the next table entry
@@ -16193,6 +16193,17 @@
16193
16193
  }
16194
16194
  return result;
16195
16195
  }
16196
+ function emitParsingError(observer, error, levelRetry) {
16197
+ logger.warn("parsing error: " + error.message);
16198
+ observer.emit(Events.ERROR, Events.ERROR, {
16199
+ type: ErrorTypes.MEDIA_ERROR,
16200
+ details: ErrorDetails.FRAG_PARSING_ERROR,
16201
+ fatal: false,
16202
+ levelRetry: levelRetry,
16203
+ error: error,
16204
+ reason: error.message
16205
+ });
16206
+ }
16196
16207
  function logEncryptedSamplesFoundInUnencryptedStream(type) {
16197
16208
  logger.log(type + " with AES-128-CBC encryption found in unencrypted stream");
16198
16209
  }
@@ -18927,7 +18938,7 @@
18927
18938
  case 'init':
18928
18939
  {
18929
18940
  var config = JSON.parse(data.config);
18930
- self.transmuxer = new Transmuxer(observer, data.typeSupported, config, data.vendor, data.id);
18941
+ self.transmuxer = new Transmuxer(observer, data.typeSupported, config, '', data.id);
18931
18942
  var logger = enableLogs(config.debug, data.id);
18932
18943
  forwardWorkerLogs(logger);
18933
18944
  forwardMessage('init', null);
@@ -19104,10 +19115,6 @@
19104
19115
  this.observer.on(Events.FRAG_DECRYPTED, forwardMessage);
19105
19116
  this.observer.on(Events.ERROR, forwardMessage);
19106
19117
  var m2tsTypeSupported = getM2TSSupportedAudioTypes(config.preferManagedMediaSource);
19107
-
19108
- // navigator.vendor is not always available in Web Worker
19109
- // refer to https://developer.mozilla.org/en-US/docs/Web/API/WorkerGlobalScope/navigator
19110
- var vendor = navigator.vendor;
19111
19118
  if (this.useWorker && typeof Worker !== 'undefined') {
19112
19119
  var canCreateWorker = config.workerPath || hasUMDWorker();
19113
19120
  if (canCreateWorker) {
@@ -19119,8 +19126,8 @@
19119
19126
  logger.log("injecting Web Worker for \"" + id + "\"");
19120
19127
  this.workerContext = injectWorker();
19121
19128
  }
19122
- this.onwmsg = function (ev) {
19123
- return _this.onWorkerMessage(ev);
19129
+ this.onwmsg = function (event) {
19130
+ return _this.onWorkerMessage(event);
19124
19131
  };
19125
19132
  var worker = this.workerContext.worker;
19126
19133
  worker.addEventListener('message', this.onwmsg);
@@ -19139,7 +19146,7 @@
19139
19146
  worker.postMessage({
19140
19147
  cmd: 'init',
19141
19148
  typeSupported: m2tsTypeSupported,
19142
- vendor: vendor,
19149
+ vendor: '',
19143
19150
  id: id,
19144
19151
  config: JSON.stringify(config)
19145
19152
  });
@@ -19147,12 +19154,12 @@
19147
19154
  logger.warn("Error setting up \"" + id + "\" Web Worker, fallback to inline", err);
19148
19155
  this.resetWorker();
19149
19156
  this.error = null;
19150
- this.transmuxer = new Transmuxer(this.observer, m2tsTypeSupported, config, vendor, id);
19157
+ this.transmuxer = new Transmuxer(this.observer, m2tsTypeSupported, config, '', id);
19151
19158
  }
19152
19159
  return;
19153
19160
  }
19154
19161
  }
19155
- this.transmuxer = new Transmuxer(this.observer, m2tsTypeSupported, config, vendor, id);
19162
+ this.transmuxer = new Transmuxer(this.observer, m2tsTypeSupported, config, '', id);
19156
19163
  }
19157
19164
  var _proto = TransmuxerInterface.prototype;
19158
19165
  _proto.resetWorker = function resetWorker() {
@@ -19298,9 +19305,16 @@
19298
19305
  });
19299
19306
  this.onFlush(chunkMeta);
19300
19307
  };
19301
- _proto.onWorkerMessage = function onWorkerMessage(ev) {
19302
- var data = ev.data;
19308
+ _proto.onWorkerMessage = function onWorkerMessage(event) {
19309
+ var data = event.data;
19310
+ if (!(data != null && data.event)) {
19311
+ logger.warn("worker message received with no " + (data ? 'event name' : 'data'));
19312
+ return;
19313
+ }
19303
19314
  var hls = this.hls;
19315
+ if (!this.hls) {
19316
+ return;
19317
+ }
19304
19318
  switch (data.event) {
19305
19319
  case 'init':
19306
19320
  {
@@ -20643,7 +20657,8 @@
20643
20657
  // In the case that AAC and HE-AAC audio codecs are signalled in manifest,
20644
20658
  // force HE-AAC, as it seems that most browsers prefers it.
20645
20659
  // don't force HE-AAC if mono stream, or in Firefox
20646
- if (audio.metadata.channelCount !== 1 && ua.indexOf('firefox') === -1) {
20660
+ var audioMetadata = audio.metadata;
20661
+ if (audioMetadata && 'channelCount' in audioMetadata && (audioMetadata.channelCount || 1) !== 1 && ua.indexOf('firefox') === -1) {
20647
20662
  audioCodec = 'mp4a.40.5';
20648
20663
  }
20649
20664
  }
@@ -21694,7 +21709,7 @@
21694
21709
  * Get the video-dev/hls.js package version.
21695
21710
  */
21696
21711
  function get() {
21697
- return "1.5.10-0.canary.10320";
21712
+ return "1.5.10-0.canary.10326";
21698
21713
  }
21699
21714
  }, {
21700
21715
  key: "Events",