diff --git a/src/js/engine/convert-engine.js b/src/js/engine/convert-engine.js index e01e38d2b..ea771fb67 100644 --- a/src/js/engine/convert-engine.js +++ b/src/js/engine/convert-engine.js @@ -86,6 +86,13 @@ class ConvertEngine extends Component { // download converted file downloadBlob(fileName, this.player().convertedData); } + + /** + * Remove any temporary data and references + */ + dispose() { + super.dispose(); + } } // expose component for external plugins diff --git a/src/js/plugins/ffmpeg-wasm-plugin.js b/src/js/plugins/ffmpeg-wasm-plugin.js index c0775ccac..e23b7b3a1 100644 --- a/src/js/plugins/ffmpeg-wasm-plugin.js +++ b/src/js/plugins/ffmpeg-wasm-plugin.js @@ -132,6 +132,17 @@ class FFmpegWasmEngine extends ConvertEngine { // notify listeners this.player().trigger('finishConvert'); } + + /** + * Terminate the FFMPEG workers if they have been started + */ + dispose() { + super.dispose(); + if (this.ffmpeg !== null && this.ffmpeg.loaded) { + this.ffmpeg.terminate(); + this.ffmpeg = null; + } + } } // expose plugin diff --git a/src/js/videojs.record.js b/src/js/videojs.record.js index ce9aca9bc..68e1302f1 100644 --- a/src/js/videojs.record.js +++ b/src/js/videojs.record.js @@ -1384,6 +1384,11 @@ class Record extends Plugin { this.engine.off(Event.RECORD_COMPLETE, this.engineStopCallback); } + // Clean up any resources the converter engine may have used + if (this.converter) { + this.converter.dispose(); + } + // stop recording and device this.stop(); this.stopDevice(); diff --git a/test/engine/convert-engine.spec.js b/test/engine/convert-engine.spec.js index ef5629e6e..568dcaeb4 100644 --- a/test/engine/convert-engine.spec.js +++ b/test/engine/convert-engine.spec.js @@ -62,4 +62,13 @@ describe('engine.convert-engine', () => { done(); }); }); + + it('should call dispose when the player is disposed', (done) => { + let engine = new ConvertEngine(player, {}); + spyOn(engine, 'dispose'); + + player.dispose(); + + expect(engine.dispose).toHaveBeenCalled(); + }); });