From ffcaf31b7a57fb3921b93f5f4268a88bfe23e8ed Mon Sep 17 00:00:00 2001 From: "yuval.keidar" Date: Tue, 10 Nov 2020 11:49:58 +0200 Subject: [PATCH 1/3] fix: source removed before destroy process finish Issue: source has been removed from video tag before destroy has been finished. Solution: wait for mediaSource destroy before removing the src from video tag. --- src/engines/html5/html5.js | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/src/engines/html5/html5.js b/src/engines/html5/html5.js index 50d2c934f..0692047f7 100644 --- a/src/engines/html5/html5.js +++ b/src/engines/html5/html5.js @@ -50,7 +50,7 @@ export default class Html5 extends FakeEventTarget implements IEngine { */ _canLoadMediaSourceAdapterPromise: Promise<*>; _droppedFramesWatcher: ?DroppedFramesWatcher; - + _reset: boolean = false; /** * The html5 class logger. * @type {any} @@ -208,19 +208,31 @@ export default class Html5 extends FakeEventTarget implements IEngine { * @returns {void} */ reset(): void { + if (this._reset) return; + this._reset = true; this._eventManager.removeAll(); if (this._droppedFramesWatcher) { this._droppedFramesWatcher.destroy(); this._droppedFramesWatcher = null; } - if (this._mediaSourceAdapter) { - this._canLoadMediaSourceAdapterPromise = this._mediaSourceAdapter.destroy(); - this._mediaSourceAdapter = null; - } - if (this._el && this._el.src) { - Utils.Dom.setAttribute(this._el, 'src', ''); - Utils.Dom.removeAttribute(this._el, 'src'); - } + this._canLoadMediaSourceAdapterPromise = new Promise((resolve, reject) => { + const mediaSourceAdapterDestroyed = this._mediaSourceAdapter ? this._mediaSourceAdapter.destroy() : Promise.resolve(); + if (this._el && this._el.src) { + mediaSourceAdapterDestroyed.then( + () => { + Utils.Dom.setAttribute(this._el, 'src', ''); + Utils.Dom.removeAttribute(this._el, 'src'); + resolve(); + }, + () => { + reject(); + } + ); + } else { + resolve(); + } + }); + this._mediaSourceAdapter = null; } /** @@ -477,6 +489,7 @@ export default class Html5 extends FakeEventTarget implements IEngine { this._el.load(); return this._canLoadMediaSourceAdapterPromise .then(() => { + this._reset = false; if (this._mediaSourceAdapter) { return this._mediaSourceAdapter.load(startTime).catch(error => { return Promise.reject(error); From 2441a3ec56a7bd8deedb00956eb00ef51322379b Mon Sep 17 00:00:00 2001 From: "yuval.keidar" Date: Tue, 10 Nov 2020 17:14:34 +0200 Subject: [PATCH 2/3] change reset flag to true initilize --- src/engines/html5/html5.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engines/html5/html5.js b/src/engines/html5/html5.js index 0692047f7..529b23f5f 100644 --- a/src/engines/html5/html5.js +++ b/src/engines/html5/html5.js @@ -489,7 +489,6 @@ export default class Html5 extends FakeEventTarget implements IEngine { this._el.load(); return this._canLoadMediaSourceAdapterPromise .then(() => { - this._reset = false; if (this._mediaSourceAdapter) { return this._mediaSourceAdapter.load(startTime).catch(error => { return Promise.reject(error); @@ -985,6 +984,7 @@ export default class Html5 extends FakeEventTarget implements IEngine { */ _init(source: PKMediaSourceObject, config: Object): void { this._config = config; + this._reset = false; this._loadMediaSourceAdapter(source); this.attach(); } From 165ea3aa4f6762081c03475c0a070f9825f38180 Mon Sep 17 00:00:00 2001 From: "yuval.keidar" Date: Thu, 12 Nov 2020 10:21:00 +0200 Subject: [PATCH 3/3] Update html5.js --- src/engines/html5/html5.js | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/src/engines/html5/html5.js b/src/engines/html5/html5.js index 529b23f5f..f9b266505 100644 --- a/src/engines/html5/html5.js +++ b/src/engines/html5/html5.js @@ -218,18 +218,13 @@ export default class Html5 extends FakeEventTarget implements IEngine { this._canLoadMediaSourceAdapterPromise = new Promise((resolve, reject) => { const mediaSourceAdapterDestroyed = this._mediaSourceAdapter ? this._mediaSourceAdapter.destroy() : Promise.resolve(); if (this._el && this._el.src) { - mediaSourceAdapterDestroyed.then( - () => { - Utils.Dom.setAttribute(this._el, 'src', ''); - Utils.Dom.removeAttribute(this._el, 'src'); - resolve(); - }, - () => { - reject(); - } - ); + mediaSourceAdapterDestroyed.then(() => { + Utils.Dom.setAttribute(this._el, 'src', ''); + Utils.Dom.removeAttribute(this._el, 'src'); + resolve(); + }, reject); } else { - resolve(); + mediaSourceAdapterDestroyed.then(resolve, reject); } }); this._mediaSourceAdapter = null;