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

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.js CHANGED
@@ -644,7 +644,7 @@
644
644
  // Some browsers don't allow to use bind on console object anyway
645
645
  // fallback to default if needed
646
646
  try {
647
- newLogger.log("Debug logs enabled for \"" + context + "\" in hls.js version " + "1.5.5-0.canary.9985");
647
+ newLogger.log("Debug logs enabled for \"" + context + "\" in hls.js version " + "1.5.5-0.canary.9986");
648
648
  } catch (e) {
649
649
  /* log fn threw an exception. All logger methods are no-ops. */
650
650
  return createLogger();
@@ -9554,6 +9554,7 @@
9554
9554
  _this.decrypter = void 0;
9555
9555
  _this.initPTS = [];
9556
9556
  _this.buffering = true;
9557
+ _this.loadingParts = false;
9557
9558
  _this.onMediaSeeking = function () {
9558
9559
  var _assertThisInitialize = _assertThisInitialized(_this),
9559
9560
  config = _assertThisInitialize.config,
@@ -9589,6 +9590,14 @@
9589
9590
  // Remove gap fragments
9590
9591
  _this.fragmentTracker.removeFragmentsInRange(currentTime, Infinity, _this.playlistType, true);
9591
9592
  _this.lastCurrentTime = currentTime;
9593
+ if (!_this.loadingParts) {
9594
+ var bufferEnd = Math.max(bufferInfo.end, currentTime);
9595
+ var shouldLoadParts = _this.shouldLoadParts(_this.getLevelDetails(), bufferEnd);
9596
+ if (shouldLoadParts) {
9597
+ _this.log("LL-Part loading ON after seeking to " + currentTime.toFixed(2) + " with buffer @" + bufferEnd.toFixed(2));
9598
+ _this.loadingParts = shouldLoadParts;
9599
+ }
9600
+ }
9592
9601
  }
9593
9602
 
9594
9603
  // in case seeking occurs although no media buffered, adjust startPosition and nextLoadPosition to seek target
@@ -9998,8 +10007,16 @@
9998
10007
  } else if (!frag.encrypted && details.encryptedFragments.length) {
9999
10008
  this.keyLoader.loadClear(frag, details.encryptedFragments);
10000
10009
  }
10010
+ var fragPrevious = this.fragPrevious;
10011
+ if (frag.sn !== 'initSegment' && (!fragPrevious || frag.sn !== fragPrevious.sn)) {
10012
+ var shouldLoadParts = this.shouldLoadParts(level.details, frag.end);
10013
+ if (shouldLoadParts !== this.loadingParts) {
10014
+ this.log("LL-Part loading " + (shouldLoadParts ? 'ON' : 'OFF') + " loading sn " + (fragPrevious == null ? void 0 : fragPrevious.sn) + "->" + frag.sn);
10015
+ this.loadingParts = shouldLoadParts;
10016
+ }
10017
+ }
10001
10018
  targetBufferTime = Math.max(frag.start, targetBufferTime || 0);
10002
- if (this.config.lowLatencyMode && frag.sn !== 'initSegment') {
10019
+ if (this.loadingParts && frag.sn !== 'initSegment') {
10003
10020
  var partList = details.partList;
10004
10021
  if (partList && progressCallback) {
10005
10022
  if (targetBufferTime > frag.end && details.fragmentHint) {
@@ -10041,6 +10058,13 @@
10041
10058
  }
10042
10059
  }
10043
10060
  }
10061
+ if (frag.sn !== 'initSegment' && this.loadingParts) {
10062
+ this.log("LL-Part loading OFF after next part miss @" + targetBufferTime.toFixed(2));
10063
+ this.loadingParts = false;
10064
+ } else if (!frag.url) {
10065
+ // Selected fragment hint for part but not loading parts
10066
+ return Promise.resolve(null);
10067
+ }
10044
10068
  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)));
10045
10069
  // Don't update nextLoadPosition for fragments which are not buffered
10046
10070
  if (isFiniteNumber(frag.sn) && !this.bitrateTest) {
@@ -10143,8 +10167,36 @@
10143
10167
  if (part) {
10144
10168
  part.stats.parsing.end = now;
10145
10169
  }
10170
+ // See if part loading should be disabled/enabled based on buffer and playback position.
10171
+ if (frag.sn !== 'initSegment') {
10172
+ var levelDetails = this.getLevelDetails();
10173
+ var loadingPartsAtEdge = levelDetails && frag.sn > levelDetails.endSN;
10174
+ var shouldLoadParts = loadingPartsAtEdge || this.shouldLoadParts(levelDetails, frag.end);
10175
+ if (shouldLoadParts !== this.loadingParts) {
10176
+ this.log("LL-Part loading " + (shouldLoadParts ? 'ON' : 'OFF') + " after parsing segment ending @" + frag.end.toFixed(2));
10177
+ this.loadingParts = shouldLoadParts;
10178
+ }
10179
+ }
10146
10180
  this.updateLevelTiming(frag, part, level, chunkMeta.partial);
10147
10181
  };
10182
+ _proto.shouldLoadParts = function shouldLoadParts(details, bufferEnd) {
10183
+ if (this.config.lowLatencyMode) {
10184
+ if (!details) {
10185
+ return this.loadingParts;
10186
+ }
10187
+ if (details != null && details.partList) {
10188
+ var _details$fragmentHint;
10189
+ // Buffer must be ahead of first part + duration of parts after last segment
10190
+ // and playback must be at or past segment adjacent to part list
10191
+ var firstPart = details.partList[0];
10192
+ var safePartStart = firstPart.end + (((_details$fragmentHint = details.fragmentHint) == null ? void 0 : _details$fragmentHint.duration) || 0);
10193
+ if (bufferEnd >= safePartStart && this.lastCurrentTime > firstPart.start - firstPart.fragment.duration) {
10194
+ return true;
10195
+ }
10196
+ }
10197
+ }
10198
+ return false;
10199
+ };
10148
10200
  _proto.getCurrentContext = function getCurrentContext(chunkMeta) {
10149
10201
  var levels = this.levels,
10150
10202
  fragCurrent = this.fragCurrent;
@@ -10279,7 +10331,8 @@
10279
10331
  // find fragment index, contiguous with end of buffer position
10280
10332
  var config = this.config;
10281
10333
  var start = fragments[0].start;
10282
- var frag;
10334
+ var canLoadParts = config.lowLatencyMode && !!levelDetails.partList;
10335
+ var frag = null;
10283
10336
  if (levelDetails.live) {
10284
10337
  var initialLiveManifestSize = config.initialLiveManifestSize;
10285
10338
  if (fragLen < initialLiveManifestSize) {
@@ -10291,6 +10344,10 @@
10291
10344
  // Do not load using live logic if the starting frag is requested - we want to use getFragmentAtPosition() so that
10292
10345
  // we get the fragment matching that start time
10293
10346
  if (!levelDetails.PTSKnown && !this.startFragRequested && this.startPosition === -1 || pos < start) {
10347
+ if (canLoadParts && !this.loadingParts) {
10348
+ this.log("LL-Part loading ON for initial live fragment");
10349
+ this.loadingParts = true;
10350
+ }
10294
10351
  frag = this.getInitialLiveFragment(levelDetails, fragments);
10295
10352
  this.startPosition = this.nextLoadPosition = frag ? this.hls.liveSyncPosition || frag.start : pos;
10296
10353
  }
@@ -10301,7 +10358,7 @@
10301
10358
 
10302
10359
  // If we haven't run into any special cases already, just load the fragment most closely matching the requested position
10303
10360
  if (!frag) {
10304
- var end = config.lowLatencyMode ? levelDetails.partEnd : levelDetails.fragmentEnd;
10361
+ var end = this.loadingParts ? levelDetails.partEnd : levelDetails.fragmentEnd;
10305
10362
  frag = this.getFragmentAtPosition(pos, end, levelDetails);
10306
10363
  }
10307
10364
  return this.mapToInitFragWhenRequired(frag);
@@ -10415,7 +10472,7 @@
10415
10472
  var fragmentHint = levelDetails.fragmentHint;
10416
10473
  var tolerance = config.maxFragLookUpTolerance;
10417
10474
  var partList = levelDetails.partList;
10418
- var loadingParts = !!(config.lowLatencyMode && partList != null && partList.length && fragmentHint);
10475
+ var loadingParts = !!(this.loadingParts && partList != null && partList.length && fragmentHint);
10419
10476
  if (loadingParts && fragmentHint && !this.bitrateTest) {
10420
10477
  // Include incomplete fragment with parts at end
10421
10478
  fragments = fragments.concat(fragmentHint);
@@ -30034,7 +30091,7 @@
30034
30091
  * Get the video-dev/hls.js package version.
30035
30092
  */
30036
30093
  function get() {
30037
- return "1.5.5-0.canary.9985";
30094
+ return "1.5.5-0.canary.9986";
30038
30095
  }
30039
30096
  }, {
30040
30097
  key: "Events",
package/dist/hls.js.d.ts CHANGED
@@ -247,6 +247,7 @@ export declare class BaseStreamController extends TaskLoop implements NetworkCom
247
247
  protected decrypter: Decrypter;
248
248
  protected initPTS: RationalTimestamp[];
249
249
  protected buffering: boolean;
250
+ private loadingParts;
250
251
  constructor(hls: Hls, fragmentTracker: FragmentTracker, keyLoader: KeyLoader, logPrefix: string, playlistType: PlaylistLevelType);
251
252
  protected registerListeners(): void;
252
253
  protected unregisterListeners(): void;
@@ -283,6 +284,7 @@ export declare class BaseStreamController extends TaskLoop implements NetworkCom
283
284
  private doFragPartsLoad;
284
285
  private handleFragLoadError;
285
286
  protected _handleTransmuxerFlush(chunkMeta: ChunkMetadata): void;
287
+ private shouldLoadParts;
286
288
  protected getCurrentContext(chunkMeta: ChunkMetadata): {
287
289
  frag: Fragment;
288
290
  part: Part | null;