hls.js 1.5.2-0.canary.9965 → 1.5.2-0.canary.9969

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.26.0"
132
132
  },
133
- "version": "1.5.2-0.canary.9965"
133
+ "version": "1.5.2-0.canary.9969"
134
134
  }
@@ -871,8 +871,9 @@ class AbrController extends Logger implements AbrComponentAPI {
871
871
  }
872
872
 
873
873
  public set nextAutoLevel(nextLevel: number) {
874
- const value = Math.max(this.hls.minAutoLevel, nextLevel);
875
- if (this._nextAutoLevel != value) {
874
+ const { maxAutoLevel, minAutoLevel } = this.hls;
875
+ const value = Math.min(Math.max(nextLevel, minAutoLevel), maxAutoLevel);
876
+ if (this._nextAutoLevel !== value) {
876
877
  this.nextAutoLevelKey = '';
877
878
  this._nextAutoLevel = value;
878
879
  }
@@ -552,7 +552,7 @@ class AudioStreamController
552
552
 
553
553
  // compute start position if we are aligned with the main playlist
554
554
  if (!this.startFragRequested && (this.mainDetails || !newDetails.live)) {
555
- this.setStartPosition(track.details, sliding);
555
+ this.setStartPosition(this.mainDetails || newDetails, sliding);
556
556
  }
557
557
  // only switch back to IDLE state if we were waiting for track to start downloading a new fragment
558
558
  if (
@@ -134,7 +134,8 @@ export default class StreamController
134
134
  }
135
135
  // set new level to playlist loader : this will trigger start level load
136
136
  // hls.nextLoadLevel remains until it is set to a new value or until a new frag is successfully loaded
137
- this.level = hls.nextLoadLevel = startLevel;
137
+ hls.nextLoadLevel = startLevel;
138
+ this.level = hls.loadLevel;
138
139
  this.loadedmetadata = false;
139
140
  }
140
141
  // if startPosition undefined but lastCurrentTime set, set startPosition to last currentTime
@@ -318,7 +318,7 @@ export class SubtitleStreamController
318
318
  this.levelLastLoaded = track;
319
319
 
320
320
  if (!this.startFragRequested && (this.mainDetails || !newDetails.live)) {
321
- this.setStartPosition(track.details, sliding);
321
+ this.setStartPosition(this.mainDetails || newDetails, sliding);
322
322
  }
323
323
 
324
324
  // 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;