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/package.json CHANGED
@@ -130,5 +130,5 @@
130
130
  "url-toolkit": "2.2.5",
131
131
  "wrangler": "3.85.0"
132
132
  },
133
- "version": "1.6.0-beta.1.0.canary.10751"
133
+ "version": "1.6.0-beta.1.0.canary.10752"
134
134
  }
@@ -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.total ||
290
- Math.max(stats.loaded, Math.round((duration * level.averageBitrate) / 8));
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
- ? levels[i].averageBitrate
884
- : levels[i].maxBitrate;
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,
@@ -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);