{"version":3,"sources":["webpack://VideojsRecord/webpack/universalModuleDefinition","webpack://VideojsRecord/webpack/bootstrap","webpack://VideojsRecord/./node_modules/global/window.js","webpack://VideojsRecord/(webpack)/buildin/global.js","webpack://VideojsRecord/./src/css/videojs.record.scss?aafa","webpack://VideojsRecord/./src/js/controls/animation-display.js","webpack://VideojsRecord/./src/js/controls/camera-button.js","webpack://VideojsRecord/./src/js/controls/device-button.js","webpack://VideojsRecord/./src/js/controls/record-canvas.js","webpack://VideojsRecord/./src/js/controls/record-indicator.js","webpack://VideojsRecord/./src/js/controls/record-toggle.js","webpack://VideojsRecord/./src/js/defaults.js","webpack://VideojsRecord/./src/js/engine/record-engine.js","webpack://VideojsRecord/./src/js/engine/record-mode.js","webpack://VideojsRecord/./src/js/engine/record-rtc.js","webpack://VideojsRecord/./src/js/utils/browser-shim.js","webpack://VideojsRecord/./src/js/utils/detect-browser.js","webpack://VideojsRecord/./src/js/utils/format-time.js","webpack://VideojsRecord/./src/js/videojs.record.js","webpack://VideojsRecord/external \"videojs\""],"names":["Component","videojs","getComponent","AnimationDisplay","className","innerHTML","registerComponent","Button","CameraButton","on","player_","onStart","onStop","off","event","recorder","record","isProcessing","start","retrySnapshot","removeClass","addClass","controlText","prototype","controlText_","DeviceButton","getDevice","RecordCanvas","RecordIndicator","player","options","enable","dir","show","hide","RecordToggle","isRecording","stop","pluginDefaultOptions","image","audio","video","animation","maxLength","frameWidth","frameHeight","debug","autoMuteDevice","videoMimeType","videoRecorderType","audioEngine","audioRecorderType","audioMimeType","audioBufferSize","audioSampleRate","audioBitRate","audioChannels","audioWorkerURL","animationFrameRate","animationQuality","timeSlice","RECORDRTC","LIBVORBISJS","RECORDERJS","LAMEJS","OPUSRECORDER","RecordEngine","evented","recordedData","undefined","URL","revokeObjectURL","fileObj","Blob","File","now","Date","lastModified","getTime","lastModifiedDate","e","TypeError","fileExtension","type","split","indexOf","name","data","addFileInfo","dispose","trigger","fileName","Object","keys","navigator","msSaveOrOpenBlob","msSaveBlob","hyperlink","document","createElement","href","createObjectURL","download","style","body","documentElement","appendChild","click","target","dispatchEvent","MouseEvent","view","window","bubbles","cancelable","IMAGE_ONLY","AUDIO_ONLY","VIDEO_ONLY","AUDIO_VIDEO","ANIMATION","getRecorderMode","isModeEnabled","mode","RecordRTCEngine","stream","mediaType","inputStream","engine","RecordRTC","MRecordRTC","disableLogs","mimeType","bufferSize","sampleRate","numberOfAudioChannels","canvas","quality","frameRate","onTimeStamp","addStream","destroy","startRecording","stopRecording","onStopRecording","bind","pauseRecording","resumeRecording","save","audioVideoURL","mediaURL","recordType","getRecordType","getBlob","recording","mtype","gif","setSrcObject","element","ignoreCreateObjectURL","src","srcObject","mozSrcObject","console","log","detectBrowser","result","browser","version","minVersion","mozGetUserMedia","extractVersion","userAgent","webkitGetUserMedia","mediaDevices","match","RTCPeerConnection","uastring","expr","pos","length","parseInt","isEdge","isSafari","isOpera","opera","isChrome","formatTime","seconds","guide","msDisplayMax","s","Math","floor","m","h","gm","gh","ms","isNaN","Infinity","Plugin","getPlugin","Player","AUTO","play","retval","techGet_","then","Record","loadOptions","resetState","deviceIcon","buildCSSClass","deviceButton","addChild","recordIndicator","recordCanvas","animationDisplay","cameraButton","recordToggle","one","setupUI","newOptions","recordOptions","mergeOptions","options_","plugins","recordImage","recordAudio","recordVideo","recordAnimation","recordTimeSlice","videoFrameWidth","videoFrameHeight","controlBar","el","insertBefore","firstChild","remainingTimeDisplay","display","liveDisplay","loop","surfer","wavesurfer","bigPlayButton","setDuration","usingNativeControls_","tech_","el_","controls","removeTechControlsListeners_","progressControl","userActive","playToggle","_recording","_processing","children","deviceReadyCallback","onDeviceReady","deviceErrorCallback","onDeviceError","engineStopCallback","onRecordComplete","microphone","un","setupPlaybackEvents","liveMode","paused","getUserMedia","catch","_deviceActive","setCurrentTime","playbackTimeUpdate","Error","EngineClass","LibVorbisEngine","RecorderjsEngine","LamejsEngine","OpusRecorderEngine","err","error","bitRate","width","height","setup","uiElements","currentTimeDisplay","timeDivider","durationDisplay","forEach","disable","mediaElement","muted","displayVolumeControl","load","code","deviceErrorCode","startVideoPreview","captureFrame","muteTracks","createSnapshot","pauseTime","pausedTime","startTime","countDown","setInterval","onCountDown","clearInterval","stopStream","stopDevice","getTracks","pause","resume","loadingSpinner","once","streamDuration","showAnimation","hideAnimation","duration","currentTime","streamCurrentTime","getCurrentTime","min","formattedTime_","contentEl","lastChild","textContent","url","saveAs","reset","empty","devices","mute","getAudioTracks","enabled","getVideoTracks","toDataURL","detected","Promise","resolve","reject","ImageCapture","Function","track","imageCapture","grabFrame","imageBitmap","drawCanvas","getContext","drawImage","current","all","currentTimestamp","allTimestamps","internal","audioRecorder","gifRecorder","videoRecorder","getInternalRecorder","MediaStreamRecorder","getArrayOfBlobs","enumerateDevices","enumerateErrorCode","device","push","deviceId","errorMessage","setSinkId","sinkId","volumePanel","VERSION","registerPlugin","module","exports"],"mappings":"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","file":"videojs.record.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"videojs\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"VideojsRecord\", [\"videojs\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"VideojsRecord\"] = factory(require(\"videojs\"));\n\telse\n\t\troot[\"VideojsRecord\"] = factory(root[\"videojs\"]);\n})(window, function(__WEBPACK_EXTERNAL_MODULE_video_js__) {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","var win;\n\nif (typeof window !== \"undefined\") {\n    win = window;\n} else if (typeof global !== \"undefined\") {\n    win = global;\n} else if (typeof self !== \"undefined\"){\n    win = self;\n} else {\n    win = {};\n}\n\nmodule.exports = win;\n","var g;\r\n\r\n// This works in non-strict mode\r\ng = (function() {\r\n\treturn this;\r\n})();\r\n\r\ntry {\r\n\t// This works if eval is allowed (see CSP)\r\n\tg = g || Function(\"return this\")() || (1, eval)(\"this\");\r\n} catch (e) {\r\n\t// This works if the window reference is available\r\n\tif (typeof window === \"object\") g = window;\r\n}\r\n\r\n// g can still be undefined, but nothing to do about it...\r\n// We return undefined, instead of nothing here, so it's\r\n// easier to handle this case. if(!global) { ...}\r\n\r\nmodule.exports = g;\r\n","// extracted by mini-css-extract-plugin","/**\n * @file animation-display.js\n * @since 2.0.0\n */\n\nconst Component = videojs.getComponent('Component');\n\n/**\n * Image for displaying animated GIF image.\n *\n * @class\n * @augments videojs.Component\n*/\nclass AnimationDisplay extends Component {\n\n    /**\n     * Create the `AnimationDisplay`s DOM element.\n     *\n     * @return {Element}\n     *         The dom element that gets created.\n     */\n    createEl() {\n        return super.createEl('div', {\n            className: 'vjs-animation-display',\n            innerHTML: '<img />'\n        });\n    }\n}\n\nComponent.registerComponent('AnimationDisplay', AnimationDisplay);\n\nexport default AnimationDisplay;\n","/**\n * @file camera-button.js\n * @since 2.0.0\n */\n\nconst Button = videojs.getComponent('Button');\nconst Component = videojs.getComponent('Component');\n\n/**\n * Button to toggle between create and retry snapshot image.\n *\n * @class\n * @augments videojs.Button\n*/\nclass CameraButton extends Button {\n    /**\n     * Builds the default DOM `className`.\n     *\n     * @return {string}\n     *         The DOM `className` for this object.\n     */\n    buildCSSClass() {\n        return 'vjs-camera-button vjs-control vjs-button vjs-icon-photo-camera';\n    }\n\n    /**\n     * Enable the `CameraButton` element so that it can be activated or clicked.\n     */\n    enable() {\n        super.enable();\n\n        this.on(this.player_, 'startRecord', this.onStart);\n        this.on(this.player_, 'stopRecord', this.onStop);\n    }\n\n    /**\n     * Disable the `CameraButton` element so that it cannot be activated or clicked.\n     */\n    disable() {\n        super.disable();\n\n        this.off(this.player_, 'startRecord', this.onStart);\n        this.off(this.player_, 'stopRecord', this.onStop);\n    }\n\n    /**\n     * This gets called when the button is clicked.\n     *\n     * @param {EventTarget~Event} event\n     *        The `tap` or `click` event that caused this function to be\n     *        called.\n     *\n     * @listens tap\n     * @listens click\n     */\n    handleClick(event) {\n        let recorder = this.player_.record();\n\n        if (!recorder.isProcessing()) {\n            // create snapshot\n            recorder.start();\n        } else {\n            // retry\n            recorder.retrySnapshot();\n\n            // reset camera button\n            this.onStop();\n        }\n    }\n\n    /**\n     * Add the vjs-icon-replay class to the element so it can change appearance.\n     *\n     * @param {EventTarget~Event} [event]\n     *        The event that caused this function to run.\n     *\n     * @listens Player#startRecord\n     */\n    onStart(event) {\n        // replace element class so it can change appearance\n        this.removeClass('vjs-icon-photo-camera');\n        this.addClass('vjs-icon-replay');\n\n        // change the button text\n        this.controlText('Retry');\n    }\n\n    /**\n     * Add the vjs-icon-photo-camera class to the element so it can change appearance.\n     *\n     * @param {EventTarget~Event} [event]\n     *        The event that caused this function to run.\n     *\n     * @listens Player#stopRecord\n     */\n    onStop(event) {\n        // replace element class so it can change appearance\n        this.removeClass('vjs-icon-replay');\n        this.addClass('vjs-icon-photo-camera');\n\n        // change the button text\n        this.controlText('Image');\n    }\n}\n\n/**\n * The text that should display over the `CameraButton`s controls. Added for localization.\n *\n * @type {string}\n * @private\n */\nCameraButton.prototype.controlText_ = 'Image';\n\nComponent.registerComponent('CameraButton', CameraButton);\n\nexport default CameraButton;\n","/**\n * @file device-button.js\n * @since 2.0.0\n */\n\nconst Button = videojs.getComponent('Button');\nconst Component = videojs.getComponent('Component');\n\n/**\n * Button to select recording device.\n *\n * @class\n * @augments videojs.Button\n*/\nclass DeviceButton extends Button {\n    /**\n     * This gets called when this button gets:\n     *\n     * - Clicked (via the `click` event, listening starts in the constructor)\n     * - Tapped (via the `tap` event, listening starts in the constructor)\n     *\n     * @param {EventTarget~Event} event\n     *        The `keydown`, `tap`, or `click` event that caused this function to be\n     *        called.\n     *\n     * @listens tap\n     * @listens click\n     */\n    handleClick(event) {\n        // open device dialog\n        this.player_.record().getDevice();\n    }\n}\n\n/**\n * The text that should display over the `DeviceButton`s controls. Added for localization.\n *\n * @type {string}\n * @private\n */\nDeviceButton.prototype.controlText_ = 'Device';\n\nComponent.registerComponent('DeviceButton', DeviceButton);\n\nexport default DeviceButton;\n","/**\n * @file record-canvas\n * @since 2.0.0\n */\n\nconst Component = videojs.getComponent('Component');\n\n/**\n * Canvas for displaying snapshot image.\n *\n * @class\n * @augments videojs.Component\n*/\nclass RecordCanvas extends Component {\n\n    /**\n     * Create the `RecordCanvas`s DOM element.\n     *\n     * @return {Element}\n     *         The dom element that gets created.\n     */\n    createEl() {\n        return super.createEl('div', {\n            className: 'vjs-record-canvas',\n            innerHTML: '<canvas></canvas>'\n        });\n    }\n}\n\nComponent.registerComponent('RecordCanvas', RecordCanvas);\n\nexport default RecordCanvas;\n","/**\n * @file record-indicator.js\n * @since 2.0.0\n */\n\nconst Component = videojs.getComponent('Component');\n\n/**\n * Icon indicating recording is active.\n *\n * @class\n * @augments videojs.Component\n*/\nclass RecordIndicator extends Component {\n    /**\n     * The constructor function for the class.\n     *\n     * @private\n     * @param {(videojs.Player|Object)} player - Video.js player instance.\n     * @param {Object} options - Player options.\n     */\n    constructor(player, options) {\n        super(player, options);\n\n        this.enable();\n    }\n\n    /**\n     * Create the `RecordIndicator`s DOM element.\n     *\n     * @return {Element}\n     *         The dom element that gets created.\n     */\n    createEl() {\n        return super.createEl('div', {\n            className: 'vjs-record-indicator vjs-control',\n            dir: 'ltr'\n        });\n    }\n\n    /**\n     * Enable event handlers.\n     */\n    enable() {\n        this.on(this.player_, 'startRecord', this.show);\n        this.on(this.player_, 'stopRecord', this.hide);\n    }\n\n    /**\n     * Disable event handlers.\n     */\n    disable() {\n        this.off(this.player_, 'startRecord', this.show);\n        this.off(this.player_, 'stopRecord', this.hide);\n    }\n}\n\nComponent.registerComponent('RecordIndicator', RecordIndicator);\n\nexport default RecordIndicator;\n","/**\n * @file record-toggle.js\n * @since 2.0.0\n */\n\nconst Button = videojs.getComponent('Button');\nconst Component = videojs.getComponent('Component');\n\n/**\n * Button to toggle between start and stop recording.\n *\n * @class\n * @augments videojs.Button\n*/\nclass RecordToggle extends Button {\n    /**\n     * Builds the default DOM `className`.\n     *\n     * @return {string}\n     *         The DOM `className` for this object.\n     */\n    buildCSSClass() {\n        return 'vjs-record-button vjs-control vjs-button vjs-icon-record-start';\n    }\n\n    /**\n     * Enable the `RecordToggle` element so that it can be activated or clicked.\n     */\n    enable() {\n        super.enable();\n\n        this.on(this.player_, 'startRecord', this.onStart);\n        this.on(this.player_, 'stopRecord', this.onStop);\n    }\n\n    /**\n     * Disable the `RecordToggle` element so that it cannot be activated or clicked.\n     */\n    disable() {\n        super.disable();\n\n        this.off(this.player_, 'startRecord', this.onStart);\n        this.off(this.player_, 'stopRecord', this.onStop);\n    }\n\n    /**\n     * This gets called when the button is clicked.\n     *\n     * @param {EventTarget~Event} event\n     *        The `tap` or `click` event that caused this function to be\n     *        called.\n     *\n     * @listens tap\n     * @listens click\n     */\n    handleClick(event) {\n        let recorder = this.player_.record();\n        if (!recorder.isRecording()) {\n            recorder.start();\n        } else {\n            recorder.stop();\n        }\n    }\n\n    /**\n     * Add the vjs-icon-record-stop class to the element so it can change appearance.\n     *\n     * @param {EventTarget~Event} [event]\n     *        The event that caused this function to run.\n     *\n     * @listens Player#startRecord\n     */\n    onStart(event) {\n        // replace element class so it can change appearance\n        this.removeClass('vjs-icon-record-start');\n        this.addClass('vjs-icon-record-stop');\n\n        // change the button text\n        this.controlText('Stop');\n    }\n\n    /**\n     * Add the vjs-icon-record-start class to the element so it can change appearance.\n     *\n     * @param {EventTarget~Event} [event]\n     *        The event that caused this function to run.\n     *\n     * @listens Player#stopRecord\n     */\n    onStop(event) {\n        // replace element class so it can change appearance\n        this.removeClass('vjs-icon-record-stop');\n        this.addClass('vjs-icon-record-start');\n\n        // change the button text\n        this.controlText('Record');\n    }\n}\n\n/**\n * The text that should display over the `RecordToggle`s controls. Added for localization.\n *\n * @type {string}\n * @private\n */\nRecordToggle.prototype.controlText_ = 'Record';\n\nComponent.registerComponent('RecordToggle', RecordToggle);\n\nexport default RecordToggle;\n","/**\n * @file defaults.js\n * @since 2.0.0\n */\n\n//plugin defaults\nconst pluginDefaultOptions = {\n    // Single snapshot image.\n    image: false,\n    // Include audio in the recorded clip.\n    audio: false,\n    // Include video in the recorded clip.\n    video: false,\n    // Animated GIF.\n    animation: false,\n    // Maximum length of the recorded clip.\n    maxLength: 10,\n    // Width of the recorded video frames.\n    frameWidth: 320,\n    // Height of the recorded video frames.\n    frameHeight: 240,\n    // Enables console logging for debugging purposes.\n    debug: false,\n    // Turn off the camera/mic (and light) when audio and/or video recording\n    // stops, and turns them on again when you resume recording.\n    autoMuteDevice: false,\n    // The mime type for the video recorder. Default to 'video/webm'.\n    // Use 'video/mp4' (Firefox) or 'video/webm;codecs=H264' (Chrome 52 and\n    // newer) for MP4.\n    videoMimeType: 'video/webm',\n    // Video recorder type to use. This allows you to specify an alternative\n    // recorder class, e.g. WhammyRecorder. Defaults to 'auto' which let's\n    // recordrtc specify the best available recorder type.\n    videoRecorderType: 'auto',\n    // Audio recording library to use. Legal values are 'recordrtc',\n    // 'libvorbis.js', 'opus-recorder', 'lamejs' and 'recorder.js'.\n    audioEngine: 'recordrtc',\n    // Audio recorder type to use. This allows you to specify an alternative\n    // recorder class, e.g. StereoAudioRecorder. Defaults to 'auto' which let's\n    // recordrtc specify the best available recorder type. Currently this\n    // setting is only used with the 'recordrtc' audioEngine.\n    audioRecorderType: 'auto',\n    // The mime type for the audio recorder. Defaults to 'auto' which will pick\n    // the best option available in the browser (e.g. either 'audio/wav',\n    // 'audio/ogg' or 'audio/webm').\n    audioMimeType: 'auto',\n    // The size of the audio buffer (in sample-frames) which needs to\n    // be processed each time onprocessaudio is called.\n    // From the spec: This value controls how frequently the audioprocess event is\n    // dispatched and how many sample-frames need to be processed each call.\n    // Lower values for buffer size will result in a lower (better) latency.\n    // Higher values will be necessary to avoid audio breakup and glitches.\n    // Legal values are 256, 512, 1024, 2048, 4096, 8192 or 16384.\n    audioBufferSize: 4096,\n    // The audio sample rate (in sample-frames per second) at which the\n    // AudioContext handles audio. It is assumed that all AudioNodes\n    // in the context run at this rate. In making this assumption,\n    // sample-rate converters or \"varispeed\" processors are not supported\n    // in real-time processing.\n    // The sampleRate parameter describes the sample-rate of the\n    // linear PCM audio data in the buffer in sample-frames per second.\n    // An implementation must support sample-rates in at least\n    // the range 22050 to 96000.\n    audioSampleRate: 44100,\n    // The audio bitrate in kbps (only used in lamejs plugin).\n    audioBitRate: 128,\n    // Allows you to record single-channel audio, which can reduce the\n    // filesize.\n    audioChannels: 2,\n    // URL for the audio worker.\n    audioWorkerURL: '',\n    // Frame rate in frames per second.\n    animationFrameRate: 200,\n    // Sets quality of color quantization (conversion of images to the\n    // maximum 256 colors allowed by the GIF specification).\n    // Lower values (minimum = 1) produce better colors,\n    // but slow processing significantly. 10 is the default,\n    // and produces good color mapping at reasonable speeds.\n    // Values greater than 20 do not yield significant improvements\n    // in speed.\n    animationQuality: 10,\n    // Accepts numbers in milliseconds; use this to force intervals-based blobs.\n    timeSlice: 0\n};\n\nexport default pluginDefaultOptions;\n","/**\n * @file record-engine.js\n * @since 2.0.0\n */\n\nconst Component = videojs.getComponent('Component');\n\n// supported recorder plugin engines\nconst RECORDRTC = 'recordrtc';\nconst LIBVORBISJS = 'libvorbis.js';\nconst RECORDERJS = 'recorder.js';\nconst LAMEJS = 'lamejs';\nconst OPUSRECORDER = 'opus-recorder';\n\n/**\n * Base class for recorder backends.\n * @class\n * @augments videojs.Component\n */\nclass RecordEngine extends Component {\n    /**\n     * Creates an instance of this class.\n     *\n     * @param  {Player} player\n     *         The `Player` that this class should be attached to.\n     *\n     * @param  {Object} [options]\n     *         The key/value store of player options.\n     */\n    constructor(player, options) {\n\n        // auto mixin the evented mixin (required since video.js v6.6.0)\n        options.evented = true;\n\n        super(player, options);\n    }\n\n    /**\n     * Remove any temporary data and references to streams.\n     * @private\n     */\n    dispose() {\n        // dispose previous recording\n        if (this.recordedData !== undefined) {\n            URL.revokeObjectURL(this.recordedData);\n        }\n    }\n\n    /**\n     * Add filename and timestamp to recorded file object.\n     *\n     * @param {(blob|file)} fileObj - Blob or File object.\n     */\n    addFileInfo(fileObj) {\n        if (fileObj instanceof Blob || fileObj instanceof File) {\n            // set modification date\n            let now = new Date();\n            try {\n                fileObj.lastModified = now.getTime();\n                fileObj.lastModifiedDate = now;\n            } catch (e) {\n                if (e instanceof TypeError) {\n                    // ignore: setting getter-only property \"lastModifiedDate\"\n                } else {\n                    // re-raise error\n                    throw e;\n                }\n            }\n            // guess extension name from mime type, e.g. audio/ogg, but\n            // any extension is valid here. Chrome also accepts extended\n            // mime types like video/webm;codecs=h264,vp9,opus\n            let fileExtension = '.' + fileObj.type.split('/')[1];\n            if (fileExtension.indexOf(';') > -1) {\n                fileExtension = fileExtension.split(';')[0];\n            }\n\n            // use timestamp in filename, e.g. 1451180941326.ogg\n            try {\n                fileObj.name = now.getTime() + fileExtension;\n            } catch (e) {\n                if (e instanceof TypeError) {\n                    // ignore: setting getter-only property \"name\"\n                } else {\n                    // re-raise error\n                    throw e;\n                }\n            }\n        }\n    }\n\n    /**\n     * Invoked when recording is stopped and resulting stream is available.\n     *\n     * @param {blob} data - Reference to the recorded Blob.\n     */\n    onStopRecording(data) {\n        this.recordedData = data;\n\n        // add filename and timestamp to recorded file object\n        this.addFileInfo(this.recordedData);\n\n        // remove reference to recorded stream\n        this.dispose();\n\n        // notify listeners\n        this.trigger('recordComplete');\n    }\n\n    /**\n     * Show save as dialog in browser so the user can store the recorded media\n     * locally.\n     *\n     * @param {object} name - Object with names for the particular blob(s)\n     *     you want to save. File extensions are added automatically. For\n     *     example: {'video': 'name-of-video-file'}. Supported keys are\n     *     'audio', 'video' and 'gif'.\n     */\n    saveAs(name) {\n        let fileName = name[Object.keys(name)[0]];\n\n        if (typeof navigator.msSaveOrOpenBlob !== 'undefined') {\n            return navigator.msSaveOrOpenBlob(this.recordedData, fileName);\n        } else if (typeof navigator.msSaveBlob !== 'undefined') {\n            return navigator.msSaveBlob(this.recordedData, fileName);\n        }\n\n        let hyperlink = document.createElement('a');\n        hyperlink.href = URL.createObjectURL(this.recordedData);\n        hyperlink.download = fileName;\n\n        hyperlink.style = 'display:none;opacity:0;color:transparent;';\n        (document.body || document.documentElement).appendChild(hyperlink);\n\n        if (typeof hyperlink.click === 'function') {\n            hyperlink.click();\n        } else {\n            hyperlink.target = '_blank';\n            hyperlink.dispatchEvent(new MouseEvent('click', {\n                view: window,\n                bubbles: true,\n                cancelable: true\n            }));\n        }\n\n        URL.revokeObjectURL(hyperlink.href);\n    }\n}\n\n// expose component for external plugins\nvideojs.RecordEngine = RecordEngine;\nComponent.registerComponent('RecordEngine', RecordEngine);\n\nexport {\n    RecordEngine,\n    RECORDRTC, LIBVORBISJS, RECORDERJS, LAMEJS, OPUSRECORDER\n};\n","/**\n * @file record-mode.js\n * @since 2.0.0\n */\n\n// recorder modes\nconst IMAGE_ONLY = 'image_only';\nconst AUDIO_ONLY = 'audio_only';\nconst VIDEO_ONLY = 'video_only';\nconst AUDIO_VIDEO = 'audio_video';\nconst ANIMATION = 'animation';\n\n\nconst getRecorderMode = function(image, audio, video, animation) {\n    if (isModeEnabled(image)) {\n        return IMAGE_ONLY;\n\n    } else if (isModeEnabled(animation)) {\n        return ANIMATION;\n\n    } else if (isModeEnabled(audio) && !isModeEnabled(video)) {\n        return AUDIO_ONLY;\n\n    } else if (isModeEnabled(audio) && isModeEnabled(video)) {\n        return AUDIO_VIDEO;\n\n    } else if (!isModeEnabled(audio) && isModeEnabled(video)) {\n        return VIDEO_ONLY;\n    }\n};\n\n/**\n * Return boolean indicating whether mode is enabled or not.\n *\n * @private\n */\nconst isModeEnabled = function(mode) {\n    return mode === Object(mode) || mode === true;\n};\n\nexport {\n    getRecorderMode,\n    IMAGE_ONLY, AUDIO_ONLY, VIDEO_ONLY, AUDIO_VIDEO, ANIMATION\n};\n","/**\n * @file record-rtc.js\n * @since 2.0.0\n */\n\nimport { RecordEngine } from './record-engine';\nimport { isChrome } from '../utils/detect-browser';\nimport {IMAGE_ONLY, AUDIO_ONLY, VIDEO_ONLY, AUDIO_VIDEO, ANIMATION} from './record-mode';\n\nconst Component = videojs.getComponent('Component');\n\n/**\n * Engine used with the MRecordRTC class in the RecordRTC library.\n *\n * @class\n * @augments videojs.RecordEngine\n */\nclass RecordRTCEngine extends RecordEngine {\n\n    /**\n     * Setup recording engine.\n     */\n    setup(stream, mediaType, debug) {\n        this.inputStream = stream;\n        this.mediaType = mediaType;\n        this.debug = debug;\n\n        // setup RecordRTC\n        this.engine = new RecordRTC.MRecordRTC();\n        this.engine.mediaType = this.mediaType;\n        this.engine.disableLogs = !this.debug;\n        this.engine.mimeType = this.mimeType;\n\n        // audio settings\n        this.engine.bufferSize = this.bufferSize;\n        this.engine.sampleRate = this.sampleRate;\n        this.engine.numberOfAudioChannels = this.audioChannels;\n\n        // video/canvas settings\n        this.engine.video = this.video;\n        this.engine.canvas = this.canvas;\n\n        // animated gif settings\n        this.engine.quality = this.quality;\n        this.engine.frameRate = this.frameRate;\n        if (this.onTimeStamp !== undefined) {\n            this.engine.timeSlice = this.timeSlice;\n            this.engine.onTimeStamp = this.onTimeStamp;\n        }\n\n        // connect stream to recording engine\n        this.engine.addStream(this.inputStream);\n    }\n\n    /**\n     * Remove any temporary data and references to streams.\n     */\n    dispose() {\n        super.dispose();\n\n        if (typeof this.engine.destroy === 'function') {\n            this.engine.destroy();\n        }\n    }\n\n    /**\n     * Start recording.\n     */\n    start() {\n        this.engine.startRecording();\n    }\n\n    /**\n     * Stop recording. Result will be available async when onStopRecording\n     * is called.\n     */\n    stop() {\n        this.engine.stopRecording(this.onStopRecording.bind(this));\n    }\n\n    /**\n     * Pause recording.\n     */\n    pause() {\n        this.engine.pauseRecording();\n    }\n\n    /**\n     * Resume recording.\n     */\n    resume() {\n        this.engine.resumeRecording();\n    }\n\n    /**\n     * Show save as dialog in browser so the user can store the recorded media\n     * locally.\n     *\n     * @param {object} name - Object with names for the particular blob(s)\n     *     you want to save. File extensions are added automatically. For\n     *     example: {'video': 'name-of-video-file'}. Supported keys are\n     *     'audio', 'video' and 'gif'.\n     */\n    saveAs(name) {\n        if (this.engine && name !== undefined) {\n            this.engine.save(name);\n        }\n    }\n\n    /**\n     * Invoked when recording is stopped and resulting stream is available.\n     *\n     * @private\n     * @param {string} audioVideoURL - Reference to the recorded Blob\n     *     object, e.g. 'blob:http://localhost:8080/10100016-4248-9949-b0d6-0bb40db56eba'\n     * @param {string} type - Media type, eg. 'video' or 'audio'.\n     */\n    onStopRecording(audioVideoURL, type) {\n        // store reference to recorded stream URL\n        this.mediaURL = audioVideoURL;\n\n        // store reference to recorded stream data\n        let recordType = this.player().record().getRecordType();\n        this.engine.getBlob((recording) => {\n            switch (recordType) {\n                case AUDIO_ONLY:\n                    this.recordedData = recording.audio;\n\n                    this.addFileInfo(this.recordedData);\n\n                    // notify listeners\n                    this.trigger('recordComplete');\n                    break;\n\n                case VIDEO_ONLY:\n                case AUDIO_VIDEO:\n                    // when recording both audio and video, recordrtc\n                    // calls this twice on chrome, first with audio data\n                    // and then with video data.\n                    // on firefox it's called once but with a single\n                    // blob that includes both audio and video data.\n                    if (recording.video !== undefined) {\n                        // data is video-only but on firefox audio+video\n                        this.recordedData = recording.video;\n\n                        // on the chrome browser two blobs are created\n                        // containing the separate audio/video streams.\n                        if (recordType === AUDIO_VIDEO && isChrome()) {\n                            // store both audio and video\n                            this.recordedData = recording;\n\n                            for (let mtype in this.recordedData) {\n                                this.addFileInfo(this.recordedData[mtype]);\n                            }\n                        } else {\n                            this.addFileInfo(this.recordedData);\n                        }\n\n                        // notify listeners\n                        this.trigger('recordComplete');\n                    }\n                    break;\n\n                case ANIMATION:\n                    this.recordedData = recording.gif;\n\n                    this.addFileInfo(this.recordedData);\n\n                    // notify listeners\n                    this.trigger('recordComplete');\n                    break;\n            }\n        });\n    }\n}\n\n// expose plugin\nvideojs.RecordRTCEngine = RecordRTCEngine;\n\nComponent.registerComponent('RecordRTCEngine', RecordRTCEngine);\n\nexport default RecordRTCEngine;\n","/**\n * @file browser-shim.js\n * @since 2.0.0\n */\n\nconst setSrcObject = function (stream, element, ignoreCreateObjectURL) {\n    if ('createObjectURL' in URL && !ignoreCreateObjectURL) {\n        try {\n            element.src = URL.createObjectURL(stream);\n        } catch (e) {\n            setSrcObject(stream, element, true);\n            return;\n        }\n    } else if ('srcObject' in element) {\n        element.srcObject = stream;\n    } else if ('mozSrcObject' in element) {\n        element.mozSrcObject = stream;\n    } else {\n        console.log('createObjectURL/srcObject both are not supported.');\n    }\n};\n\nexport default setSrcObject;\n","/**\n * @file detect-browser.js\n * @since 2.0.0\n */\n\nimport window from 'global/window';\n\n/**\n * Browser detector.\n *\n * @private\n * @return {object} result containing browser, version and minVersion\n *     properties.\n */\nconst detectBrowser = function() {\n    // returned result object\n    let result = {};\n    result.browser = null;\n    result.version = null;\n    result.minVersion = null;\n\n    // fail early if it's not a browser\n    if (typeof window === 'undefined' || !window.navigator) {\n        result.browser = 'Not a supported browser.';\n        return result;\n    }\n\n    if (navigator.mozGetUserMedia) { // Firefox.\n        result.browser = 'firefox';\n        result.version = extractVersion(navigator.userAgent,\n            /Firefox\\/(\\d+)\\./, 1);\n        result.minVersion = 31;\n    } else if (navigator.webkitGetUserMedia) {\n        // Chrome, Chromium, Webview, Opera.\n        // Version matches Chrome/WebRTC version.\n        result.browser = 'chrome';\n        result.version = extractVersion(navigator.userAgent,\n            /Chrom(e|ium)\\/(\\d+)\\./, 2);\n        result.minVersion = 38;\n    } else if (navigator.mediaDevices &&\n               navigator.userAgent.match(/Edge\\/(\\d+).(\\d+)$/)) { // Edge.\n        result.browser = 'edge';\n        result.version = extractVersion(navigator.userAgent,\n            /Edge\\/(\\d+).(\\d+)$/, 2);\n        result.minVersion = 10547;\n    } else if (window.RTCPeerConnection &&\n        navigator.userAgent.match(/AppleWebKit\\/(\\d+)\\./)) { // Safari.\n        result.browser = 'safari';\n        result.version = extractVersion(navigator.userAgent,\n            /AppleWebKit\\/(\\d+)\\./, 1);\n    } else {\n        // Default fallthrough: not supported.\n        result.browser = 'Not a supported browser.';\n        return result;\n    }\n\n    return result;\n};\n\n/**\n * Extract browser version out of the provided user agent string.\n *\n * @private\n * @param {!string} uastring - userAgent string.\n * @param {!string} expr - Regular expression used as match criteria.\n * @param {!number} pos - position in the version string to be\n *     returned.\n * @return {!number} browser version.\n */\nconst extractVersion = function(uastring, expr, pos) {\n    let match = uastring.match(expr);\n    return match && match.length >= pos && parseInt(match[pos], 10);\n};\n\nconst isEdge = function() {\n    return detectBrowser().browser === 'edge';\n};\n\nconst isSafari = function() {\n    return detectBrowser().browser === 'safari';\n};\n\nconst isOpera = function() {\n    return !!window.opera || navigator.userAgent.indexOf('OPR/') !== -1;\n};\n\nconst isChrome = function() {\n    return detectBrowser().browser === 'chrome';\n};\n\nexport {\n    detectBrowser, isEdge, isOpera, isChrome, isSafari\n};\n","/**\n * @file format-time.js\n * @since 2.0.0\n */\n\n/**\n * Format seconds as a time string, H:MM:SS, M:SS or M:SS:MMM.\n *\n * Supplying a guide (in seconds) will force a number of leading zeros\n * to cover the length of the guide.\n *\n * @param {number} seconds - Number of seconds to be turned into a\n *     string.\n * @param {number} guide - Number (in seconds) to model the string\n *     after.\n * @param {number} msDisplayMax - Number (in milliseconds) to model the string\n *     after.\n * @return {string} Time formatted as H:MM:SS, M:SS or M:SS:MMM, e.g.\n *     0:00:12.\n * @private\n */\nconst formatTime = function(seconds, guide, msDisplayMax) {\n    // Default to using seconds as guide\n    seconds = seconds < 0 ? 0 : seconds;\n    guide = guide || seconds;\n    let s = Math.floor(seconds % 60),\n        m = Math.floor(seconds / 60 % 60),\n        h = Math.floor(seconds / 3600),\n        gm = Math.floor(guide / 60 % 60),\n        gh = Math.floor(guide / 3600),\n        ms = Math.floor((seconds - s) * 1000);\n\n    // handle invalid times\n    if (isNaN(seconds) || seconds === Infinity) {\n        // '-' is false for all relational operators (e.g. <, >=) so this\n        // setting will add the minimum number of fields specified by the\n        // guide\n        h = m = s = ms = '-';\n    }\n\n    // Check if we need to show milliseconds\n    if (guide > 0 && guide < msDisplayMax) {\n        if (ms < 100) {\n            if (ms < 10) {\n                ms = '00' + ms;\n            } else {\n                ms = '0' + ms;\n            }\n        }\n        ms = ':' + ms;\n    } else {\n        ms = '';\n    }\n\n    // Check if we need to show hours\n    h = (h > 0 || gh > 0) ? h + ':' : '';\n\n    // If hours are showing, we may need to add a leading zero.\n    // Always show at least one digit of minutes.\n    m = (((h || gm >= 10) && m < 10) ? '0' + m : m) + ':';\n\n    // Check if leading zero is need for seconds\n    s = ((s < 10) ? '0' + s : s);\n\n    return h + m + s + ms;\n};\n\nexport default formatTime;\n","/**\n * @file videojs.record.js\n *\n * The main file for the videojs-record project.\n * MIT license: https://github.com/collab-project/videojs-record/blob/master/LICENSE\n */\n\nimport AnimationDisplay from './controls/animation-display';\nimport RecordCanvas from './controls/record-canvas';\nimport DeviceButton from './controls/device-button';\nimport CameraButton from './controls/camera-button';\nimport RecordToggle from './controls/record-toggle';\nimport RecordIndicator from './controls/record-indicator';\n\nimport pluginDefaultOptions from './defaults';\nimport formatTime from './utils/format-time';\nimport setSrcObject from './utils/browser-shim';\nimport { detectBrowser, isChrome } from './utils/detect-browser';\n\nimport RecordRTCEngine from './engine/record-rtc';\nimport {RECORDRTC, LIBVORBISJS, RECORDERJS, LAMEJS, OPUSRECORDER} from './engine/record-engine';\nimport {IMAGE_ONLY, AUDIO_ONLY, VIDEO_ONLY, AUDIO_VIDEO, ANIMATION, getRecorderMode} from './engine/record-mode';\n\nimport videojs from 'video.js';\n\nconst Plugin = videojs.getPlugin('plugin');\nconst Player = videojs.getComponent('Player');\n\nconst AUTO = 'auto';\n\n\n// monkey-patch play (#152)\nPlayer.prototype.play = function play() {\n    let retval = this.techGet_('play');\n    // silence errors (unhandled promise from play)\n    if (retval !== undefined && typeof retval.then === 'function') {\n        retval.then(null, (e) => {});\n    }\n    return retval;\n};\n\n/**\n * Record audio/video/images using the Video.js player.\n *\n * @class\n * @augments videojs.Plugin\n */\nclass Record extends Plugin {\n    /**\n     * The constructor function for the class.\n     *\n     * @param {(videojs.Player|Object)} player\n     * @param {Object} options - Player options.\n     */\n    constructor(player, options) {\n        super(player, options);\n\n        // add plugin style\n        player.addClass('vjs-record');\n\n        // setup plugin options\n        this.loadOptions();\n\n        // (re)set recorder state\n        this.resetState();\n\n        // add device button with icon based on type\n        let deviceIcon = 'av-perm';\n        switch (this.getRecordType()) {\n            case IMAGE_ONLY:\n            case VIDEO_ONLY:\n            case ANIMATION:\n                deviceIcon = 'video-perm';\n                break;\n            case AUDIO_ONLY:\n                deviceIcon = 'audio-perm';\n                break;\n        }\n        DeviceButton.prototype.buildCSSClass = function() {\n            // use dynamic icon class\n            return 'vjs-record vjs-device-button vjs-control vjs-icon-' + deviceIcon;\n        };\n        player.deviceButton = new DeviceButton(player, options);\n        player.addChild(player.deviceButton);\n\n        // add blinking record indicator\n        player.recordIndicator = new RecordIndicator(player, options);\n        player.recordIndicator.hide();\n        player.addChild(player.recordIndicator);\n\n        // add canvas for recording and displaying image\n        player.recordCanvas = new RecordCanvas(player, options);\n        player.recordCanvas.hide();\n        player.addChild(player.recordCanvas);\n\n        // add image for animation display\n        player.animationDisplay = new AnimationDisplay(player, options);\n        player.animationDisplay.hide();\n        player.addChild(player.animationDisplay);\n\n        // add camera button\n        player.cameraButton = new CameraButton(player, options);\n        player.cameraButton.hide();\n\n        // add record toggle\n        player.recordToggle = new RecordToggle(player, options);\n        player.recordToggle.hide();\n\n        // wait until player ui is ready\n        this.player.one('ready', this.setupUI.bind(this));\n    }\n\n    /**\n     * Setup plugin options.\n     *\n     * @param {Object} options - Optional new player options.\n     */\n    loadOptions(newOptions = {}) {\n        let recordOptions = videojs.mergeOptions(pluginDefaultOptions,\n            this.player.options_.plugins.record, newOptions);\n\n        // record settings\n        this.recordImage = recordOptions.image;\n        this.recordAudio = recordOptions.audio;\n        this.recordVideo = recordOptions.video;\n        this.recordAnimation = recordOptions.animation;\n        this.maxLength = recordOptions.maxLength;\n        this.debug = recordOptions.debug;\n        this.recordTimeSlice = recordOptions.timeSlice;\n        this.autoMuteDevice = recordOptions.autoMuteDevice;\n\n        // video/canvas settings\n        this.videoFrameWidth = recordOptions.frameWidth;\n        this.videoFrameHeight = recordOptions.frameHeight;\n        this.videoRecorderType = recordOptions.videoRecorderType;\n        this.videoMimeType = recordOptions.videoMimeType;\n\n        // audio settings\n        this.audioEngine = recordOptions.audioEngine;\n        this.audioRecorderType = recordOptions.audioRecorderType;\n        this.audioWorkerURL = recordOptions.audioWorkerURL;\n        this.audioBufferSize = recordOptions.audioBufferSize;\n        this.audioSampleRate = recordOptions.audioSampleRate;\n        this.audioBitRate = recordOptions.audioBitRate;\n        this.audioChannels = recordOptions.audioChannels;\n        this.audioMimeType = recordOptions.audioMimeType;\n\n        // animation settings\n        this.animationFrameRate = recordOptions.animationFrameRate;\n        this.animationQuality = recordOptions.animationQuality;\n    }\n\n    /**\n     * Player UI is ready.\n     * @private\n     */\n    setupUI() {\n        // insert custom controls on left-side of controlbar\n        this.player.controlBar.addChild(this.player.cameraButton);\n        this.player.controlBar.el().insertBefore(\n            this.player.cameraButton.el(),\n            this.player.controlBar.el().firstChild);\n        this.player.controlBar.el().insertBefore(\n            this.player.recordToggle.el(),\n            this.player.controlBar.el().firstChild);\n\n        // get rid of unused controls\n        if (this.player.controlBar.remainingTimeDisplay !== undefined) {\n            this.player.controlBar.remainingTimeDisplay.el().style.display = 'none';\n        }\n        if (this.player.controlBar.liveDisplay !== undefined) {\n            this.player.controlBar.liveDisplay.el().style.display = 'none';\n        }\n\n        // loop feature is never used in this plugin\n        this.player.loop(false);\n\n        // tweak player UI based on type\n        switch (this.getRecordType()) {\n            case AUDIO_ONLY:\n                // reference to videojs-wavesurfer plugin\n                this.surfer = this.player.wavesurfer();\n                break;\n\n            case IMAGE_ONLY:\n            case VIDEO_ONLY:\n            case AUDIO_VIDEO:\n            case ANIMATION:\n                // customize controls\n                this.player.bigPlayButton.hide();\n\n                // loadedmetadata resets the durationDisplay for the\n                // first time\n                this.player.one('loadedmetadata', () => {\n                    // display max record time\n                    this.setDuration(this.maxLength);\n                });\n\n                // the native controls don't work for this UI so disable\n                // them no matter what\n                if (this.player.usingNativeControls_ === true) {\n                    if (this.player.tech_.el_ !== undefined) {\n                        this.player.tech_.el_.controls = false;\n                    }\n                }\n\n                // clicking or tapping the player video element should not try\n                // to start playback\n                this.player.removeTechControlsListeners_();\n\n                if (this.player.options_.controls) {\n                    // progress control isn't used by this plugin\n                    this.player.controlBar.progressControl.hide();\n\n                    // prevent controlbar fadeout\n                    this.player.on('userinactive', (event) => {\n                        this.player.userActive(true);\n                    });\n\n                    // videojs automatically hides the controls when no valid 'source'\n                    // element is included in the video or audio tag. Don't. Ever again.\n                    this.player.controlBar.show();\n                    this.player.controlBar.el().style.display = 'flex';\n                }\n                break;\n        }\n\n        // disable time display events that constantly try to reset the current time\n        // and duration values\n        this.player.off('timeupdate');\n        this.player.off('durationchange');\n        this.player.off('loadedmetadata');\n\n        // display max record time\n        this.setDuration(this.maxLength);\n\n        // hide play control\n        this.player.controlBar.playToggle.hide();\n    }\n\n    /**\n     * Indicates whether the plugin is currently recording or not.\n     *\n     * @return {boolean} Plugin currently recording or not.\n     */\n    isRecording() {\n        return this._recording;\n    }\n\n    /**\n     * Indicates whether the plugin is currently processing recorded data\n     * or not.\n     *\n     * @return {boolean} Plugin processing or not.\n     */\n    isProcessing() {\n        return this._processing;\n    }\n\n    /**\n     * Indicates whether the plugin is destroyed or not.\n     *\n     * @return {boolean} Plugin destroyed or not.\n     */\n    isDestroyed() {\n        return this.player && (this.player.children() === null);\n    }\n\n    /**\n     * Open the browser's recording device selection dialog.\n     */\n    getDevice() {\n        // define device callbacks once\n        if (this.deviceReadyCallback === undefined) {\n            this.deviceReadyCallback = this.onDeviceReady.bind(this);\n        }\n        if (this.deviceErrorCallback === undefined) {\n            this.deviceErrorCallback = this.onDeviceError.bind(this);\n        }\n        if (this.engineStopCallback === undefined) {\n            this.engineStopCallback = this.onRecordComplete.bind(this);\n        }\n        // ask the browser to give the user access to the media device\n        // and get a stream reference in the callback function\n        switch (this.getRecordType()) {\n            case AUDIO_ONLY:\n                // setup microphone\n                this.mediaType = {\n                    audio: (this.audioRecorderType === AUTO) ? true : this.audioRecorderType,\n                    video: false\n                };\n                // remove existing microphone listeners\n                this.surfer.surfer.microphone.un('deviceReady',\n                    this.deviceReadyCallback);\n                this.surfer.surfer.microphone.un('deviceError',\n                    this.deviceErrorCallback);\n\n                // setup new microphone listeners\n                this.surfer.surfer.microphone.on('deviceReady',\n                    this.deviceReadyCallback);\n                this.surfer.surfer.microphone.on('deviceError',\n                    this.deviceErrorCallback);\n\n                // disable existing playback events\n                this.surfer.setupPlaybackEvents(false);\n\n                // (re)set surfer liveMode\n                this.surfer.liveMode = true;\n                this.surfer.surfer.microphone.paused = false;\n\n                // open browser device selection dialog\n                this.surfer.surfer.microphone.start();\n                break;\n\n            case IMAGE_ONLY:\n            case VIDEO_ONLY:\n                // setup camera\n                this.mediaType = {\n                    audio: false,\n                    video: (this.videoRecorderType === AUTO) ? true : this.videoRecorderType\n                };\n                navigator.mediaDevices.getUserMedia({\n                    audio: false,\n                    video: (this.getRecordType() === IMAGE_ONLY) ? this.recordImage : this.recordVideo\n                }).then(\n                    this.onDeviceReady.bind(this)\n                ).catch(\n                    this.onDeviceError.bind(this)\n                );\n                break;\n\n            case AUDIO_VIDEO:\n                // setup camera and microphone\n                this.mediaType = {\n                    audio: (this.audioRecorderType === AUTO) ? true : this.audioRecorderType,\n                    video: (this.videoRecorderType === AUTO) ? true : this.videoRecorderType\n                };\n                navigator.mediaDevices.getUserMedia({\n                    audio: this.recordAudio,\n                    video: this.recordVideo\n                }).then(\n                    this.onDeviceReady.bind(this)\n                ).catch(\n                    this.onDeviceError.bind(this)\n                );\n                break;\n\n            case ANIMATION:\n                // setup camera\n                this.mediaType = {\n                    // animated GIF\n                    audio: false,\n                    video: false,\n                    gif: true\n                };\n                navigator.mediaDevices.getUserMedia({\n                    audio: false,\n                    video: this.recordAnimation\n                }).then(\n                    this.onDeviceReady.bind(this)\n                ).catch(\n                    this.onDeviceError.bind(this)\n                );\n                break;\n        }\n    }\n\n    /**\n     * Invoked when the device is ready.\n     * @private\n     * @param stream: LocalMediaStream instance.\n     */\n    onDeviceReady(stream) {\n        this._deviceActive = true;\n\n        // store reference to stream for stopping etc.\n        this.stream = stream;\n\n        // hide device selection button\n        this.player.deviceButton.hide();\n\n        // reset time (e.g. when stopDevice was used)\n        this.setDuration(this.maxLength);\n        this.setCurrentTime(0);\n\n        // hide play/pause control (e.g. when stopDevice was used)\n        this.player.controlBar.playToggle.hide();\n\n        // reset playback listeners\n        this.off(this.player, 'timeupdate', this.playbackTimeUpdate);\n        this.off(this.player, 'ended', this.playbackTimeUpdate);\n\n        // setup recording engine\n        if (this.getRecordType() !== IMAGE_ONLY) {\n            // currently libvorbis.js, recorder.js, opus-recorder and lamejs\n            // are only supported in audio-only mode\n            if (this.getRecordType() !== AUDIO_ONLY &&\n                (this.audioEngine === LIBVORBISJS ||\n                 this.audioEngine === RECORDERJS ||\n                 this.audioEngine === LAMEJS ||\n                 this.audioEngine === OPUSRECORDER)) {\n                throw new Error('Currently ' + this.audioEngine +\n                    ' is only supported in audio-only mode.');\n            }\n\n            // get recorder class\n            var EngineClass;\n            switch (this.audioEngine) {\n                case RECORDRTC:\n                    // RecordRTC.js (default)\n                    EngineClass = RecordRTCEngine;\n                    break;\n\n                case LIBVORBISJS:\n                    // libvorbis.js\n                    EngineClass = videojs.LibVorbisEngine;\n                    break;\n\n                case RECORDERJS:\n                    // recorder.js\n                    EngineClass = videojs.RecorderjsEngine;\n                    break;\n\n                case LAMEJS:\n                    // lamejs\n                    EngineClass = videojs.LamejsEngine;\n                    break;\n\n                case OPUSRECORDER:\n                    // opus-recorder\n                    EngineClass = videojs.OpusRecorderEngine;\n                    break;\n\n                default:\n                    // unknown engine\n                    throw new Error('Unknown audioEngine: ' + this.audioEngine);\n            }\n            try {\n                // connect stream to recording engine\n                this.engine = new EngineClass(this.player, this.player.options_);\n            } catch (err) {\n                console.error(err);\n                throw new Error('Could not load ' + this.audioEngine +\n                    ' plugin');\n            }\n\n            // listen for events\n            this.engine.on('recordComplete', this.engineStopCallback);\n\n            // audio settings\n            this.engine.bufferSize = this.audioBufferSize;\n            this.engine.sampleRate = this.audioSampleRate;\n            this.engine.bitRate = this.audioBitRate;\n            this.engine.audioChannels = this.audioChannels;\n            this.engine.audioWorkerURL = this.audioWorkerURL;\n\n            // mime type\n            this.engine.mimeType = {\n                video: this.videoMimeType,\n                gif: 'image/gif'\n            };\n            if (this.audioMimeType !== null &&\n                this.audioMimeType !== AUTO) {\n                this.engine.mimeType.audio = this.audioMimeType;\n            }\n\n            // video/canvas settings\n            this.engine.video = {\n                width: this.videoFrameWidth,\n                height: this.videoFrameHeight\n            };\n            this.engine.canvas = {\n                width: this.videoFrameWidth,\n                height: this.videoFrameHeight\n            };\n\n            // animated GIF settings\n            this.engine.quality = this.animationQuality;\n            this.engine.frameRate = this.animationFrameRate;\n\n            // timeSlice\n            if (this.recordTimeSlice && this.recordTimeSlice > 0) {\n                this.engine.timeSlice = this.recordTimeSlice;\n                this.engine.onTimeStamp = this.onTimeStamp.bind(this);\n            }\n\n            // initialize recorder\n            this.engine.setup(this.stream, this.mediaType, this.debug);\n\n            // show elements that should never be hidden in animation,\n            // audio and/or video modus\n            let uiElements = [\n                this.player.controlBar.currentTimeDisplay,\n                this.player.controlBar.timeDivider,\n                this.player.controlBar.durationDisplay\n            ];\n            uiElements.forEach((element) => {\n                if (element !== undefined) {\n                    element.el().style.display = 'block';\n                    element.show();\n                }\n            });\n\n            // show record button\n            this.player.recordToggle.show();\n        } else {\n            // disable record indicator\n            this.player.recordIndicator.disable();\n\n            // setup UI for retrying snapshot (e.g. when stopDevice was\n            // used)\n            this.retrySnapshot();\n\n            // reset and show camera button\n            this.player.cameraButton.onStop();\n            this.player.cameraButton.show();\n        }\n\n        // setup preview\n        if (this.getRecordType() !== AUDIO_ONLY) {\n            // show live preview\n            this.mediaElement = this.player.el().firstChild;\n            this.mediaElement.controls = false;\n\n            // mute incoming audio for feedback loops\n            this.mediaElement.muted = true;\n\n            // hide the volume bar while it's muted\n            this.displayVolumeControl(false);\n\n            // load stream\n            this.load(this.stream);\n\n            // stream loading is async, so we wait until it's ready to play\n            // the stream\n            this.player.one('loadedmetadata', () => {\n                // start stream\n                this.mediaElement.play();\n\n                // forward to listeners\n                this.player.trigger('deviceReady');\n            });\n        } else {\n            // forward to listeners\n            this.player.trigger('deviceReady');\n        }\n    }\n\n    /**\n     * Invoked when an device error occurred.\n     * @private\n     */\n    onDeviceError(code) {\n        this._deviceActive = false;\n\n        // store code\n        this.player.deviceErrorCode = code;\n\n        // forward error to player\n        this.player.trigger('deviceError');\n    }\n\n    /**\n     * Start recording.\n     */\n    start() {\n        if (!this.isProcessing()) {\n            this._recording = true;\n\n            // hide play/pause control\n            this.player.controlBar.playToggle.hide();\n\n            // reset playback listeners\n            this.off(this.player, 'timeupdate', this.playbackTimeUpdate);\n            this.off(this.player, 'ended', this.playbackTimeUpdate);\n\n            // start preview\n            switch (this.getRecordType()) {\n                case AUDIO_ONLY:\n                    // disable playback events\n                    this.surfer.setupPlaybackEvents(false);\n\n                    // start/resume live audio visualization\n                    this.surfer.surfer.microphone.paused = false;\n                    this.surfer.liveMode = true;\n                    this.surfer.surfer.microphone.play();\n                    break;\n\n                case VIDEO_ONLY:\n                case AUDIO_VIDEO:\n                    // preview video stream in video element\n                    this.startVideoPreview();\n                    break;\n\n                case ANIMATION:\n                    // hide the first frame\n                    this.player.recordCanvas.hide();\n\n                    // hide the animation\n                    this.player.animationDisplay.hide();\n\n                    // show preview video\n                    this.mediaElement.style.display = 'block';\n\n                    // for animations, capture the first frame\n                    // that can be displayed as soon as recording\n                    // is complete\n                    this.captureFrame().then((result) => {\n                        // start video preview **after** capturing first frame\n                        this.startVideoPreview();\n                    });\n                    break;\n            }\n\n            if (this.autoMuteDevice) {\n                // unmute device\n                this.muteTracks(false);\n            }\n\n            // start recording\n            switch (this.getRecordType()) {\n                case IMAGE_ONLY:\n                    // create snapshot\n                    this.createSnapshot();\n\n                    // notify UI\n                    this.player.trigger('startRecord');\n                    break;\n\n                case VIDEO_ONLY:\n                case AUDIO_VIDEO:\n                case ANIMATION:\n                    // wait for media stream on video element to actually load\n                    this.player.one('loadedmetadata', () => {\n                        // start actually recording process\n                        this.startRecording();\n                    });\n                    break;\n\n                default:\n                    // all resources have already loaded, so we can start\n                    // recording right away\n                    this.startRecording();\n            }\n        }\n    }\n\n    /**\n     * Start recording.\n     * @private\n     */\n    startRecording() {\n        // register starting point\n        this.paused = false;\n        this.pauseTime = this.pausedTime = 0;\n        this.startTime = new Date().getTime();\n\n        // start countdown\n        this.countDown = this.player.setInterval(\n            this.onCountDown.bind(this), 100);\n\n        // cleanup previous recording\n        if (this.engine !== undefined) {\n            this.engine.dispose();\n        }\n\n        // start recording stream\n        this.engine.start();\n\n        // notify UI\n        this.player.trigger('startRecord');\n    }\n\n    /**\n     * Stop recording.\n     */\n    stop() {\n        if (!this.isProcessing()) {\n            this._recording = false;\n            this._processing = true;\n\n            if (this.getRecordType() !== IMAGE_ONLY) {\n                // notify UI\n                this.player.trigger('stopRecord');\n\n                // stop countdown\n                this.player.clearInterval(this.countDown);\n\n                // stop recording stream (result will be available async)\n                if (this.engine) {\n                    this.engine.stop();\n                }\n\n                if (this.autoMuteDevice) {\n                    // mute device\n                    this.muteTracks(true);\n                }\n            } else {\n                if (this.player.recordedData) {\n                    // notify listeners that image data is (already) available\n                    this.player.trigger('finishRecord');\n                }\n            }\n        }\n    }\n\n    /**\n     * Stop device(s) and recording if active.\n     */\n    stopDevice() {\n        if (this.isRecording()) {\n            // stop stream once recorded data is available,\n            // otherwise it'll break recording\n            this.player.one('finishRecord', this.stopStream.bind(this));\n\n            // stop recording\n            this.stop();\n        } else {\n            // stop stream now, since there's no recorded data available\n            this.stopStream();\n        }\n    }\n\n    /**\n     * Stop stream and device.\n     */\n    stopStream() {\n        // stop stream and device\n        if (this.stream) {\n            this._deviceActive = false;\n\n            if (this.getRecordType() === AUDIO_ONLY) {\n                // make the microphone plugin stop it's device\n                this.surfer.surfer.microphone.stopDevice();\n                return;\n            }\n            this.stream.getTracks().forEach((stream) => {\n                stream.stop();\n            });\n        }\n    }\n\n    /**\n     * Pause recording.\n     */\n    pause() {\n        if (!this.paused) {\n            this.pauseTime = new Date().getTime();\n            this.paused = true;\n\n            this.engine.pause();\n        }\n    }\n\n    /**\n     * Resume recording.\n     */\n    resume() {\n        if (this.paused) {\n            this.pausedTime += new Date().getTime() - this.pauseTime;\n\n            this.engine.resume();\n            this.paused = false;\n        }\n    }\n\n    /**\n     * Invoked when recording completed and the resulting stream is\n     * available.\n     * @private\n     */\n    onRecordComplete() {\n        // store reference to recorded stream data\n        this.player.recordedData = this.engine.recordedData;\n\n        // change the replay button back to a play button\n        this.player.controlBar.playToggle.removeClass('vjs-ended');\n        this.player.controlBar.playToggle.show();\n\n        // notify listeners that data is available\n        this.player.trigger('finishRecord');\n\n        switch (this.getRecordType()) {\n            case AUDIO_ONLY:\n                // pause player so user can start playback\n                this.surfer.pause();\n\n                // setup events for playback\n                this.surfer.setupPlaybackEvents(true);\n\n                // display loader\n                this.player.loadingSpinner.show();\n\n                // restore interaction with controls after waveform\n                // rendering is complete\n                this.surfer.surfer.once('ready', () => {\n                    this._processing = false;\n                });\n\n                // visualize recorded stream\n                this.load(this.player.recordedData);\n                break;\n\n            case VIDEO_ONLY:\n            case AUDIO_VIDEO:\n                // pausing the player so we can visualize the recorded data\n                // will trigger an async video.js 'pause' event that we\n                // have to wait for.\n                this.player.one('pause', () => {\n                    // video data is ready\n                    this._processing = false;\n\n                    // hide loader\n                    this.player.loadingSpinner.hide();\n\n                    // show stream total duration\n                    this.setDuration(this.streamDuration);\n\n                    // update time during playback and at end\n                    this.on(this.player, 'timeupdate',\n                        this.playbackTimeUpdate);\n                    this.on(this.player, 'ended',\n                        this.playbackTimeUpdate);\n\n                    // unmute local audio during playback\n                    if (this.getRecordType() === AUDIO_VIDEO) {\n                        this.mediaElement.muted = false;\n\n                        // show the volume bar when it's unmuted\n                        this.displayVolumeControl(true);\n                    }\n\n                    // load recorded media\n                    if (isChrome() && this.getRecordType() === AUDIO_VIDEO) {\n                        // use video property on Chrome\n                        this.load(this.player.recordedData.video);\n                    } else {\n                        this.load(this.player.recordedData);\n                    }\n                });\n\n                // pause player so user can start playback\n                this.player.pause();\n                break;\n\n            case ANIMATION:\n                // animation data is ready\n                this._processing = false;\n\n                // hide loader\n                this.player.loadingSpinner.hide();\n\n                // show animation total duration\n                this.setDuration(this.streamDuration);\n\n                // hide preview video\n                this.mediaElement.style.display = 'none';\n\n                // show the first frame\n                this.player.recordCanvas.show();\n\n                // pause player so user can start playback\n                this.player.pause();\n\n                // show animation on play\n                this.on(this.player, 'play', this.showAnimation);\n\n                // hide animation on pause\n                this.on(this.player, 'pause', this.hideAnimation);\n                break;\n        }\n    }\n\n    /**\n     * Invoked during recording and displays the remaining time.\n     * @private\n     */\n    onCountDown() {\n        if (!this.paused) {\n            var now = new Date().getTime();\n            var duration = this.maxLength;\n            var currentTime = (now - (this.startTime + this.pausedTime)) / 1000;\n\n            this.streamDuration = currentTime;\n\n            if (currentTime >= duration) {\n                // at the end\n                currentTime = duration;\n\n                // stop recording\n                this.stop();\n            }\n\n            // update duration\n            this.setDuration(duration);\n\n            // update current time\n            this.setCurrentTime(currentTime, duration);\n\n            // notify listeners\n            this.player.trigger('progressRecord');\n        }\n    }\n\n    /**\n     * Get the current time of the recorded stream during playback.\n     *\n     * Returns 0 if no recording is available (yet).\n     */\n    getCurrentTime() {\n        let currentTime = isNaN(this.streamCurrentTime) ? 0 : this.streamCurrentTime;\n\n        if (this.getRecordType() === AUDIO_ONLY) {\n            currentTime = this.surfer.getCurrentTime();\n        }\n\n        return currentTime;\n    }\n\n    /**\n     * Updates the player's element displaying the current time.\n     *\n     * @private\n     * @param {number} [currentTime=0] - Current position of the\n     *    playhead (in seconds).\n     * @param {number} [duration=0] - Duration in seconds.\n     */\n    setCurrentTime(currentTime, duration) {\n        currentTime = isNaN(currentTime) ? 0 : currentTime;\n        duration = isNaN(duration) ? 0 : duration;\n\n        switch (this.getRecordType()) {\n            case AUDIO_ONLY:\n                this.surfer.setCurrentTime(currentTime, duration);\n                break;\n\n            case VIDEO_ONLY:\n            case AUDIO_VIDEO:\n            case ANIMATION:\n                this.streamCurrentTime = Math.min(currentTime, duration);\n\n                // update current time display component\n                this.player.controlBar.currentTimeDisplay.formattedTime_ =\n                   this.player.controlBar.currentTimeDisplay.contentEl().lastChild.textContent =\n                       formatTime(this.streamCurrentTime, duration, this.msDisplayMax);\n                break;\n        }\n    }\n\n    /**\n     * Get the length of the recorded stream in seconds.\n     *\n     * Returns 0 if no recording is available (yet).\n     */\n    getDuration() {\n        let duration = isNaN(this.streamDuration) ? 0 : this.streamDuration;\n\n        return duration;\n    }\n\n    /**\n     * Updates the player's element displaying the duration time.\n     *\n     * @param {number} [duration=0] - Duration in seconds.\n     * @private\n     */\n    setDuration(duration) {\n        duration = isNaN(duration) ? 0 : duration;\n\n        switch (this.getRecordType()) {\n            case AUDIO_ONLY:\n                this.surfer.setDuration(duration);\n                break;\n\n            case VIDEO_ONLY:\n            case AUDIO_VIDEO:\n            case ANIMATION:\n                // update duration display component\n                this.player.controlBar.durationDisplay.formattedTime_ =\n                    this.player.controlBar.durationDisplay.contentEl().lastChild.textContent =\n                        formatTime(duration, duration, this.msDisplayMax);\n                break;\n        }\n    }\n\n    /**\n     * Start loading data.\n     *\n     * @param {(string|blob|file)} url - Either the URL of the media file,\n     *     a Blob, a File object or MediaStream.\n     */\n    load(url) {\n        switch (this.getRecordType()) {\n            case AUDIO_ONLY:\n                // visualize recorded Blob stream\n                this.surfer.load(url);\n                break;\n\n            case IMAGE_ONLY:\n            case VIDEO_ONLY:\n            case AUDIO_VIDEO:\n            case ANIMATION:\n                if (url instanceof Blob || url instanceof File) {\n                    // assign blob using createObjectURL\n                    setSrcObject(url, this.mediaElement, false);\n                } else {\n                    // assign stream without createObjectURL\n                    setSrcObject(url, this.mediaElement, true);\n                }\n                break;\n        }\n    }\n\n    /**\n     * Show save as dialog in browser so the user can store the recorded media\n     * locally.\n     *\n     * @param {object} name - Object with one or more names for the particular\n     *     blob(s) you want to save. File extensions are added automatically.\n     *     For example: {'video': 'name-of-video-file'}. Supported keys are\n     *     'audio', 'video' and 'gif'.\n     */\n    saveAs(name) {\n        if (this.engine && name !== undefined) {\n            this.engine.saveAs(name);\n        }\n    }\n\n    /**\n     * Destroy plugin only.\n     *\n     * Use `destroy` to remove the plugin and the player.\n     */\n    dispose() {\n        // disable common event listeners\n        this.player.off('ready');\n        this.player.off('userinactive');\n        this.player.off('loadedmetadata');\n\n        // prevent callbacks if recording is in progress\n        if (this.engine) {\n            this.engine.dispose();\n            this.engine.off('recordComplete', this.engineStopCallback);\n        }\n\n        // stop recording and device\n        this.stop();\n        this.stopDevice();\n\n        // stop countdown\n        this.player.clearInterval(this.countDown);\n\n        // dispose wavesurfer.js\n        if (this.getRecordType() == AUDIO_ONLY) {\n            if (this.surfer) {\n                // also disposes player\n                this.surfer.destroy();\n            }\n        }\n\n        this.resetState();\n\n        super.dispose();\n    }\n\n    /**\n     * Destroy plugin and players and cleanup resources.\n     */\n    destroy() {\n        this.player.dispose();\n    }\n\n    /**\n     * Reset the plugin.\n     */\n    reset() {\n        // prevent callbacks if recording is in progress\n        if (this.engine) {\n            this.engine.dispose();\n            this.engine.off('recordComplete', this.engineStopCallback);\n        }\n\n        // stop recording and device\n        this.stop();\n        this.stopDevice();\n\n        // stop countdown\n        this.player.clearInterval(this.countDown);\n\n        // reset options\n        this.loadOptions();\n\n        // reset recorder state\n        this.resetState();\n\n        // reset record time\n        this.setDuration(this.maxLength);\n        this.setCurrentTime(0);\n\n        // reset player\n        this.player.reset();\n        switch (this.getRecordType()) {\n            case AUDIO_ONLY:\n                if (this.surfer && this.surfer.surfer) {\n                    // empty last frame\n                    this.surfer.surfer.empty();\n                }\n                break;\n\n            case IMAGE_ONLY:\n            case ANIMATION:\n                // reset UI\n                this.player.recordCanvas.hide();\n                this.player.cameraButton.hide();\n                break;\n        }\n\n        // hide play control\n        this.player.controlBar.playToggle.hide();\n\n        // show device selection button\n        this.player.deviceButton.show();\n\n        // hide record button\n        this.player.recordToggle.hide();\n\n        // loadedmetadata resets the durationDisplay for the\n        // first time\n        this.player.one('loadedmetadata', () => {\n            // display max record time\n            this.setDuration(this.maxLength);\n        });\n    }\n\n    /**\n     * Reset the plugin recorder state.\n     * @private\n     */\n    resetState() {\n        this._recording = false;\n        this._processing = false;\n        this._deviceActive = false;\n        this.devices = [];\n    }\n\n    /**\n     * Mute LocalMediaStream audio and video tracks.\n     */\n    muteTracks(mute) {\n        if ((this.getRecordType() === AUDIO_ONLY ||\n            this.getRecordType() === AUDIO_VIDEO) &&\n            this.stream.getAudioTracks().length > 0) {\n            this.stream.getAudioTracks()[0].enabled = !mute;\n        }\n\n        if (this.getRecordType() !== AUDIO_ONLY &&\n            this.stream.getVideoTracks().length > 0) {\n            this.stream.getVideoTracks()[0].enabled = !mute;\n        }\n    }\n\n    /**\n     * Get recorder type.\n     */\n    getRecordType() {\n        return getRecorderMode(this.recordImage, this.recordAudio,\n            this.recordVideo, this.recordAnimation);\n    }\n\n    /**\n     * Create and display snapshot image.\n     * @private\n     */\n    createSnapshot() {\n        this.captureFrame().then((result) => {\n            // turn the canvas data into base64 data with a PNG header\n            this.player.recordedData = result.toDataURL('image/png');\n\n            // hide preview video\n            this.mediaElement.style.display = 'none';\n\n            // show the snapshot\n            this.player.recordCanvas.show();\n\n            // stop recording\n            this.stop();\n        });\n    }\n\n    /**\n     * Reset UI for retrying a snapshot image.\n     * @private\n     */\n    retrySnapshot() {\n        this._processing = false;\n\n        // retry: hide the snapshot\n        this.player.recordCanvas.hide();\n\n        // show preview video\n        this.player.el().firstChild.style.display = 'block';\n    }\n\n    /**\n     * Capture frame from camera and copy data to canvas.\n     * @private\n     */\n    captureFrame() {\n        var detected = detectBrowser();\n        var recordCanvas = this.player.recordCanvas.el().firstChild;\n\n        // set the canvas size to the dimensions of the camera,\n        // which also wipes the content of the canvas\n        recordCanvas.width = this.player.width();\n        recordCanvas.height = this.player.height();\n\n        return new Promise((resolve, reject) => {\n            // MediaCapture is only supported on:\n            // - Chrome 60 and newer (see\n            // https://github.com/w3c/mediacapture-image/blob/gh-pages/implementation-status.md)\n            // - Firefox behind flag (https://bugzilla.mozilla.org/show_bug.cgi?id=888177)\n            //\n            // importing ImageCapture can fail when enabling chrome flag is still required.\n            // if so; ignore and continue\n            if ((detected.browser === 'chrome' && detected.version >= 60) &&\n               (typeof ImageCapture === typeof Function)) {\n                try {\n                    var track = this.stream.getVideoTracks()[0];\n                    var imageCapture = new ImageCapture(track);\n                    // take picture\n                    imageCapture.grabFrame().then((imageBitmap) => {\n                        // get a frame and copy it onto the canvas\n                        this.drawCanvas(recordCanvas, imageBitmap);\n\n                        // notify others\n                        resolve(recordCanvas);\n                    }).catch((error) => {\n                        // ignore, try oldskool\n                    });\n                } catch (err) {}\n            }\n            // no ImageCapture available: do it the oldskool way\n\n            // get a frame and copy it onto the canvas\n            this.drawCanvas(recordCanvas, this.mediaElement);\n\n            // notify others\n            resolve(recordCanvas);\n        });\n    }\n\n    /**\n     * Draw image frame on canvas element.\n     * @private\n     */\n    drawCanvas(canvas, element) {\n        canvas.getContext('2d').drawImage(\n            element, 0, 0,\n            canvas.width,\n            canvas.height\n        );\n    }\n\n    /**\n     * Start preview of video stream.\n     * @private\n     */\n    startVideoPreview() {\n        // disable playback events\n        this.off('timeupdate');\n        this.off('durationchange');\n        this.off('loadedmetadata');\n        this.off('play');\n\n        // mute local audio\n        this.mediaElement.muted = true;\n\n        // hide volume control to prevent feedback\n        this.displayVolumeControl(false);\n\n        // start or resume live preview\n        this.load(this.stream);\n        this.mediaElement.play();\n    }\n\n    /**\n     * Show animated GIF.\n     * @private\n     */\n    showAnimation() {\n        var animationDisplay = this.player.animationDisplay.el().firstChild;\n\n        // set the image size to the dimensions of the recorded animation\n        animationDisplay.width = this.player.width();\n        animationDisplay.height = this.player.height();\n\n        // hide the first frame\n        this.player.recordCanvas.hide();\n\n        // show the animation\n        setSrcObject(this.player.recordedData, animationDisplay, false);\n        this.player.animationDisplay.show();\n    }\n\n    /**\n     * Hide animated GIF.\n     * @private\n     */\n    hideAnimation() {\n        // show the first frame\n        this.player.recordCanvas.show();\n\n        // hide the animation\n        this.player.animationDisplay.hide();\n    }\n\n    /**\n     * Update time during playback.\n     * @private\n     */\n    playbackTimeUpdate() {\n        this.setCurrentTime(this.player.currentTime(),\n            this.streamDuration);\n    }\n\n    /**\n     * Received new timestamp (when timeSlice option is enabled).\n     * @private\n     */\n    onTimeStamp(current, all) {\n        this.player.currentTimestamp = current;\n        this.player.allTimestamps = all;\n\n        // get blob (only for MediaStreamRecorder)\n        var internal;\n        switch (this.getRecordType()) {\n            case AUDIO_ONLY:\n                internal = this.engine.engine.audioRecorder;\n                break;\n\n            case ANIMATION:\n                internal = this.engine.engine.gifRecorder;\n                break;\n\n            default:\n                internal = this.engine.engine.videoRecorder;\n        }\n        internal = internal.getInternalRecorder();\n        if ((internal instanceof MediaStreamRecorder) === true) {\n            this.player.recordedData = internal.getArrayOfBlobs();\n\n            // inject file info for newest blob\n            this.engine.addFileInfo(\n                this.player.recordedData[this.player.recordedData.length - 1]);\n        }\n\n        // notify others\n        this.player.trigger('timestamp');\n    }\n\n    /**\n     * Collects information about the media input and output devices\n     * available on the system.\n     *\n     * Returns an array.\n     */\n    enumerateDevices() {\n        if (!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) {\n            this.player.enumerateErrorCode = 'enumerateDevices() not supported.';\n            this.player.trigger('enumerateError');\n            return;\n        }\n\n        // List cameras and microphones.\n        navigator.mediaDevices.enumerateDevices(this).then((devices) => {\n            this.devices = [];\n            devices.forEach((device) => {\n                this.devices.push(device);\n            });\n\n            // notify listeners\n            this.player.trigger('enumerateReady');\n        }).catch((err) => {\n            this.player.enumerateErrorCode = err;\n            this.player.trigger('enumerateError');\n        });\n    }\n\n    /**\n     * Change the audio output device.\n     *\n     * @param {string} deviceId - Id of audio output device.\n     */\n    setAudioOutput(deviceId) {\n        let errorMessage;\n\n        switch (this.getRecordType()) {\n            case AUDIO_ONLY:\n                // use wavesurfer\n                this.surfer.surfer.setSinkId(deviceId).then((result) => {\n                    // notify listeners\n                    this.player.trigger('audioOutputReady');\n                    return;\n                }).catch((err) => {\n                    errorMessage = err;\n                });\n                break;\n\n            default:\n                let element = player.tech_.el_;\n                if (deviceId) {\n                    if (typeof element.sinkId !== 'undefined') {\n                        element.setSinkId(deviceId).then((result) => {\n                            // notify listeners\n                            this.player.trigger('audioOutputReady');\n                            return;\n                        }).catch((err) => {\n                            errorMessage = err;\n                        });\n                    } else {\n                        errorMessage = 'Browser does not support audio output device selection.';\n                    }\n                } else {\n                    errorMessage = 'Invalid deviceId: ' + deviceId;\n                }\n                break;\n        }\n\n        // error if we get here: notify listeners\n        this.player.trigger('error', errorMessage);\n    }\n\n    /**\n     * Show or hide the volume menu.\n     *\n     * @private\n     * @param {boolean} display - Hide/show volume control.\n     */\n    displayVolumeControl(display) {\n        if (this.player.controlBar.volumePanel !== undefined) {\n            if (display === true) {\n                display = 'flex';\n            } else {\n                display = 'none';\n            }\n            this.player.controlBar.volumePanel.el().style.display = display;\n        }\n    }\n}\n\n// version nr is injected during build\nRecord.VERSION = __VERSION__;\n\n// register plugin\nvideojs.Record = Record;\nif (videojs.getPlugin('record') === undefined) {\n    videojs.registerPlugin('record', Record);\n}\n\n// export plugin\nmodule.exports = {\n    Record\n};\n","module.exports = __WEBPACK_EXTERNAL_MODULE_video_js__;"],"sourceRoot":""}