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

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.mjs CHANGED
@@ -420,7 +420,7 @@ function enableLogs(debugConfig, context, id) {
420
420
  // Some browsers don't allow to use bind on console object anyway
421
421
  // fallback to default if needed
422
422
  try {
423
- newLogger.log(`Debug logs enabled for "${context}" in hls.js version ${"1.5.14-0.canary.10427"}`);
423
+ newLogger.log(`Debug logs enabled for "${context}" in hls.js version ${"1.5.14-0.canary.10431"}`);
424
424
  } catch (e) {
425
425
  /* log fn threw an exception. All logger methods are no-ops. */
426
426
  return createLogger();
@@ -8674,30 +8674,14 @@ function findFirstFragWithCC(fragments, cc) {
8674
8674
  }
8675
8675
  return null;
8676
8676
  }
8677
- function shouldAlignOnDiscontinuities(lastFrag, switchDetails, details) {
8678
- if (switchDetails) {
8679
- if (details.endCC > details.startCC || lastFrag && lastFrag.cc < details.startCC) {
8677
+ function shouldAlignOnDiscontinuities(refDetails, details) {
8678
+ if (refDetails) {
8679
+ if (details.startCC < refDetails.endCC && details.endCC > refDetails.startCC) {
8680
8680
  return true;
8681
8681
  }
8682
8682
  }
8683
8683
  return false;
8684
8684
  }
8685
-
8686
- // Find the first frag in the previous level which matches the CC of the first frag of the new level
8687
- function findDiscontinuousReferenceFrag(prevDetails, curDetails) {
8688
- const prevFrags = prevDetails.fragments;
8689
- const curFrags = curDetails.fragments;
8690
- if (!curFrags.length || !prevFrags.length) {
8691
- logger.log('No fragments to align');
8692
- return;
8693
- }
8694
- const prevStartFrag = findFirstFragWithCC(prevFrags, curFrags[0].cc);
8695
- if (!prevStartFrag || prevStartFrag && !prevStartFrag.startPTS) {
8696
- logger.log('No frag in previous level to align on');
8697
- return;
8698
- }
8699
- return prevStartFrag;
8700
- }
8701
8685
  function adjustFragmentStart(frag, sliding) {
8702
8686
  if (frag) {
8703
8687
  const start = frag.start + sliding;
@@ -8732,7 +8716,7 @@ function alignStream(lastFrag, switchDetails, details) {
8732
8716
  if (!switchDetails) {
8733
8717
  return;
8734
8718
  }
8735
- alignDiscontinuities(lastFrag, details, switchDetails);
8719
+ alignDiscontinuities(details, switchDetails);
8736
8720
  if (!details.alignedSliding && switchDetails) {
8737
8721
  // If the PTS wasn't figured out via discontinuity sequence that means there was no CC increase within the level.
8738
8722
  // Aligning via Program Date Time should therefore be reliable, since PDT should be the same within the same
@@ -8748,20 +8732,24 @@ function alignStream(lastFrag, switchDetails, details) {
8748
8732
  }
8749
8733
 
8750
8734
  /**
8751
- * Computes the PTS if a new level's fragments using the PTS of a fragment in the last level which shares the same
8752
- * discontinuity sequence.
8753
- * @param lastFrag - The last Fragment which shares the same discontinuity sequence
8735
+ * Ajust the start of fragments in `details` by the difference in time between fragments of the latest
8736
+ * shared discontinuity sequence change.
8754
8737
  * @param lastLevel - The details of the last loaded level
8755
8738
  * @param details - The details of the new level
8756
8739
  */
8757
- function alignDiscontinuities(lastFrag, details, switchDetails) {
8758
- if (shouldAlignOnDiscontinuities(lastFrag, switchDetails, details)) {
8759
- const referenceFrag = findDiscontinuousReferenceFrag(switchDetails, details);
8760
- if (referenceFrag && isFiniteNumber(referenceFrag.start)) {
8761
- logger.log(`Adjusting PTS using last level due to CC increase within current level ${details.url}`);
8762
- adjustSlidingStart(referenceFrag.start, details);
8763
- }
8740
+ function alignDiscontinuities(details, refDetails) {
8741
+ if (!shouldAlignOnDiscontinuities(refDetails, details)) {
8742
+ return;
8764
8743
  }
8744
+ const targetCC = Math.min(refDetails.endCC, details.endCC);
8745
+ const refFrag = findFirstFragWithCC(refDetails.fragments, targetCC);
8746
+ const frag = findFirstFragWithCC(details.fragments, targetCC);
8747
+ if (!refFrag || !frag) {
8748
+ return;
8749
+ }
8750
+ logger.log(`Aligning playlist at start of dicontinuity sequence ${targetCC}`);
8751
+ const delta = refFrag.start - frag.start;
8752
+ adjustSlidingStart(delta, details);
8765
8753
  }
8766
8754
 
8767
8755
  /**
@@ -9896,7 +9884,7 @@ class BaseStreamController extends TaskLoop {
9896
9884
  return;
9897
9885
  }
9898
9886
  if ('payload' in data) {
9899
- this.log(`Loaded fragment ${frag.sn} of level ${frag.level}`);
9887
+ this.log(`Loaded ${frag.type} sn: ${frag.sn} of ${this.playlistLabel()} ${frag.level}`);
9900
9888
  this.hls.trigger(Events.FRAG_LOADED, data);
9901
9889
  }
9902
9890
 
@@ -10046,9 +10034,9 @@ class BaseStreamController extends TaskLoop {
10046
10034
  return !frag || !fragCurrent || frag.sn !== fragCurrent.sn || frag.level !== fragCurrent.level;
10047
10035
  }
10048
10036
  fragBufferedComplete(frag, part) {
10049
- var _frag$startPTS, _frag$endPTS, _this$fragCurrent, _this$fragPrevious;
10037
+ var _this$fragCurrent, _this$fragPrevious;
10050
10038
  const media = this.mediaBuffer ? this.mediaBuffer : this.media;
10051
- this.log(`Buffered ${frag.type} sn: ${frag.sn}${part ? ' part: ' + part.index : ''} of ${this.playlistType === PlaylistLevelType.MAIN ? 'level' : 'track'} ${frag.level} (frag:[${((_frag$startPTS = frag.startPTS) != null ? _frag$startPTS : NaN).toFixed(3)}-${((_frag$endPTS = frag.endPTS) != null ? _frag$endPTS : NaN).toFixed(3)}] > buffer:${media ? TimeRanges.toString(BufferHelper.getBuffered(media)) : '(detached)'})`);
10039
+ this.log(`Buffered ${frag.type} sn: ${frag.sn}${part ? ' part: ' + part.index : ''} of ${this.fragInfo(frag)} > buffer:${media ? TimeRanges.toString(BufferHelper.getBuffered(media)) : '(detached)'})`);
10052
10040
  if (frag.sn !== 'initSegment') {
10053
10041
  var _this$levels;
10054
10042
  if (frag.type !== PlaylistLevelType.SUBTITLE) {
@@ -10105,7 +10093,7 @@ class BaseStreamController extends TaskLoop {
10105
10093
  }
10106
10094
  let keyLoadingPromise = null;
10107
10095
  if (frag.encrypted && !((_frag$decryptdata = frag.decryptdata) != null && _frag$decryptdata.key)) {
10108
- this.log(`Loading key for ${frag.sn} of [${details.startSN}-${details.endSN}], ${this.playlistType === PlaylistLevelType.MAIN ? 'level' : 'track'} ${frag.level}`);
10096
+ this.log(`Loading key for ${frag.sn} of [${details.startSN}-${details.endSN}], ${this.playlistLabel()} ${frag.level}`);
10109
10097
  this.state = State.KEY_LOADING;
10110
10098
  this.fragCurrent = frag;
10111
10099
  keyLoadingPromise = this.keyLoader.load(frag).then(keyLoadedData => {
@@ -10144,7 +10132,7 @@ class BaseStreamController extends TaskLoop {
10144
10132
  const partIndex = this.getNextPart(partList, frag, targetBufferTime);
10145
10133
  if (partIndex > -1) {
10146
10134
  const part = partList[partIndex];
10147
- this.log(`Loading part sn: ${frag.sn} p: ${part.index} cc: ${frag.cc} of playlist [${details.startSN}-${details.endSN}] parts [0-${partIndex}-${partList.length - 1}] ${this.playlistType === PlaylistLevelType.MAIN ? 'level' : 'track'}: ${frag.level}, target: ${parseFloat(targetBufferTime.toFixed(3))}`);
10135
+ this.log(`Loading part sn: ${frag.sn} p: ${part.index} cc: ${frag.cc} of playlist [${details.startSN}-${details.endSN}] parts [0-${partIndex}-${partList.length - 1}] ${this.playlistLabel()}: ${frag.level}, target: ${parseFloat(targetBufferTime.toFixed(3))}`);
10148
10136
  this.nextLoadPosition = part.start + part.duration;
10149
10137
  this.state = State.FRAG_LOADING;
10150
10138
  let _result;
@@ -10180,7 +10168,7 @@ class BaseStreamController extends TaskLoop {
10180
10168
  // Selected fragment hint for part but not loading parts
10181
10169
  return Promise.resolve(null);
10182
10170
  }
10183
- this.log(`Loading fragment ${frag.sn} cc: ${frag.cc} ${details ? 'of [' + details.startSN + '-' + details.endSN + '] ' : ''}${this.playlistType === PlaylistLevelType.MAIN ? 'level' : 'track'}: ${frag.level}, target: ${parseFloat(targetBufferTime.toFixed(3))}`);
10171
+ this.log(`Loading ${frag.type} sn: ${frag.sn} of ${this.fragInfo(frag, false)}) cc: ${frag.cc} ${details ? '[' + details.startSN + '-' + details.endSN + ']' : ''}, target: ${parseFloat(targetBufferTime.toFixed(3))}`);
10184
10172
  // Don't update nextLoadPosition for fragments which are not buffered
10185
10173
  if (isFiniteNumber(frag.sn) && !this.bitrateTest) {
10186
10174
  this.nextLoadPosition = frag.start + frag.duration;
@@ -10959,11 +10947,19 @@ class BaseStreamController extends TaskLoop {
10959
10947
  // For this error fallthrough. Marking parsed will allow advancing to next fragment.
10960
10948
  }
10961
10949
  this.state = State.PARSED;
10950
+ this.log(`Parsed ${frag.type} sn: ${frag.sn}${part ? ' part: ' + part.index : ''} of ${this.fragInfo(frag)})`);
10962
10951
  this.hls.trigger(Events.FRAG_PARSED, {
10963
10952
  frag,
10964
10953
  part
10965
10954
  });
10966
10955
  }
10956
+ playlistLabel() {
10957
+ return this.playlistType === PlaylistLevelType.MAIN ? 'level' : 'track';
10958
+ }
10959
+ fragInfo(frag, pts = true) {
10960
+ var _ref, _ref2;
10961
+ return `${this.playlistLabel()} ${frag.level} (frag:[${((_ref = pts ? frag.startPTS : frag.start) != null ? _ref : NaN).toFixed(3)}-${((_ref2 = pts ? frag.endPTS : frag.end) != null ? _ref2 : NaN).toFixed(3)}]`;
10962
+ }
10967
10963
  resetTransmuxer() {
10968
10964
  if (this.transmuxer) {
10969
10965
  this.transmuxer.destroy();
@@ -29268,7 +29264,7 @@ class Hls {
29268
29264
  * Get the video-dev/hls.js package version.
29269
29265
  */
29270
29266
  static get version() {
29271
- return "1.5.14-0.canary.10427";
29267
+ return "1.5.14-0.canary.10431";
29272
29268
  }
29273
29269
 
29274
29270
  /**