hls.js 1.5.17 → 1.5.19

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
@@ -521,7 +521,7 @@
521
521
  // Some browsers don't allow to use bind on console object anyway
522
522
  // fallback to default if needed
523
523
  try {
524
- exportedLogger.log("Debug logs enabled for \"" + id + "\" in hls.js version " + "1.5.17");
524
+ exportedLogger.log("Debug logs enabled for \"" + id + "\" in hls.js version " + "1.5.19");
525
525
  } catch (e) {
526
526
  exportedLogger = fakeLogger;
527
527
  }
@@ -4979,15 +4979,16 @@
4979
4979
  delete oldDetails.fragmentHint.endPTS;
4980
4980
  }
4981
4981
  // check if old/new playlists have fragments in common
4982
- // loop through overlapping SN and update startPTS , cc, and duration if any found
4983
- var ccOffset = 0;
4982
+ // loop through overlapping SN and update startPTS, cc, and duration if any found
4984
4983
  var PTSFrag;
4985
- mapFragmentIntersection(oldDetails, newDetails, function (oldFrag, newFrag) {
4986
- if (oldFrag.relurl) {
4987
- // Do not compare CC if the old fragment has no url. This is a level.fragmentHint used by LL-HLS parts.
4988
- // It maybe be off by 1 if it was created before any parts or discontinuity tags were appended to the end
4989
- // of the playlist.
4990
- ccOffset = oldFrag.cc - newFrag.cc;
4984
+ mapFragmentIntersection(oldDetails, newDetails, function (oldFrag, newFrag, newFragIndex, newFragments) {
4985
+ if (newDetails.skippedSegments) {
4986
+ if (newFrag.cc !== oldFrag.cc) {
4987
+ var ccOffset = oldFrag.cc - newFrag.cc;
4988
+ for (var _i = newFragIndex; _i < newFragments.length; _i++) {
4989
+ newFragments[_i].cc += ccOffset;
4990
+ }
4991
+ }
4991
4992
  }
4992
4993
  if (isFiniteNumber(oldFrag.startPTS) && isFiniteNumber(oldFrag.endPTS)) {
4993
4994
  newFrag.start = newFrag.startPTS = oldFrag.startPTS;
@@ -5012,8 +5013,9 @@
5012
5013
  currentInitSegment = oldFrag.initSegment;
5013
5014
  }
5014
5015
  });
5016
+ var newFragments = newDetails.fragments;
5015
5017
  if (currentInitSegment) {
5016
- var fragmentsToCheck = newDetails.fragmentHint ? newDetails.fragments.concat(newDetails.fragmentHint) : newDetails.fragments;
5018
+ var fragmentsToCheck = newDetails.fragmentHint ? newFragments.concat(newDetails.fragmentHint) : newFragments;
5017
5019
  fragmentsToCheck.forEach(function (frag) {
5018
5020
  var _currentInitSegment;
5019
5021
  if (frag && (!frag.initSegment || frag.initSegment.relurl === ((_currentInitSegment = currentInitSegment) == null ? void 0 : _currentInitSegment.relurl))) {
@@ -5022,29 +5024,22 @@
5022
5024
  });
5023
5025
  }
5024
5026
  if (newDetails.skippedSegments) {
5025
- newDetails.deltaUpdateFailed = newDetails.fragments.some(function (frag) {
5027
+ newDetails.deltaUpdateFailed = newFragments.some(function (frag) {
5026
5028
  return !frag;
5027
5029
  });
5028
5030
  if (newDetails.deltaUpdateFailed) {
5029
5031
  logger.warn('[level-helper] Previous playlist missing segments skipped in delta playlist');
5030
- for (var _i = newDetails.skippedSegments; _i--;) {
5031
- newDetails.fragments.shift();
5032
+ for (var _i2 = newDetails.skippedSegments; _i2--;) {
5033
+ newFragments.shift();
5034
+ }
5035
+ newDetails.startSN = newFragments[0].sn;
5036
+ } else {
5037
+ if (newDetails.canSkipDateRanges) {
5038
+ newDetails.dateRanges = mergeDateRanges(oldDetails.dateRanges, newDetails.dateRanges, newDetails.recentlyRemovedDateranges);
5032
5039
  }
5033
- newDetails.startSN = newDetails.fragments[0].sn;
5034
- newDetails.startCC = newDetails.fragments[0].cc;
5035
- } else if (newDetails.canSkipDateRanges) {
5036
- newDetails.dateRanges = mergeDateRanges(oldDetails.dateRanges, newDetails.dateRanges, newDetails.recentlyRemovedDateranges);
5037
- }
5038
- }
5039
- var newFragments = newDetails.fragments;
5040
- if (ccOffset) {
5041
- logger.warn('discontinuity sliding from playlist, take drift into account');
5042
- for (var _i2 = 0; _i2 < newFragments.length; _i2++) {
5043
- newFragments[_i2].cc += ccOffset;
5044
5040
  }
5045
- }
5046
- if (newDetails.skippedSegments) {
5047
5041
  newDetails.startCC = newDetails.fragments[0].cc;
5042
+ newDetails.endCC = newFragments[newFragments.length - 1].cc;
5048
5043
  }
5049
5044
 
5050
5045
  // Merge parts
@@ -5128,7 +5123,7 @@
5128
5123
  _newFrag = newDetails.fragments[i] = _oldFrag;
5129
5124
  }
5130
5125
  if (_oldFrag && _newFrag) {
5131
- intersectionFn(_oldFrag, _newFrag);
5126
+ intersectionFn(_oldFrag, _newFrag, i, newFrags);
5132
5127
  }
5133
5128
  }
5134
5129
  }
@@ -7503,6 +7498,7 @@
7503
7498
  _this2.resetBuffer(type);
7504
7499
  });
7505
7500
  this._initSourceBuffer();
7501
+ this.hls.resumeBuffering();
7506
7502
  };
7507
7503
  _proto.resetBuffer = function resetBuffer(type) {
7508
7504
  var sb = this.sourceBuffer[type];
@@ -9145,47 +9141,51 @@
9145
9141
  xhr.onprogress = null;
9146
9142
  var _status = xhr.status;
9147
9143
  // http status between 200 to 299 are all successful
9148
- var useResponse = xhr.responseType !== 'text';
9149
- if (_status >= 200 && _status < 300 && (useResponse && xhr.response || xhr.responseText !== null)) {
9150
- stats.loading.end = Math.max(self.performance.now(), stats.loading.first);
9151
- var data = useResponse ? xhr.response : xhr.responseText;
9152
- var len = xhr.responseType === 'arraybuffer' ? data.byteLength : data.length;
9153
- stats.loaded = stats.total = len;
9154
- stats.bwEstimate = stats.total * 8000 / (stats.loading.end - stats.loading.first);
9155
- if (!this.callbacks) {
9156
- return;
9157
- }
9158
- var onProgress = this.callbacks.onProgress;
9159
- if (onProgress) {
9160
- onProgress(stats, context, data, xhr);
9161
- }
9162
- if (!this.callbacks) {
9144
+ var useResponseText = xhr.responseType === 'text' ? xhr.responseText : null;
9145
+ if (_status >= 200 && _status < 300) {
9146
+ var data = useResponseText != null ? useResponseText : xhr.response;
9147
+ if (data != null) {
9148
+ stats.loading.end = Math.max(self.performance.now(), stats.loading.first);
9149
+ var len = xhr.responseType === 'arraybuffer' ? data.byteLength : data.length;
9150
+ stats.loaded = stats.total = len;
9151
+ stats.bwEstimate = stats.total * 8000 / (stats.loading.end - stats.loading.first);
9152
+ if (!this.callbacks) {
9153
+ return;
9154
+ }
9155
+ var onProgress = this.callbacks.onProgress;
9156
+ if (onProgress) {
9157
+ onProgress(stats, context, data, xhr);
9158
+ }
9159
+ if (!this.callbacks) {
9160
+ return;
9161
+ }
9162
+ var _response = {
9163
+ url: xhr.responseURL,
9164
+ data: data,
9165
+ code: _status
9166
+ };
9167
+ this.callbacks.onSuccess(_response, stats, context, xhr);
9163
9168
  return;
9164
9169
  }
9165
- var response = {
9166
- url: xhr.responseURL,
9167
- data: data,
9168
- code: _status
9169
- };
9170
- this.callbacks.onSuccess(response, stats, context, xhr);
9170
+ }
9171
+
9172
+ // Handle bad status or nullish response
9173
+ var retryConfig = config.loadPolicy.errorRetry;
9174
+ var retryCount = stats.retry;
9175
+ // if max nb of retries reached or if http status between 400 and 499 (such error cannot be recovered, retrying is useless), return error
9176
+ var response = {
9177
+ url: context.url,
9178
+ data: undefined,
9179
+ code: _status
9180
+ };
9181
+ if (shouldRetry(retryConfig, retryCount, false, response)) {
9182
+ this.retry(retryConfig);
9171
9183
  } else {
9172
- var retryConfig = config.loadPolicy.errorRetry;
9173
- var retryCount = stats.retry;
9174
- // if max nb of retries reached or if http status between 400 and 499 (such error cannot be recovered, retrying is useless), return error
9175
- var _response = {
9176
- url: context.url,
9177
- data: undefined,
9178
- code: _status
9179
- };
9180
- if (shouldRetry(retryConfig, retryCount, false, _response)) {
9181
- this.retry(retryConfig);
9182
- } else {
9183
- logger.error(_status + " while loading " + context.url);
9184
- this.callbacks.onError({
9185
- code: _status,
9186
- text: xhr.statusText
9187
- }, context, xhr, stats);
9188
- }
9184
+ logger.error(_status + " while loading " + context.url);
9185
+ this.callbacks.onError({
9186
+ code: _status,
9187
+ text: xhr.statusText
9188
+ }, context, xhr, stats);
9189
9189
  }
9190
9190
  }
9191
9191
  }
@@ -11261,7 +11261,7 @@
11261
11261
  };
11262
11262
  _proto.load = function load(frag) {
11263
11263
  var _this2 = this;
11264
- if (!frag.decryptdata && frag.encrypted && this.emeController) {
11264
+ if (!frag.decryptdata && frag.encrypted && this.emeController && this.config.emeEnabled) {
11265
11265
  // Multiple keys, but none selected, resolve in eme-controller
11266
11266
  return this.emeController.selectKeySystemFormat(frag).then(function (keySystemFormat) {
11267
11267
  return _this2.loadInternal(frag, keySystemFormat);
@@ -12238,6 +12238,7 @@
12238
12238
  _this.startFragRequested = false;
12239
12239
  _this.decrypter = void 0;
12240
12240
  _this.initPTS = [];
12241
+ _this.buffering = true;
12241
12242
  _this.onvseeking = null;
12242
12243
  _this.onvended = null;
12243
12244
  _this.logPrefix = '';
@@ -12280,6 +12281,12 @@
12280
12281
  this.clearNextTick();
12281
12282
  this.state = State.STOPPED;
12282
12283
  };
12284
+ _proto.pauseBuffering = function pauseBuffering() {
12285
+ this.buffering = false;
12286
+ };
12287
+ _proto.resumeBuffering = function resumeBuffering() {
12288
+ this.buffering = true;
12289
+ };
12283
12290
  _proto._streamEnded = function _streamEnded(bufferInfo, levelDetails) {
12284
12291
  // If playlist is live, there is another buffered range after the current range, nothing buffered, media is detached,
12285
12292
  // of nothing loading/loaded return false
@@ -16548,19 +16555,23 @@
16548
16555
  this.videoTrackConfig = undefined;
16549
16556
  };
16550
16557
  _proto.getVideoStartPts = function getVideoStartPts(videoSamples) {
16558
+ // Get the minimum PTS value relative to the first sample's PTS, normalized for 33-bit wrapping
16551
16559
  var rolloverDetected = false;
16560
+ var firstPts = videoSamples[0].pts;
16552
16561
  var startPTS = videoSamples.reduce(function (minPTS, sample) {
16553
- var delta = sample.pts - minPTS;
16562
+ var pts = sample.pts;
16563
+ var delta = pts - minPTS;
16554
16564
  if (delta < -4294967296) {
16555
16565
  // 2^32, see PTSNormalize for reasoning, but we're hitting a rollover here, and we don't want that to impact the timeOffset calculation
16556
16566
  rolloverDetected = true;
16557
- return normalizePts(minPTS, sample.pts);
16558
- } else if (delta > 0) {
16567
+ pts = normalizePts(pts, firstPts);
16568
+ delta = pts - minPTS;
16569
+ }
16570
+ if (delta > 0) {
16559
16571
  return minPTS;
16560
- } else {
16561
- return sample.pts;
16562
16572
  }
16563
- }, videoSamples[0].pts);
16573
+ return pts;
16574
+ }, firstPts);
16564
16575
  if (rolloverDetected) {
16565
16576
  logger.debug('PTS rollover detected');
16566
16577
  }
@@ -19241,7 +19252,7 @@
19241
19252
  if (this.altAudio && this.audioOnly) {
19242
19253
  return;
19243
19254
  }
19244
- var level = hls.nextLoadLevel;
19255
+ var level = this.buffering ? hls.nextLoadLevel : hls.loadLevel;
19245
19256
  if (!(levels != null && levels[level])) {
19246
19257
  return;
19247
19258
  }
@@ -19263,6 +19274,9 @@
19263
19274
  this.state = State.ENDED;
19264
19275
  return;
19265
19276
  }
19277
+ if (!this.buffering) {
19278
+ return;
19279
+ }
19266
19280
 
19267
19281
  // set next load level : this will trigger a playlist load if needed
19268
19282
  if (hls.loadLevel !== level && hls.manualLevel === -1) {
@@ -20471,9 +20485,13 @@
20471
20485
  }
20472
20486
  logger.log("startLoad(" + startPosition + ")");
20473
20487
  this.started = true;
20474
- this.networkControllers.forEach(function (controller) {
20475
- controller.startLoad(startPosition);
20476
- });
20488
+ this.resumeBuffering();
20489
+ for (var i = 0; i < this.networkControllers.length; i++) {
20490
+ this.networkControllers[i].startLoad(startPosition);
20491
+ if (!this.started || !this.networkControllers) {
20492
+ break;
20493
+ }
20494
+ }
20477
20495
  }
20478
20496
 
20479
20497
  /**
@@ -20482,32 +20500,35 @@
20482
20500
  _proto.stopLoad = function stopLoad() {
20483
20501
  logger.log('stopLoad');
20484
20502
  this.started = false;
20485
- this.networkControllers.forEach(function (controller) {
20486
- controller.stopLoad();
20487
- });
20503
+ for (var i = 0; i < this.networkControllers.length; i++) {
20504
+ this.networkControllers[i].stopLoad();
20505
+ if (this.started || !this.networkControllers) {
20506
+ break;
20507
+ }
20508
+ }
20488
20509
  }
20489
20510
 
20490
20511
  /**
20491
- * Resumes stream controller segment loading if previously started.
20512
+ * Resumes stream controller segment loading after `pauseBuffering` has been called.
20492
20513
  */;
20493
20514
  _proto.resumeBuffering = function resumeBuffering() {
20494
- if (this.started) {
20495
- this.networkControllers.forEach(function (controller) {
20496
- if ('fragmentLoader' in controller) {
20497
- controller.startLoad(-1);
20498
- }
20499
- });
20500
- }
20515
+ logger.log("resume buffering");
20516
+ this.networkControllers.forEach(function (controller) {
20517
+ if (controller.resumeBuffering) {
20518
+ controller.resumeBuffering();
20519
+ }
20520
+ });
20501
20521
  }
20502
20522
 
20503
20523
  /**
20504
- * Stops stream controller segment loading without changing 'started' state like stopLoad().
20524
+ * Prevents stream controller from loading new segments until `resumeBuffering` is called.
20505
20525
  * This allows for media buffering to be paused without interupting playlist loading.
20506
20526
  */;
20507
20527
  _proto.pauseBuffering = function pauseBuffering() {
20528
+ logger.log("pause buffering");
20508
20529
  this.networkControllers.forEach(function (controller) {
20509
- if ('fragmentLoader' in controller) {
20510
- controller.stopLoad();
20530
+ if (controller.pauseBuffering) {
20531
+ controller.pauseBuffering();
20511
20532
  }
20512
20533
  });
20513
20534
  }
@@ -21064,7 +21085,7 @@
21064
21085
  * Get the video-dev/hls.js package version.
21065
21086
  */
21066
21087
  function get() {
21067
- return "1.5.17";
21088
+ return "1.5.19";
21068
21089
  }
21069
21090
  }, {
21070
21091
  key: "Events",