UNPKG

dashjs

Version:

A reference client implementation for the playback of MPEG DASH via Javascript and compliant browsers.

634 lines (618 loc) 71.9 kB
'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