UNPKG

@l5i/dashjs

Version:

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

61 lines (60 loc) 6.26 kB
/** * The copyright in this software is being made available under the BSD License, * included below. This software may be subject to other third party and contributor * rights, including patent rights, and no such rights are granted under this license. * * Copyright (c) 2013, Dash Industry Forum. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation and/or * other materials provided with the distribution. * * Neither the name of Dash Industry Forum nor the names of its * contributors may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */'use strict';Object.defineProperty(exports,'__esModule',{value:true});function _interopRequireDefault(obj){return obj && obj.__esModule?obj:{'default':obj};}var _utilsMetricSerialiser=require('../../utils/MetricSerialiser');var _utilsMetricSerialiser2=_interopRequireDefault(_utilsMetricSerialiser);var _utilsRNG=require('../../utils/RNG');var _utilsRNG2=_interopRequireDefault(_utilsRNG);function DVBReporting(config){config = config || {};var instance=undefined;var context=this.context;var metricSerialiser=(0,_utilsMetricSerialiser2['default'])(context).getInstance();var randomNumberGenerator=(0,_utilsRNG2['default'])(context).getInstance();var USE_DRAFT_DVB_SPEC=true;var isReportingPlayer=false;var reportingPlayerStatusDecided=false;var reportingUrl=null;var rangeController=null;var allowPendingRequestsToCompleteOnReset=true;var pendingRequests=[];var metricsConstants=config.metricsConstants;function doGetRequest(url,successCB,failureCB){var req=new XMLHttpRequest();var oncomplete=function oncomplete(){var reqIndex=pendingRequests.indexOf(req);if(reqIndex === -1){return;}else {pendingRequests.splice(reqIndex,1);}if(req.status >= 200 && req.status < 300){if(successCB){successCB();}}else {if(failureCB){failureCB();}}};pendingRequests.push(req);try{req.open('GET',url);req.onloadend = oncomplete;req.onerror = oncomplete;req.send();}catch(e) {req.onerror();}}function report(type,vos){if(!Array.isArray(vos)){vos = [vos];} // If the Player is not a reporting Player, then the Player shall // not report any errors. // ... In addition to any time restrictions specified by a Range // element within the Metrics element. if(isReportingPlayer && rangeController.isEnabled()){ // This reporting mechanism operates by creating one HTTP GET // request for every entry in the top level list of the metric. vos.forEach(function(vo){var url=metricSerialiser.serialise(vo); // this has been proposed for errata if(USE_DRAFT_DVB_SPEC && type !== metricsConstants.DVB_ERRORS){url = 'metricname=' + type + '&' + url;} // Take the value of the @reportingUrl attribute, append a // question mark ('?') character and then append the string // created in the previous step. url = reportingUrl + '?' + url; // Make an HTTP GET request to the URL contained within the // string created in the previous step. doGetRequest(url,null,function(){ // If the Player is unable to make the report, for // example because the @reportingUrl is invalid, the // host cannot be reached, or an HTTP status code other // than one in the 200 series is received, the Player // shall cease being a reporting Player for the // duration of the MPD. isReportingPlayer = false;});});}}function initialize(entry,rc){var probability=undefined;rangeController = rc;reportingUrl = entry['dvb:reportingUrl']; // If a required attribute is missing, the Reporting descriptor may // be ignored by the Player if(!reportingUrl){throw new Error('required parameter missing (dvb:reportingUrl)');} // A Player's status, as a reporting Player or not, shall remain // static for the duration of the MPD, regardless of MPD updates. // (i.e. only calling reset (or failure) changes this state) if(!reportingPlayerStatusDecided){ // NOTE: DVB spec has a typo where it incorrectly references the // priority attribute, which should be probability probability = entry['dvb:probability'] || entry['dvb:priority'] || 0; // If the @priority attribute is set to 1000, it shall be a reporting Player. // If the @priority attribute is missing, the Player shall not be a reporting Player. // For any other value of the @probability attribute, it shall decide at random whether to be a // reporting Player, such that the probability of being one is @probability/1000. if(probability && (probability === 1000 || probability / 1000 >= randomNumberGenerator.random())){isReportingPlayer = true;}reportingPlayerStatusDecided = true;}}function reset(){if(!allowPendingRequestsToCompleteOnReset){pendingRequests.forEach(function(req){return req.abort();});pendingRequests = [];}reportingPlayerStatusDecided = false;isReportingPlayer = false;reportingUrl = null;rangeController = null;}instance = {report:report,initialize:initialize,reset:reset};return instance;}DVBReporting.__dashjs_factory_name = 'DVBReporting';exports['default'] = dashjs.FactoryMaker.getClassFactory(DVBReporting); /* jshint ignore:line */module.exports = exports['default']; //# sourceMappingURL=DVBReporting.js.map