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/package.json CHANGED
@@ -130,5 +130,5 @@
130
130
  "url-toolkit": "2.2.5",
131
131
  "wrangler": "3.22.4"
132
132
  },
133
- "version": "1.5.3"
133
+ "version": "1.5.4"
134
134
  }
@@ -870,8 +870,9 @@ class AbrController implements AbrComponentAPI {
870
870
  }
871
871
 
872
872
  public set nextAutoLevel(nextLevel: number) {
873
- const value = Math.max(this.hls.minAutoLevel, nextLevel);
874
- if (this._nextAutoLevel != value) {
873
+ const { maxAutoLevel, minAutoLevel } = this.hls;
874
+ const value = Math.min(Math.max(nextLevel, minAutoLevel), maxAutoLevel);
875
+ if (this._nextAutoLevel !== value) {
875
876
  this.nextAutoLevelKey = '';
876
877
  this._nextAutoLevel = value;
877
878
  }
@@ -555,7 +555,7 @@ class AudioStreamController
555
555
 
556
556
  // compute start position if we are aligned with the main playlist
557
557
  if (!this.startFragRequested && (this.mainDetails || !newDetails.live)) {
558
- this.setStartPosition(track.details, sliding);
558
+ this.setStartPosition(this.mainDetails || newDetails, sliding);
559
559
  }
560
560
  // only switch back to IDLE state if we were waiting for track to start downloading a new fragment
561
561
  if (
@@ -140,7 +140,8 @@ export default class StreamController
140
140
  }
141
141
  // set new level to playlist loader : this will trigger start level load
142
142
  // hls.nextLoadLevel remains until it is set to a new value or until a new frag is successfully loaded
143
- this.level = hls.nextLoadLevel = startLevel;
143
+ hls.nextLoadLevel = startLevel;
144
+ this.level = hls.loadLevel;
144
145
  this.loadedmetadata = false;
145
146
  }
146
147
  // if startPosition undefined but lastCurrentTime set, set startPosition to last currentTime
@@ -320,7 +320,7 @@ export class SubtitleStreamController
320
320
  this.levelLastLoaded = track;
321
321
 
322
322
  if (!this.startFragRequested && (this.mainDetails || !newDetails.live)) {
323
- this.setStartPosition(track.details, sliding);
323
+ this.setStartPosition(this.mainDetails || newDetails, sliding);
324
324
  }
325
325
 
326
326
  // trigger handler right now
@@ -38,6 +38,13 @@ export function readUint32(buffer: Uint8Array, offset: number): number {
38
38
  return val < 0 ? 4294967296 + val : val;
39
39
  }
40
40
 
41
+ export function readUint64(buffer: Uint8Array, offset: number) {
42
+ let result = readUint32(buffer, offset);
43
+ result *= Math.pow(2, 32);
44
+ result += readUint32(buffer, offset + 4);
45
+ return result;
46
+ }
47
+
41
48
  export function readSint32(buffer: Uint8Array, offset: number): number {
42
49
  return (
43
50
  (buffer[offset] << 24) |
@@ -125,15 +132,15 @@ export function parseSegmentIndex(sidx: Uint8Array): SidxInfo | null {
125
132
  const timescale = readUint32(sidx, index);
126
133
  index += 4;
127
134
 
128
- // TODO: parse earliestPresentationTime and firstOffset
129
- // usually zero in our case
130
- const earliestPresentationTime = 0;
131
- const firstOffset = 0;
135
+ let earliestPresentationTime = 0;
136
+ let firstOffset = 0;
132
137
 
133
138
  if (version === 0) {
134
- index += 8;
139
+ earliestPresentationTime = readUint32(sidx, (index += 4));
140
+ firstOffset = readUint32(sidx, (index += 4));
135
141
  } else {
136
- index += 16;
142
+ earliestPresentationTime = readUint64(sidx, (index += 8));
143
+ firstOffset = readUint64(sidx, (index += 8));
137
144
  }
138
145
 
139
146
  // skip reserved
@@ -677,19 +684,31 @@ export function getDuration(data: Uint8Array, initData: InitData) {
677
684
  }
678
685
  if (videoDuration === 0 && audioDuration === 0) {
679
686
  // If duration samples are not available in the traf use sidx subsegment_duration
687
+ let sidxMinStart = Infinity;
688
+ let sidxMaxEnd = 0;
680
689
  let sidxDuration = 0;
681
690
  const sidxs = findBox(data, ['sidx']);
682
691
  for (let i = 0; i < sidxs.length; i++) {
683
692
  const sidx = parseSegmentIndex(sidxs[i]);
684
693
  if (sidx?.references) {
685
- sidxDuration += sidx.references.reduce(
694
+ sidxMinStart = Math.min(
695
+ sidxMinStart,
696
+ sidx.earliestPresentationTime / sidx.timescale,
697
+ );
698
+ const subSegmentDuration = sidx.references.reduce(
686
699
  (dur, ref) => dur + ref.info.duration || 0,
687
700
  0,
688
701
  );
702
+ sidxMaxEnd = Math.max(
703
+ sidxMaxEnd,
704
+ subSegmentDuration + sidx.earliestPresentationTime / sidx.timescale,
705
+ );
706
+ sidxDuration = sidxMaxEnd - sidxMinStart;
689
707
  }
690
708
  }
691
-
692
- return sidxDuration;
709
+ if (sidxDuration && Number.isFinite(sidxDuration)) {
710
+ return sidxDuration;
711
+ }
693
712
  }
694
713
  if (videoDuration) {
695
714
  return videoDuration;