@gcorevideo/player 2.6.9 → 2.7.0
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/index.js +39 -20
- package/lib/Player.d.ts +3 -2
- package/lib/Player.d.ts.map +1 -1
- package/lib/Player.js +22 -7
- package/lib/playback.types.d.ts +12 -0
- package/lib/playback.types.d.ts.map +1 -1
- package/lib/plugins/dash-playback/DashPlayback.d.ts +3 -7
- package/lib/plugins/dash-playback/DashPlayback.d.ts.map +1 -1
- package/lib/plugins/dash-playback/DashPlayback.js +9 -9
- package/lib/plugins/hls-playback/HlsPlayback.d.ts +2 -1
- package/lib/plugins/hls-playback/HlsPlayback.d.ts.map +1 -1
- package/lib/plugins/hls-playback/HlsPlayback.js +7 -3
- package/lib/types.d.ts +0 -6
- package/lib/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/Player.ts +32 -15
- package/src/playback.types.ts +20 -0
- package/src/plugins/dash-playback/DashPlayback.ts +13 -18
- package/src/plugins/hls-playback/HlsPlayback.ts +10 -6
- package/src/types.ts +0 -7
- package/tsconfig.tsbuildinfo +1 -1
- package/src/plugins/hls-playback/hls.js +0 -706
package/dist/index.js
CHANGED
|
@@ -12375,9 +12375,9 @@ class DashPlayback extends HTML5Video {
|
|
|
12375
12375
|
dash.on(DASHJS.MediaPlayer.events.QUALITY_CHANGE_REQUESTED, (evt) => {
|
|
12376
12376
|
// TODO
|
|
12377
12377
|
assert.ok(this._levels, 'An array of levels is required to change quality');
|
|
12378
|
-
const newLevel = this._levels.find((level) => level.
|
|
12378
|
+
const newLevel = this._levels.find((level) => level.level === evt.newQuality); // TODO or simply this._levels[evt.newQuality]?
|
|
12379
12379
|
assert.ok(newLevel, 'A valid level is required to change quality');
|
|
12380
|
-
this.onLevelSwitch(newLevel
|
|
12380
|
+
this.onLevelSwitch(newLevel);
|
|
12381
12381
|
});
|
|
12382
12382
|
});
|
|
12383
12383
|
this._dash.on(DASHJS.MediaPlayer.events.METRIC_ADDED, (e) => {
|
|
@@ -12662,17 +12662,17 @@ class DashPlayback extends HTML5Video {
|
|
|
12662
12662
|
_fillLevels(levels) {
|
|
12663
12663
|
// TOOD check that levels[i].qualityIndex === i
|
|
12664
12664
|
this._levels = levels.map((level) => {
|
|
12665
|
-
return {
|
|
12665
|
+
return {
|
|
12666
|
+
level: level.qualityIndex,
|
|
12667
|
+
bitrate: level.bitrate,
|
|
12668
|
+
width: level.width,
|
|
12669
|
+
height: level.height,
|
|
12670
|
+
};
|
|
12666
12671
|
});
|
|
12667
12672
|
this.trigger(Events$1.PLAYBACK_LEVELS_AVAILABLE, this._levels);
|
|
12668
12673
|
}
|
|
12669
12674
|
onLevelSwitch(currentLevel) {
|
|
12670
|
-
this.trigger(Events$1.PLAYBACK_BITRATE,
|
|
12671
|
-
height: currentLevel.height,
|
|
12672
|
-
width: currentLevel.width,
|
|
12673
|
-
bitrate: currentLevel.bitrate,
|
|
12674
|
-
level: currentLevel.qualityIndex,
|
|
12675
|
-
});
|
|
12675
|
+
this.trigger(Events$1.PLAYBACK_BITRATE, currentLevel);
|
|
12676
12676
|
}
|
|
12677
12677
|
getPlaybackType() {
|
|
12678
12678
|
return this._playbackType;
|
|
@@ -41843,7 +41843,12 @@ class HlsPlayback extends HTML5Video {
|
|
|
41843
41843
|
_fillLevels() {
|
|
41844
41844
|
assert.ok(this._hls, 'Hls.js instance is not available');
|
|
41845
41845
|
this._levels = this._hls.levels.map((level, index) => {
|
|
41846
|
-
return {
|
|
41846
|
+
return {
|
|
41847
|
+
level: index, // or level.id?
|
|
41848
|
+
width: level.width,
|
|
41849
|
+
height: level.height,
|
|
41850
|
+
bitrate: level.bitrate,
|
|
41851
|
+
};
|
|
41847
41852
|
});
|
|
41848
41853
|
this.trigger(Events$1.PLAYBACK_LEVELS_AVAILABLE, this._levels);
|
|
41849
41854
|
}
|
|
@@ -42004,7 +42009,6 @@ class HlsPlayback extends HTML5Video {
|
|
|
42004
42009
|
this.trigger(Events$1.PLAYBACK_BITRATE, {
|
|
42005
42010
|
height: currentLevel.height,
|
|
42006
42011
|
width: currentLevel.width,
|
|
42007
|
-
bandwidth: currentLevel.bitrate,
|
|
42008
42012
|
bitrate: currentLevel.bitrate,
|
|
42009
42013
|
level: data.level
|
|
42010
42014
|
});
|
|
@@ -42248,6 +42252,13 @@ class Player {
|
|
|
42248
42252
|
assert.ok(!this.player, 'Player already initialized');
|
|
42249
42253
|
const player = new Player$1(coreOptions);
|
|
42250
42254
|
this.player = player;
|
|
42255
|
+
if (player.core.activeContainer) {
|
|
42256
|
+
trace(`${T} tuneIn bindBitrateChangeHandler`);
|
|
42257
|
+
this.bindBitrateChangeHandler();
|
|
42258
|
+
}
|
|
42259
|
+
player.core.on(Events$1.CORE_ACTIVE_CONTAINER_CHANGED, () => {
|
|
42260
|
+
this.bindBitrateChangeHandler();
|
|
42261
|
+
}, null);
|
|
42251
42262
|
// TODO checks if the whole thing is necessary
|
|
42252
42263
|
this.tuneInTimerId = globalThis.setTimeout(() => {
|
|
42253
42264
|
trace(`${T} tuneInTimer`, {
|
|
@@ -42269,13 +42280,17 @@ class Player {
|
|
|
42269
42280
|
}
|
|
42270
42281
|
this.tunedIn = true;
|
|
42271
42282
|
const player = this.player;
|
|
42272
|
-
if (player.core.activeContainer) {
|
|
42273
|
-
|
|
42274
|
-
|
|
42275
|
-
}
|
|
42276
|
-
player.core.on(
|
|
42277
|
-
|
|
42278
|
-
|
|
42283
|
+
// if (player.core.activeContainer) {
|
|
42284
|
+
// trace(`${T} tuneIn bindBitrateChangeHandler`)
|
|
42285
|
+
// this.bindBitrateChangeHandler()
|
|
42286
|
+
// }
|
|
42287
|
+
// player.core.on(
|
|
42288
|
+
// ClapprEvents.CORE_ACTIVE_CONTAINER_CHANGED,
|
|
42289
|
+
// () => {
|
|
42290
|
+
// this.bindBitrateChangeHandler()
|
|
42291
|
+
// },
|
|
42292
|
+
// null,
|
|
42293
|
+
// )
|
|
42279
42294
|
if (Browser.isiOS && player.core.activePlayback) {
|
|
42280
42295
|
player.core.activePlayback.$el.on('webkitendfullscreen', () => {
|
|
42281
42296
|
try {
|
|
@@ -42438,6 +42453,10 @@ class Player {
|
|
|
42438
42453
|
}
|
|
42439
42454
|
bindBitrateChangeHandler() {
|
|
42440
42455
|
trace(`${T} bindBitrateChangeHandler`, { activeContainer: this.player?.core?.activeContainer?.name });
|
|
42456
|
+
const currentPlayback = this.player?.core.activePlayback;
|
|
42457
|
+
currentPlayback.on(Events$1.PLAYBACK_LEVELS_AVAILABLE, (levels) => {
|
|
42458
|
+
// TODO
|
|
42459
|
+
});
|
|
42441
42460
|
this.player?.core.activeContainer.on(Events$1.CONTAINER_BITRATE, (bitrate) => {
|
|
42442
42461
|
trace(`${T} bitrate has changed`, { bitrate });
|
|
42443
42462
|
this.qLevel = bitrate;
|
|
@@ -42571,12 +42590,12 @@ class SentryTracer {
|
|
|
42571
42590
|
}
|
|
42572
42591
|
}
|
|
42573
42592
|
|
|
42574
|
-
var version$1 = "2.
|
|
42593
|
+
var version$1 = "2.7.0";
|
|
42575
42594
|
|
|
42576
42595
|
var packages = {
|
|
42577
42596
|
"": {
|
|
42578
42597
|
name: "@gcorevideo/player",
|
|
42579
|
-
version: "2.
|
|
42598
|
+
version: "2.7.0",
|
|
42580
42599
|
license: "Apache-2.0",
|
|
42581
42600
|
dependencies: {
|
|
42582
42601
|
"@clappr/core": "^0.11.3",
|
package/lib/Player.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import type { PlaybackType, PlayerPlugin
|
|
1
|
+
import type { PlaybackType, PlayerPlugin } from './types.js';
|
|
2
2
|
import { PlayerConfig, PlayerEvent } from './types.js';
|
|
3
|
+
import { QualityLevel } from './playback.types.js';
|
|
3
4
|
type PlayerEventHandler<T extends PlayerEvent> = () => void;
|
|
4
5
|
export type PlaybackModule = 'dash' | 'hls' | 'native';
|
|
5
6
|
/**
|
|
@@ -16,7 +17,7 @@ export declare class Player {
|
|
|
16
17
|
private tunedIn;
|
|
17
18
|
get activePlayback(): PlaybackModule | null;
|
|
18
19
|
get activeSource(): string | null;
|
|
19
|
-
get bitrate():
|
|
20
|
+
get bitrate(): QualityLevel | null;
|
|
20
21
|
get hd(): any;
|
|
21
22
|
get playbackType(): PlaybackType | undefined;
|
|
22
23
|
constructor(config: PlayerConfig);
|
package/lib/Player.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Player.d.ts","sourceRoot":"","sources":["../src/Player.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,
|
|
1
|
+
{"version":3,"file":"Player.d.ts","sourceRoot":"","sources":["../src/Player.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EAEb,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAQtD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAIlD,KAAK,kBAAkB,CAAC,CAAC,SAAS,WAAW,IAAI,MAAM,IAAI,CAAA;AAiB3D,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAA;AAItD;;GAEG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAA4B;IAE1C,OAAO,CAAC,MAAM,CAAgC;IAE9C,OAAO,CAAC,OAAO,CAAkB;IAEjC,OAAO,CAAC,MAAM,CAA4B;IAE1C,OAAO,CAAC,KAAK,CAAQ;IAErB,OAAO,CAAC,QAAQ,CAA2B;IAE3C,OAAO,CAAC,aAAa,CAA6C;IAElE,OAAO,CAAC,OAAO,CAAQ;IAEvB,IAAI,cAAc,IAAI,cAAc,GAAG,IAAI,CAY1C;IAED,IAAI,YAAY,IAAI,MAAM,GAAG,IAAI,CAKhC;IAED,IAAI,OAAO,IAAI,YAAY,GAAG,IAAI,CAEjC;IAED,IAAI,EAAE,QAEL;IAED,IAAI,YAAY,IAAI,YAAY,GAAG,SAAS,CAE3C;gBAEW,MAAM,EAAE,YAAY;IAIhC,EAAE,CAAC,CAAC,SAAS,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAIlE,GAAG,CAAC,CAAC,SAAS,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAInE,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC;IAIvC,OAAO,CAAC,SAAS;IAIX,IAAI,CAAC,aAAa,EAAE,WAAW;IAyBrC,OAAO;IAiBP,KAAK;IAKL,IAAI;IAKJ,MAAM,CAAC,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAQjD,MAAM,CAAC,IAAI,EAAE,MAAM;IAKnB,IAAI;IAKJ,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,YAAY;IAI1C,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,YAAY;IAI5C,OAAO,CAAC,UAAU;YAiCJ,MAAM;IA0FpB,OAAO,CAAC,MAAM,CAgDb;IAED,OAAO,CAAC,gBAAgB;IAiDxB,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,wBAAwB;IAiBhC,OAAO,CAAC,iBAAiB;CAM1B"}
|
package/lib/Player.js
CHANGED
|
@@ -148,6 +148,13 @@ export class Player {
|
|
|
148
148
|
assert.ok(!this.player, 'Player already initialized');
|
|
149
149
|
const player = new PlayerClappr(coreOptions);
|
|
150
150
|
this.player = player;
|
|
151
|
+
if (player.core.activeContainer) {
|
|
152
|
+
trace(`${T} tuneIn bindBitrateChangeHandler`);
|
|
153
|
+
this.bindBitrateChangeHandler();
|
|
154
|
+
}
|
|
155
|
+
player.core.on(ClapprEvents.CORE_ACTIVE_CONTAINER_CHANGED, () => {
|
|
156
|
+
this.bindBitrateChangeHandler();
|
|
157
|
+
}, null);
|
|
151
158
|
// TODO checks if the whole thing is necessary
|
|
152
159
|
this.tuneInTimerId = globalThis.setTimeout(() => {
|
|
153
160
|
trace(`${T} tuneInTimer`, {
|
|
@@ -169,13 +176,17 @@ export class Player {
|
|
|
169
176
|
}
|
|
170
177
|
this.tunedIn = true;
|
|
171
178
|
const player = this.player;
|
|
172
|
-
if (player.core.activeContainer) {
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
}
|
|
176
|
-
player.core.on(
|
|
177
|
-
|
|
178
|
-
|
|
179
|
+
// if (player.core.activeContainer) {
|
|
180
|
+
// trace(`${T} tuneIn bindBitrateChangeHandler`)
|
|
181
|
+
// this.bindBitrateChangeHandler()
|
|
182
|
+
// }
|
|
183
|
+
// player.core.on(
|
|
184
|
+
// ClapprEvents.CORE_ACTIVE_CONTAINER_CHANGED,
|
|
185
|
+
// () => {
|
|
186
|
+
// this.bindBitrateChangeHandler()
|
|
187
|
+
// },
|
|
188
|
+
// null,
|
|
189
|
+
// )
|
|
179
190
|
if (Browser.isiOS && player.core.activePlayback) {
|
|
180
191
|
player.core.activePlayback.$el.on('webkitendfullscreen', () => {
|
|
181
192
|
try {
|
|
@@ -338,6 +349,10 @@ export class Player {
|
|
|
338
349
|
}
|
|
339
350
|
bindBitrateChangeHandler() {
|
|
340
351
|
trace(`${T} bindBitrateChangeHandler`, { activeContainer: this.player?.core?.activeContainer?.name });
|
|
352
|
+
const currentPlayback = this.player?.core.activePlayback;
|
|
353
|
+
currentPlayback.on(ClapprEvents.PLAYBACK_LEVELS_AVAILABLE, (levels) => {
|
|
354
|
+
// TODO
|
|
355
|
+
});
|
|
341
356
|
this.player?.core.activeContainer.on(ClapprEvents.CONTAINER_BITRATE, (bitrate) => {
|
|
342
357
|
trace(`${T} bitrate has changed`, { bitrate });
|
|
343
358
|
this.qLevel = bitrate;
|
package/lib/playback.types.d.ts
CHANGED
|
@@ -9,4 +9,16 @@ export type TimeProgress = TimePosition & {
|
|
|
9
9
|
export type TimeUpdate = TimePosition & {
|
|
10
10
|
firstFragDateTime: number;
|
|
11
11
|
};
|
|
12
|
+
export type BitrateInfo = {
|
|
13
|
+
bitrate: number;
|
|
14
|
+
width: number;
|
|
15
|
+
height: number;
|
|
16
|
+
};
|
|
17
|
+
export type QualityLevel = {
|
|
18
|
+
level: number;
|
|
19
|
+
width: number;
|
|
20
|
+
height: number;
|
|
21
|
+
bitrate: number;
|
|
22
|
+
};
|
|
23
|
+
export type QualityLevelInfo = QualityLevel;
|
|
12
24
|
//# sourceMappingURL=playback.types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playback.types.d.ts","sourceRoot":"","sources":["../src/playback.types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC;AAE/B,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,SAAS,CAAC;IACnB,KAAK,EAAE,SAAS,CAAC;CAClB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;CAAE,CAAC;AAE7D,MAAM,MAAM,UAAU,GAAG,YAAY,GAAG;IACtC,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CAAC"}
|
|
1
|
+
{"version":3,"file":"playback.types.d.ts","sourceRoot":"","sources":["../src/playback.types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC;AAE/B,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,SAAS,CAAC;IACnB,KAAK,EAAE,SAAS,CAAC;CAClB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;CAAE,CAAC;AAE7D,MAAM,MAAM,UAAU,GAAG,YAAY,GAAG;IACtC,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,CAAA;AAOD,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAGD,MAAM,MAAM,gBAAgB,GAAG,YAAY,CAAC"}
|
|
@@ -1,12 +1,8 @@
|
|
|
1
1
|
import { HTML5Video, Playback } from '@clappr/core';
|
|
2
|
-
import DASHJS, { ErrorEvent as DashErrorEvent, PlaybackErrorEvent as DashPlaybackErrorEvent, type BitrateInfo, IManifestInfo } from 'dashjs';
|
|
3
|
-
import { TimePosition, TimeValue } from '../../playback.types.js';
|
|
2
|
+
import DASHJS, { ErrorEvent as DashErrorEvent, PlaybackErrorEvent as DashPlaybackErrorEvent, type BitrateInfo as DashBitrateInfo, IManifestInfo } from 'dashjs';
|
|
3
|
+
import { QualityLevel, TimePosition, TimeValue } from '../../playback.types.js';
|
|
4
4
|
type PlaybackType = typeof Playback.VOD | typeof Playback.LIVE | typeof Playback.AOD | typeof Playback.NO_OP;
|
|
5
5
|
type PlaylistType = string;
|
|
6
|
-
type QualityLevel = {
|
|
7
|
-
id: number;
|
|
8
|
-
level: BitrateInfo;
|
|
9
|
-
};
|
|
10
6
|
type LocalTimeCorrelation = {
|
|
11
7
|
local: number;
|
|
12
8
|
remote: number;
|
|
@@ -68,7 +64,7 @@ export default class DashPlayback extends HTML5Video {
|
|
|
68
64
|
stop(): void;
|
|
69
65
|
destroy(): import("@clappr/core").UIObject;
|
|
70
66
|
_updatePlaybackType(): void;
|
|
71
|
-
_fillLevels(levels:
|
|
67
|
+
_fillLevels(levels: DashBitrateInfo[]): void;
|
|
72
68
|
private onLevelSwitch;
|
|
73
69
|
getPlaybackType(): string;
|
|
74
70
|
isSeekEnabled(): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DashPlayback.d.ts","sourceRoot":"","sources":["../../../src/plugins/dash-playback/DashPlayback.ts"],"names":[],"mappings":"AAIA,OAAO,EAAU,UAAU,EAAO,QAAQ,EAAS,MAAM,cAAc,CAAA;AAEvE,OAAO,MAAM,EAAE,EACb,UAAU,IAAI,cAAc,EAC5B,kBAAkB,IAAI,sBAAsB,EAC5C,KAAK,WAAW,
|
|
1
|
+
{"version":3,"file":"DashPlayback.d.ts","sourceRoot":"","sources":["../../../src/plugins/dash-playback/DashPlayback.ts"],"names":[],"mappings":"AAIA,OAAO,EAAU,UAAU,EAAO,QAAQ,EAAS,MAAM,cAAc,CAAA;AAEvE,OAAO,MAAM,EAAE,EACb,UAAU,IAAI,cAAc,EAC5B,kBAAkB,IAAI,sBAAsB,EAC5C,KAAK,WAAW,IAAI,eAAe,EAEnC,aAAa,EACd,MAAM,QAAQ,CAAA;AAGf,OAAO,EAAe,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAM5F,KAAK,YAAY,GACb,OAAO,QAAQ,CAAC,GAAG,GACnB,OAAO,QAAQ,CAAC,IAAI,GACpB,OAAO,QAAQ,CAAC,GAAG,GACnB,OAAO,QAAQ,CAAC,KAAK,CAAA;AAEzB,KAAK,YAAY,GAAG,MAAM,CAAA;AAE1B,KAAK,oBAAoB,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAID,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,UAAU;IAClD,OAAO,EAAE,YAAY,EAAE,GAAG,IAAI,CAAO;IAErC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAO;IAKnC,mCAAmC,EAAE,OAAO,CAAQ;IAEpD,aAAa,EAAE,OAAO,CAAQ;IAI9B,uBAAuB,EAAE,MAAM,CAAI;IASnC,wBAAwB,EAAE,MAAM,CAAI;IAEpC,aAAa,EAAE,YAAY,CAAe;IAG1C,aAAa,EAAE,YAAY,GAAG,IAAI,CAAO;IAGzC,gBAAgB,EAAE,SAAS,CAAI;IAE/B,KAAK,EAAE,MAAM,CAAC,gBAAgB,GAAG,IAAI,CAAO;IAE5C,2BAA2B,EAAE,MAAM,CAAI;IAEvC,aAAa,EAAE,SAAS,GAAG,IAAI,CAAO;IAEtC,eAAe,EAAE,YAAY,CAA2B;IAIxD,0BAA0B,EAAE,oBAAoB,GAAG,IAAI,CAAO;IAI9D,wBAAwB,EAAE,oBAAoB,GAAG,IAAI,CAAO;IAE5D,kBAAkB,UAAQ;IAE1B,YAAY,EAAE,aAAa,GAAG,IAAI,CAAO;IAGzC,sBAAsB,EAAE,SAAS,GAAG,IAAI,CAAO;IAE/C,gBAAgB,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,GAAG,IAAI,CAAO;IAE9D,IAAI,IAAI,WAEP;IAED,IAAI,MAAM,IAAI,YAAY,EAAE,CAE3B;IAED,IAAI,YAAY,IAAI,MAAM,CAMzB;IAED,IAAI,OAAO,YAEV;IAED,IAAI,YAAY,CAAC,EAAE,EAAE,MAAM,EAiC1B;IAED,IAAI,UAAU,WASb;IAED,IAAI,IAAI,WAEP;IAID,IAAI,sBAAsB,WAczB;IAID,IAAI,oBAAoB,WAgBvB;IAED,IAAI,SAAS,WAKZ;gBAEW,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,GAAG;IAOzD,MAAM;IAwEN,MAAM;IAMN,MAAM;IAMN,SAAS;IAIT,qBAAqB;IAQrB,oBAAoB;IAMpB,kBAAkB;IAOlB,WAAW,IAAI,SAAS;IAQxB,cAAc,IAAI,SAAS;IAU3B,kBAAkB,IAAI,SAAS;IAI/B,cAAc,CAAC,UAAU,EAAE,MAAM;IAejC,IAAI,CAAC,IAAI,EAAE,SAAS;IAgBpB,eAAe;IAIf,UAAU,CAAC,MAAM,EAAE,OAAO;IAK1B,eAAe;IAaf,gBAAgB,UAAW,sBAAsB,UAEhD;IAED,eAAe,UAAW,cAAc,UAwGvC;IAED,aAAa;IAqBb,iBAAiB;IAWjB,IAAI,UAAU,YASb;IAED,WAAW;IAmBX,IAAI;IAUJ,KAAK;IAWL,IAAI;IASJ,OAAO;IAkBP,mBAAmB;IAQnB,WAAW,CAAC,MAAM,EAAE,eAAe,EAAE;IAarC,OAAO,CAAC,aAAa;IAIrB,eAAe;IAIf,aAAa;CAGd"}
|
|
@@ -164,9 +164,9 @@ export default class DashPlayback extends HTML5Video {
|
|
|
164
164
|
dash.on(DASHJS.MediaPlayer.events.QUALITY_CHANGE_REQUESTED, (evt) => {
|
|
165
165
|
// TODO
|
|
166
166
|
assert.ok(this._levels, 'An array of levels is required to change quality');
|
|
167
|
-
const newLevel = this._levels.find((level) => level.
|
|
167
|
+
const newLevel = this._levels.find((level) => level.level === evt.newQuality); // TODO or simply this._levels[evt.newQuality]?
|
|
168
168
|
assert.ok(newLevel, 'A valid level is required to change quality');
|
|
169
|
-
this.onLevelSwitch(newLevel
|
|
169
|
+
this.onLevelSwitch(newLevel);
|
|
170
170
|
});
|
|
171
171
|
});
|
|
172
172
|
this._dash.on(DASHJS.MediaPlayer.events.METRIC_ADDED, (e) => {
|
|
@@ -451,17 +451,17 @@ export default class DashPlayback extends HTML5Video {
|
|
|
451
451
|
_fillLevels(levels) {
|
|
452
452
|
// TOOD check that levels[i].qualityIndex === i
|
|
453
453
|
this._levels = levels.map((level) => {
|
|
454
|
-
return {
|
|
454
|
+
return {
|
|
455
|
+
level: level.qualityIndex,
|
|
456
|
+
bitrate: level.bitrate,
|
|
457
|
+
width: level.width,
|
|
458
|
+
height: level.height,
|
|
459
|
+
};
|
|
455
460
|
});
|
|
456
461
|
this.trigger(Events.PLAYBACK_LEVELS_AVAILABLE, this._levels);
|
|
457
462
|
}
|
|
458
463
|
onLevelSwitch(currentLevel) {
|
|
459
|
-
this.trigger(Events.PLAYBACK_BITRATE,
|
|
460
|
-
height: currentLevel.height,
|
|
461
|
-
width: currentLevel.width,
|
|
462
|
-
bitrate: currentLevel.bitrate,
|
|
463
|
-
level: currentLevel.qualityIndex,
|
|
464
|
-
});
|
|
464
|
+
this.trigger(Events.PLAYBACK_BITRATE, currentLevel);
|
|
465
465
|
}
|
|
466
466
|
getPlaybackType() {
|
|
467
467
|
return this._playbackType;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { HTML5Video } from '@clappr/core';
|
|
2
2
|
import HLSJS, { HlsEvents, type HlsErrorData, type FragChangedData, type FragLoadedData, type FragParsingMetadataData, type LevelSwitchingData } from 'hls.js';
|
|
3
|
+
import { QualityLevel } from '../../playback.types.js';
|
|
3
4
|
import { PlaybackType } from '../../types';
|
|
4
5
|
type ErrorInfo = Record<string, unknown>;
|
|
5
6
|
export default class HlsPlayback extends HTML5Video {
|
|
@@ -32,7 +33,7 @@ export default class HlsPlayback extends HTML5Video {
|
|
|
32
33
|
get supportedVersion(): {
|
|
33
34
|
min: string;
|
|
34
35
|
};
|
|
35
|
-
get levels():
|
|
36
|
+
get levels(): QualityLevel[];
|
|
36
37
|
get currentLevel(): number;
|
|
37
38
|
get isReady(): boolean;
|
|
38
39
|
set currentLevel(id: number);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HlsPlayback.d.ts","sourceRoot":"","sources":["../../../src/plugins/hls-playback/HlsPlayback.ts"],"names":[],"mappings":"AAIA,OAAO,EAAU,UAAU,EAAqC,MAAM,cAAc,CAAC;AAErF,OAAO,KAAK,EAAE,EACZ,SAAS,EAET,KAAK,YAAY,EAEjB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,uBAAuB,EAG5B,KAAK,kBAAkB,EACxB,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"HlsPlayback.d.ts","sourceRoot":"","sources":["../../../src/plugins/hls-playback/HlsPlayback.ts"],"names":[],"mappings":"AAIA,OAAO,EAAU,UAAU,EAAqC,MAAM,cAAc,CAAC;AAErF,OAAO,KAAK,EAAE,EACZ,SAAS,EAET,KAAK,YAAY,EAEjB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,uBAAuB,EAG5B,KAAK,kBAAkB,EACxB,MAAM,QAAQ,CAAC;AAEhB,OAAO,EAAE,YAAY,EAAgB,MAAM,yBAAyB,CAAC;AAErE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAwC3C,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEzC,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,UAAU;IACjD,OAAO,CAAC,UAAU,CAAS;IAE3B,OAAO,CAAC,gBAAgB,CAAS;IAEjC,OAAO,CAAC,gBAAgB,CAAyB;IAEjD,OAAO,CAAC,aAAa,CAAuB;IAE5C,OAAO,CAAC,mCAAmC,CAAS;IAEpD,OAAO,CAAC,8BAA8B,CAAK;IAE3C,OAAO,CAAC,cAAc,CAAS;IAE/B,OAAO,CAAC,IAAI,CAAsB;IAElC,OAAO,CAAC,aAAa,CAAS;IAE9B,OAAO,CAAC,aAAa,CAAuB;IAE5C,OAAO,CAAC,eAAe,CAA6B;IAEpD,OAAO,CAAC,OAAO,CAA+B;IAE9C,OAAO,CAAC,0BAA0B,CAAgC;IAElE,OAAO,CAAC,wBAAwB,CAAgC;IAEhE,OAAO,CAAC,eAAe,CAAS;IAEhC,OAAO,CAAC,uBAAuB,CAAK;IAEpC,OAAO,CAAC,aAAa,CAA8C;IAEnE,OAAO,CAAC,aAAa,CAA6B;IAElD,OAAO,CAAC,wBAAwB,CAAK;IAErC,OAAO,CAAC,gBAAgB,CAAuB;IAE/C,OAAO,CAAC,yBAAyB,CAAK;IAEtC,OAAO,CAAC,yBAAyB,CAAS;IAE1C,OAAO,CAAC,uBAAuB,CAAS;IAExC,OAAO,CAAC,sBAAsB,CAAuB;IAErD,OAAO,CAAC,gBAAgB,CAAwB;IAEhD,IAAI,IAAI,WAEP;IAED,IAAI,gBAAgB;;MAEnB;IAED,IAAI,MAAM,mBAET;IAED,IAAI,YAAY,IAQK,MAAM,CAN1B;IAED,IAAI,OAAO,YAEV;IAED,IAAI,YAAY,CAAC,EAAE,EAAE,MAAM,EAS1B;IAED,IAAI,OAAO,WAGV;IAED,IAAI,sBAAsB,SAIzB;IAED,IAAI,UAAU,WAMb;IAED,IAAI,IAAI,WAEP;IAID,IAAI,sBAAsB,WAWzB;IAID,IAAI,oBAAoB,WAWvB;IAED,IAAI,SAAS,WAEZ;IAmBD,IAAI,2BAA2B,WAM9B;IAED,IAAI,iBAAiB,kBAEpB;IAED,IAAI,cAAc;;MAEjB;IAED,IAAI,eAAe,QAElB;IAED,IAAI,WAAW,QAEd;IAED,IAAI,gBAAgB,kBAWnB;IAED,MAAM,KAAK,KAAK,iBAEf;gBAEW,GAAG,IAAI,EAAE,GAAG,EAAE;IAO1B,gBAAgB;IA2ChB,MAAM;IAON,mBAAmB;IAYnB,kBAAkB;IAUlB,eAAe;IAOf,gBAAgB;IAiChB,mBAAmB;IASnB,qBAAqB;IASrB,0BAA0B,CAAC,GAAG,EAAE,SAAS,CAAC,qBAAqB,EAAE,IAAI,EAAE,uBAAuB;IAK9F,MAAM;IAMN,MAAM;IASN,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS;IAqBnE,SAAS,CAAC,MAAM,EAAE,MAAM;IAExB,qBAAqB;IAUrB,oBAAoB;IAQpB,kBAAkB;IAOlB,WAAW;IAIX,cAAc;IAUd,kBAAkB;IAIlB,cAAc,CAAC,UAAU,EAAE,MAAM;IAQjC,IAAI,CAAC,IAAI,EAAE,MAAM;IAWjB,eAAe;IAIf,UAAU,CAAC,MAAM,EAAE,OAAO;IAK1B,eAAe;IAaf,aAAa,CAAC,GAAG,EAAE,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,YAAY;IA6EtD,YAAY,CAAC,IAAI,EAAE,YAAY;IAQ/B,aAAa;IAab,iBAAiB;IAUjB,WAAW;IA0BX,IAAI,CAAC,GAAG,EAAE,MAAM;IAMhB,IAAI;IASJ,KAAK;IAUL,IAAI;IAQJ,OAAO;IAMP,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,eAAe;IAgIvB,kBAAkB,CAAC,GAAG,EAAE,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,eAAe;IAMrE,iBAAiB,CAAC,GAAG,EAAE,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,cAAc;IAIlE,iBAAiB;IAYjB,cAAc,CAAC,GAAG,EAAE,SAAS,CAAC,eAAe,EAAE,IAAI,EAAE,kBAAkB;IAsBvE,IAAI,UAAU,YAMb;IAED,eAAe;IAIf,aAAa;CAGd"}
|
|
@@ -5,8 +5,8 @@ import { Events, HTML5Video, Log, Playback, PlayerError, Utils } from '@clappr/c
|
|
|
5
5
|
import assert from 'assert';
|
|
6
6
|
import HLSJS from 'hls.js';
|
|
7
7
|
import { trace } from '../../trace/index.js';
|
|
8
|
-
const { now, listContainsIgnoreCase } = Utils;
|
|
9
8
|
import { CLAPPR_VERSION } from "../../build.js";
|
|
9
|
+
const { now, listContainsIgnoreCase } = Utils;
|
|
10
10
|
const AUTO = -1;
|
|
11
11
|
const DEFAULT_RECOVER_ATTEMPTS = 16;
|
|
12
12
|
Events.register('PLAYBACK_FRAGMENT_CHANGED');
|
|
@@ -559,7 +559,12 @@ export default class HlsPlayback extends HTML5Video {
|
|
|
559
559
|
_fillLevels() {
|
|
560
560
|
assert.ok(this._hls, 'Hls.js instance is not available');
|
|
561
561
|
this._levels = this._hls.levels.map((level, index) => {
|
|
562
|
-
return {
|
|
562
|
+
return {
|
|
563
|
+
level: index, // or level.id?
|
|
564
|
+
width: level.width,
|
|
565
|
+
height: level.height,
|
|
566
|
+
bitrate: level.bitrate,
|
|
567
|
+
};
|
|
563
568
|
});
|
|
564
569
|
this.trigger(Events.PLAYBACK_LEVELS_AVAILABLE, this._levels);
|
|
565
570
|
}
|
|
@@ -720,7 +725,6 @@ export default class HlsPlayback extends HTML5Video {
|
|
|
720
725
|
this.trigger(Events.PLAYBACK_BITRATE, {
|
|
721
726
|
height: currentLevel.height,
|
|
722
727
|
width: currentLevel.width,
|
|
723
|
-
bandwidth: currentLevel.bitrate,
|
|
724
728
|
bitrate: currentLevel.bitrate,
|
|
725
729
|
level: data.level
|
|
726
730
|
});
|
package/lib/types.d.ts
CHANGED
|
@@ -79,12 +79,6 @@ export type StreamMediaSource = {
|
|
|
79
79
|
export type SrcProjectionType = 'regular' | '360' | 'vr180' | 'vr360tb';
|
|
80
80
|
export type ProjectionType = '360' | '180' | '360_TB';
|
|
81
81
|
export type TranslationSettings = Partial<Record<LangTag, Record<TranslationKey, string>>>;
|
|
82
|
-
export type QualityLevelInfo = {
|
|
83
|
-
level: number;
|
|
84
|
-
width: number;
|
|
85
|
-
height: number;
|
|
86
|
-
bitrate: number;
|
|
87
|
-
};
|
|
88
82
|
export declare enum PlayerEvent {
|
|
89
83
|
Ready = "ready",
|
|
90
84
|
Play = "play",
|
package/lib/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/Player.ts
CHANGED
|
@@ -18,7 +18,7 @@ import type {
|
|
|
18
18
|
import type {
|
|
19
19
|
PlaybackType,
|
|
20
20
|
PlayerPlugin,
|
|
21
|
-
|
|
21
|
+
// QualityLevel,
|
|
22
22
|
} from './types.js'
|
|
23
23
|
import { reportError, trace } from './trace/index.js'
|
|
24
24
|
import { PlayerConfig, PlayerEvent } from './types.js'
|
|
@@ -29,6 +29,7 @@ import {
|
|
|
29
29
|
buildSourcesSet,
|
|
30
30
|
unwrapSource,
|
|
31
31
|
} from './utils/mediaSources.js'
|
|
32
|
+
import { QualityLevel } from './playback.types.js'
|
|
32
33
|
|
|
33
34
|
// TODO implement transport retry/failover and fallback logic
|
|
34
35
|
|
|
@@ -57,7 +58,7 @@ type PluginOptions = Record<string, unknown>
|
|
|
57
58
|
* @beta
|
|
58
59
|
*/
|
|
59
60
|
export class Player {
|
|
60
|
-
private qLevel:
|
|
61
|
+
private qLevel: QualityLevel | null = null
|
|
61
62
|
|
|
62
63
|
private config: PlayerConfig = DEFAULT_OPTIONS
|
|
63
64
|
|
|
@@ -94,7 +95,7 @@ export class Player {
|
|
|
94
95
|
return this.player.core.activePlayback.options.src
|
|
95
96
|
}
|
|
96
97
|
|
|
97
|
-
get bitrate():
|
|
98
|
+
get bitrate(): QualityLevel | null {
|
|
98
99
|
return this.qLevel
|
|
99
100
|
}
|
|
100
101
|
|
|
@@ -214,6 +215,18 @@ export class Player {
|
|
|
214
215
|
const player = new PlayerClappr(coreOptions)
|
|
215
216
|
this.player = player
|
|
216
217
|
|
|
218
|
+
if (player.core.activeContainer) {
|
|
219
|
+
trace(`${T} tuneIn bindBitrateChangeHandler`)
|
|
220
|
+
this.bindBitrateChangeHandler()
|
|
221
|
+
}
|
|
222
|
+
player.core.on(
|
|
223
|
+
ClapprEvents.CORE_ACTIVE_CONTAINER_CHANGED,
|
|
224
|
+
() => {
|
|
225
|
+
this.bindBitrateChangeHandler()
|
|
226
|
+
},
|
|
227
|
+
null,
|
|
228
|
+
)
|
|
229
|
+
|
|
217
230
|
// TODO checks if the whole thing is necessary
|
|
218
231
|
this.tuneInTimerId = globalThis.setTimeout(() => {
|
|
219
232
|
trace(`${T} tuneInTimer`, {
|
|
@@ -236,17 +249,17 @@ export class Player {
|
|
|
236
249
|
}
|
|
237
250
|
this.tunedIn = true
|
|
238
251
|
const player = this.player
|
|
239
|
-
if (player.core.activeContainer) {
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
}
|
|
243
|
-
player.core.on(
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
)
|
|
252
|
+
// if (player.core.activeContainer) {
|
|
253
|
+
// trace(`${T} tuneIn bindBitrateChangeHandler`)
|
|
254
|
+
// this.bindBitrateChangeHandler()
|
|
255
|
+
// }
|
|
256
|
+
// player.core.on(
|
|
257
|
+
// ClapprEvents.CORE_ACTIVE_CONTAINER_CHANGED,
|
|
258
|
+
// () => {
|
|
259
|
+
// this.bindBitrateChangeHandler()
|
|
260
|
+
// },
|
|
261
|
+
// null,
|
|
262
|
+
// )
|
|
250
263
|
if (Browser.isiOS && player.core.activePlayback) {
|
|
251
264
|
player.core.activePlayback.$el.on('webkitendfullscreen', () => {
|
|
252
265
|
try {
|
|
@@ -422,9 +435,13 @@ export class Player {
|
|
|
422
435
|
|
|
423
436
|
private bindBitrateChangeHandler() {
|
|
424
437
|
trace(`${T} bindBitrateChangeHandler`, { activeContainer: this.player?.core?.activeContainer?.name })
|
|
438
|
+
const currentPlayback = this.player?.core.activePlayback;
|
|
439
|
+
currentPlayback.on(ClapprEvents.PLAYBACK_LEVELS_AVAILABLE, (levels: QualityLevel[]) => {
|
|
440
|
+
// TODO
|
|
441
|
+
});
|
|
425
442
|
this.player?.core.activeContainer.on(
|
|
426
443
|
ClapprEvents.CONTAINER_BITRATE,
|
|
427
|
-
(bitrate:
|
|
444
|
+
(bitrate: QualityLevel) => {
|
|
428
445
|
trace(`${T} bitrate has changed`, { bitrate })
|
|
429
446
|
|
|
430
447
|
this.qLevel = bitrate
|
package/src/playback.types.ts
CHANGED
|
@@ -11,3 +11,23 @@ export type TimeUpdate = TimePosition & {
|
|
|
11
11
|
firstFragDateTime: number;
|
|
12
12
|
};
|
|
13
13
|
|
|
14
|
+
export type BitrateInfo = {
|
|
15
|
+
bitrate: number;
|
|
16
|
+
width: number;
|
|
17
|
+
height: number;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// TODO decide which one to use
|
|
21
|
+
// export type QualityLevel = {
|
|
22
|
+
// id: number
|
|
23
|
+
// level: BitrateInfo
|
|
24
|
+
// }
|
|
25
|
+
export type QualityLevel = {
|
|
26
|
+
level: number // index
|
|
27
|
+
width: number
|
|
28
|
+
height: number
|
|
29
|
+
bitrate: number
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// TODO drop
|
|
33
|
+
export type QualityLevelInfo = QualityLevel;
|
|
@@ -7,13 +7,13 @@ import assert from 'assert'
|
|
|
7
7
|
import DASHJS, {
|
|
8
8
|
ErrorEvent as DashErrorEvent,
|
|
9
9
|
PlaybackErrorEvent as DashPlaybackErrorEvent,
|
|
10
|
-
type BitrateInfo,
|
|
10
|
+
type BitrateInfo as DashBitrateInfo,
|
|
11
11
|
MetricEvent as DashMetricEvent,
|
|
12
12
|
IManifestInfo,
|
|
13
13
|
} from 'dashjs'
|
|
14
14
|
import { trace } from '../../trace/index.js'
|
|
15
15
|
|
|
16
|
-
import { TimePosition, TimeValue } from '../../playback.types.js'
|
|
16
|
+
import { BitrateInfo, QualityLevel, TimePosition, TimeValue } from '../../playback.types.js'
|
|
17
17
|
|
|
18
18
|
const AUTO = -1
|
|
19
19
|
|
|
@@ -27,11 +27,6 @@ type PlaybackType =
|
|
|
27
27
|
|
|
28
28
|
type PlaylistType = string // TODO union
|
|
29
29
|
|
|
30
|
-
type QualityLevel = {
|
|
31
|
-
id: number
|
|
32
|
-
level: BitrateInfo
|
|
33
|
-
}
|
|
34
|
-
|
|
35
30
|
type LocalTimeCorrelation = {
|
|
36
31
|
local: number
|
|
37
32
|
remote: number
|
|
@@ -260,10 +255,10 @@ export default class DashPlayback extends HTML5Video {
|
|
|
260
255
|
'An array of levels is required to change quality',
|
|
261
256
|
)
|
|
262
257
|
const newLevel = this._levels.find(
|
|
263
|
-
(level) => level.
|
|
258
|
+
(level) => level.level === evt.newQuality,
|
|
264
259
|
) // TODO or simply this._levels[evt.newQuality]?
|
|
265
260
|
assert.ok(newLevel, 'A valid level is required to change quality')
|
|
266
|
-
this.onLevelSwitch(newLevel
|
|
261
|
+
this.onLevelSwitch(newLevel)
|
|
267
262
|
})
|
|
268
263
|
})
|
|
269
264
|
|
|
@@ -631,21 +626,21 @@ export default class DashPlayback extends HTML5Video {
|
|
|
631
626
|
this._playbackType = this._dash.isDynamic() ? Playback.LIVE : Playback.VOD
|
|
632
627
|
}
|
|
633
628
|
|
|
634
|
-
_fillLevels(levels:
|
|
629
|
+
_fillLevels(levels: DashBitrateInfo[]) {
|
|
635
630
|
// TOOD check that levels[i].qualityIndex === i
|
|
636
631
|
this._levels = levels.map((level) => {
|
|
637
|
-
return {
|
|
632
|
+
return {
|
|
633
|
+
level: level.qualityIndex,
|
|
634
|
+
bitrate: level.bitrate,
|
|
635
|
+
width: level.width,
|
|
636
|
+
height: level.height,
|
|
637
|
+
}
|
|
638
638
|
})
|
|
639
639
|
this.trigger(Events.PLAYBACK_LEVELS_AVAILABLE, this._levels)
|
|
640
640
|
}
|
|
641
641
|
|
|
642
|
-
private onLevelSwitch(currentLevel:
|
|
643
|
-
this.trigger(Events.PLAYBACK_BITRATE,
|
|
644
|
-
height: currentLevel.height,
|
|
645
|
-
width: currentLevel.width,
|
|
646
|
-
bitrate: currentLevel.bitrate,
|
|
647
|
-
level: currentLevel.qualityIndex,
|
|
648
|
-
})
|
|
642
|
+
private onLevelSwitch(currentLevel: QualityLevel) {
|
|
643
|
+
this.trigger(Events.PLAYBACK_BITRATE, currentLevel)
|
|
649
644
|
}
|
|
650
645
|
|
|
651
646
|
getPlaybackType() {
|
|
@@ -17,15 +17,15 @@ import HLSJS, {
|
|
|
17
17
|
type LevelSwitchingData,
|
|
18
18
|
} from 'hls.js';
|
|
19
19
|
|
|
20
|
-
import { TimePosition } from '../../playback.types.js';
|
|
20
|
+
import { QualityLevel, TimePosition } from '../../playback.types.js';
|
|
21
21
|
import { trace } from '../../trace/index.js';
|
|
22
22
|
import { PlaybackType } from '../../types';
|
|
23
23
|
import { TimerId } from '../../utils/types';
|
|
24
24
|
|
|
25
|
-
const { now, listContainsIgnoreCase } = Utils;
|
|
26
|
-
|
|
27
25
|
import { CLAPPR_VERSION } from "../../build.js";
|
|
28
26
|
|
|
27
|
+
const { now, listContainsIgnoreCase } = Utils;
|
|
28
|
+
|
|
29
29
|
const AUTO = -1;
|
|
30
30
|
const DEFAULT_RECOVER_ATTEMPTS = 16;
|
|
31
31
|
|
|
@@ -84,7 +84,7 @@ export default class HlsPlayback extends HTML5Video {
|
|
|
84
84
|
|
|
85
85
|
private _lastTimeUpdate: TimePosition | null = null;
|
|
86
86
|
|
|
87
|
-
private _levels:
|
|
87
|
+
private _levels: QualityLevel[] | null = null;
|
|
88
88
|
|
|
89
89
|
private _localStartTimeCorrelation: TimeCorrelation | null = null;
|
|
90
90
|
|
|
@@ -707,7 +707,12 @@ export default class HlsPlayback extends HTML5Video {
|
|
|
707
707
|
private _fillLevels() {
|
|
708
708
|
assert.ok(this._hls, 'Hls.js instance is not available');
|
|
709
709
|
this._levels = this._hls.levels.map((level, index) => {
|
|
710
|
-
return {
|
|
710
|
+
return {
|
|
711
|
+
level: index, // or level.id?
|
|
712
|
+
width: level.width,
|
|
713
|
+
height: level.height,
|
|
714
|
+
bitrate: level.bitrate,
|
|
715
|
+
};
|
|
711
716
|
});
|
|
712
717
|
this.trigger(Events.PLAYBACK_LEVELS_AVAILABLE, this._levels);
|
|
713
718
|
}
|
|
@@ -878,7 +883,6 @@ export default class HlsPlayback extends HTML5Video {
|
|
|
878
883
|
this.trigger(Events.PLAYBACK_BITRATE, {
|
|
879
884
|
height: currentLevel.height,
|
|
880
885
|
width: currentLevel.width,
|
|
881
|
-
bandwidth: currentLevel.bitrate,
|
|
882
886
|
bitrate: currentLevel.bitrate,
|
|
883
887
|
level: data.level
|
|
884
888
|
});
|