dashjs
Version:
A reference client implementation for the playback of MPEG DASH via Javascript and compliant browsers.
634 lines (618 loc) • 71.9 kB
JavaScript
'use strict';Object.defineProperty(exports,"__esModule",{value:true});var _cea608Parser=require('../../externals/cea608-parser');var _cea608Parser2=_interopRequireDefault(_cea608Parser);var _Constants=require('./constants/Constants');var _Constants2=_interopRequireDefault(_Constants);var _MetricsConstants=require('./constants/MetricsConstants');var _MetricsConstants2=_interopRequireDefault(_MetricsConstants);var _PlaybackController=require('./controllers/PlaybackController');var _PlaybackController2=_interopRequireDefault(_PlaybackController);var _StreamController=require('./controllers/StreamController');var _StreamController2=_interopRequireDefault(_StreamController);var _MediaController=require('./controllers/MediaController');var _MediaController2=_interopRequireDefault(_MediaController);var _BaseURLController=require('./controllers/BaseURLController');var _BaseURLController2=_interopRequireDefault(_BaseURLController);var _ManifestLoader=require('./ManifestLoader');var _ManifestLoader2=_interopRequireDefault(_ManifestLoader);var _ErrorHandler=require('./utils/ErrorHandler');var _ErrorHandler2=_interopRequireDefault(_ErrorHandler);var _Capabilities=require('./utils/Capabilities');var _Capabilities2=_interopRequireDefault(_Capabilities);var _TextTracks=require('./text/TextTracks');var _TextTracks2=_interopRequireDefault(_TextTracks);var _RequestModifier=require('./utils/RequestModifier');var _RequestModifier2=_interopRequireDefault(_RequestModifier);var _TextController=require('./text/TextController');var _TextController2=_interopRequireDefault(_TextController);var _URIFragmentModel=require('./models/URIFragmentModel');var _URIFragmentModel2=_interopRequireDefault(_URIFragmentModel);var _ManifestModel=require('./models/ManifestModel');var _ManifestModel2=_interopRequireDefault(_ManifestModel);var _MediaPlayerModel=require('./models/MediaPlayerModel');var _MediaPlayerModel2=_interopRequireDefault(_MediaPlayerModel);var _AbrController=require('./controllers/AbrController');var _AbrController2=_interopRequireDefault(_AbrController);var _VideoModel=require('./models/VideoModel');var _VideoModel2=_interopRequireDefault(_VideoModel);var _DOMStorage=require('./utils/DOMStorage');var _DOMStorage2=_interopRequireDefault(_DOMStorage);var _Debug=require('./../core/Debug');var _Debug2=_interopRequireDefault(_Debug);var _Errors=require('./../core/errors/Errors');var _Errors2=_interopRequireDefault(_Errors);var _EventBus=require('./../core/EventBus');var _EventBus2=_interopRequireDefault(_EventBus);var _Events=require('./../core/events/Events');var _Events2=_interopRequireDefault(_Events);var _MediaPlayerEvents=require('./MediaPlayerEvents');var _MediaPlayerEvents2=_interopRequireDefault(_MediaPlayerEvents);var _FactoryMaker=require('../core/FactoryMaker');var _FactoryMaker2=_interopRequireDefault(_FactoryMaker);var _Settings=require('../core/Settings');var _Settings2=_interopRequireDefault(_Settings);var _Version=require('./../core/Version');var _DashAdapter=require('../dash/DashAdapter');var _DashAdapter2=_interopRequireDefault(_DashAdapter);var _DashMetrics=require('../dash/DashMetrics');var _DashMetrics2=_interopRequireDefault(_DashMetrics);var _TimelineConverter=require('../dash/utils/TimelineConverter');var _TimelineConverter2=_interopRequireDefault(_TimelineConverter);var _HTTPRequest=require('./vo/metrics/HTTPRequest');var _base=require('../../externals/base64');var _base2=_interopRequireDefault(_base);var _codemIsoboxer=require('codem-isoboxer');var _codemIsoboxer2=_interopRequireDefault(_codemIsoboxer);var _DashJSError=require('./vo/DashJSError');var _DashJSError2=_interopRequireDefault(_DashJSError);var _SupervisorTools=require('./utils/SupervisorTools');function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj};}/**
* @module MediaPlayer
* @description The MediaPlayer is the primary dash.js Module and a Facade to build your player around.
* It will allow you access to all the important dash.js properties/methods via the public API and all the
* events to build a robust DASH media player.
*///Dash
function MediaPlayer(){/**
* @constant {string} STREAMING_NOT_INITIALIZED_ERROR error string thrown when a function is called before the dash.js has been fully initialized
* @inner
*/var STREAMING_NOT_INITIALIZED_ERROR='You must first call initialize() and set a source before calling this method';/**
* @constant {string} PLAYBACK_NOT_INITIALIZED_ERROR error string thrown when a function is called before the dash.js has been fully initialized
* @inner
*/var PLAYBACK_NOT_INITIALIZED_ERROR='You must first call initialize() and set a valid source and view before calling this method';/**
* @constant {string} ELEMENT_NOT_ATTACHED_ERROR error string thrown when a function is called before the dash.js has received a reference of an HTML5 video element
* @inner
*/var ELEMENT_NOT_ATTACHED_ERROR='You must first call attachView() to set the video element before calling this method';/**
* @constant {string} SOURCE_NOT_ATTACHED_ERROR error string thrown when a function is called before the dash.js has received a valid source stream.
* @inner
*/var SOURCE_NOT_ATTACHED_ERROR='You must first call attachSource() with a valid source before calling this method';/**
* @constant {string} MEDIA_PLAYER_NOT_INITIALIZED_ERROR error string thrown when a function is called before the dash.js has been fully initialized.
* @inner
*/var MEDIA_PLAYER_NOT_INITIALIZED_ERROR='MediaPlayer not initialized!';var context=this.context;var eventBus=(0,_EventBus2.default)(context).getInstance();var settings=(0,_Settings2.default)(context).getInstance();var debug=(0,_Debug2.default)(context).getInstance();var instance=void 0,logger=void 0,source=void 0,protectionData=void 0,mediaPlayerInitialized=void 0,streamingInitialized=void 0,playbackInitialized=void 0,autoPlay=void 0,abrController=void 0,timelineConverter=void 0,mediaController=void 0,protectionController=void 0,metricsReportingController=void 0,mssHandler=void 0,adapter=void 0,mediaPlayerModel=void 0,errHandler=void 0,capabilities=void 0,streamController=void 0,playbackController=void 0,dashMetrics=void 0,manifestModel=void 0,videoModel=void 0,textController=void 0,uriFragmentModel=void 0,domStorage=void 0;/*
---------------------------------------------------------------------------
INIT FUNCTIONS
---------------------------------------------------------------------------
*/function setup(){logger=debug.getLogger(instance);mediaPlayerInitialized=false;playbackInitialized=false;streamingInitialized=false;autoPlay=true;protectionController=null;protectionData=null;adapter=null;_Events2.default.extend(_MediaPlayerEvents2.default);mediaPlayerModel=(0,_MediaPlayerModel2.default)(context).getInstance();videoModel=(0,_VideoModel2.default)(context).getInstance();uriFragmentModel=(0,_URIFragmentModel2.default)(context).getInstance();}/**
* Configure media player with customs controllers. Helpful for tests
*
* @param {object=} config controllers configuration
* @memberof module:MediaPlayer
* @instance
*/function setConfig(config){if(!config){return;}if(config.capabilities){capabilities=config.capabilities;}if(config.streamController){streamController=config.streamController;}if(config.playbackController){playbackController=config.playbackController;}if(config.mediaPlayerModel){mediaPlayerModel=config.mediaPlayerModel;}if(config.abrController){abrController=config.abrController;}if(config.mediaController){mediaController=config.mediaController;}if(config.settings){settings=config.settings;}}/**
* Upon creating the MediaPlayer you must call initialize before you call anything else.
* There is one exception to this rule. It is crucial to call {@link module:MediaPlayer#extend extend()}
* with all your extensions prior to calling initialize.
*
* ALL arguments are optional and there are individual methods to set each argument later on.
* The args in this method are just for convenience and should only be used for a simple player setup.
*
* @param {HTML5MediaElement=} view - Optional arg to set the video element. {@link module:MediaPlayer#attachView attachView()}
* @param {string=} source - Optional arg to set the media source. {@link module:MediaPlayer#attachSource attachSource()}
* @param {boolean=} AutoPlay - Optional arg to set auto play. {@link module:MediaPlayer#setAutoPlay setAutoPlay()}
* @see {@link module:MediaPlayer#attachView attachView()}
* @see {@link module:MediaPlayer#attachSource attachSource()}
* @see {@link module:MediaPlayer#setAutoPlay setAutoPlay()}
* @memberof module:MediaPlayer
* @instance
*/function initialize(view,source,AutoPlay){if(!capabilities){capabilities=(0,_Capabilities2.default)(context).getInstance();}errHandler=(0,_ErrorHandler2.default)(context).getInstance();if(!capabilities.supportsMediaSource()){errHandler.error(new _DashJSError2.default(_Errors2.default.CAPABILITY_MEDIASOURCE_ERROR_CODE,_Errors2.default.CAPABILITY_MEDIASOURCE_ERROR_MESSAGE));return;}if(mediaPlayerInitialized)return;mediaPlayerInitialized=true;// init some controllers and models
timelineConverter=(0,_TimelineConverter2.default)(context).getInstance();if(!abrController){abrController=(0,_AbrController2.default)(context).getInstance();}if(!playbackController){playbackController=(0,_PlaybackController2.default)(context).getInstance();}if(!mediaController){mediaController=(0,_MediaController2.default)(context).getInstance();}adapter=(0,_DashAdapter2.default)(context).getInstance();manifestModel=(0,_ManifestModel2.default)(context).getInstance();dashMetrics=(0,_DashMetrics2.default)(context).getInstance({settings:settings});textController=(0,_TextController2.default)(context).getInstance();domStorage=(0,_DOMStorage2.default)(context).getInstance({settings:settings});adapter.setConfig({constants:_Constants2.default,cea608parser:_cea608Parser2.default,errHandler:errHandler,BASE64:_base2.default});restoreDefaultUTCTimingSources();setAutoPlay(AutoPlay!==undefined?AutoPlay:true);if(view){attachView(view);}if(source){attachSource(source);}logger.info('[dash.js '+getVersion()+'] '+'MediaPlayer has been initialized');}/**
* Sets the MPD source and the video element to null. You can also reset the MediaPlayer by
* calling attachSource with a new source file.
*
* Calling this method is all that is necessary to destroy a MediaPlayer instance.
*
* @memberof module:MediaPlayer
* @instance
*/function reset(){attachSource(null);attachView(null);protectionData=null;if(protectionController){protectionController.reset();protectionController=null;}if(metricsReportingController){metricsReportingController.reset();metricsReportingController=null;}settings.reset();}/**
* The ready state of the MediaPlayer based on both the video element and MPD source being defined.
*
* @returns {boolean} The current ready state of the MediaPlayer
* @see {@link module:MediaPlayer#attachView attachView()}
* @see {@link module:MediaPlayer#attachSource attachSource()}
* @memberof module:MediaPlayer
* @instance
*/function isReady(){return!!source&&!!videoModel.getElement();}/**
* Use the on method to listen for public events found in MediaPlayer.events. {@link MediaPlayerEvents}
*
* @param {string} type - {@link MediaPlayerEvents}
* @param {Function} listener - callback method when the event fires.
* @param {Object} scope - context of the listener so it can be removed properly.
* @memberof module:MediaPlayer
* @instance
*/function on(type,listener,scope){eventBus.on(type,listener,scope);}/**
* Use the off method to remove listeners for public events found in MediaPlayer.events. {@link MediaPlayerEvents}
*
* @param {string} type - {@link MediaPlayerEvents}
* @param {Function} listener - callback method when the event fires.
* @param {Object} scope - context of the listener so it can be removed properly.
* @memberof module:MediaPlayer
* @instance
*/function off(type,listener,scope){eventBus.off(type,listener,scope);}/**
* Current version of Dash.js
* @returns {string} the current dash.js version string.
* @memberof module:MediaPlayer
* @instance
*/function getVersion(){return(0,_Version.getVersionString)();}/**
* Use this method to access the dash.js logging class.
*
* @returns {Debug}
* @memberof module:MediaPlayer
* @instance
*/function getDebug(){return debug;}/*
---------------------------------------------------------------------------
PLAYBACK FUNCTIONS
---------------------------------------------------------------------------
*//**
* Causes the player to begin streaming the media as set by the {@link module:MediaPlayer#attachSource attachSource()}
* method in preparation for playing. It specifically does not require a view to be attached with {@link module:MediaPlayer#attachSource attachView()} to begin preloading.
* When a view is attached after preloading, the buffered data is transferred to the attached mediaSource buffers.
*
* @see {@link module:MediaPlayer#attachSource attachSource()}
* @see {@link module:MediaPlayer#attachView attachView()}
* @memberof module:MediaPlayer
* @throws {@link module:MediaPlayer~SOURCE_NOT_ATTACHED_ERROR SOURCE_NOT_ATTACHED_ERROR} if called before attachSource function
* @instance
*/function preload(){if(videoModel.getElement()||streamingInitialized){return false;}if(source){initializePlayback();}else{throw SOURCE_NOT_ATTACHED_ERROR;}}/**
* The play method initiates playback of the media defined by the {@link module:MediaPlayer#attachSource attachSource()} method.
* This method will call play on the native Video Element.
*
* @see {@link module:MediaPlayer#attachSource attachSource()}
* @throws {@link module:MediaPlayer~PLAYBACK_NOT_INITIALIZED_ERROR PLAYBACK_NOT_INITIALIZED_ERROR} if called before initializePlayback function
* @memberof module:MediaPlayer
* @instance
*/function play(){if(!playbackInitialized){throw PLAYBACK_NOT_INITIALIZED_ERROR;}if(!autoPlay||isPaused()&&playbackInitialized){playbackController.play();}}/**
* This method will call pause on the native Video Element.
*
* @throws {@link module:MediaPlayer~PLAYBACK_NOT_INITIALIZED_ERROR PLAYBACK_NOT_INITIALIZED_ERROR} if called before initializePlayback function
* @memberof module:MediaPlayer
* @instance
*/function pause(){if(!playbackInitialized){throw PLAYBACK_NOT_INITIALIZED_ERROR;}playbackController.pause();}/**
* Returns a Boolean that indicates whether the Video Element is paused.
* @return {boolean}
* @throws {@link module:MediaPlayer~PLAYBACK_NOT_INITIALIZED_ERROR PLAYBACK_NOT_INITIALIZED_ERROR} if called before initializePlayback function
* @memberof module:MediaPlayer
* @instance
*/function isPaused(){if(!playbackInitialized){throw PLAYBACK_NOT_INITIALIZED_ERROR;}return playbackController.isPaused();}/**
* Sets the currentTime property of the attached video element. If it is a live stream with a
* timeShiftBufferLength, then the DVR window offset will be automatically calculated.
*
* @param {number} value - A relative time, in seconds, based on the return value of the {@link module:MediaPlayer#duration duration()} method is expected
* @see {@link module:MediaPlayer#getDVRSeekOffset getDVRSeekOffset()}
* @throws {@link module:MediaPlayer~PLAYBACK_NOT_INITIALIZED_ERROR PLAYBACK_NOT_INITIALIZED_ERROR} if called before initializePlayback function
* @throws {@link Constants#BAD_ARGUMENT_ERROR BAD_ARGUMENT_ERROR} if called with an invalid argument, not number type or is NaN.
* @memberof module:MediaPlayer
* @instance
*/function seek(value){if(!playbackInitialized){throw PLAYBACK_NOT_INITIALIZED_ERROR;}(0,_SupervisorTools.checkParameterType)(value,'number');if(isNaN(value)){throw _Constants2.default.BAD_ARGUMENT_ERROR;}var s=playbackController.getIsDynamic()?getDVRSeekOffset(value):value;playbackController.seek(s);}/**
* Returns a Boolean that indicates whether the media is in the process of seeking to a new position.
* @return {boolean}
* @throws {@link module:MediaPlayer~PLAYBACK_NOT_INITIALIZED_ERROR PLAYBACK_NOT_INITIALIZED_ERROR} if called before initializePlayback function
* @memberof module:MediaPlayer
* @instance
*/function isSeeking(){if(!playbackInitialized){throw PLAYBACK_NOT_INITIALIZED_ERROR;}return playbackController.isSeeking();}/**
* Returns a Boolean that indicates whether the media is in the process of dynamic.
* @return {boolean}
* @throws {@link module:MediaPlayer~PLAYBACK_NOT_INITIALIZED_ERROR PLAYBACK_NOT_INITIALIZED_ERROR} if called before initializePlayback function
* @memberof module:MediaPlayer
* @instance
*/function isDynamic(){if(!playbackInitialized){throw PLAYBACK_NOT_INITIALIZED_ERROR;}return playbackController.getIsDynamic();}/**
* Use this method to set the native Video Element's playback rate.
* @param {number} value
* @memberof module:MediaPlayer
* @instance
*/function setPlaybackRate(value){getVideoElement().playbackRate=value;}/**
* Returns the current playback rate.
* @returns {number}
* @memberof module:MediaPlayer
* @instance
*/function getPlaybackRate(){return getVideoElement().playbackRate;}/**
* Use this method to set the native Video Element's muted state. Takes a Boolean that determines whether audio is muted. true if the audio is muted and false otherwise.
* @param {boolean} value
* @memberof module:MediaPlayer
* @throws {@link Constants#BAD_ARGUMENT_ERROR BAD_ARGUMENT_ERROR} if called with an invalid argument, not boolean type.
* @instance
*/function setMute(value){(0,_SupervisorTools.checkParameterType)(value,'boolean');getVideoElement().muted=value;}/**
* A Boolean that determines whether audio is muted.
* @returns {boolean}
* @memberof module:MediaPlayer
* @instance
*/function isMuted(){return getVideoElement().muted;}/**
* A double indicating the audio volume, from 0.0 (silent) to 1.0 (loudest).
* @param {number} value
* @memberof module:MediaPlayer
* @throws {@link Constants#BAD_ARGUMENT_ERROR BAD_ARGUMENT_ERROR} if called with an invalid argument, not number type, or is NaN or not between 0 and 1.
* @instance
*/function setVolume(value){if(typeof value!=='number'||isNaN(value)||value<0.0||value>1.0){throw _Constants2.default.BAD_ARGUMENT_ERROR;}getVideoElement().volume=value;}/**
* Returns the current audio volume, from 0.0 (silent) to 1.0 (loudest).
* @returns {number}
* @memberof module:MediaPlayer
* @instance
*/function getVolume(){return getVideoElement().volume;}/**
* The length of the buffer for a given media type, in seconds. Valid media
* types are "video", "audio" and "fragmentedText". If no type is passed
* in, then the minimum of video, audio and fragmentedText buffer length is
* returned. NaN is returned if an invalid type is requested, the
* presentation does not contain that type, or if no arguments are passed
* and the presentation does not include any adaption sets of valid media
* type.
*
* @param {string} type - the media type of the buffer
* @returns {number} The length of the buffer for the given media type, in
* seconds, or NaN
* @memberof module:MediaPlayer
* @instance
*/function getBufferLength(type){var types=[_Constants2.default.VIDEO,_Constants2.default.AUDIO,_Constants2.default.FRAGMENTED_TEXT];if(!type){var buffer=types.map(function(t){return getTracksFor(t).length>0?getDashMetrics().getCurrentBufferLevel(t):Number.MAX_VALUE;}).reduce(function(p,c){return Math.min(p,c);});return buffer===Number.MAX_VALUE?NaN:buffer;}else{if(types.indexOf(type)!==-1){var _buffer=getDashMetrics().getCurrentBufferLevel(type);return _buffer?_buffer:NaN;}else{logger.warn('getBufferLength requested for invalid type');return NaN;}}}/**
* The timeShiftBufferLength (DVR Window), in seconds.
*
* @returns {number} The window of allowable play time behind the live point of a live stream.
* @memberof module:MediaPlayer
* @instance
*/function getDVRWindowSize(){var metric=dashMetrics.getCurrentDVRInfo();if(!metric){return 0;}return metric.manifestInfo.DVRWindowSize;}/**
* This method should only be used with a live stream that has a valid timeShiftBufferLength (DVR Window).
* NOTE - If you do not need the raw offset value (i.e. media analytics, tracking, etc) consider using the {@link module:MediaPlayer#seek seek()} method
* which will calculate this value for you and set the video element's currentTime property all in one simple call.
*
* @param {number} value - A relative time, in seconds, based on the return value of the {@link module:MediaPlayer#duration duration()} method is expected.
* @returns {number} A value that is relative the available range within the timeShiftBufferLength (DVR Window).
* @see {@link module:MediaPlayer#seek seek()}
* @memberof module:MediaPlayer
* @instance
*/function getDVRSeekOffset(value){var metric=dashMetrics.getCurrentDVRInfo();if(!metric){return 0;}var liveDelay=playbackController.getLiveDelay();var val=metric.range.start+value;if(val>metric.range.end-liveDelay){val=metric.range.end-liveDelay;}return val;}/**
* Current time of the playhead, in seconds.
*
* If called with no arguments then the returned time value is time elapsed since the start point of the first stream, or if it is a live stream, then the time will be based on the return value of the {@link module:MediaPlayer#duration duration()} method.
* However if a stream ID is supplied then time is relative to the start of that stream, or is null if there is no such stream id in the manifest.
*
* @param {string} streamId - The ID of a stream that the returned playhead time must be relative to the start of. If undefined, then playhead time is relative to the first stream.
* @returns {number} The current playhead time of the media, or null.
* @throws {@link module:MediaPlayer~PLAYBACK_NOT_INITIALIZED_ERROR PLAYBACK_NOT_INITIALIZED_ERROR} if called before initializePlayback function
* @memberof module:MediaPlayer
* @instance
*/function time(streamId){if(!playbackInitialized){throw PLAYBACK_NOT_INITIALIZED_ERROR;}var t=getVideoElement().currentTime;if(streamId!==undefined){t=streamController.getTimeRelativeToStreamId(t,streamId);}else if(playbackController.getIsDynamic()){var metric=dashMetrics.getCurrentDVRInfo();t=metric===null?0:duration()-(metric.range.end-metric.time);}return t;}/**
* Duration of the media's playback, in seconds.
*
* @returns {number} The current duration of the media.
* @memberof module:MediaPlayer
* @throws {@link module:MediaPlayer~PLAYBACK_NOT_INITIALIZED_ERROR PLAYBACK_NOT_INITIALIZED_ERROR} if called before initializePlayback function
* @instance
*/function duration(){if(!playbackInitialized){throw PLAYBACK_NOT_INITIALIZED_ERROR;}var d=getVideoElement().duration;if(playbackController.getIsDynamic()){var metric=dashMetrics.getCurrentDVRInfo();var range=void 0;if(!metric){return 0;}range=metric.range.end-metric.range.start;d=range<metric.manifestInfo.DVRWindowSize?range:metric.manifestInfo.DVRWindowSize;}return d;}/**
* Use this method to get the current playhead time as an absolute value, the time in seconds since midnight UTC, Jan 1 1970.
* Note - this property only has meaning for live streams. If called before play() has begun, it will return a value of NaN.
*
* @returns {number} The current playhead time as UTC timestamp.
* @throws {@link module:MediaPlayer~PLAYBACK_NOT_INITIALIZED_ERROR PLAYBACK_NOT_INITIALIZED_ERROR} if called before initializePlayback function
* @memberof module:MediaPlayer
* @instance
*/function timeAsUTC(){if(!playbackInitialized){throw PLAYBACK_NOT_INITIALIZED_ERROR;}if(time()<0){return NaN;}return getAsUTC(time());}/**
* Use this method to get the current duration as an absolute value, the time in seconds since midnight UTC, Jan 1 1970.
* Note - this property only has meaning for live streams.
*
* @returns {number} The current duration as UTC timestamp.
* @throws {@link module:MediaPlayer~PLAYBACK_NOT_INITIALIZED_ERROR PLAYBACK_NOT_INITIALIZED_ERROR} if called before initializePlayback function
* @memberof module:MediaPlayer
* @instance
*/function durationAsUTC(){if(!playbackInitialized){throw PLAYBACK_NOT_INITIALIZED_ERROR;}return getAsUTC(duration());}/*
---------------------------------------------------------------------------
AUTO BITRATE
---------------------------------------------------------------------------
*//**
* Gets the top quality BitrateInfo checking portal limit and max allowed.
*
* It calls getTopQualityIndexFor internally
*
* @param {string} type - 'video' or 'audio' are the type options.
* @memberof module:MediaPlayer
* @returns {BitrateInfo | null}
* @throws {@link module:MediaPlayer~STREAMING_NOT_INITIALIZED_ERROR STREAMING_NOT_INITIALIZED_ERROR} if called before initializePlayback function
* @instance
*/function getTopBitrateInfoFor(type){if(!streamingInitialized){throw STREAMING_NOT_INITIALIZED_ERROR;}return abrController.getTopBitrateInfoFor(type);}/**
* Gets the current download quality for media type video, audio or images. For video and audio types the ABR
* rules update this value before every new download unless setAutoSwitchQualityFor(type, false) is called. For 'image'
* type, thumbnails, there is no ABR algorithm and quality is set manually.
*
* @param {string} type - 'video', 'audio' or 'image' (thumbnails)
* @returns {number} the quality index, 0 corresponding to the lowest bitrate
* @memberof module:MediaPlayer
* @see {@link module:MediaPlayer#setAutoSwitchQualityFor setAutoSwitchQualityFor()}
* @see {@link module:MediaPlayer#setQualityFor setQualityFor()}
* @throws {@link module:MediaPlayer~STREAMING_NOT_INITIALIZED_ERROR STREAMING_NOT_INITIALIZED_ERROR} if called before initializePlayback function
* @instance
*/function getQualityFor(type){if(!streamingInitialized){throw STREAMING_NOT_INITIALIZED_ERROR;}if(type===_Constants2.default.IMAGE){var activeStream=getActiveStream();if(!activeStream){return-1;}var thumbnailController=activeStream.getThumbnailController();return!thumbnailController?-1:thumbnailController.getCurrentTrackIndex();}return abrController.getQualityFor(type);}/**
* Sets the current quality for media type instead of letting the ABR Heuristics automatically selecting it.
* This value will be overwritten by the ABR rules unless setAutoSwitchQualityFor(type, false) is called.
*
* @param {string} type - 'video', 'audio' or 'image'
* @param {number} value - the quality index, 0 corresponding to the lowest bitrate
* @memberof module:MediaPlayer
* @see {@link module:MediaPlayer#setAutoSwitchQualityFor setAutoSwitchQualityFor()}
* @see {@link module:MediaPlayer#getQualityFor getQualityFor()}
* @throws {@link module:MediaPlayer~STREAMING_NOT_INITIALIZED_ERROR STREAMING_NOT_INITIALIZED_ERROR} if called before initializePlayback function
* @instance
*/function setQualityFor(type,value){if(!streamingInitialized){throw STREAMING_NOT_INITIALIZED_ERROR;}if(type===_Constants2.default.IMAGE){var activeStream=getActiveStream();if(!activeStream){return;}var thumbnailController=activeStream.getThumbnailController();if(thumbnailController){thumbnailController.setTrackByIndex(value);}}abrController.setPlaybackQuality(type,streamController.getActiveStreamInfo(),value);}/**
* Update the video element size variables
* Should be called on window resize (or any other time player is resized). Fullscreen does trigger a window resize event.
*
* Once windowResizeEventCalled = true, abrController.checkPortalSize() will use element size variables rather than querying clientWidth every time.
*
* @memberof module:MediaPlayer
* @instance
*/function updatePortalSize(){abrController.setElementSize();abrController.setWindowResizeEventCalled(true);}/*
---------------------------------------------------------------------------
MEDIA PLAYER CONFIGURATION
---------------------------------------------------------------------------
*//**
* <p>Set to false to prevent stream from auto-playing when the view is attached.</p>
*
* @param {boolean} value
* @default true
* @memberof module:MediaPlayer
* @see {@link module:MediaPlayer#attachView attachView()}
* @throws {@link Constants#BAD_ARGUMENT_ERROR BAD_ARGUMENT_ERROR} if called with an invalid argument, not boolean type.
* @instance
*
*/function setAutoPlay(value){(0,_SupervisorTools.checkParameterType)(value,'boolean');autoPlay=value;}/**
* @returns {boolean} The current autoPlay state.
* @memberof module:MediaPlayer
* @instance
*/function getAutoPlay(){return autoPlay;}/**
* @memberof module:MediaPlayer
* @instance
* @returns {number|NaN} Current live stream latency in seconds. It is the difference between current time and time position at the playback head.
* @throws {@link module:MediaPlayer~MEDIA_PLAYER_NOT_INITIALIZED_ERROR MEDIA_PLAYER_NOT_INITIALIZED_ERROR} if called before initialize function
*/function getCurrentLiveLatency(){if(!mediaPlayerInitialized){throw MEDIA_PLAYER_NOT_INITIALIZED_ERROR;}if(!playbackInitialized){return NaN;}return playbackController.getCurrentLiveLatency();}/**
* Add a custom ABR Rule
* Rule will be apply on next stream if a stream is being played
*
* @param {string} type - rule type (one of ['qualitySwitchRules','abandonFragmentRules'])
* @param {string} rulename - name of rule (used to identify custom rule). If one rule of same name has been added, then existing rule will be updated
* @param {object} rule - the rule object instance
* @memberof module:MediaPlayer
* @throws {@link Constants#BAD_ARGUMENT_ERROR BAD_ARGUMENT_ERROR} if called with invalid arguments.
* @instance
*/function addABRCustomRule(type,rulename,rule){mediaPlayerModel.addABRCustomRule(type,rulename,rule);}/**
* Remove a custom ABR Rule
*
* @param {string} rulename - name of the rule to be removed
* @memberof module:MediaPlayer
* @instance
*/function removeABRCustomRule(rulename){mediaPlayerModel.removeABRCustomRule(rulename);}/**
* Remove all custom rules
* @memberof module:MediaPlayer
* @instance
*/function removeAllABRCustomRule(){mediaPlayerModel.removeABRCustomRule();}/**
* <p>Allows you to set a scheme and server source for UTC live edge detection for dynamic streams.
* If UTCTiming is defined in the manifest, it will take precedence over any time source manually added.</p>
* <p>If you have exposed the Date header, use the method {@link module:MediaPlayer#clearDefaultUTCTimingSources clearDefaultUTCTimingSources()}.
* This will allow the date header on the manifest to be used instead of a time server</p>
* @param {string} schemeIdUri - <ul>
* <li>urn:mpeg:dash:utc:http-head:2014</li>
* <li>urn:mpeg:dash:utc:http-xsdate:2014</li>
* <li>urn:mpeg:dash:utc:http-iso:2014</li>
* <li>urn:mpeg:dash:utc:direct:2014</li>
* </ul>
* <p>Some specs referencing early ISO23009-1 drafts incorrectly use
* 2012 in the URI, rather than 2014. support these for now.</p>
* <ul>
* <li>urn:mpeg:dash:utc:http-head:2012</li>
* <li>urn:mpeg:dash:utc:http-xsdate:2012</li>
* <li>urn:mpeg:dash:utc:http-iso:2012</li>
* <li>urn:mpeg:dash:utc:direct:2012</li>
* </ul>
* @param {string} value - Path to a time source.
* @default
* <ul>
* <li>schemeIdUri:urn:mpeg:dash:utc:http-xsdate:2014</li>
* <li>value:http://time.akamai.com/?iso&ms/li>
* </ul>
* @memberof module:MediaPlayer
* @see {@link module:MediaPlayer#removeUTCTimingSource removeUTCTimingSource()}
* @instance
*/function addUTCTimingSource(schemeIdUri,value){mediaPlayerModel.addUTCTimingSource(schemeIdUri,value);}/**
* <p>Allows you to remove a UTC time source. Both schemeIdUri and value need to match the Dash.vo.UTCTiming properties in order for the
* entry to be removed from the array</p>
* @param {string} schemeIdUri - see {@link module:MediaPlayer#addUTCTimingSource addUTCTimingSource()}
* @param {string} value - see {@link module:MediaPlayer#addUTCTimingSource addUTCTimingSource()}
* @memberof module:MediaPlayer
* @see {@link module:MediaPlayer#clearDefaultUTCTimingSources clearDefaultUTCTimingSources()}
* @throws {@link Constants#BAD_ARGUMENT_ERROR BAD_ARGUMENT_ERROR} if called with invalid arguments, schemeIdUri and value are not string type.
* @instance
*/function removeUTCTimingSource(schemeIdUri,value){mediaPlayerModel.removeUTCTimingSource(schemeIdUri,value);}/**
* <p>Allows you to clear the stored array of time sources.</p>
* <p>Example use: If you have exposed the Date header, calling this method
* will allow the date header on the manifest to be used instead of the time server.</p>
* <p>Example use: Calling this method, assuming there is not an exposed date header on the manifest, will default back
* to using a binary search to discover the live edge</p>
*
* @memberof module:MediaPlayer
* @see {@link module:MediaPlayer#restoreDefaultUTCTimingSources restoreDefaultUTCTimingSources()}
* @instance
*/function clearDefaultUTCTimingSources(){mediaPlayerModel.clearDefaultUTCTimingSources();}/**
* <p>Allows you to restore the default time sources after calling {@link module:MediaPlayer#clearDefaultUTCTimingSources clearDefaultUTCTimingSources()}</p>
*
* @default
* <ul>
* <li>schemeIdUri:urn:mpeg:dash:utc:http-xsdate:2014</li>
* <li>value:http://time.akamai.com/?iso&ms</li>
* </ul>
*
* @memberof module:MediaPlayer
* @see {@link module:MediaPlayer#addUTCTimingSource addUTCTimingSource()}
* @instance
*/function restoreDefaultUTCTimingSources(){mediaPlayerModel.restoreDefaultUTCTimingSources();}/**
* Returns the average throughput computed in the ABR logic
*
* @param {string} type
* @return {number} value
* @memberof module:MediaPlayer
* @instance
*/function getAverageThroughput(type){var throughputHistory=abrController.getThroughputHistory();return throughputHistory?throughputHistory.getAverageThroughput(type):0;}/**
* Sets whether withCredentials on XHR requests for a particular request
* type is true or false
*
* @default false
* @param {string} type - one of HTTPRequest.*_TYPE
* @param {boolean} value
* @memberof module:MediaPlayer
* @instance
*/function setXHRWithCredentialsForType(type,value){mediaPlayerModel.setXHRWithCredentialsForType(type,value);}/**
* Gets whether withCredentials on XHR requests for a particular request
* type is true or false
*
* @param {string} type - one of HTTPRequest.*_TYPE
* @return {boolean}
* @memberof module:MediaPlayer
* @instance
*/function getXHRWithCredentialsForType(type){return mediaPlayerModel.getXHRWithCredentialsForType(type);}/*
---------------------------------------------------------------------------
METRICS
---------------------------------------------------------------------------
*//**
* Returns the DashMetrics.js Module. You use this Module to get access to all the public metrics
* stored in dash.js
*
* @see {@link module:DashMetrics}
* @returns {Object}
* @memberof module:MediaPlayer
* @instance
*/function getDashMetrics(){return dashMetrics;}/*
---------------------------------------------------------------------------
TEXT MANAGEMENT
---------------------------------------------------------------------------
*//**
* Set default language for text. If default language is not one of text tracks, dash will choose the first one.
*
* @param {string} lang - default language
* @memberof module:MediaPlayer
* @instance
*/function setTextDefaultLanguage(lang){if(textController===undefined){textController=(0,_TextController2.default)(context).getInstance();}textController.setTextDefaultLanguage(lang);}/**
* Get default language for text.
*
* @return {string} the default language if it has been set using setTextDefaultLanguage
* @memberof module:MediaPlayer
* @instance
*/function getTextDefaultLanguage(){if(textController===undefined){textController=(0,_TextController2.default)(context).getInstance();}return textController.getTextDefaultLanguage();}/**
* Set enabled default state.
* This is used to enable/disable text when a file is loaded.
* During playback, use enableText to enable text for the file
*
* @param {boolean} enable - true to enable text, false otherwise
* @memberof module:MediaPlayer
* @instance
*/function setTextDefaultEnabled(enable){if(textController===undefined){textController=(0,_TextController2.default)(context).getInstance();}textController.setTextDefaultEnabled(enable);}/**
* Get enabled default state.
*
* @return {boolean} default enable state
* @memberof module:MediaPlayer
* @instance
*/function getTextDefaultEnabled(){if(textController===undefined){textController=(0,_TextController2.default)(context).getInstance();}return textController.getTextDefaultEnabled();}/**
* Enable/disable text
* When enabling text, dash will choose the previous selected text track
*
* @param {boolean} enable - true to enable text, false otherwise (same as setTextTrack(-1))
* @memberof module:MediaPlayer
* @instance
*/function enableText(enable){if(textController===undefined){textController=(0,_TextController2.default)(context).getInstance();}textController.enableText(enable);}/**
* Enable/disable text
* When enabling dash will keep downloading and process fragmented text tracks even if all tracks are in mode "hidden"
*
* @param {boolean} enable - true to enable text streaming even if all text tracks are hidden.
* @memberof module:MediaPlayer
* @instance
*/function enableForcedTextStreaming(enable){if(textController===undefined){textController=(0,_TextController2.default)(context).getInstance();}textController.enableForcedTextStreaming(enable);}/**
* Return if text is enabled
*
* @return {boolean} return true if text is enabled, false otherwise
* @memberof module:MediaPlayer
* @instance
*/function isTextEnabled(){if(textController===undefined){textController=(0,_TextController2.default)(context).getInstance();}return textController.isTextEnabled();}/**
* Use this method to change the current text track for both external time text files and fragmented text tracks. There is no need to
* set the track mode on the video object to switch a track when using this method.
* @param {number} idx - Index of track based on the order of the order the tracks are added Use -1 to disable all tracks. (turn captions off). Use module:MediaPlayer#dashjs.MediaPlayer.events.TEXT_TRACK_ADDED.
* @see {@link MediaPlayerEvents#event:TEXT_TRACK_ADDED dashjs.MediaPlayer.events.TEXT_TRACK_ADDED}
* @throws {@link module:MediaPlayer~PLAYBACK_NOT_INITIALIZED_ERROR PLAYBACK_NOT_INITIALIZED_ERROR} if called before initializePlayback function
* @memberof module:MediaPlayer
* @instance
*/function setTextTrack(idx){if(!playbackInitialized){throw PLAYBACK_NOT_INITIALIZED_ERROR;}if(textController===undefined){textController=(0,_TextController2.default)(context).getInstance();}textController.setTextTrack(idx);}function getCurrentTextTrackIndex(){var idx=NaN;if(textController){idx=textController.getCurrentTrackIdx();}return idx;}/**
* This method serves to control captions z-index value. If 'true' is passed, the captions will have the highest z-index and be
* displayed on top of other html elements. Default value is 'false' (z-index is not set).
* @param {boolean} value
* @memberof module:MediaPlayer
* @instance
*/function displayCaptionsOnTop(value){var textTracks=(0,_TextTracks2.default)(context).getInstance();textTracks.setConfig({videoModel:videoModel});textTracks.initialize();textTracks.setDisplayCConTop(value);}/*
---------------------------------------------------------------------------
VIDEO ELEMENT MANAGEMENT
---------------------------------------------------------------------------
*//**
* Returns instance of Video Element that was attached by calling attachView()
* @returns {Object}
* @memberof module:MediaPlayer
* @throws {@link module:MediaPlayer~ELEMENT_NOT_ATTACHED_ERROR ELEMENT_NOT_ATTACHED_ERROR} if called before attachView function
* @instance
*/function getVideoElement(){if(!videoModel.getElement()){throw ELEMENT_NOT_ATTACHED_ERROR;}return videoModel.getElement();}/**
* Use this method to attach an HTML5 VideoElement for dash.js to operate upon.
*
* @param {Object} element - An HTMLMediaElement that has already been defined in the DOM (or equivalent stub).
* @memberof module:MediaPlayer
* @throws {@link module:MediaPlayer~MEDIA_PLAYER_NOT_INITIALIZED_ERROR MEDIA_PLAYER_NOT_INITIALIZED_ERROR} if called before initialize function
* @instance
*/function attachView(element){if(!mediaPlayerInitialized){throw MEDIA_PLAYER_NOT_INITIALIZED_ERROR;}videoModel.setElement(element);if(element){detectProtection();detectMetricsReporting();detectMss();if(streamController){streamController.switchToVideoElement();}}if(playbackInitialized){//Reset if we have been playing before, so this is a new element.
resetPlaybackControllers();}initializePlayback();}/**
* Returns instance of Div that was attached by calling attachTTMLRenderingDiv()
* @returns {Object}
* @memberof module:MediaPlayer
* @instance
*/function getTTMLRenderingDiv(){return videoModel?videoModel.getTTMLRenderingDiv():null;}/**
* Use this method to attach an HTML5 div for dash.js to render rich TTML subtitles.
*
* @param {HTMLDivElement} div - An unstyled div placed after the video element. It will be styled to match the video size and overlay z-order.
* @memberof module:MediaPlayer
* @throws {@link module:MediaPlayer~ELEMENT_NOT_ATTACHED_ERROR ELEMENT_NOT_ATTACHED_ERROR} if called before attachView function
* @instance
*/function attachTTMLRenderingDiv(div){if(!videoModel.getElement()){throw ELEMENT_NOT_ATTACHED_ERROR;}videoModel.setTTMLRenderingDiv(div);}/*
---------------------------------------------------------------------------
STREAM AND TRACK MANAGEMENT
---------------------------------------------------------------------------
*//**
* @param {string} type
* @returns {Array}
* @memberof module:MediaPlayer
* @throws {@link module:MediaPlayer~STREAMING_NOT_INITIALIZED_ERROR STREAMING_NOT_INITIALIZED_ERROR} if called before initializePlayback function
* @instance
*/function getBitrateInfoListFor(type){if(!streamingInitialized){throw STREAMING_NOT_INITIALIZED_ERROR;}var stream=getActiveStream();return stream?stream.getBitrateListFor(type):[];}/**
* This method returns the list of all available streams from a given manifest
* @param {Object} manifest
* @returns {Array} list of {@link StreamInfo}
* @memberof module:MediaPlayer
* @throws {@link module:MediaPlayer~STREAMING_NOT_INITIALIZED_ERROR STREAMING_NOT_INITIALIZED_ERROR} if called before initializePlayback function
* @instance
*/function getStreamsFromManifest(manifest){if(!streamingInitialized){throw STREAMING_NOT_INITIALIZED_ERROR;}return adapter.getStreamsInfo(manifest);}/**
* This method returns the list of all available tracks for a given media type
* @param {string} type
* @returns {Array} list of {@link MediaInfo}
* @memberof module:MediaPlayer
* @throws {@link module:MediaPlayer~STREAMING_NOT_INITIALIZED_ERROR STREAMING_NOT_INITIALIZED_ERROR} if called before initializePlayback function
* @instance
*/function getTracksFor(type){if(!streamingInitialized){throw STREAMING_NOT_INITIALIZED_ERROR;}var streamInfo=streamController.getActiveStreamInfo();return mediaController.getTracksFor(type,streamInfo);}/**
* This method returns the list of all available tracks for a given media type and streamInfo from a given manifest
* @param {string} type
* @param {Object} manifest
* @param {Object} streamInfo
* @returns {Array} list of {@link MediaInfo}
* @memberof module:MediaPlayer
* @throws {@link module:MediaPlayer~STREAMING_NOT_INITIALIZED_ERROR STREAMING_NOT_INITIALIZED_ERROR} if called before initializePlayback function
* @instance
*/function getTracksForTypeFromManifest(type,manifest,streamInfo){if(!streamingInitialized){throw STREAMING_NOT_INITIALIZED_ERROR;}streamInfo=streamInfo||adapter.getStreamsInfo(manifest,1)[0];return streamInfo?adapter.getAllMediaInfoForType(streamInfo,type,manifest):[];}/**
* @param {string} type
* @returns {Object|null} {@link MediaInfo}
*
* @memberof module:MediaPlayer
* @throws {@link module:MediaPlayer~STREAMING_NOT_INITIALIZED_ERROR STREAMING_NOT_INITIALIZED_ERROR} if called before initializePlayback function
* @instance
*/function getCurrentTrackFor(type){if(!streamingInitialized){throw STREAMING_NOT_INITIALIZED_ERROR;}var streamInfo=streamController.getActiveStreamInfo();return mediaController.getCurrentTrackFor(type,streamInfo);}/**
* This method allows to set media settings that will be used to pick the initial track. Format of the settings
* is following:
* {lang: langValue,
* viewpoint: viewpointValue,
* audioChannelConfiguration: audioChannelConfigurationValue,
* accessibility: accessibilityValue,
* role: roleValue}
*
*
* @param {string} type
* @param {Object} value
* @memberof module:MediaPlayer
* @throws {@link module:MediaPlayer~MEDIA_PLAYER_NOT_INITIALIZED_ERROR MEDIA_PLAYER_NOT_INITIALIZED_ERROR} if called before initialize function
* @instance
*/function setQualityForSettingsFor(type,value){if(!mediaPlayerInitialized){throw MEDIA_PLAYER_NOT_INITIALIZED_ERROR;}mediaController.setInitialSettings(type,value);}/**
* This method returns media settings that is used to pick the initial track. Format of the settings
* is following:
* {lang: langValue,
* viewpoint: viewpointValue,
* audioChannelConfiguration: audioChannelConfigurationValue,
* accessibility: accessibilityValue,
* role: roleValue}
* @param {string} type
* @returns {Object}
* @memberof module:MediaPlayer
* @throws {@link module:MediaPlayer~MEDIA_PLAYER_NOT_INITIALIZED_ERROR MEDIA_PLAYER_NOT_INITIALIZED_ERROR} if called before initialize function
* @instance
*/function getInitialMediaSettingsFor(type){if(!mediaPlayerInitialized){throw MEDIA_PLAYER_NOT_INITIALIZED_ERROR;}return mediaController.getInitialSettings(type);}/**
* @param {MediaInfo} track - instance of {@link MediaInfo}
* @memberof module:MediaPlayer
* @throws {@link module:MediaPlayer~STREAMING_NOT_INITIALIZED_ERROR STREAMING_NOT_INITIALIZED_ERROR} if called before initializePlayback function
* @instance
*/function setCurrentTrack(track){if(!streamingInitialized){throw STREAMING_NOT_INITIALIZED_ERROR;}mediaController.setTrack(track);}/**
* This method returns the current track switch mode.
*
* @param {string} type
* @returns {string} mode
* @memberof module:MediaPlayer
* @throws {@link module:MediaPlayer~MEDIA_PLAYER_NOT_INITIALIZED_ERROR MEDIA_PLAYER_NOT_INITIALIZED_ERROR} if called before initialize function
* @instance
*/function getTrackSwitchModeFor(type){if(!mediaPlayerInitialized){throw MEDIA_PLAYER_NOT_INITIALIZED_ERROR;}return mediaController.getSwitchMode(type);}/**
* This method sets the current track switch mode. Available options are:
*
* MediaController.TRACK_SWITCH_MODE_NEVER_REPLACE
* (used to forbid clearing the buffered data (prior to current playback position) after track switch.
* Defers to fastSwitchEnabled for placement of new data. Default for video)
*
* MediaController.TRACK_SWITCH_MODE_ALWAYS_REPLACE
* (used to clear the buffered data (prior to current playback position) after track switch. Default for audio)
*
* @param {string} type
* @param {string} mode
* @memberof module:MediaPlayer
* @throws {@link module:MediaPlayer~MEDIA_PLAYER_NOT_INITIALIZED_ERROR MEDIA_PLAYER_NOT_INITIALIZED_ERROR} if called before initialize function
* @instance
*/function setTrackSwitchModeFor(type,mode){if(!mediaPlayerInitialized){throw MEDIA_PLAYER_NOT_INITIALIZED_ERROR;}mediaController.setSwitchMode(type,mode);}/**
* This method sets the selection mode for the i