From ddf90ed7c91ea1c3b71ed485757fb230dfb252b8 Mon Sep 17 00:00:00 2001 From: "yuval.keidar" Date: Sun, 25 Apr 2021 11:28:56 +0300 Subject: [PATCH 01/13] fix(FEC-11136): config to break possible stall on the beginning in SmartTV Issue: Tizen 4 has stalls on the beginning of the media/after first seek we want to make sure the media wouldn't stop. Solution: make a small seeks until playback keeps playing. --- src/dash-adapter.js | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/dash-adapter.js b/src/dash-adapter.js index 3fb91c33..f1aced78 100644 --- a/src/dash-adapter.js +++ b/src/dash-adapter.js @@ -144,6 +144,13 @@ export default class DashAdapter extends BaseMediaSourceAdapter { */ _videoSizeUpdateTimer: ?IntervalID = null; + /** + * stall interval to break the stall on Smart TV + * @type {null|number} + * @private + */ + _stallInterval: ?IntervalID = null; + /** * 3016 is the number of the video error at shaka, we already listens to it in the html5 class * @member {number} - VIDEO_ERROR_CODE @@ -365,10 +372,42 @@ export default class DashAdapter extends BaseMediaSourceAdapter { } this._maybeSetFilters(); this._maybeSetDrmConfig(); + this._maybeBreakStalls(); this._shaka.configure(this._config.shakaConfig); this._addBindings(); } + _clearStallInterval(): void { + if (this._stallInterval) { + clearInterval(this._stallInterval); + this._stallInterval = null; + } + } + + _stallSmartTVHandler(): void { + this._clearStallInterval(); + let lastCurrentTime = this._videoElement.currentTime; + this._stallInterval = setInterval(() => { + if (lastCurrentTime === this._videoElement.currentTime) { + this._videoElement.currentTime = parseFloat(this._videoElement.currentTime.toFixed(1)) + 0.1; + } else { + this._clearStallInterval(); + } + }, 2 * 1000); + } + + /** + * register to event to break the stalls on smart TV + * @returns {void} + * @private + */ + _maybeBreakStalls(): void { + if (this._config.playback.forceBreakStall) { + this._eventManager.listenOnce(EventType.STALLED, this._stallSmartTVHandler); + this._eventManager.listenOnce(EventType.SEEKED, this._stallSmartTVHandler); + } + } + /** * get the redirected URL * @param {string} url - The url to check for redirection @@ -729,6 +768,7 @@ export default class DashAdapter extends BaseMediaSourceAdapter { this._responseFilterError = false; this._manifestParser = null; this._thumbnailController = null; + this._clearStallInterval(); this._clearVideoUpdateTimer(); if (this._eventManager) { this._eventManager.removeAll(); From 8a92e058b3740d2d1ee11108fc639df7a02a16af Mon Sep 17 00:00:00 2001 From: "yuval.keidar" Date: Sun, 25 Apr 2021 11:36:36 +0300 Subject: [PATCH 02/13] Update dash-adapter.js --- src/dash-adapter.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/dash-adapter.js b/src/dash-adapter.js index f1aced78..aeb6fee6 100644 --- a/src/dash-adapter.js +++ b/src/dash-adapter.js @@ -211,6 +211,9 @@ export default class DashAdapter extends BaseMediaSourceAdapter { if (Utils.Object.hasPropertyPath(config, 'text.useShakaTextTrackDisplay')) { adapterConfig.useShakaTextTrackDisplay = Utils.Object.getPropertyPath(config, 'text.useShakaTextTrackDisplay'); } + if (Utils.Object.hasPropertyPath(config, 'playback.forceBreakStall')) { + adapterConfig.forceBreakStall = Utils.Object.getPropertyPath(config, 'playback.forceBreakStall'); + } if (Utils.Object.hasPropertyPath(config, 'sources.options')) { const options = config.sources.options; adapterConfig.forceRedirectExternalStreams = options.forceRedirectExternalStreams; From 4be136529e6772e5eba6950fa83171b039b655d7 Mon Sep 17 00:00:00 2001 From: "yuval.keidar" Date: Sun, 25 Apr 2021 11:59:21 +0300 Subject: [PATCH 03/13] Update dash-adapter.js --- src/dash-adapter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dash-adapter.js b/src/dash-adapter.js index aeb6fee6..05ddd2b3 100644 --- a/src/dash-adapter.js +++ b/src/dash-adapter.js @@ -405,7 +405,7 @@ export default class DashAdapter extends BaseMediaSourceAdapter { * @private */ _maybeBreakStalls(): void { - if (this._config.playback.forceBreakStall) { + if (this._config.forceBreakStall) { this._eventManager.listenOnce(EventType.STALLED, this._stallSmartTVHandler); this._eventManager.listenOnce(EventType.SEEKED, this._stallSmartTVHandler); } From a0d515e5446ff378b7c674909f338190f31310d7 Mon Sep 17 00:00:00 2001 From: "yuval.keidar" Date: Sun, 25 Apr 2021 13:46:16 +0300 Subject: [PATCH 04/13] Update dash-adapter.js --- src/dash-adapter.js | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/dash-adapter.js b/src/dash-adapter.js index 05ddd2b3..09848c7c 100644 --- a/src/dash-adapter.js +++ b/src/dash-adapter.js @@ -42,6 +42,20 @@ const ShakaEvent: ShakaEventType = { */ const ABR_RESTRICTION_UPDATE_INTERVAL = 1000; +/** + * the interval for stall detection + * @type {number} + * @const + */ +const STALL_DETECTION_INTERVAL = 2000; + +/** + * the threshold needed to break the stall + * @type {number} + * @const + */ +const STALL_BREAK_THRESHOLD = 0.1; + /** * Adapter of shaka lib for dash content * @classdesc @@ -211,8 +225,8 @@ export default class DashAdapter extends BaseMediaSourceAdapter { if (Utils.Object.hasPropertyPath(config, 'text.useShakaTextTrackDisplay')) { adapterConfig.useShakaTextTrackDisplay = Utils.Object.getPropertyPath(config, 'text.useShakaTextTrackDisplay'); } - if (Utils.Object.hasPropertyPath(config, 'playback.forceBreakStall')) { - adapterConfig.forceBreakStall = Utils.Object.getPropertyPath(config, 'playback.forceBreakStall'); + if (Utils.Object.hasPropertyPath(config, 'streaming.forceBreakStall')) { + adapterConfig.forceBreakStall = Utils.Object.getPropertyPath(config, 'streaming.forceBreakStall'); } if (Utils.Object.hasPropertyPath(config, 'sources.options')) { const options = config.sources.options; @@ -392,11 +406,11 @@ export default class DashAdapter extends BaseMediaSourceAdapter { let lastCurrentTime = this._videoElement.currentTime; this._stallInterval = setInterval(() => { if (lastCurrentTime === this._videoElement.currentTime) { - this._videoElement.currentTime = parseFloat(this._videoElement.currentTime.toFixed(1)) + 0.1; + this._videoElement.currentTime = parseFloat(this._videoElement.currentTime.toFixed(1)) + STALL_BREAK_THRESHOLD; } else { this._clearStallInterval(); } - }, 2 * 1000); + }, STALL_DETECTION_INTERVAL); } /** From 1cd14a63b5fb5cc53233be67a034c061215ff302 Mon Sep 17 00:00:00 2001 From: "yuval.keidar" Date: Mon, 26 Apr 2021 11:19:25 +0300 Subject: [PATCH 05/13] keep the last current time changed --- src/dash-adapter.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/dash-adapter.js b/src/dash-adapter.js index 09848c7c..c3bfaa3f 100644 --- a/src/dash-adapter.js +++ b/src/dash-adapter.js @@ -410,6 +410,7 @@ export default class DashAdapter extends BaseMediaSourceAdapter { } else { this._clearStallInterval(); } + lastCurrentTime = this._videoElement.currentTime; }, STALL_DETECTION_INTERVAL); } From baa2ec3a4badbee2fcd7b5d28ebc9629e37f11fe Mon Sep 17 00:00:00 2001 From: "yuval.keidar" Date: Mon, 26 Apr 2021 12:10:48 +0300 Subject: [PATCH 06/13] fix for pause --- src/dash-adapter.js | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/src/dash-adapter.js b/src/dash-adapter.js index c3bfaa3f..7bd1199e 100644 --- a/src/dash-adapter.js +++ b/src/dash-adapter.js @@ -404,14 +404,23 @@ export default class DashAdapter extends BaseMediaSourceAdapter { _stallSmartTVHandler(): void { this._clearStallInterval(); let lastCurrentTime = this._videoElement.currentTime; - this._stallInterval = setInterval(() => { - if (lastCurrentTime === this._videoElement.currentTime) { - this._videoElement.currentTime = parseFloat(this._videoElement.currentTime.toFixed(1)) + STALL_BREAK_THRESHOLD; - } else { - this._clearStallInterval(); - } - lastCurrentTime = this._videoElement.currentTime; - }, STALL_DETECTION_INTERVAL); + const initInterval = () => { + this._stallInterval = setInterval(() => { + if (!this._videoElement.paused) { + if (lastCurrentTime === this._videoElement.currentTime) { + DashAdapter._logger.debug('stall found, break the stall'); + this._videoElement.currentTime = parseFloat(this._videoElement.currentTime.toFixed(1)) + STALL_BREAK_THRESHOLD; + } else { + this._clearStallInterval(); + } + } else { + this._clearStallInterval(); + this._eventManager.listenOnce(this._videoElement, EventType.PLAYING, () => initInterval()); + } + lastCurrentTime = this._videoElement.currentTime; + }, STALL_DETECTION_INTERVAL); + }; + initInterval(); } /** @@ -421,8 +430,8 @@ export default class DashAdapter extends BaseMediaSourceAdapter { */ _maybeBreakStalls(): void { if (this._config.forceBreakStall) { - this._eventManager.listenOnce(EventType.STALLED, this._stallSmartTVHandler); - this._eventManager.listenOnce(EventType.SEEKED, this._stallSmartTVHandler); + this._eventManager.listenOnce(this._videoElement, EventType.STALLED, () => this._stallSmartTVHandler()); + this._eventManager.listenOnce(this._videoElement, EventType.SEEKED, () => this._stallSmartTVHandler()); } } From 81c227fb6e3ee195115de095463e1b1e839962fc Mon Sep 17 00:00:00 2001 From: "yuval.keidar" Date: Mon, 26 Apr 2021 19:13:15 +0300 Subject: [PATCH 07/13] fix stall after startTime --- src/dash-adapter.js | 44 +++++++++++++++++++++----------------------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/src/dash-adapter.js b/src/dash-adapter.js index 7bd1199e..3f9dbbe9 100644 --- a/src/dash-adapter.js +++ b/src/dash-adapter.js @@ -160,11 +160,18 @@ export default class DashAdapter extends BaseMediaSourceAdapter { /** * stall interval to break the stall on Smart TV - * @type {null|number} + * @type {null|IntervalID} * @private */ _stallInterval: ?IntervalID = null; + /** + * stall interval to break the stall on Smart TV + * @type {number} + * @private + */ + _startTime: Number = 0; + /** * 3016 is the number of the video error at shaka, we already listens to it in the html5 class * @member {number} - VIDEO_ERROR_CODE @@ -403,24 +410,16 @@ export default class DashAdapter extends BaseMediaSourceAdapter { _stallSmartTVHandler(): void { this._clearStallInterval(); - let lastCurrentTime = this._videoElement.currentTime; - const initInterval = () => { - this._stallInterval = setInterval(() => { - if (!this._videoElement.paused) { - if (lastCurrentTime === this._videoElement.currentTime) { - DashAdapter._logger.debug('stall found, break the stall'); - this._videoElement.currentTime = parseFloat(this._videoElement.currentTime.toFixed(1)) + STALL_BREAK_THRESHOLD; - } else { - this._clearStallInterval(); - } - } else { - this._clearStallInterval(); - this._eventManager.listenOnce(this._videoElement, EventType.PLAYING, () => initInterval()); - } - lastCurrentTime = this._videoElement.currentTime; - }, STALL_DETECTION_INTERVAL); - }; - initInterval(); + let lastUpdateTime = this._startTime ? this._startTime : this._videoElement.currentTime; + this._stallInterval = setInterval(() => { + if (lastUpdateTime === this._videoElement.currentTime) { + DashAdapter._logger.debug('stall found, break the stall'); + this._videoElement.currentTime = parseFloat(this._videoElement.currentTime.toFixed(1)) + STALL_BREAK_THRESHOLD; + } else { + this._clearStallInterval(); + } + lastUpdateTime = this._videoElement.currentTime; + }, STALL_DETECTION_INTERVAL); } /** @@ -431,7 +430,6 @@ export default class DashAdapter extends BaseMediaSourceAdapter { _maybeBreakStalls(): void { if (this._config.forceBreakStall) { this._eventManager.listenOnce(this._videoElement, EventType.STALLED, () => this._stallSmartTVHandler()); - this._eventManager.listenOnce(this._videoElement, EventType.SEEKED, () => this._stallSmartTVHandler()); } } @@ -722,12 +720,12 @@ export default class DashAdapter extends BaseMediaSourceAdapter { this._loadPromise = new Promise((resolve, reject) => { if (this._sourceObj && this._sourceObj.url) { this._trigger(EventType.ABR_MODE_CHANGED, {mode: this.isAdaptiveBitrateEnabled() ? 'auto' : 'manual'}); - let shakaStartTime = startTime && startTime > -1 ? startTime : undefined; - shakaStartTime = isNaN(this._lastTimeDetach) ? shakaStartTime : this._lastTimeDetach; + this._startTime = startTime && startTime > -1 ? startTime : undefined; + this._startTime = isNaN(this._lastTimeDetach) ? this._startTime : this._lastTimeDetach; this._lastTimeDetach = NaN; this._maybeGetRedirectedUrl(this._sourceObj.url) .then(url => { - return this._shaka.load(url, shakaStartTime); + return this._shaka.load(url, this._startTime); }) .then(() => { const data = {tracks: this._getParsedTracks()}; From ffc26fbb297822c76cde7ee34d77400c5a128126 Mon Sep 17 00:00:00 2001 From: "yuval.keidar" Date: Mon, 26 Apr 2021 21:58:04 +0300 Subject: [PATCH 08/13] add max attempt of stall --- src/dash-adapter.js | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/dash-adapter.js b/src/dash-adapter.js index 3f9dbbe9..2d13356d 100644 --- a/src/dash-adapter.js +++ b/src/dash-adapter.js @@ -56,6 +56,13 @@ const STALL_DETECTION_INTERVAL = 2000; */ const STALL_BREAK_THRESHOLD = 0.1; +/** + * the number of stalls until we stop + * @type {number} + * @const + */ +const MAX_NUMBER_OF_STALLS = 5; + /** * Adapter of shaka lib for dash content * @classdesc @@ -166,7 +173,7 @@ export default class DashAdapter extends BaseMediaSourceAdapter { _stallInterval: ?IntervalID = null; /** - * stall interval to break the stall on Smart TV + * start time requested * @type {number} * @private */ @@ -410,9 +417,10 @@ export default class DashAdapter extends BaseMediaSourceAdapter { _stallSmartTVHandler(): void { this._clearStallInterval(); - let lastUpdateTime = this._startTime ? this._startTime : this._videoElement.currentTime; + let stallHandlerCounter = 0; + let lastUpdateTime = this._startTime > this._videoElement.currentTime ? this._startTime : this._videoElement.currentTime; this._stallInterval = setInterval(() => { - if (lastUpdateTime === this._videoElement.currentTime) { + if (lastUpdateTime === this._videoElement.currentTime && ++stallHandlerCounter <= MAX_NUMBER_OF_STALLS) { DashAdapter._logger.debug('stall found, break the stall'); this._videoElement.currentTime = parseFloat(this._videoElement.currentTime.toFixed(1)) + STALL_BREAK_THRESHOLD; } else { From 68a6b42f53fac12d336e871b17cd8304d4efa707 Mon Sep 17 00:00:00 2001 From: "yuval.keidar" Date: Tue, 27 Apr 2021 08:39:52 +0300 Subject: [PATCH 09/13] Update dash-adapter.js --- src/dash-adapter.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/dash-adapter.js b/src/dash-adapter.js index 2d13356d..ce7d6828 100644 --- a/src/dash-adapter.js +++ b/src/dash-adapter.js @@ -61,7 +61,7 @@ const STALL_BREAK_THRESHOLD = 0.1; * @type {number} * @const */ -const MAX_NUMBER_OF_STALLS = 5; +const MAX_NUMBER_OF_STALLS = 10; /** * Adapter of shaka lib for dash content @@ -174,10 +174,10 @@ export default class DashAdapter extends BaseMediaSourceAdapter { /** * start time requested - * @type {number} + * @type {null|number} * @private */ - _startTime: Number = 0; + _startTime: ?number = 0; /** * 3016 is the number of the video error at shaka, we already listens to it in the html5 class From 6da4acb72f9d950be8f1589d8df7071a14daa1af Mon Sep 17 00:00:00 2001 From: "yuval.keidar" Date: Tue, 27 Apr 2021 10:31:10 +0300 Subject: [PATCH 10/13] Update dash-adapter.js --- src/dash-adapter.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/dash-adapter.js b/src/dash-adapter.js index e9f8aca9..58f452b1 100644 --- a/src/dash-adapter.js +++ b/src/dash-adapter.js @@ -179,6 +179,12 @@ export default class DashAdapter extends BaseMediaSourceAdapter { */ _startTime: ?number = 0; + /** + * playback started to play + * @type {boolean} + * @private + */ + _isPlaybackStarted: boolean = false; /** * 3016 is the number of the video error at shaka, we already listens to it in the html5 class * @member {number} - VIDEO_ERROR_CODE @@ -419,7 +425,7 @@ export default class DashAdapter extends BaseMediaSourceAdapter { _stallSmartTVHandler(): void { this._clearStallInterval(); let stallHandlerCounter = 0; - let lastUpdateTime = this._startTime > this._videoElement.currentTime ? this._startTime : this._videoElement.currentTime; + let lastUpdateTime = !this._isPlaybackStarted ? this._startTime : this._videoElement.currentTime; this._stallInterval = setInterval(() => { if (lastUpdateTime === this._videoElement.currentTime && ++stallHandlerCounter <= MAX_NUMBER_OF_STALLS) { DashAdapter._logger.debug('stall found, break the stall'); @@ -438,7 +444,8 @@ export default class DashAdapter extends BaseMediaSourceAdapter { */ _maybeBreakStalls(): void { if (this._config.forceBreakStall) { - this._eventManager.listenOnce(this._videoElement, EventType.STALLED, () => this._stallSmartTVHandler()); + this._eventManager.listen(this._videoElement, EventType.STALLED, () => this._stallSmartTVHandler()); + this._eventManager.listenOnce(this._videoElement, EventType.PLAYING, () => (this._isPlaybackStarted = true)); } } From e63f39677db9bed6e5bac7ca283f47fec0ad493d Mon Sep 17 00:00:00 2001 From: "yuval.keidar" Date: Tue, 27 Apr 2021 10:32:47 +0300 Subject: [PATCH 11/13] Update dash-adapter.js --- src/dash-adapter.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dash-adapter.js b/src/dash-adapter.js index 58f452b1..e5b98700 100644 --- a/src/dash-adapter.js +++ b/src/dash-adapter.js @@ -177,7 +177,7 @@ export default class DashAdapter extends BaseMediaSourceAdapter { * @type {null|number} * @private */ - _startTime: ?number = 0; + _startTime: ?number; /** * playback started to play @@ -425,7 +425,7 @@ export default class DashAdapter extends BaseMediaSourceAdapter { _stallSmartTVHandler(): void { this._clearStallInterval(); let stallHandlerCounter = 0; - let lastUpdateTime = !this._isPlaybackStarted ? this._startTime : this._videoElement.currentTime; + let lastUpdateTime = !this._isPlaybackStarted && this._startTime ? this._startTime : this._videoElement.currentTime; this._stallInterval = setInterval(() => { if (lastUpdateTime === this._videoElement.currentTime && ++stallHandlerCounter <= MAX_NUMBER_OF_STALLS) { DashAdapter._logger.debug('stall found, break the stall'); From 61e53877aa42843374df88251c5fe7356be93a94 Mon Sep 17 00:00:00 2001 From: "yuval.keidar" Date: Tue, 27 Apr 2021 10:39:27 +0300 Subject: [PATCH 12/13] Update dash-adapter.js --- src/dash-adapter.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/dash-adapter.js b/src/dash-adapter.js index e5b98700..4828f796 100644 --- a/src/dash-adapter.js +++ b/src/dash-adapter.js @@ -445,7 +445,6 @@ export default class DashAdapter extends BaseMediaSourceAdapter { _maybeBreakStalls(): void { if (this._config.forceBreakStall) { this._eventManager.listen(this._videoElement, EventType.STALLED, () => this._stallSmartTVHandler()); - this._eventManager.listenOnce(this._videoElement, EventType.PLAYING, () => (this._isPlaybackStarted = true)); } } @@ -691,9 +690,11 @@ export default class DashAdapter extends BaseMediaSourceAdapter { this._eventManager.listen(this._shaka, ShakaEvent.DRM_SESSION_UPDATE, this._adapterEventsBindings.drmsessionupdate); this._eventManager.listen(this._videoElement, EventType.WAITING, this._adapterEventsBindings.waiting); this._eventManager.listen(this._videoElement, EventType.PLAYING, this._adapterEventsBindings.playing); - this._eventManager.listenOnce(this._videoElement, EventType.PLAYING, () => - this._eventManager.listen(this._shaka, ShakaEvent.BUFFERING, this._adapterEventsBindings.buffering) - ); + this._eventManager.listenOnce(this._videoElement, EventType.PLAYING, () => { + this._isPlaybackStarted = true; + this._eventManager.listen(this._shaka, ShakaEvent.BUFFERING, this._adapterEventsBindings.buffering); + }); + // called when a resource is downloaded this._shaka.getNetworkingEngine().registerResponseFilter((type, response) => { switch (type) { @@ -812,6 +813,7 @@ export default class DashAdapter extends BaseMediaSourceAdapter { this._responseFilterError = false; this._manifestParser = null; this._thumbnailController = null; + this._isPlaybackStarted = false; this._clearStallInterval(); this._clearVideoUpdateTimer(); if (this._eventManager) { From 36d18fd39dcab360c0ad3e3cd0031c6c886e5c3f Mon Sep 17 00:00:00 2001 From: "yuval.keidar" Date: Tue, 27 Apr 2021 10:44:50 +0300 Subject: [PATCH 13/13] Update dash-adapter.js --- src/dash-adapter.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/dash-adapter.js b/src/dash-adapter.js index 4828f796..34d5f1fc 100644 --- a/src/dash-adapter.js +++ b/src/dash-adapter.js @@ -422,12 +422,12 @@ export default class DashAdapter extends BaseMediaSourceAdapter { } } - _stallSmartTVHandler(): void { + _stallHandler(): void { this._clearStallInterval(); let stallHandlerCounter = 0; let lastUpdateTime = !this._isPlaybackStarted && this._startTime ? this._startTime : this._videoElement.currentTime; this._stallInterval = setInterval(() => { - if (lastUpdateTime === this._videoElement.currentTime && ++stallHandlerCounter <= MAX_NUMBER_OF_STALLS) { + if (lastUpdateTime === this._videoElement.currentTime && stallHandlerCounter++ < MAX_NUMBER_OF_STALLS) { DashAdapter._logger.debug('stall found, break the stall'); this._videoElement.currentTime = parseFloat(this._videoElement.currentTime.toFixed(1)) + STALL_BREAK_THRESHOLD; } else { @@ -444,7 +444,7 @@ export default class DashAdapter extends BaseMediaSourceAdapter { */ _maybeBreakStalls(): void { if (this._config.forceBreakStall) { - this._eventManager.listen(this._videoElement, EventType.STALLED, () => this._stallSmartTVHandler()); + this._eventManager.listen(this._videoElement, EventType.STALLED, () => this._stallHandler()); } }