hls.js 1.5.5-0.canary.9985 → 1.5.5-0.canary.9987

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
@@ -613,7 +613,7 @@
613
613
  // Some browsers don't allow to use bind on console object anyway
614
614
  // fallback to default if needed
615
615
  try {
616
- newLogger.log("Debug logs enabled for \"" + context + "\" in hls.js version " + "1.5.5-0.canary.9985");
616
+ newLogger.log("Debug logs enabled for \"" + context + "\" in hls.js version " + "1.5.5-0.canary.9987");
617
617
  } catch (e) {
618
618
  /* log fn threw an exception. All logger methods are no-ops. */
619
619
  return createLogger();
@@ -12307,6 +12307,7 @@
12307
12307
  _this.decrypter = void 0;
12308
12308
  _this.initPTS = [];
12309
12309
  _this.buffering = true;
12310
+ _this.loadingParts = false;
12310
12311
  _this.onMediaSeeking = function () {
12311
12312
  var _assertThisInitialize = _assertThisInitialized(_this),
12312
12313
  config = _assertThisInitialize.config,
@@ -12342,6 +12343,14 @@
12342
12343
  // Remove gap fragments
12343
12344
  _this.fragmentTracker.removeFragmentsInRange(currentTime, Infinity, _this.playlistType, true);
12344
12345
  _this.lastCurrentTime = currentTime;
12346
+ if (!_this.loadingParts) {
12347
+ var bufferEnd = Math.max(bufferInfo.end, currentTime);
12348
+ var shouldLoadParts = _this.shouldLoadParts(_this.getLevelDetails(), bufferEnd);
12349
+ if (shouldLoadParts) {
12350
+ _this.log("LL-Part loading ON after seeking to " + currentTime.toFixed(2) + " with buffer @" + bufferEnd.toFixed(2));
12351
+ _this.loadingParts = shouldLoadParts;
12352
+ }
12353
+ }
12345
12354
  }
12346
12355
 
12347
12356
  // in case seeking occurs although no media buffered, adjust startPosition and nextLoadPosition to seek target
@@ -12751,8 +12760,16 @@
12751
12760
  } else if (!frag.encrypted && details.encryptedFragments.length) {
12752
12761
  this.keyLoader.loadClear(frag, details.encryptedFragments);
12753
12762
  }
12763
+ var fragPrevious = this.fragPrevious;
12764
+ if (frag.sn !== 'initSegment' && (!fragPrevious || frag.sn !== fragPrevious.sn)) {
12765
+ var shouldLoadParts = this.shouldLoadParts(level.details, frag.end);
12766
+ if (shouldLoadParts !== this.loadingParts) {
12767
+ this.log("LL-Part loading " + (shouldLoadParts ? 'ON' : 'OFF') + " loading sn " + (fragPrevious == null ? void 0 : fragPrevious.sn) + "->" + frag.sn);
12768
+ this.loadingParts = shouldLoadParts;
12769
+ }
12770
+ }
12754
12771
  targetBufferTime = Math.max(frag.start, targetBufferTime || 0);
12755
- if (this.config.lowLatencyMode && frag.sn !== 'initSegment') {
12772
+ if (this.loadingParts && frag.sn !== 'initSegment') {
12756
12773
  var partList = details.partList;
12757
12774
  if (partList && progressCallback) {
12758
12775
  if (targetBufferTime > frag.end && details.fragmentHint) {
@@ -12794,6 +12811,13 @@
12794
12811
  }
12795
12812
  }
12796
12813
  }
12814
+ if (frag.sn !== 'initSegment' && this.loadingParts) {
12815
+ this.log("LL-Part loading OFF after next part miss @" + targetBufferTime.toFixed(2));
12816
+ this.loadingParts = false;
12817
+ } else if (!frag.url) {
12818
+ // Selected fragment hint for part but not loading parts
12819
+ return Promise.resolve(null);
12820
+ }
12797
12821
  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)));
12798
12822
  // Don't update nextLoadPosition for fragments which are not buffered
12799
12823
  if (isFiniteNumber(frag.sn) && !this.bitrateTest) {
@@ -12896,8 +12920,36 @@
12896
12920
  if (part) {
12897
12921
  part.stats.parsing.end = now;
12898
12922
  }
12923
+ // See if part loading should be disabled/enabled based on buffer and playback position.
12924
+ if (frag.sn !== 'initSegment') {
12925
+ var levelDetails = this.getLevelDetails();
12926
+ var loadingPartsAtEdge = levelDetails && frag.sn > levelDetails.endSN;
12927
+ var shouldLoadParts = loadingPartsAtEdge || this.shouldLoadParts(levelDetails, frag.end);
12928
+ if (shouldLoadParts !== this.loadingParts) {
12929
+ this.log("LL-Part loading " + (shouldLoadParts ? 'ON' : 'OFF') + " after parsing segment ending @" + frag.end.toFixed(2));
12930
+ this.loadingParts = shouldLoadParts;
12931
+ }
12932
+ }
12899
12933
  this.updateLevelTiming(frag, part, level, chunkMeta.partial);
12900
12934
  };
12935
+ _proto.shouldLoadParts = function shouldLoadParts(details, bufferEnd) {
12936
+ if (this.config.lowLatencyMode) {
12937
+ if (!details) {
12938
+ return this.loadingParts;
12939
+ }
12940
+ if (details != null && details.partList) {
12941
+ var _details$fragmentHint;
12942
+ // Buffer must be ahead of first part + duration of parts after last segment
12943
+ // and playback must be at or past segment adjacent to part list
12944
+ var firstPart = details.partList[0];
12945
+ var safePartStart = firstPart.end + (((_details$fragmentHint = details.fragmentHint) == null ? void 0 : _details$fragmentHint.duration) || 0);
12946
+ if (bufferEnd >= safePartStart && this.lastCurrentTime > firstPart.start - firstPart.fragment.duration) {
12947
+ return true;
12948
+ }
12949
+ }
12950
+ }
12951
+ return false;
12952
+ };
12901
12953
  _proto.getCurrentContext = function getCurrentContext(chunkMeta) {
12902
12954
  var levels = this.levels,
12903
12955
  fragCurrent = this.fragCurrent;
@@ -13032,7 +13084,8 @@
13032
13084
  // find fragment index, contiguous with end of buffer position
13033
13085
  var config = this.config;
13034
13086
  var start = fragments[0].start;
13035
- var frag;
13087
+ var canLoadParts = config.lowLatencyMode && !!levelDetails.partList;
13088
+ var frag = null;
13036
13089
  if (levelDetails.live) {
13037
13090
  var initialLiveManifestSize = config.initialLiveManifestSize;
13038
13091
  if (fragLen < initialLiveManifestSize) {
@@ -13044,6 +13097,10 @@
13044
13097
  // Do not load using live logic if the starting frag is requested - we want to use getFragmentAtPosition() so that
13045
13098
  // we get the fragment matching that start time
13046
13099
  if (!levelDetails.PTSKnown && !this.startFragRequested && this.startPosition === -1 || pos < start) {
13100
+ if (canLoadParts && !this.loadingParts) {
13101
+ this.log("LL-Part loading ON for initial live fragment");
13102
+ this.loadingParts = true;
13103
+ }
13047
13104
  frag = this.getInitialLiveFragment(levelDetails, fragments);
13048
13105
  this.startPosition = this.nextLoadPosition = frag ? this.hls.liveSyncPosition || frag.start : pos;
13049
13106
  }
@@ -13054,7 +13111,7 @@
13054
13111
 
13055
13112
  // If we haven't run into any special cases already, just load the fragment most closely matching the requested position
13056
13113
  if (!frag) {
13057
- var end = config.lowLatencyMode ? levelDetails.partEnd : levelDetails.fragmentEnd;
13114
+ var end = this.loadingParts ? levelDetails.partEnd : levelDetails.fragmentEnd;
13058
13115
  frag = this.getFragmentAtPosition(pos, end, levelDetails);
13059
13116
  }
13060
13117
  return this.mapToInitFragWhenRequired(frag);
@@ -13168,7 +13225,7 @@
13168
13225
  var fragmentHint = levelDetails.fragmentHint;
13169
13226
  var tolerance = config.maxFragLookUpTolerance;
13170
13227
  var partList = levelDetails.partList;
13171
- var loadingParts = !!(config.lowLatencyMode && partList != null && partList.length && fragmentHint);
13228
+ var loadingParts = !!(this.loadingParts && partList != null && partList.length && fragmentHint);
13172
13229
  if (loadingParts && fragmentHint && !this.bitrateTest) {
13173
13230
  // Include incomplete fragment with parts at end
13174
13231
  fragments = fragments.concat(fragmentHint);
@@ -21268,7 +21325,7 @@
21268
21325
  * Get the video-dev/hls.js package version.
21269
21326
  */
21270
21327
  function get() {
21271
- return "1.5.5-0.canary.9985";
21328
+ return "1.5.5-0.canary.9987";
21272
21329
  }
21273
21330
  }, {
21274
21331
  key: "Events",