@gcorevideo/player 2.28.27 → 2.28.29
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/core.js +173 -123
- package/dist/index.css +336 -336
- package/dist/index.embed.js +256 -199
- package/dist/index.js +229 -177
- package/lib/playback/BasePlayback.d.ts.map +1 -1
- package/lib/playback/dash-playback/DashPlayback.d.ts +25 -6
- package/lib/playback/dash-playback/DashPlayback.d.ts.map +1 -1
- package/lib/playback/dash-playback/DashPlayback.js +89 -46
- package/lib/playback/hls-playback/HlsPlayback.d.ts +32 -6
- package/lib/playback/hls-playback/HlsPlayback.d.ts.map +1 -1
- package/lib/playback/hls-playback/HlsPlayback.js +78 -57
- package/lib/playback.types.d.ts +6 -0
- package/lib/playback.types.d.ts.map +1 -1
- package/lib/plugins/subtitles/ClosedCaptions.d.ts +5 -0
- package/lib/plugins/subtitles/ClosedCaptions.d.ts.map +1 -1
- package/lib/plugins/subtitles/ClosedCaptions.js +56 -54
- package/lib/testUtils.d.ts +2 -0
- package/lib/testUtils.d.ts.map +1 -1
- package/lib/testUtils.js +2 -0
- package/package.json +2 -2
- package/src/playback/BasePlayback.ts +2 -1
- package/src/playback/dash-playback/DashPlayback.ts +115 -55
- package/src/playback/hls-playback/HlsPlayback.ts +96 -87
- package/src/playback.types.ts +7 -0
- package/src/plugins/multi-camera/MultiCamera.ts +5 -5
- package/src/plugins/subtitles/ClosedCaptions.ts +64 -57
- package/src/plugins/subtitles/__tests__/ClosedCaptions.test.ts +195 -196
- package/src/plugins/subtitles/__tests__/__snapshots__/ClosedCaptions.test.ts.snap +13 -1
- package/src/testUtils.ts +2 -0
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BasePlayback.d.ts","sourceRoot":"","sources":["../../src/playback/BasePlayback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAU,UAAU,EAAe,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"BasePlayback.d.ts","sourceRoot":"","sources":["../../src/playback/BasePlayback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAU,UAAU,EAAe,MAAM,cAAc,CAAA;AAK5E;;;GAGG;AACH,qBAAa,YAAa,SAAQ,UAAU;IAC1C,IAAI,YAAY,YAEf;IAED,WAAW,CAAC,SAAS,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,YAAY;IA0BlD;;;OAGG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM;IAInB,UAAU;CAIpB"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Playback } from '@clappr/core';
|
|
2
|
-
import
|
|
3
|
-
import { QualityLevel, TimePosition, TimeValue } from '../../playback.types.js';
|
|
2
|
+
import { MediaPlayerClass, IManifestInfo } from 'dashjs';
|
|
3
|
+
import { QualityLevel, TimePosition, TimeValue, VTTCueInfo } from '../../playback.types.js';
|
|
4
4
|
import { BasePlayback } from '../BasePlayback.js';
|
|
5
5
|
import { AudioTrack } from '@clappr/core/types/base/playback/playback.js';
|
|
6
6
|
type PlaybackType = typeof Playback.VOD | typeof Playback.LIVE | typeof Playback.AOD | typeof Playback.NO_OP;
|
|
@@ -10,8 +10,8 @@ type LocalTimeCorrelation = {
|
|
|
10
10
|
remote: number;
|
|
11
11
|
};
|
|
12
12
|
export default class DashPlayback extends BasePlayback {
|
|
13
|
-
_levels: QualityLevel[]
|
|
14
|
-
_currentLevel: number
|
|
13
|
+
_levels: QualityLevel[];
|
|
14
|
+
_currentLevel: number;
|
|
15
15
|
_durationExcludesAfterLiveSyncPoint: boolean;
|
|
16
16
|
_isReadyState: boolean;
|
|
17
17
|
_playableRegionDuration: number;
|
|
@@ -19,7 +19,7 @@ export default class DashPlayback extends BasePlayback {
|
|
|
19
19
|
_playbackType: PlaybackType;
|
|
20
20
|
_playlistType: PlaylistType | null;
|
|
21
21
|
_programDateTime: TimeValue;
|
|
22
|
-
_dash:
|
|
22
|
+
_dash: MediaPlayerClass | null;
|
|
23
23
|
_extrapolatedWindowDuration: number;
|
|
24
24
|
_lastDuration: TimeValue | null;
|
|
25
25
|
_lastTimeUpdate: TimePosition;
|
|
@@ -28,6 +28,10 @@ export default class DashPlayback extends BasePlayback {
|
|
|
28
28
|
startChangeQuality: boolean;
|
|
29
29
|
manifestInfo: IManifestInfo | null;
|
|
30
30
|
_timeUpdateTimer: ReturnType<typeof setInterval> | null;
|
|
31
|
+
oncueenter: ((e: VTTCueInfo) => void) | null;
|
|
32
|
+
oncueexit: ((e: {
|
|
33
|
+
id: string;
|
|
34
|
+
}) => void) | null;
|
|
31
35
|
get name(): string;
|
|
32
36
|
get levels(): QualityLevel[];
|
|
33
37
|
get currentLevel(): number;
|
|
@@ -66,7 +70,7 @@ export default class DashPlayback extends BasePlayback {
|
|
|
66
70
|
private destroyInstance;
|
|
67
71
|
destroy(): void;
|
|
68
72
|
_updatePlaybackType(): void;
|
|
69
|
-
_fillLevels
|
|
73
|
+
private _fillLevels;
|
|
70
74
|
private onLevelSwitch;
|
|
71
75
|
private onLevelSwitchEnd;
|
|
72
76
|
getPlaybackType(): string;
|
|
@@ -82,6 +86,21 @@ export default class DashPlayback extends BasePlayback {
|
|
|
82
86
|
* @override
|
|
83
87
|
*/
|
|
84
88
|
_handleTextTrackChange(): void;
|
|
89
|
+
setTextTrack(id: number): void;
|
|
90
|
+
/**
|
|
91
|
+
* @override
|
|
92
|
+
*/
|
|
93
|
+
get closedCaptionsTracks(): {
|
|
94
|
+
id: number;
|
|
95
|
+
name: string;
|
|
96
|
+
track: {
|
|
97
|
+
id: number;
|
|
98
|
+
label: string;
|
|
99
|
+
language: string | null;
|
|
100
|
+
mode: string;
|
|
101
|
+
};
|
|
102
|
+
}[];
|
|
103
|
+
private getTextTracks;
|
|
85
104
|
}
|
|
86
105
|
export {};
|
|
87
106
|
//# sourceMappingURL=DashPlayback.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DashPlayback.d.ts","sourceRoot":"","sources":["../../../src/playback/dash-playback/DashPlayback.ts"],"names":[],"mappings":"AAKA,OAAO,EAAe,QAAQ,EAAyB,MAAM,cAAc,CAAA;AAG3E,OAAO,
|
|
1
|
+
{"version":3,"file":"DashPlayback.d.ts","sourceRoot":"","sources":["../../../src/playback/dash-playback/DashPlayback.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
import { Events, Log, Playback, PlayerError, Utils, $ } from '@clappr/core';
|
|
6
6
|
import { trace } from '@gcorevideo/utils';
|
|
7
7
|
import assert from 'assert';
|
|
8
|
-
import
|
|
8
|
+
import { MediaPlayer, } from 'dashjs';
|
|
9
9
|
import { PlaybackErrorCode, } from '../../playback.types.js';
|
|
10
10
|
import { isDashSource } from '../../utils/mediaSources.js';
|
|
11
11
|
import { BasePlayback } from '../BasePlayback.js';
|
|
@@ -14,8 +14,8 @@ const AUTO = -1;
|
|
|
14
14
|
const { now } = Utils;
|
|
15
15
|
const T = 'playback.dash';
|
|
16
16
|
export default class DashPlayback extends BasePlayback {
|
|
17
|
-
_levels =
|
|
18
|
-
_currentLevel =
|
|
17
|
+
_levels = [];
|
|
18
|
+
_currentLevel = AUTO;
|
|
19
19
|
// true when the actual duration is longer than hlsjs's live sync point
|
|
20
20
|
// when this is false playableRegionDuration will be the actual duration
|
|
21
21
|
// when this is true playableRegionDuration will exclude the time after the sync point
|
|
@@ -49,17 +49,15 @@ export default class DashPlayback extends BasePlayback {
|
|
|
49
49
|
startChangeQuality = false;
|
|
50
50
|
manifestInfo = null;
|
|
51
51
|
_timeUpdateTimer = null;
|
|
52
|
+
oncueenter = null;
|
|
53
|
+
oncueexit = null;
|
|
52
54
|
get name() {
|
|
53
55
|
return 'dash';
|
|
54
56
|
}
|
|
55
57
|
get levels() {
|
|
56
|
-
return this._levels
|
|
58
|
+
return this._levels;
|
|
57
59
|
}
|
|
58
60
|
get currentLevel() {
|
|
59
|
-
if (this._currentLevel === null) {
|
|
60
|
-
return AUTO;
|
|
61
|
-
}
|
|
62
|
-
// 0 is a valid level ID
|
|
63
61
|
return this._currentLevel;
|
|
64
62
|
}
|
|
65
63
|
get isReady() {
|
|
@@ -81,7 +79,7 @@ export default class DashPlayback extends BasePlayback {
|
|
|
81
79
|
});
|
|
82
80
|
dash.updateSettings(settings);
|
|
83
81
|
if (id !== -1) {
|
|
84
|
-
this._dash.
|
|
82
|
+
this._dash.setRepresentationForTypeByIndex('video', id);
|
|
85
83
|
}
|
|
86
84
|
if (this._playbackType === Playback.VOD) {
|
|
87
85
|
const curr_time = this._dash.time();
|
|
@@ -95,6 +93,7 @@ export default class DashPlayback extends BasePlayback {
|
|
|
95
93
|
}
|
|
96
94
|
}
|
|
97
95
|
get _startTime() {
|
|
96
|
+
// TODO review
|
|
98
97
|
if (this._playbackType === Playback.LIVE &&
|
|
99
98
|
this._playlistType !== 'EVENT') {
|
|
100
99
|
return this._extrapolatedStartTime;
|
|
@@ -141,7 +140,7 @@ export default class DashPlayback extends BasePlayback {
|
|
|
141
140
|
}
|
|
142
141
|
}
|
|
143
142
|
_setup() {
|
|
144
|
-
const dash =
|
|
143
|
+
const dash = MediaPlayer().create();
|
|
145
144
|
this._dash = dash;
|
|
146
145
|
this._dash.initialize();
|
|
147
146
|
if (this.options.dash) {
|
|
@@ -149,6 +148,7 @@ export default class DashPlayback extends BasePlayback {
|
|
|
149
148
|
streaming: {
|
|
150
149
|
text: {
|
|
151
150
|
defaultEnabled: false,
|
|
151
|
+
dispatchForManualRendering: true,
|
|
152
152
|
},
|
|
153
153
|
},
|
|
154
154
|
}, this.options.dash);
|
|
@@ -157,27 +157,27 @@ export default class DashPlayback extends BasePlayback {
|
|
|
157
157
|
this._dash.attachView(this.el);
|
|
158
158
|
this._dash.setAutoPlay(false);
|
|
159
159
|
this._dash.attachSource(this.options.src);
|
|
160
|
-
this._dash.on(
|
|
161
|
-
this._dash.on(
|
|
162
|
-
this._dash.on(
|
|
163
|
-
const bitrates = dash.
|
|
160
|
+
this._dash.on(MediaPlayer.events.ERROR, this._onDASHJSSError);
|
|
161
|
+
this._dash.on(MediaPlayer.events.PLAYBACK_ERROR, this._onPlaybackError);
|
|
162
|
+
this._dash.on(MediaPlayer.events.STREAM_INITIALIZED, () => {
|
|
163
|
+
const bitrates = dash.getRepresentationsByType('video');
|
|
164
164
|
this._updatePlaybackType();
|
|
165
165
|
this._fillLevels(bitrates);
|
|
166
|
-
const currentLevel = dash.
|
|
167
|
-
if (currentLevel
|
|
168
|
-
this.trigger(Events.PLAYBACK_BITRATE, this.getLevel(currentLevel));
|
|
166
|
+
const currentLevel = dash.getCurrentRepresentationForType('video');
|
|
167
|
+
if (currentLevel) {
|
|
168
|
+
this.trigger(Events.PLAYBACK_BITRATE, this.getLevel(currentLevel.index));
|
|
169
169
|
}
|
|
170
|
-
dash.on(
|
|
171
|
-
const newLevel = this.getLevel(evt.
|
|
170
|
+
dash.on(MediaPlayer.events.QUALITY_CHANGE_REQUESTED, (evt) => {
|
|
171
|
+
const newLevel = this.getLevel(evt.newRepresentation.index);
|
|
172
172
|
this.onLevelSwitch(newLevel);
|
|
173
173
|
});
|
|
174
174
|
this.checkAudioTracks();
|
|
175
175
|
});
|
|
176
|
-
this._dash.on(
|
|
177
|
-
const currentLevel = this.getLevel(evt.
|
|
176
|
+
this._dash.on(MediaPlayer.events.QUALITY_CHANGE_RENDERED, (evt) => {
|
|
177
|
+
const currentLevel = this.getLevel(evt.newRepresentation.index);
|
|
178
178
|
this.onLevelSwitchEnd(currentLevel);
|
|
179
179
|
});
|
|
180
|
-
this._dash.on(
|
|
180
|
+
this._dash.on(MediaPlayer.events.METRIC_ADDED, (e) => {
|
|
181
181
|
// Listen for the first manifest request in order to update player UI
|
|
182
182
|
if (e.metric === 'DVRInfo') {
|
|
183
183
|
// TODO fix typings
|
|
@@ -189,14 +189,27 @@ export default class DashPlayback extends BasePlayback {
|
|
|
189
189
|
}
|
|
190
190
|
}
|
|
191
191
|
});
|
|
192
|
-
this._dash.on(
|
|
192
|
+
this._dash.on(MediaPlayer.events.PLAYBACK_RATE_CHANGED, (e) => {
|
|
193
193
|
this.trigger(PlaybackEvents.PLAYBACK_RATE_CHANGED, e.playbackRate);
|
|
194
194
|
});
|
|
195
|
-
this._dash.on(
|
|
195
|
+
this._dash.on(MediaPlayer.events.TRACK_CHANGE_RENDERED, (e) => {
|
|
196
196
|
if (e.mediaType === 'audio') {
|
|
197
197
|
this.trigger(Events.PLAYBACK_AUDIO_CHANGED, toClapprTrack(e.newMediaInfo));
|
|
198
198
|
}
|
|
199
199
|
});
|
|
200
|
+
this._dash.on(MediaPlayer.events.CUE_ENTER, (e) => {
|
|
201
|
+
this.oncueenter?.({
|
|
202
|
+
end: e.end,
|
|
203
|
+
id: e.id,
|
|
204
|
+
start: e.start,
|
|
205
|
+
text: e.text,
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
this._dash.on(MediaPlayer.events.CUE_EXIT, (e) => {
|
|
209
|
+
this.oncueexit?.({
|
|
210
|
+
id: e.id,
|
|
211
|
+
});
|
|
212
|
+
});
|
|
200
213
|
}
|
|
201
214
|
render() {
|
|
202
215
|
this._ready();
|
|
@@ -285,8 +298,7 @@ export default class DashPlayback extends BasePlayback {
|
|
|
285
298
|
this.trigger(Events.PLAYBACK_SETTINGSUPDATE);
|
|
286
299
|
}
|
|
287
300
|
_onPlaybackError = (event) => {
|
|
288
|
-
|
|
289
|
-
trace(`${T} _onPlaybackError`, { event });
|
|
301
|
+
trace(`${T} _onPlaybackError`, { type: event.type, code: event.error.code, message: event.error.message });
|
|
290
302
|
};
|
|
291
303
|
_onDASHJSSError = (event) => {
|
|
292
304
|
this._stopTimeUpdateTimer();
|
|
@@ -294,17 +306,17 @@ export default class DashPlayback extends BasePlayback {
|
|
|
294
306
|
const e = event.error;
|
|
295
307
|
switch (e.code) {
|
|
296
308
|
// TODO test handling of these errors
|
|
297
|
-
case
|
|
298
|
-
case
|
|
299
|
-
case
|
|
300
|
-
case
|
|
301
|
-
case
|
|
309
|
+
case MediaPlayer.errors.MANIFEST_LOADER_PARSING_FAILURE_ERROR_CODE:
|
|
310
|
+
case MediaPlayer.errors.MANIFEST_LOADER_LOADING_FAILURE_ERROR_CODE:
|
|
311
|
+
case MediaPlayer.errors.DOWNLOAD_ERROR_ID_MANIFEST_CODE:
|
|
312
|
+
case MediaPlayer.errors.DOWNLOAD_ERROR_ID_CONTENT_CODE:
|
|
313
|
+
case MediaPlayer.errors.DOWNLOAD_ERROR_ID_INITIALIZATION_CODE:
|
|
302
314
|
// TODO these probably indicate a broken manifest and should be treated by removing the source
|
|
303
|
-
case
|
|
304
|
-
case
|
|
305
|
-
case
|
|
306
|
-
case
|
|
307
|
-
case
|
|
315
|
+
case MediaPlayer.errors.MANIFEST_ERROR_ID_NOSTREAMS_CODE:
|
|
316
|
+
case MediaPlayer.errors.MANIFEST_ERROR_ID_PARSE_CODE:
|
|
317
|
+
case MediaPlayer.errors.MANIFEST_ERROR_ID_MULTIPLEXED_CODE:
|
|
318
|
+
case MediaPlayer.errors.MEDIASOURCE_TYPE_UNSUPPORTED_CODE:
|
|
319
|
+
case MediaPlayer.errors.SEGMENT_BASE_LOADER_ERROR_CODE:
|
|
308
320
|
this.triggerError({
|
|
309
321
|
code: PlaybackErrorCode.MediaSourceUnavailable,
|
|
310
322
|
message: e.message,
|
|
@@ -363,7 +375,7 @@ export default class DashPlayback extends BasePlayback {
|
|
|
363
375
|
if (!this._dash) {
|
|
364
376
|
return false;
|
|
365
377
|
}
|
|
366
|
-
return (this._dash?.
|
|
378
|
+
return (this._dash?.getDvrWindow()?.size >= this._minDvrSize &&
|
|
367
379
|
this.getPlaybackType() === Playback.LIVE);
|
|
368
380
|
}
|
|
369
381
|
_onProgress() {
|
|
@@ -402,10 +414,17 @@ export default class DashPlayback extends BasePlayback {
|
|
|
402
414
|
}
|
|
403
415
|
destroyInstance() {
|
|
404
416
|
if (this._dash) {
|
|
405
|
-
this._dash.off(
|
|
406
|
-
this._dash.off(
|
|
407
|
-
this._dash.off(
|
|
417
|
+
this._dash.off(MediaPlayer.events.ERROR, this._onDASHJSSError);
|
|
418
|
+
this._dash.off(MediaPlayer.events.PLAYBACK_ERROR, this._onPlaybackError);
|
|
419
|
+
this._dash.off(MediaPlayer.events.MANIFEST_LOADED, this.getDuration);
|
|
420
|
+
const tracks = this._dash.getTracksFor('text');
|
|
421
|
+
tracks.forEach(track => {
|
|
422
|
+
if (track.id) {
|
|
423
|
+
this._dash.removeExternalSubtitleById(track.id);
|
|
424
|
+
}
|
|
425
|
+
});
|
|
408
426
|
this._dash.reset();
|
|
427
|
+
this._dash.destroy();
|
|
409
428
|
this._dash = null;
|
|
410
429
|
}
|
|
411
430
|
}
|
|
@@ -423,11 +442,10 @@ export default class DashPlayback extends BasePlayback {
|
|
|
423
442
|
}
|
|
424
443
|
}
|
|
425
444
|
_fillLevels(levels) {
|
|
426
|
-
// TOOD check that levels[i].qualityIndex === i
|
|
427
445
|
this._levels = levels.map((level) => {
|
|
428
446
|
return {
|
|
429
|
-
level: level.
|
|
430
|
-
bitrate: level.
|
|
447
|
+
level: level.index,
|
|
448
|
+
bitrate: level.bitrateInKbit * 1000,
|
|
431
449
|
width: level.width,
|
|
432
450
|
height: level.height,
|
|
433
451
|
};
|
|
@@ -451,9 +469,9 @@ export default class DashPlayback extends BasePlayback {
|
|
|
451
469
|
return this._playbackType === Playback.VOD || this.dvrEnabled;
|
|
452
470
|
}
|
|
453
471
|
getLevel(quality) {
|
|
454
|
-
const
|
|
455
|
-
assert.ok(
|
|
456
|
-
return
|
|
472
|
+
const level = this.levels.find((level) => level.level === quality);
|
|
473
|
+
assert.ok(level, 'Invalid quality level');
|
|
474
|
+
return level;
|
|
457
475
|
}
|
|
458
476
|
setPlaybackRate(rate) {
|
|
459
477
|
this._dash?.setPlaybackRate(rate);
|
|
@@ -500,6 +518,31 @@ export default class DashPlayback extends BasePlayback {
|
|
|
500
518
|
super._handleTextTrackChange();
|
|
501
519
|
this._dash?.setTextTrack(this.closedCaptionsTrackId);
|
|
502
520
|
}
|
|
521
|
+
setTextTrack(id) {
|
|
522
|
+
this._dash?.setTextTrack(id);
|
|
523
|
+
}
|
|
524
|
+
/**
|
|
525
|
+
* @override
|
|
526
|
+
*/
|
|
527
|
+
get closedCaptionsTracks() {
|
|
528
|
+
const tt = this.getTextTracks();
|
|
529
|
+
return tt;
|
|
530
|
+
}
|
|
531
|
+
getTextTracks() {
|
|
532
|
+
return this._dash?.getTracksFor('text').map((t, index) => ({
|
|
533
|
+
id: index,
|
|
534
|
+
name: getTextTrackLabel(t) || "",
|
|
535
|
+
track: {
|
|
536
|
+
id: index,
|
|
537
|
+
label: getTextTrackLabel(t) || "",
|
|
538
|
+
language: t.lang,
|
|
539
|
+
mode: "hidden",
|
|
540
|
+
},
|
|
541
|
+
})) || [];
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
function getTextTrackLabel(t) {
|
|
545
|
+
return t.labels.find((l) => !l.lang || l.lang === t.lang)?.text;
|
|
503
546
|
}
|
|
504
547
|
DashPlayback.canPlay = function (resource, mimeType) {
|
|
505
548
|
if (!isDashSource(resource, mimeType)) {
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import HLSJS, { Events as HlsEvents, type
|
|
2
|
-
import { QualityLevel } from '../../playback.types.js';
|
|
1
|
+
import HLSJS, { Events as HlsEvents, type LevelSwitchingData } from 'hls.js';
|
|
2
|
+
import { QualityLevel, VTTCueInfo } from '../../playback.types.js';
|
|
3
3
|
import { PlaybackType } from '../../types.js';
|
|
4
4
|
import { BasePlayback } from '../BasePlayback.js';
|
|
5
5
|
import { AudioTrack } from '@clappr/core/types/base/playback/playback.js';
|
|
6
6
|
export default class HlsPlayback extends BasePlayback {
|
|
7
|
-
private _ccIsSetup;
|
|
8
7
|
private _ccTracksUpdated;
|
|
9
8
|
private _currentFragment;
|
|
10
9
|
private _currentLevel;
|
|
@@ -28,6 +27,12 @@ export default class HlsPlayback extends BasePlayback {
|
|
|
28
27
|
private _recoveredDecodingError;
|
|
29
28
|
private _segmentTargetDuration;
|
|
30
29
|
private _timeUpdateTimer;
|
|
30
|
+
oncueenter: ((e: VTTCueInfo) => void) | null;
|
|
31
|
+
oncueexit: ((e: {
|
|
32
|
+
id: string;
|
|
33
|
+
}) => void) | null;
|
|
34
|
+
private cues;
|
|
35
|
+
private currentCueId;
|
|
31
36
|
/**
|
|
32
37
|
* @internal
|
|
33
38
|
*/
|
|
@@ -66,7 +71,6 @@ export default class HlsPlayback extends BasePlayback {
|
|
|
66
71
|
private _listenHLSEvents;
|
|
67
72
|
private bindCustomListeners;
|
|
68
73
|
private unbindCustomListeners;
|
|
69
|
-
private _onFragmentParsingMetadata;
|
|
70
74
|
protected render(): this;
|
|
71
75
|
protected _ready(): void;
|
|
72
76
|
private _recover;
|
|
@@ -83,10 +87,12 @@ export default class HlsPlayback extends BasePlayback {
|
|
|
83
87
|
private _updateDvr;
|
|
84
88
|
private _updateSettings;
|
|
85
89
|
private _onHLSJSError;
|
|
90
|
+
private reload;
|
|
86
91
|
private _keyIsDenied;
|
|
87
92
|
_onTimeUpdate(): void;
|
|
88
93
|
_onDurationChange(): void;
|
|
89
94
|
_onProgress(): void;
|
|
95
|
+
private triggerCues;
|
|
90
96
|
load(url: string): void;
|
|
91
97
|
play(): void;
|
|
92
98
|
pause(): void;
|
|
@@ -95,8 +101,6 @@ export default class HlsPlayback extends BasePlayback {
|
|
|
95
101
|
private _updatePlaybackType;
|
|
96
102
|
private _fillLevels;
|
|
97
103
|
private _onLevelUpdated;
|
|
98
|
-
_onFragmentChanged(evt: HlsEvents.FRAG_CHANGED, data: FragChangedData): void;
|
|
99
|
-
_onFragmentLoaded(evt: HlsEvents.FRAG_LOADED, data: FragLoadedData): void;
|
|
100
104
|
_onLevelSwitch(evt: HlsEvents.LEVEL_SWITCHING, data: LevelSwitchingData): void;
|
|
101
105
|
_onLevelSwitched(evt: HlsEvents.LEVEL_SWITCHED, data: {
|
|
102
106
|
level: number;
|
|
@@ -110,5 +114,27 @@ export default class HlsPlayback extends BasePlayback {
|
|
|
110
114
|
switchAudioTrack(id: string): void;
|
|
111
115
|
private _onAudioTracksUpdated;
|
|
112
116
|
private _onAudioTrackSwitched;
|
|
117
|
+
setTextTrack(id: number): void;
|
|
118
|
+
/**
|
|
119
|
+
* @override
|
|
120
|
+
*/
|
|
121
|
+
get closedCaptionsTracks(): {
|
|
122
|
+
id: number;
|
|
123
|
+
name: string;
|
|
124
|
+
track: {
|
|
125
|
+
id: number;
|
|
126
|
+
label: string;
|
|
127
|
+
language: string | undefined;
|
|
128
|
+
};
|
|
129
|
+
}[];
|
|
130
|
+
getTextTracks(): {
|
|
131
|
+
id: number;
|
|
132
|
+
name: string;
|
|
133
|
+
track: {
|
|
134
|
+
id: number;
|
|
135
|
+
label: string;
|
|
136
|
+
language: string | undefined;
|
|
137
|
+
};
|
|
138
|
+
}[];
|
|
113
139
|
}
|
|
114
140
|
//# sourceMappingURL=HlsPlayback.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HlsPlayback.d.ts","sourceRoot":"","sources":["../../../src/playback/hls-playback/HlsPlayback.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,EACZ,MAAM,IAAI,SAAS,
|
|
1
|
+
{"version":3,"file":"HlsPlayback.d.ts","sourceRoot":"","sources":["../../../src/playback/hls-playback/HlsPlayback.ts"],"names":[],"mappings":"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"}
|