hls.js 1.5.3 → 1.5.4

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
@@ -411,7 +411,7 @@ function enableLogs(debugConfig, id) {
411
411
  // Some browsers don't allow to use bind on console object anyway
412
412
  // fallback to default if needed
413
413
  try {
414
- exportedLogger.log(`Debug logs enabled for "${id}" in hls.js version ${"1.5.3"}`);
414
+ exportedLogger.log(`Debug logs enabled for "${id}" in hls.js version ${"1.5.4"}`);
415
415
  } catch (e) {
416
416
  exportedLogger = fakeLogger;
417
417
  }
@@ -1550,6 +1550,12 @@ function readUint32(buffer, offset) {
1550
1550
  const val = readSint32(buffer, offset);
1551
1551
  return val < 0 ? 4294967296 + val : val;
1552
1552
  }
1553
+ function readUint64(buffer, offset) {
1554
+ let result = readUint32(buffer, offset);
1555
+ result *= Math.pow(2, 32);
1556
+ result += readUint32(buffer, offset + 4);
1557
+ return result;
1558
+ }
1553
1559
  function readSint32(buffer, offset) {
1554
1560
  return buffer[offset] << 24 | buffer[offset + 1] << 16 | buffer[offset + 2] << 8 | buffer[offset + 3];
1555
1561
  }
@@ -1612,15 +1618,14 @@ function parseSegmentIndex(sidx) {
1612
1618
  let index = 8;
1613
1619
  const timescale = readUint32(sidx, index);
1614
1620
  index += 4;
1615
-
1616
- // TODO: parse earliestPresentationTime and firstOffset
1617
- // usually zero in our case
1618
- const earliestPresentationTime = 0;
1619
- const firstOffset = 0;
1621
+ let earliestPresentationTime = 0;
1622
+ let firstOffset = 0;
1620
1623
  if (version === 0) {
1621
- index += 8;
1624
+ earliestPresentationTime = readUint32(sidx, index += 4);
1625
+ firstOffset = readUint32(sidx, index += 4);
1622
1626
  } else {
1623
- index += 16;
1627
+ earliestPresentationTime = readUint64(sidx, index += 8);
1628
+ firstOffset = readUint64(sidx, index += 8);
1624
1629
  }
1625
1630
 
1626
1631
  // skip reserved
@@ -2068,15 +2073,22 @@ function getDuration(data, initData) {
2068
2073
  }
2069
2074
  if (videoDuration === 0 && audioDuration === 0) {
2070
2075
  // If duration samples are not available in the traf use sidx subsegment_duration
2076
+ let sidxMinStart = Infinity;
2077
+ let sidxMaxEnd = 0;
2071
2078
  let sidxDuration = 0;
2072
2079
  const sidxs = findBox(data, ['sidx']);
2073
2080
  for (let i = 0; i < sidxs.length; i++) {
2074
2081
  const sidx = parseSegmentIndex(sidxs[i]);
2075
2082
  if (sidx != null && sidx.references) {
2076
- sidxDuration += sidx.references.reduce((dur, ref) => dur + ref.info.duration || 0, 0);
2083
+ sidxMinStart = Math.min(sidxMinStart, sidx.earliestPresentationTime / sidx.timescale);
2084
+ const subSegmentDuration = sidx.references.reduce((dur, ref) => dur + ref.info.duration || 0, 0);
2085
+ sidxMaxEnd = Math.max(sidxMaxEnd, subSegmentDuration + sidx.earliestPresentationTime / sidx.timescale);
2086
+ sidxDuration = sidxMaxEnd - sidxMinStart;
2077
2087
  }
2078
2088
  }
2079
- return sidxDuration;
2089
+ if (sidxDuration && isFiniteNumber(sidxDuration)) {
2090
+ return sidxDuration;
2091
+ }
2080
2092
  }
2081
2093
  if (videoDuration) {
2082
2094
  return videoDuration;
@@ -7420,8 +7432,12 @@ class AbrController {
7420
7432
  return -1;
7421
7433
  }
7422
7434
  set nextAutoLevel(nextLevel) {
7423
- const value = Math.max(this.hls.minAutoLevel, nextLevel);
7424
- if (this._nextAutoLevel != value) {
7435
+ const {
7436
+ maxAutoLevel,
7437
+ minAutoLevel
7438
+ } = this.hls;
7439
+ const value = Math.min(Math.max(nextLevel, minAutoLevel), maxAutoLevel);
7440
+ if (this._nextAutoLevel !== value) {
7425
7441
  this.nextAutoLevelKey = '';
7426
7442
  this._nextAutoLevel = value;
7427
7443
  }
@@ -16037,7 +16053,7 @@ class AudioStreamController extends BaseStreamController {
16037
16053
 
16038
16054
  // compute start position if we are aligned with the main playlist
16039
16055
  if (!this.startFragRequested && (this.mainDetails || !newDetails.live)) {
16040
- this.setStartPosition(track.details, sliding);
16056
+ this.setStartPosition(this.mainDetails || newDetails, sliding);
16041
16057
  }
16042
16058
  // only switch back to IDLE state if we were waiting for track to start downloading a new fragment
16043
16059
  if (this.state === State.WAITING_TRACK && !this.waitForCdnTuneIn(newDetails)) {
@@ -16957,7 +16973,7 @@ class SubtitleStreamController extends BaseStreamController {
16957
16973
  track.details = newDetails;
16958
16974
  this.levelLastLoaded = track;
16959
16975
  if (!this.startFragRequested && (this.mainDetails || !newDetails.live)) {
16960
- this.setStartPosition(track.details, sliding);
16976
+ this.setStartPosition(this.mainDetails || newDetails, sliding);
16961
16977
  }
16962
16978
 
16963
16979
  // trigger handler right now
@@ -26607,7 +26623,8 @@ class StreamController extends BaseStreamController {
26607
26623
  }
26608
26624
  // set new level to playlist loader : this will trigger start level load
26609
26625
  // hls.nextLoadLevel remains until it is set to a new value or until a new frag is successfully loaded
26610
- this.level = hls.nextLoadLevel = startLevel;
26626
+ hls.nextLoadLevel = startLevel;
26627
+ this.level = hls.loadLevel;
26611
26628
  this.loadedmetadata = false;
26612
26629
  }
26613
26630
  // if startPosition undefined but lastCurrentTime set, set startPosition to last currentTime
@@ -27682,7 +27699,7 @@ class Hls {
27682
27699
  * Get the video-dev/hls.js package version.
27683
27700
  */
27684
27701
  static get version() {
27685
- return "1.5.3";
27702
+ return "1.5.4";
27686
27703
  }
27687
27704
 
27688
27705
  /**