hls.js 1.5.2 → 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.js +32 -16
- package/dist/hls.js.map +1 -1
- package/dist/hls.light.js +30 -14
- package/dist/hls.light.js.map +1 -1
- package/dist/hls.light.min.js +1 -1
- package/dist/hls.light.min.js.map +1 -1
- package/dist/hls.light.mjs +33 -16
- package/dist/hls.light.mjs.map +1 -1
- package/dist/hls.min.js +1 -1
- package/dist/hls.min.js.map +1 -1
- package/dist/hls.mjs +35 -18
- package/dist/hls.mjs.map +1 -1
- package/dist/hls.worker.js +1 -1
- package/dist/hls.worker.js.map +1 -1
- package/package.json +1 -1
- package/src/controller/abr-controller.ts +5 -3
- package/src/controller/audio-stream-controller.ts +1 -1
- package/src/controller/stream-controller.ts +2 -1
- package/src/controller/subtitle-stream-controller.ts +1 -1
- package/src/utils/mp4-tools.ts +28 -9
package/package.json
CHANGED
@@ -772,7 +772,8 @@ class AbrController implements AbrComponentAPI {
|
|
772
772
|
(!upSwitch &&
|
773
773
|
currentFrameRate > 0 &&
|
774
774
|
currentFrameRate < levelInfo.frameRate) ||
|
775
|
-
|
775
|
+
(levelInfo.supportedResult &&
|
776
|
+
!levelInfo.supportedResult.decodingInfoResults?.[0].smooth)
|
776
777
|
) {
|
777
778
|
levelsSkipped.push(i);
|
778
779
|
continue;
|
@@ -869,8 +870,9 @@ class AbrController implements AbrComponentAPI {
|
|
869
870
|
}
|
870
871
|
|
871
872
|
public set nextAutoLevel(nextLevel: number) {
|
872
|
-
const
|
873
|
-
|
873
|
+
const { maxAutoLevel, minAutoLevel } = this.hls;
|
874
|
+
const value = Math.min(Math.max(nextLevel, minAutoLevel), maxAutoLevel);
|
875
|
+
if (this._nextAutoLevel !== value) {
|
874
876
|
this.nextAutoLevelKey = '';
|
875
877
|
this._nextAutoLevel = value;
|
876
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(
|
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
|
-
|
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(
|
323
|
+
this.setStartPosition(this.mainDetails || newDetails, sliding);
|
324
324
|
}
|
325
325
|
|
326
326
|
// trigger handler right now
|
package/src/utils/mp4-tools.ts
CHANGED
@@ -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
|
-
|
129
|
-
|
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 +=
|
139
|
+
earliestPresentationTime = readUint32(sidx, (index += 4));
|
140
|
+
firstOffset = readUint32(sidx, (index += 4));
|
135
141
|
} else {
|
136
|
-
index +=
|
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
|
-
|
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
|
-
|
709
|
+
if (sidxDuration && Number.isFinite(sidxDuration)) {
|
710
|
+
return sidxDuration;
|
711
|
+
}
|
693
712
|
}
|
694
713
|
if (videoDuration) {
|
695
714
|
return videoDuration;
|