hls.js 1.6.0-beta.1.0.canary.10751 → 1.6.0-beta.1.0.canary.10752
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/README.md +6 -11
- package/dist/hls.d.mts +4 -0
- package/dist/hls.d.ts +4 -0
- package/dist/hls.js +48 -4
- package/dist/hls.js.d.ts +4 -0
- package/dist/hls.js.map +1 -1
- package/dist/hls.light.js +48 -4
- 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 +44 -4
- 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 +44 -4
- 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 +6 -5
- package/src/loader/fragment-loader.ts +1 -1
- package/src/loader/fragment.ts +33 -0
- package/src/loader/m3u8-parser.ts +10 -0
package/dist/hls.light.mjs
CHANGED
@@ -400,7 +400,7 @@ function enableLogs(debugConfig, context, id) {
|
|
400
400
|
// Some browsers don't allow to use bind on console object anyway
|
401
401
|
// fallback to default if needed
|
402
402
|
try {
|
403
|
-
newLogger.log(`Debug logs enabled for "${context}" in hls.js version ${"1.6.0-beta.1.0.canary.
|
403
|
+
newLogger.log(`Debug logs enabled for "${context}" in hls.js version ${"1.6.0-beta.1.0.canary.10752"}`);
|
404
404
|
} catch (e) {
|
405
405
|
/* log fn threw an exception. All logger methods are no-ops. */
|
406
406
|
return createLogger();
|
@@ -1129,7 +1129,7 @@ class AbrController extends Logger {
|
|
1129
1129
|
const bwEstimate = this.getBwEstimate();
|
1130
1130
|
const levels = hls.levels;
|
1131
1131
|
const level = levels[frag.level];
|
1132
|
-
const expectedLen =
|
1132
|
+
const expectedLen = Math.max(stats.loaded, Math.round(duration * (frag.bitrate || level.averageBitrate) / 8));
|
1133
1133
|
let timeStreaming = loadedFirstByte ? timeLoading - ttfb : timeLoading;
|
1134
1134
|
if (timeStreaming < 1 && loadedFirstByte) {
|
1135
1135
|
timeStreaming = Math.min(timeLoading, stats.loaded * 8 / bwEstimate);
|
@@ -1662,7 +1662,7 @@ class AbrController extends Logger {
|
|
1662
1662
|
}
|
1663
1663
|
|
1664
1664
|
// Use average bitrate when starvation delay (buffer length) is gt or eq two segment durations and rebuffering is not expected (maxStarvationDelay > 0)
|
1665
|
-
const bitrate = currentFragDuration && bufferStarvationDelay >= currentFragDuration * 2 && maxStarvationDelay === 0 ?
|
1665
|
+
const bitrate = currentFragDuration && bufferStarvationDelay >= currentFragDuration * 2 && maxStarvationDelay === 0 ? levelInfo.averageBitrate : levelInfo.maxBitrate;
|
1666
1666
|
const fetchDuration = this.getTimeToLoadFrag(ttfbEstimateSec, adjustedbw, bitrate * avgDuration, levelDetails === undefined);
|
1667
1667
|
const canSwitchWithinTolerance =
|
1668
1668
|
// if adjusted bw is greater than level bitrate AND
|
@@ -2869,6 +2869,8 @@ class Fragment extends BaseSegment {
|
|
2869
2869
|
this._decryptdata = null;
|
2870
2870
|
this._programDateTime = null;
|
2871
2871
|
this._ref = null;
|
2872
|
+
// Approximate bit rate of the fragment expressed in bits per second (bps) as indicated by the last EXT-X-BITRATE (kbps) tag
|
2873
|
+
this._bitrate = void 0;
|
2872
2874
|
this.rawProgramDateTime = null;
|
2873
2875
|
this.tagList = [];
|
2874
2876
|
// EXTINF has to be present for a m3u8 to be considered valid
|
@@ -2923,6 +2925,34 @@ class Fragment extends BaseSegment {
|
|
2923
2925
|
this.urlId = 0;
|
2924
2926
|
this.type = type;
|
2925
2927
|
}
|
2928
|
+
get byteLength() {
|
2929
|
+
if (this.hasStats) {
|
2930
|
+
const total = this.stats.total;
|
2931
|
+
if (total) {
|
2932
|
+
return total;
|
2933
|
+
}
|
2934
|
+
}
|
2935
|
+
if (this.byteRange) {
|
2936
|
+
const start = this.byteRange[0];
|
2937
|
+
const end = this.byteRange[1];
|
2938
|
+
if (isFiniteNumber(start) && isFiniteNumber(end)) {
|
2939
|
+
return end - start;
|
2940
|
+
}
|
2941
|
+
}
|
2942
|
+
return null;
|
2943
|
+
}
|
2944
|
+
get bitrate() {
|
2945
|
+
if (this.byteLength) {
|
2946
|
+
return this.byteLength * 8 / this.duration;
|
2947
|
+
}
|
2948
|
+
if (this._bitrate) {
|
2949
|
+
return this._bitrate;
|
2950
|
+
}
|
2951
|
+
return null;
|
2952
|
+
}
|
2953
|
+
set bitrate(value) {
|
2954
|
+
this._bitrate = value;
|
2955
|
+
}
|
2926
2956
|
get decryptdata() {
|
2927
2957
|
const {
|
2928
2958
|
levelkeys
|
@@ -4670,6 +4700,7 @@ class M3U8Parser {
|
|
4670
4700
|
let currentPart = 0;
|
4671
4701
|
let totalduration = 0;
|
4672
4702
|
let discontinuityCounter = 0;
|
4703
|
+
let currentBitrate = 0;
|
4673
4704
|
let prevFrag = null;
|
4674
4705
|
let frag = new Fragment(type, base);
|
4675
4706
|
let result;
|
@@ -4690,6 +4721,9 @@ class M3U8Parser {
|
|
4690
4721
|
frag.start = totalduration;
|
4691
4722
|
frag.sn = currentSN;
|
4692
4723
|
frag.cc = discontinuityCounter;
|
4724
|
+
if (currentBitrate) {
|
4725
|
+
frag.bitrate = currentBitrate;
|
4726
|
+
}
|
4693
4727
|
frag.level = id;
|
4694
4728
|
if (currentInitSegment) {
|
4695
4729
|
frag.initSegment = currentInitSegment;
|
@@ -4819,6 +4853,12 @@ class M3U8Parser {
|
|
4819
4853
|
break;
|
4820
4854
|
case 'BITRATE':
|
4821
4855
|
frag.tagList.push([tag, value1]);
|
4856
|
+
currentBitrate = parseInt(value1) * 1000;
|
4857
|
+
if (isFiniteNumber(currentBitrate)) {
|
4858
|
+
frag.bitrate = currentBitrate;
|
4859
|
+
} else {
|
4860
|
+
currentBitrate = 0;
|
4861
|
+
}
|
4822
4862
|
break;
|
4823
4863
|
case 'DATERANGE':
|
4824
4864
|
{
|
@@ -19043,7 +19083,7 @@ class GapController extends Logger {
|
|
19043
19083
|
}
|
19044
19084
|
}
|
19045
19085
|
|
19046
|
-
const version = "1.6.0-beta.1.0.canary.
|
19086
|
+
const version = "1.6.0-beta.1.0.canary.10752";
|
19047
19087
|
|
19048
19088
|
// ensure the worker ends up in the bundle
|
19049
19089
|
// If the worker should not be included this gets aliased to empty.js
|