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/package.json
CHANGED
@@ -285,9 +285,10 @@ class AbrController extends Logger implements AbrComponentAPI {
|
|
285
285
|
const bwEstimate: number = this.getBwEstimate();
|
286
286
|
const levels = hls.levels;
|
287
287
|
const level = levels[frag.level];
|
288
|
-
const expectedLen =
|
289
|
-
stats.
|
290
|
-
Math.
|
288
|
+
const expectedLen = Math.max(
|
289
|
+
stats.loaded,
|
290
|
+
Math.round((duration * (frag.bitrate || level.averageBitrate)) / 8),
|
291
|
+
);
|
291
292
|
let timeStreaming = loadedFirstByte ? timeLoading - ttfb : timeLoading;
|
292
293
|
if (timeStreaming < 1 && loadedFirstByte) {
|
293
294
|
timeStreaming = Math.min(timeLoading, (stats.loaded * 8) / bwEstimate);
|
@@ -880,8 +881,8 @@ class AbrController extends Logger implements AbrComponentAPI {
|
|
880
881
|
currentFragDuration &&
|
881
882
|
bufferStarvationDelay >= currentFragDuration * 2 &&
|
882
883
|
maxStarvationDelay === 0
|
883
|
-
?
|
884
|
-
:
|
884
|
+
? levelInfo.averageBitrate
|
885
|
+
: levelInfo.maxBitrate;
|
885
886
|
const fetchDuration: number = this.getTimeToLoadFrag(
|
886
887
|
ttfbEstimateSec,
|
887
888
|
adjustedbw,
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import { ErrorDetails, ErrorTypes } from '../errors';
|
2
2
|
import { getLoaderConfigWithoutReties } from '../utils/error-helper';
|
3
|
-
import type { HlsConfig } from '../config';
|
4
3
|
import type { BaseSegment, Fragment, Part } from './fragment';
|
4
|
+
import type { HlsConfig } from '../config';
|
5
5
|
import type {
|
6
6
|
ErrorData,
|
7
7
|
FragLoadedData,
|
package/src/loader/fragment.ts
CHANGED
@@ -159,6 +159,8 @@ export class Fragment extends BaseSegment {
|
|
159
159
|
private _decryptdata: LevelKey | null = null;
|
160
160
|
private _programDateTime: number | null = null;
|
161
161
|
private _ref: MediaFragmentRef | null = null;
|
162
|
+
// Approximate bit rate of the fragment expressed in bits per second (bps) as indicated by the last EXT-X-BITRATE (kbps) tag
|
163
|
+
private _bitrate?: number;
|
162
164
|
|
163
165
|
public rawProgramDateTime: string | null = null;
|
164
166
|
public tagList: Array<string[]> = [];
|
@@ -219,6 +221,37 @@ export class Fragment extends BaseSegment {
|
|
219
221
|
this.type = type;
|
220
222
|
}
|
221
223
|
|
224
|
+
get byteLength(): number | null {
|
225
|
+
if (this.hasStats) {
|
226
|
+
const total = this.stats.total;
|
227
|
+
if (total) {
|
228
|
+
return total;
|
229
|
+
}
|
230
|
+
}
|
231
|
+
if (this.byteRange) {
|
232
|
+
const start = this.byteRange[0];
|
233
|
+
const end = this.byteRange[1];
|
234
|
+
if (Number.isFinite(start) && Number.isFinite(end)) {
|
235
|
+
return (end as number) - (start as number);
|
236
|
+
}
|
237
|
+
}
|
238
|
+
return null;
|
239
|
+
}
|
240
|
+
|
241
|
+
get bitrate(): number | null {
|
242
|
+
if (this.byteLength) {
|
243
|
+
return (this.byteLength * 8) / this.duration;
|
244
|
+
}
|
245
|
+
if (this._bitrate) {
|
246
|
+
return this._bitrate;
|
247
|
+
}
|
248
|
+
return null;
|
249
|
+
}
|
250
|
+
|
251
|
+
set bitrate(value: number) {
|
252
|
+
this._bitrate = value;
|
253
|
+
}
|
254
|
+
|
222
255
|
get decryptdata(): LevelKey | null {
|
223
256
|
const { levelkeys } = this;
|
224
257
|
if (!levelkeys && !this._decryptdata) {
|
@@ -314,6 +314,7 @@ export default class M3U8Parser {
|
|
314
314
|
let currentPart = 0;
|
315
315
|
let totalduration = 0;
|
316
316
|
let discontinuityCounter = 0;
|
317
|
+
let currentBitrate = 0;
|
317
318
|
let prevFrag: Fragment | null = null;
|
318
319
|
let frag: Fragment = new Fragment(type, base);
|
319
320
|
let result: RegExpExecArray | RegExpMatchArray | null;
|
@@ -338,6 +339,9 @@ export default class M3U8Parser {
|
|
338
339
|
frag.start = totalduration;
|
339
340
|
frag.sn = currentSN;
|
340
341
|
frag.cc = discontinuityCounter;
|
342
|
+
if (currentBitrate) {
|
343
|
+
frag.bitrate = currentBitrate;
|
344
|
+
}
|
341
345
|
frag.level = id;
|
342
346
|
if (currentInitSegment) {
|
343
347
|
frag.initSegment = currentInitSegment;
|
@@ -481,6 +485,12 @@ export default class M3U8Parser {
|
|
481
485
|
break;
|
482
486
|
case 'BITRATE':
|
483
487
|
frag.tagList.push([tag, value1]);
|
488
|
+
currentBitrate = parseInt(value1) * 1000;
|
489
|
+
if (Number.isFinite(currentBitrate)) {
|
490
|
+
frag.bitrate = currentBitrate;
|
491
|
+
} else {
|
492
|
+
currentBitrate = 0;
|
493
|
+
}
|
484
494
|
break;
|
485
495
|
case 'DATERANGE': {
|
486
496
|
const dateRangeAttr = new AttrList(value1, level);
|