dashjs
Version:
A reference client implementation for the playback of MPEG DASH via Javascript and compliant browsers.
180 lines (179 loc) • 15.3 kB
JavaScript
;Object.defineProperty(exports,"__esModule",{value:true});var _Constants=require('../streaming/constants/Constants');var _Constants2=_interopRequireDefault(_Constants);var _HTTPRequest=require('../streaming/vo/metrics/HTTPRequest');var _FactoryMaker=require('../core/FactoryMaker');var _FactoryMaker2=_interopRequireDefault(_FactoryMaker);var _MetricsConstants=require('../streaming/constants/MetricsConstants');var _MetricsConstants2=_interopRequireDefault(_MetricsConstants);var _Round=require('./utils/Round10');var _Round2=_interopRequireDefault(_Round);var _MetricsModel=require('../streaming/models/MetricsModel');var _MetricsModel2=_interopRequireDefault(_MetricsModel);var _PlayList=require('../streaming/vo/metrics/PlayList');function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj};}/**
* @module DashMetrics
* @ignore
* @param {object} config
*/function DashMetrics(config){config=config||{};var context=this.context;var instance=void 0,playListTraceMetricsClosed=void 0,playListTraceMetrics=void 0,playListMetrics=void 0;var metricsModel=config.metricsModel;function setup(){metricsModel=metricsModel||(0,_MetricsModel2.default)(context).getInstance({settings:config.settings});resetInitialSettings();}function resetInitialSettings(){playListTraceMetricsClosed=true;playListTraceMetrics=null;playListMetrics=null;}/**
* @param {string} mediaType
* @param {boolean} readOnly
* @returns {*}
* @memberof module:DashMetrics
* @instance
*/function getCurrentRepresentationSwitch(mediaType,readOnly){var metrics=metricsModel.getMetricsFor(mediaType,readOnly);return getCurrent(metrics,_MetricsConstants2.default.TRACK_SWITCH);}/**
* @param {string} mediaType
* @param {Date} t time of the switch event
* @param {Date} mt media presentation time
* @param {string} to id of representation
* @param {string} lto if present, subrepresentation reference
* @memberof module:DashMetrics
* @instance
*/function addRepresentationSwitch(mediaType,t,mt,to,lto){metricsModel.addRepresentationSwitch(mediaType,t,mt,to,lto);}/**
* @param {string} mediaType
* @param {boolean} readOnly
* @param {string} infoType
* @returns {*}
* @memberof module:DashMetrics
* @instance
*/function getLatestBufferInfoVO(mediaType,readOnly,infoType){var metrics=metricsModel.getMetricsFor(mediaType,readOnly);return getCurrent(metrics,infoType);}/**
* @param {string} type
* @param {boolean} readOnly
* @returns {number}
* @memberof module:DashMetrics
* @instance
*/function getCurrentBufferLevel(type,readOnly){var vo=getLatestBufferInfoVO(type,readOnly,_MetricsConstants2.default.BUFFER_LEVEL);if(vo){return _Round2.default.round10(vo.level/1000,-3);}return 0;}/**
* @param {string} mediaType
* @param {number} t
* @param {number} level
* @memberof module:DashMetrics
* @instance
*/function addBufferLevel(mediaType,t,level){metricsModel.addBufferLevel(mediaType,t,level);}/**
* @param {string} mediaType
* @param {string} state
* @param {number} target
* @memberof module:DashMetrics
* @instance
*/function addBufferState(mediaType,state,target){metricsModel.addBufferState(mediaType,state,target);}/**
* @memberof module:DashMetrics
* @instance
*/function clearAllCurrentMetrics(){metricsModel.clearAllCurrentMetrics();}/**
* @param {string} mediaType
* @param {boolean} readOnly
* @returns {*}
* @memberof module:DashMetrics
* @instance
*/function getCurrentHttpRequest(mediaType,readOnly){var metrics=metricsModel.getMetricsFor(mediaType,readOnly);if(!metrics){return null;}var httpList=metrics.HttpList;var currentHttpList=null;var httpListLastIndex=void 0;if(!httpList||httpList.length<=0){return null;}httpListLastIndex=httpList.length-1;while(httpListLastIndex>=0){if(httpList[httpListLastIndex].responsecode){currentHttpList=httpList[httpListLastIndex];break;}httpListLastIndex--;}return currentHttpList;}/**
* @param {string} mediaType
* @returns {*}
* @memberof module:DashMetrics
* @instance
*/function getHttpRequests(mediaType){var metrics=metricsModel.getMetricsFor(mediaType,true);if(!metrics){return[];}return!!metrics.HttpList?metrics.HttpList:[];}/**
* @param {string} mediaType
* @param {Array} loadingRequests
* @param {Array} executedRequests
* @memberof module:DashMetrics
* @instance
*/function addRequestsQueue(mediaType,loadingRequests,executedRequests){metricsModel.addRequestsQueue(mediaType,loadingRequests,executedRequests);}/**
* @param {MetricsList} metrics
* @param {string} metricName
* @returns {*}
* @memberof module:DashMetrics
* @instance
*/function getCurrent(metrics,metricName){if(!metrics){return null;}var list=metrics[metricName];if(!list||list.length<=0){return null;}return list[list.length-1];}/**
* @returns {*}
* @memberof module:DashMetrics
* @instance
*/function getCurrentDroppedFrames(){var metrics=metricsModel.getMetricsFor(_Constants2.default.VIDEO,true);return getCurrent(metrics,_MetricsConstants2.default.DROPPED_FRAMES);}/**
* @param {number} quality
* @memberof module:DashMetrics
* @instance
*/function addDroppedFrames(quality){metricsModel.addDroppedFrames(_Constants2.default.VIDEO,quality);}/**
* @param {string} mediaType
* @returns {*}
* @memberof module:DashMetrics
* @instance
*/function getCurrentSchedulingInfo(mediaType){var metrics=metricsModel.getMetricsFor(mediaType,true);return getCurrent(metrics,_MetricsConstants2.default.SCHEDULING_INFO);}/**
* @param {object} request
* @param {string} state
* @memberof module:DashMetrics
* @instance
*/function addSchedulingInfo(request,state){metricsModel.addSchedulingInfo(request.mediaType,new Date(),request.type,request.startTime,request.availabilityStartTime,request.duration,request.quality,request.range,state);}/**
* @returns {*}
* @memberof module:DashMetrics
* @instance
*/function getCurrentManifestUpdate(){var streamMetrics=metricsModel.getMetricsFor(_Constants2.default.STREAM);return getCurrent(streamMetrics,_MetricsConstants2.default.MANIFEST_UPDATE);}/**
* @param {object} updatedFields fields to be updated
* @memberof module:DashMetrics
* @instance
*/function updateManifestUpdateInfo(updatedFields){var manifestUpdate=this.getCurrentManifestUpdate();metricsModel.updateManifestUpdateInfo(manifestUpdate,updatedFields);}/**
* @param {object} streamInfo
* @memberof module:DashMetrics
* @instance
*/function addManifestUpdateStreamInfo(streamInfo){if(streamInfo){var manifestUpdate=this.getCurrentManifestUpdate();metricsModel.addManifestUpdateStreamInfo(manifestUpdate,streamInfo.id,streamInfo.index,streamInfo.start,streamInfo.duration);}}/**
* @param {object} request
* @memberof module:DashMetrics
* @instance
*/function addManifestUpdate(request){metricsModel.addManifestUpdate(_Constants2.default.STREAM,request.type,request.requestStartDate,request.requestEndDate);}/**
* @param {object} request
* @param {string} responseURL
* @param {number} responseStatus
* @param {object} responseHeaders
* @param {object} traces
* @memberof module:DashMetrics
* @instance
*/function addHttpRequest(request,responseURL,responseStatus,responseHeaders,traces){metricsModel.addHttpRequest(request.mediaType,null,request.type,request.url,responseURL,request.serviceLocation||null,request.range||null,request.requestStartDate,request.firstByteDate,request.requestEndDate,responseStatus,request.duration,responseHeaders,traces);}/**
* @param {object} representation
* @param {string} mediaType
* @memberof module:DashMetrics
* @instance
*/function addManifestUpdateRepresentationInfo(representation,mediaType){if(representation){var manifestUpdateInfo=this.getCurrentManifestUpdate();metricsModel.addManifestUpdateRepresentationInfo(manifestUpdateInfo,representation.id,representation.index,representation.streamIndex,mediaType,representation.presentationTimeOffset,representation.startNumber,representation.fragmentInfoType);}}/**
* @param {string} mediaType
* @returns {*}
* @memberof module:DashMetrics
* @instance
*/function getCurrentDVRInfo(mediaType){var metrics=mediaType?metricsModel.getMetricsFor(mediaType,true):metricsModel.getMetricsFor(_Constants2.default.VIDEO,true)||metricsModel.getMetricsFor(_Constants2.default.AUDIO,true);return getCurrent(metrics,_MetricsConstants2.default.DVR_INFO);}/**
* @param {string} mediaType
* @param {Date} currentTime time of the switch event
* @param {object} mpd mpd reference
* @param {object} range range of the dvr info
* @memberof module:DashMetrics
* @instance
*/function addDVRInfo(mediaType,currentTime,mpd,range){metricsModel.addDVRInfo(mediaType,currentTime,mpd,range);}/**
* @param {string} id
* @returns {*}
* @memberof module:DashMetrics
* @instance
*/function getLatestMPDRequestHeaderValueByID(id){var headers={};var httpRequestList=void 0,httpRequest=void 0,i=void 0;httpRequestList=getHttpRequests(_Constants2.default.STREAM);for(i=httpRequestList.length-1;i>=0;i--){httpRequest=httpRequestList[i];if(httpRequest.type===_HTTPRequest.HTTPRequest.MPD_TYPE){headers=parseResponseHeaders(httpRequest._responseHeaders);break;}}return headers[id]===undefined?null:headers[id];}/**
* @param {string} type
* @param {string} id
* @returns {*}
* @memberof module:DashMetrics
* @instance
*/function getLatestFragmentRequestHeaderValueByID(type,id){var headers={};var httpRequest=getCurrentHttpRequest(type,true);if(httpRequest){headers=parseResponseHeaders(httpRequest._responseHeaders);}return headers[id]===undefined?null:headers[id];}function parseResponseHeaders(headerStr){var headers={};if(!headerStr){return headers;}// Trim headerStr to fix a MS Edge bug with xhr.getAllResponseHeaders method
// which send a string starting with a "\n" character
var headerPairs=headerStr.trim().split('\r\n');for(var i=0,ilen=headerPairs.length;i<ilen;i++){var headerPair=headerPairs[i];var index=headerPair.indexOf(': ');if(index>0){headers[headerPair.substring(0,index)]=headerPair.substring(index+2);}}return headers;}/**
* @memberof module:DashMetrics
* @instance
*/function addPlayList(){if(playListMetrics){metricsModel.addPlayList(playListMetrics);playListMetrics=null;}}function createPlaylistMetrics(mediaStartTime,startReason){playListMetrics=new _PlayList.PlayList();playListMetrics.start=new Date();playListMetrics.mstart=mediaStartTime;playListMetrics.starttype=startReason;}function createPlaylistTraceMetrics(representationId,mediaStartTime,speed){if(playListTraceMetricsClosed===true){playListTraceMetricsClosed=false;playListTraceMetrics=new _PlayList.PlayListTrace();playListTraceMetrics.representationid=representationId;playListTraceMetrics.start=new Date();playListTraceMetrics.mstart=mediaStartTime;playListTraceMetrics.playbackspeed=speed;}}function updatePlayListTraceMetrics(traceToUpdate){if(playListTraceMetrics){for(var field in playListTraceMetrics){playListTraceMetrics[field]=traceToUpdate[field];}}}function pushPlayListTraceMetrics(endTime,reason){if(playListTraceMetricsClosed===false&&playListMetrics&&playListTraceMetrics&&playListTraceMetrics.start){var startTime=playListTraceMetrics.start;var duration=endTime.getTime()-startTime.getTime();playListTraceMetrics.duration=duration;playListTraceMetrics.stopreason=reason;playListMetrics.trace.push(playListTraceMetrics);playListTraceMetricsClosed=true;}}/**
* @param {object} errors
* @memberof module:DashMetrics
* @instance
*/function addDVBErrors(errors){metricsModel.addDVBErrors(errors);}instance={getCurrentRepresentationSwitch:getCurrentRepresentationSwitch,getLatestBufferInfoVO:getLatestBufferInfoVO,getCurrentBufferLevel:getCurrentBufferLevel,getCurrentHttpRequest:getCurrentHttpRequest,getHttpRequests:getHttpRequests,getCurrentDroppedFrames:getCurrentDroppedFrames,getCurrentSchedulingInfo:getCurrentSchedulingInfo,getCurrentDVRInfo:getCurrentDVRInfo,getCurrentManifestUpdate:getCurrentManifestUpdate,getLatestFragmentRequestHeaderValueByID:getLatestFragmentRequestHeaderValueByID,getLatestMPDRequestHeaderValueByID:getLatestMPDRequestHeaderValueByID,addRepresentationSwitch:addRepresentationSwitch,addDVRInfo:addDVRInfo,updateManifestUpdateInfo:updateManifestUpdateInfo,addManifestUpdateStreamInfo:addManifestUpdateStreamInfo,addManifestUpdateRepresentationInfo:addManifestUpdateRepresentationInfo,addManifestUpdate:addManifestUpdate,addHttpRequest:addHttpRequest,addSchedulingInfo:addSchedulingInfo,addRequestsQueue:addRequestsQueue,addBufferLevel:addBufferLevel,addBufferState:addBufferState,addDroppedFrames:addDroppedFrames,addPlayList:addPlayList,addDVBErrors:addDVBErrors,createPlaylistMetrics:createPlaylistMetrics,createPlaylistTraceMetrics:createPlaylistTraceMetrics,updatePlayListTraceMetrics:updatePlayListTraceMetrics,pushPlayListTraceMetrics:pushPlayListTraceMetrics,clearAllCurrentMetrics:clearAllCurrentMetrics};setup();return instance;}/**
* 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.
*/DashMetrics.__dashjs_factory_name='DashMetrics';exports.default=_FactoryMaker2.default.getSingletonFactory(DashMetrics);
//# sourceMappingURL=DashMetrics.js.map