bigscreen-player 8.2.1 → 8.2.3
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/esm/{imscsubtitles-5bdbcdb9.js → imscsubtitles-1ea8981b.js} +1 -1
- package/dist/esm/{legacysubtitles-9a2eaf33.js → legacysubtitles-01c656c7.js} +1 -1
- package/dist/esm/{main-b47cafcf.js → main-73f2cc27.js} +31 -20
- package/dist/esm/main.d.ts +9 -4
- package/dist/esm/main.js +1 -1
- package/dist/esm/{msestrategy-ee4a8101.js → msestrategy-1d2f62f6.js} +12 -11
- package/package.json +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { fromXML, generateISD, renderHTML } from 'smp-imsc';
|
|
2
|
-
import { f as findSegmentTemplate, L as LoadUrl, a as DebugToolInstance, P as Plugins, U as Utils, D as DOMHelpers } from './main-
|
|
2
|
+
import { f as findSegmentTemplate, L as LoadUrl, a as DebugToolInstance, P as Plugins, U as Utils, D as DOMHelpers } from './main-73f2cc27.js';
|
|
3
3
|
|
|
4
4
|
const SEGMENTS_BUFFER_SIZE = 3;
|
|
5
5
|
const LOAD_ERROR_COUNT_MAX = 3;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { D as DOMHelpers, a as DebugToolInstance, P as Plugins, L as LoadUrl, T as TransportControlPosition } from './main-
|
|
1
|
+
import { D as DOMHelpers, a as DebugToolInstance, P as Plugins, L as LoadUrl, T as TransportControlPosition } from './main-73f2cc27.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Safely checks if an attribute exists on an element.
|
|
@@ -722,8 +722,6 @@ class DebugViewController {
|
|
|
722
722
|
case EntryCategory.TRACE:
|
|
723
723
|
formattedData = this.serialiseTrace(entry);
|
|
724
724
|
break;
|
|
725
|
-
default:
|
|
726
|
-
throw new TypeError(`Unrecognised Entry Category: ${category}`);
|
|
727
725
|
}
|
|
728
726
|
const sessionTime = new Date(entry.sessionTime);
|
|
729
727
|
const formatedSessionTime = `${formatDate(sessionTime)}.${zeroPadMs(sessionTime.getUTCMilliseconds())}`;
|
|
@@ -738,8 +736,6 @@ class DebugViewController {
|
|
|
738
736
|
return `Info: ${data}`;
|
|
739
737
|
case "warning":
|
|
740
738
|
return `Warning: ${data}`;
|
|
741
|
-
default:
|
|
742
|
-
throw new TypeError(`Unrecognised message level '${kind}'`);
|
|
743
739
|
}
|
|
744
740
|
}
|
|
745
741
|
serialiseTime(time) {
|
|
@@ -750,6 +746,11 @@ class DebugViewController {
|
|
|
750
746
|
var _a;
|
|
751
747
|
const { currentElementTime, kind, data } = trace;
|
|
752
748
|
switch (kind) {
|
|
749
|
+
case "apicall": {
|
|
750
|
+
const { functionName, functionArgs } = data;
|
|
751
|
+
const argsPart = functionArgs.length === 0 ? "" : ` with args [${functionArgs.join(", ")}]`;
|
|
752
|
+
return `Called '${functionName}${argsPart}'`;
|
|
753
|
+
}
|
|
753
754
|
case "buffered-ranges": {
|
|
754
755
|
const buffered = data.buffered.map(([start, end]) => `${start.toFixed(2)} - ${end.toFixed(2)}`).join(", ");
|
|
755
756
|
return `Buffered ${data.kind}: [${buffered}] at current time ${currentElementTime.toFixed(2)}`;
|
|
@@ -760,14 +761,20 @@ class DebugViewController {
|
|
|
760
761
|
const { eventType, eventTarget } = data;
|
|
761
762
|
return `Event: '${eventType}' from ${eventTarget}`;
|
|
762
763
|
}
|
|
764
|
+
case "gap": {
|
|
765
|
+
const { from, to } = data;
|
|
766
|
+
return `Gap from ${from} to ${to}`;
|
|
767
|
+
}
|
|
763
768
|
case "session-start":
|
|
764
769
|
return `Playback session started at ${new Date(data).toISOString().replace("T", " ")}`;
|
|
765
770
|
case "session-end":
|
|
766
771
|
return `Playback session ended at ${new Date(data).toISOString().replace("T", " ")}`;
|
|
772
|
+
case "quota-exceeded": {
|
|
773
|
+
const { bufferLevel, time } = data;
|
|
774
|
+
return `Quota exceeded with buffer level ${bufferLevel} at chunk start time ${time}`;
|
|
775
|
+
}
|
|
767
776
|
case "state-change":
|
|
768
777
|
return `Event: ${invertedMediaState[data]}`;
|
|
769
|
-
default:
|
|
770
|
-
throw new TypeError(`Unrecognised trace kind: ${kind}`);
|
|
771
778
|
}
|
|
772
779
|
}
|
|
773
780
|
serialiseStaticEntry(entry) {
|
|
@@ -808,7 +815,7 @@ class DebugViewController {
|
|
|
808
815
|
const [qualityIndex, bitrate] = data;
|
|
809
816
|
return `${qualityIndex} (${bitrate} kbps)`;
|
|
810
817
|
}
|
|
811
|
-
return data.join("
|
|
818
|
+
return data.join(", ");
|
|
812
819
|
}
|
|
813
820
|
render() {
|
|
814
821
|
DebugView.render({
|
|
@@ -903,8 +910,7 @@ function DebugTool() {
|
|
|
903
910
|
chronicle.setCurrentElementTime(seconds);
|
|
904
911
|
}
|
|
905
912
|
function apicall(functionName, functionArgs = []) {
|
|
906
|
-
|
|
907
|
-
debug(`Called '${functionName}${argsPart}'`);
|
|
913
|
+
chronicle.trace("apicall", { functionName, functionArgs });
|
|
908
914
|
}
|
|
909
915
|
function buffered(kind, buffered) {
|
|
910
916
|
chronicle.trace("buffered-ranges", { kind, buffered });
|
|
@@ -1118,6 +1124,8 @@ function LegacyPlayerAdapter(mediaSources, windowType, playbackElement, isUHD, p
|
|
|
1118
1124
|
}
|
|
1119
1125
|
|
|
1120
1126
|
function onTimeUpdate(event) {
|
|
1127
|
+
DebugToolInstance.updateElementTime(event.currentTime);
|
|
1128
|
+
|
|
1121
1129
|
isPaused = false;
|
|
1122
1130
|
|
|
1123
1131
|
// Note: Multiple consecutive CDN failover logic
|
|
@@ -1130,6 +1138,7 @@ function LegacyPlayerAdapter(mediaSources, windowType, playbackElement, isUHD, p
|
|
|
1130
1138
|
// Must publish this time update before checkSeekSucceded - which could cause a pause event
|
|
1131
1139
|
// This is a device specific event ordering issue.
|
|
1132
1140
|
publishTimeUpdate();
|
|
1141
|
+
|
|
1133
1142
|
if ((handleErrorOnExitingSeek || delayPauseOnExitSeek) && exitingSeek) {
|
|
1134
1143
|
checkSeekSucceeded(event.seekableRange.start, event.currentTime);
|
|
1135
1144
|
}
|
|
@@ -5679,14 +5688,16 @@ function BasicStrategy(mediaSources, windowType, mediaKind, playbackElement) {
|
|
|
5679
5688
|
}
|
|
5680
5689
|
|
|
5681
5690
|
function load(_mimeType, startTime) {
|
|
5682
|
-
if (
|
|
5691
|
+
if (mediaElement == null) {
|
|
5683
5692
|
setUpMediaElement(startTime);
|
|
5684
5693
|
setUpMediaListeners();
|
|
5685
|
-
|
|
5686
|
-
|
|
5687
|
-
setStartTime(startTime);
|
|
5688
|
-
mediaElement.load();
|
|
5694
|
+
|
|
5695
|
+
return
|
|
5689
5696
|
}
|
|
5697
|
+
|
|
5698
|
+
mediaElement.src = mediaSources.currentSource();
|
|
5699
|
+
setStartTime(startTime);
|
|
5700
|
+
mediaElement.load();
|
|
5690
5701
|
}
|
|
5691
5702
|
|
|
5692
5703
|
function setUpMediaElement(startTime) {
|
|
@@ -5756,6 +5767,8 @@ function BasicStrategy(mediaSources, windowType, mediaKind, playbackElement) {
|
|
|
5756
5767
|
}
|
|
5757
5768
|
|
|
5758
5769
|
function onTimeUpdate() {
|
|
5770
|
+
DebugToolInstance.updateElementTime(mediaElement.currentTime);
|
|
5771
|
+
|
|
5759
5772
|
publishTimeUpdate();
|
|
5760
5773
|
}
|
|
5761
5774
|
|
|
@@ -5928,7 +5941,7 @@ BasicStrategy.getLiveSupport = () => LiveSupport.SEEKABLE;
|
|
|
5928
5941
|
function StrategyPicker() {
|
|
5929
5942
|
return new Promise((resolve, reject) => {
|
|
5930
5943
|
if (window.bigscreenPlayer.playbackStrategy === PlaybackStrategy.MSE) {
|
|
5931
|
-
return import('./msestrategy-
|
|
5944
|
+
return import('./msestrategy-1d2f62f6.js')
|
|
5932
5945
|
.then(({ default: MSEStrategy }) => resolve(MSEStrategy))
|
|
5933
5946
|
.catch(() => {
|
|
5934
5947
|
reject({ error: "strategyDynamicLoadError" });
|
|
@@ -6375,7 +6388,7 @@ function CallCallbacks(callbacks, data) {
|
|
|
6375
6388
|
}
|
|
6376
6389
|
}
|
|
6377
6390
|
|
|
6378
|
-
var Version = "8.2.
|
|
6391
|
+
var Version = "8.2.3";
|
|
6379
6392
|
|
|
6380
6393
|
var sourceList;
|
|
6381
6394
|
var source;
|
|
@@ -7726,7 +7739,7 @@ function Subtitles(mediaPlayer, autoStart, playbackElement, defaultStyleOpts, me
|
|
|
7726
7739
|
|
|
7727
7740
|
if (available()) {
|
|
7728
7741
|
if (useLegacySubs) {
|
|
7729
|
-
import('./legacysubtitles-
|
|
7742
|
+
import('./legacysubtitles-01c656c7.js')
|
|
7730
7743
|
.then(({ default: LegacySubtitles }) => {
|
|
7731
7744
|
subtitlesContainer = LegacySubtitles(mediaPlayer, autoStart, playbackElement, mediaSources, defaultStyleOpts);
|
|
7732
7745
|
callback(subtitlesEnabled);
|
|
@@ -7735,7 +7748,7 @@ function Subtitles(mediaPlayer, autoStart, playbackElement, defaultStyleOpts, me
|
|
|
7735
7748
|
Plugins.interface.onSubtitlesDynamicLoadError();
|
|
7736
7749
|
});
|
|
7737
7750
|
} else {
|
|
7738
|
-
import('./imscsubtitles-
|
|
7751
|
+
import('./imscsubtitles-1ea8981b.js')
|
|
7739
7752
|
.then(({ default: IMSCSubtitles }) => {
|
|
7740
7753
|
subtitlesContainer = IMSCSubtitles(mediaPlayer, autoStart, playbackElement, mediaSources, defaultStyleOpts);
|
|
7741
7754
|
callback(subtitlesEnabled);
|
|
@@ -7857,8 +7870,6 @@ function BigscreenPlayer() {
|
|
|
7857
7870
|
|
|
7858
7871
|
function mediaStateUpdateCallback(evt) {
|
|
7859
7872
|
if (evt.timeUpdate) {
|
|
7860
|
-
DebugToolInstance.updateElementTime(evt.data.currentTime);
|
|
7861
|
-
|
|
7862
7873
|
CallCallbacks(timeUpdateCallbacks, {
|
|
7863
7874
|
currentTime: evt.data.currentTime,
|
|
7864
7875
|
endOfStream,
|
package/dist/esm/main.d.ts
CHANGED
|
@@ -481,6 +481,7 @@ type FramesDropped = CreateMetric<"frames-dropped", number>;
|
|
|
481
481
|
type InitialPlaybackTime = CreateMetric<"initial-playback-time", number>;
|
|
482
482
|
type MediaElementEnded = CreateMetric<"ended", HTMLMediaElement["ended"]>;
|
|
483
483
|
type MediaElementPaused = CreateMetric<"paused", HTMLMediaElement["paused"]>;
|
|
484
|
+
type MediaElementPlaybackRate = CreateMetric<"playback-rate", HTMLMediaElement["playbackRate"]>;
|
|
484
485
|
type MediaElementReadyState = CreateMetric<"ready-state", HTMLMediaElement["readyState"]>;
|
|
485
486
|
type MediaElementSeeking = CreateMetric<"seeking", HTMLMediaElement["seeking"]>;
|
|
486
487
|
type PlaybackStrategy = CreateMetric<"strategy", string>;
|
|
@@ -490,7 +491,7 @@ type SeekableRange = CreateMetric<"seekable-range", [start: number, end: number]
|
|
|
490
491
|
type SubtitleCDNsAvailable = CreateMetric<"subtitle-cdns-available", string[]>;
|
|
491
492
|
type SubtitleCurrentUrl = CreateMetric<"subtitle-current-url", string>;
|
|
492
493
|
type Version = CreateMetric<"version", string>;
|
|
493
|
-
type Metric = AutoResume | BitRate | BufferLength | CDNsAvailable | CurrentUrl | Duration | FramesDropped | InitialPlaybackTime | MediaElementEnded | MediaElementPaused | MediaElementReadyState | MediaElementSeeking | PlaybackStrategy | RepresentationAudio | RepresentationVideo | SeekableRange | SubtitleCDNsAvailable | SubtitleCurrentUrl | Version;
|
|
494
|
+
type Metric = AutoResume | BitRate | BufferLength | CDNsAvailable | CurrentUrl | Duration | FramesDropped | InitialPlaybackTime | MediaElementEnded | MediaElementPaused | MediaElementPlaybackRate | MediaElementReadyState | MediaElementSeeking | PlaybackStrategy | RepresentationAudio | RepresentationVideo | SeekableRange | SubtitleCDNsAvailable | SubtitleCurrentUrl | Version;
|
|
494
495
|
type MetricKind = Metric["kind"];
|
|
495
496
|
type MetricForKind<Kind extends MetricKind> = Extract<Metric, {
|
|
496
497
|
kind: Kind;
|
|
@@ -501,6 +502,10 @@ type CreateTrace<Kind extends string, Data extends Primitives | Record<string, P
|
|
|
501
502
|
kind: Kind;
|
|
502
503
|
data: Data;
|
|
503
504
|
};
|
|
505
|
+
type ApiCall = CreateTrace<"apicall", {
|
|
506
|
+
functionName: string;
|
|
507
|
+
functionArgs: any[];
|
|
508
|
+
}>;
|
|
504
509
|
type BufferedRanges = CreateTrace<"buffered-ranges", {
|
|
505
510
|
kind: MediaKinds;
|
|
506
511
|
buffered: [start: number, end: number][];
|
|
@@ -524,7 +529,7 @@ type QuotaExceeded = CreateTrace<"quota-exceeded", {
|
|
|
524
529
|
type SessionStart = CreateTrace<"session-start", number>;
|
|
525
530
|
type SessionEnd = CreateTrace<"session-end", number>;
|
|
526
531
|
type StateChange = CreateTrace<"state-change", MediaState>;
|
|
527
|
-
type Trace = BufferedRanges | Error | Event | Gap | QuotaExceeded | SessionStart | SessionEnd | StateChange;
|
|
532
|
+
type Trace = ApiCall | BufferedRanges | Error | Event | Gap | QuotaExceeded | SessionStart | SessionEnd | StateChange;
|
|
528
533
|
type TraceKind = Trace["kind"];
|
|
529
534
|
type TraceForKind<Kind extends TraceKind> = Extract<Trace, {
|
|
530
535
|
kind: Kind;
|
|
@@ -576,8 +581,8 @@ declare const DebugToolInstance: {
|
|
|
576
581
|
info: (...parts: any[]) => void;
|
|
577
582
|
statechange: (value: MediaState) => void;
|
|
578
583
|
warn: (...parts: any[]) => void;
|
|
579
|
-
dynamicMetric: <Kind extends "auto-resume" | "bitrate" | "buffer-length" | "cdns-available" | "current-url" | "duration" | "frames-dropped" | "initial-playback-time" | "ended" | "paused" | "ready-state" | "seeking" | "strategy" | "representation-audio" | "representation-video" | "seekable-range" | "subtitle-cdns-available" | "subtitle-current-url" | "version">(kind: Kind, data: MetricForKind<Kind>["data"]) => void;
|
|
580
|
-
staticMetric: <Kind_1 extends "auto-resume" | "bitrate" | "buffer-length" | "cdns-available" | "current-url" | "duration" | "frames-dropped" | "initial-playback-time" | "ended" | "paused" | "ready-state" | "seeking" | "strategy" | "representation-audio" | "representation-video" | "seekable-range" | "subtitle-cdns-available" | "subtitle-current-url" | "version">(kind: Kind_1, data: MetricForKind<Kind_1>["data"]) => void;
|
|
584
|
+
dynamicMetric: <Kind extends "auto-resume" | "bitrate" | "buffer-length" | "cdns-available" | "current-url" | "duration" | "frames-dropped" | "initial-playback-time" | "ended" | "paused" | "playback-rate" | "ready-state" | "seeking" | "strategy" | "representation-audio" | "representation-video" | "seekable-range" | "subtitle-cdns-available" | "subtitle-current-url" | "version">(kind: Kind, data: MetricForKind<Kind>["data"]) => void;
|
|
585
|
+
staticMetric: <Kind_1 extends "auto-resume" | "bitrate" | "buffer-length" | "cdns-available" | "current-url" | "duration" | "frames-dropped" | "initial-playback-time" | "ended" | "paused" | "playback-rate" | "ready-state" | "seeking" | "strategy" | "representation-audio" | "representation-video" | "seekable-range" | "subtitle-cdns-available" | "subtitle-current-url" | "version">(kind: Kind_1, data: MetricForKind<Kind_1>["data"]) => void;
|
|
581
586
|
hide: () => void;
|
|
582
587
|
show: () => void;
|
|
583
588
|
setRootElement: (element: HTMLElement) => void;
|
package/dist/esm/main.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { B as BigscreenPlayer, a as DebugTool, E as EntryCategory, b as LiveSupport, c as MediaKinds, M as MediaState, g as MockBigscreenPlayer, h as PauseTriggers, i as PlaybackStrategy, j as TransferFormat, T as TransportControlPosition, W as WindowTypes, k as isMessage, l as isMetric, m as isTrace } from './main-
|
|
1
|
+
export { B as BigscreenPlayer, a as DebugTool, E as EntryCategory, b as LiveSupport, c as MediaKinds, M as MediaState, g as MockBigscreenPlayer, h as PauseTriggers, i as PlaybackStrategy, j as TransferFormat, T as TransportControlPosition, W as WindowTypes, k as isMessage, l as isMetric, m as isTrace } from './main-73f2cc27.js';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { MediaPlayer } from 'dashjs/index_mediaplayerOnly';
|
|
2
|
-
import { W as WindowTypes, U as Utils, D as DOMHelpers, b as LiveSupport, a as DebugToolInstance, M as MediaState, P as Plugins, c as MediaKinds, d as TimeUtils, e as DynamicWindowUtils } from './main-
|
|
2
|
+
import { W as WindowTypes, U as Utils, D as DOMHelpers, b as LiveSupport, a as DebugToolInstance, M as MediaState, P as Plugins, c as MediaKinds, d as TimeUtils, e as DynamicWindowUtils } from './main-73f2cc27.js';
|
|
3
3
|
|
|
4
4
|
function filter(manifest, representationOptions) {
|
|
5
5
|
const constantFps = representationOptions.constantFps;
|
|
@@ -325,13 +325,6 @@ function MSEStrategy(mediaSources, windowType, mediaKind, playbackElement, isUHD
|
|
|
325
325
|
onBuffering();
|
|
326
326
|
}
|
|
327
327
|
|
|
328
|
-
function onStalled() {
|
|
329
|
-
DebugToolInstance.event("stalled", "MediaElement");
|
|
330
|
-
DebugToolInstance.dynamicMetric("ready-state", mediaElement.readyState);
|
|
331
|
-
|
|
332
|
-
getBufferedRanges().map(({ kind, buffered }) => DebugToolInstance.buffered(kind, buffered));
|
|
333
|
-
}
|
|
334
|
-
|
|
335
328
|
function onEnded() {
|
|
336
329
|
DebugToolInstance.event("ended", "MediaElement");
|
|
337
330
|
DebugToolInstance.dynamicMetric("ended", mediaElement.ended);
|
|
@@ -341,7 +334,13 @@ function MSEStrategy(mediaSources, windowType, mediaKind, playbackElement, isUHD
|
|
|
341
334
|
publishMediaState(MediaState.ENDED);
|
|
342
335
|
}
|
|
343
336
|
|
|
337
|
+
function onRateChange() {
|
|
338
|
+
DebugToolInstance.dynamicMetric("playback-rate", mediaElement.playbackRate);
|
|
339
|
+
}
|
|
340
|
+
|
|
344
341
|
function onTimeUpdate() {
|
|
342
|
+
DebugToolInstance.updateElementTime(mediaElement.currentTime);
|
|
343
|
+
|
|
345
344
|
const currentMpdTimeSeconds =
|
|
346
345
|
windowType === WindowTypes.SLIDING
|
|
347
346
|
? mediaPlayer.getDashMetrics().getCurrentDVRInfo(mediaKind)?.time
|
|
@@ -368,7 +367,8 @@ function MSEStrategy(mediaSources, windowType, mediaKind, playbackElement, isUHD
|
|
|
368
367
|
}
|
|
369
368
|
|
|
370
369
|
if (event.error && event.error.message) {
|
|
371
|
-
DebugToolInstance.
|
|
370
|
+
DebugToolInstance.error(`${event.error.message} (code: ${event.error.code})`);
|
|
371
|
+
|
|
372
372
|
lastError = event.error;
|
|
373
373
|
|
|
374
374
|
// Don't raise an error on fragment download error
|
|
@@ -648,6 +648,7 @@ function MSEStrategy(mediaSources, windowType, mediaKind, playbackElement, isUHD
|
|
|
648
648
|
function setUpMediaListeners() {
|
|
649
649
|
DebugToolInstance.dynamicMetric("ended", mediaElement.ended);
|
|
650
650
|
DebugToolInstance.dynamicMetric("paused", mediaElement.paused);
|
|
651
|
+
DebugToolInstance.dynamicMetric("playback-rate", mediaElement.playbackRate);
|
|
651
652
|
DebugToolInstance.dynamicMetric("ready-state", mediaElement.readyState);
|
|
652
653
|
DebugToolInstance.dynamicMetric("seeking", mediaElement.seeking);
|
|
653
654
|
|
|
@@ -661,7 +662,7 @@ function MSEStrategy(mediaSources, windowType, mediaKind, playbackElement, isUHD
|
|
|
661
662
|
mediaElement.addEventListener("seeking", onSeeking);
|
|
662
663
|
mediaElement.addEventListener("seeked", onSeeked);
|
|
663
664
|
mediaElement.addEventListener("ended", onEnded);
|
|
664
|
-
mediaElement.addEventListener("
|
|
665
|
+
mediaElement.addEventListener("ratechange", onRateChange);
|
|
665
666
|
mediaPlayer.on(DashJSEvents.ERROR, onError);
|
|
666
667
|
mediaPlayer.on(DashJSEvents.MANIFEST_LOADED, onManifestLoaded);
|
|
667
668
|
mediaPlayer.on(DashJSEvents.STREAM_INITIALIZED, onStreamInitialised);
|
|
@@ -793,7 +794,7 @@ function MSEStrategy(mediaSources, windowType, mediaKind, playbackElement, isUHD
|
|
|
793
794
|
mediaElement.removeEventListener("seeking", onSeeking);
|
|
794
795
|
mediaElement.removeEventListener("seeked", onSeeked);
|
|
795
796
|
mediaElement.removeEventListener("ended", onEnded);
|
|
796
|
-
mediaElement.removeEventListener("
|
|
797
|
+
mediaElement.removeEventListener("ratechange", onRateChange);
|
|
797
798
|
mediaPlayer.off(DashJSEvents.ERROR, onError);
|
|
798
799
|
mediaPlayer.off(DashJSEvents.MANIFEST_LOADED, onManifestLoaded);
|
|
799
800
|
mediaPlayer.off(DashJSEvents.MANIFEST_VALIDITY_CHANGED, onManifestValidityChange);
|