1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 /** 6 * @fileoverview 7 * Module to support debug overlay window with connection stats. 8 */ 9 10 'use strict'; 11 12 /** @suppress {duplicate} */ 13 var remoting = remoting || {}; 14 15 /** 16 * @constructor 17 * @param {Element} statsElement The HTML div to which to update stats. 18 */ 19 remoting.ConnectionStats = function(statsElement) { 20 this.statsElement = statsElement; 21 }; 22 23 /** 24 * Show or hide the connection stats div. 25 */ 26 remoting.ConnectionStats.prototype.toggle = function() { 27 this.statsElement.hidden = !this.statsElement.hidden; 28 }; 29 30 /** 31 * Update the statistics panel. 32 * @param {remoting.ClientSession.PerfStats} stats The connection statistics. 33 */ 34 remoting.ConnectionStats.prototype.update = function(stats) { 35 var units = ''; 36 var videoBandwidth = stats.videoBandwidth; 37 if (videoBandwidth != undefined) { 38 if (videoBandwidth < 1024) { 39 units = 'Bps'; 40 } else if (videoBandwidth < 1048576) { 41 units = 'KiBps'; 42 videoBandwidth = videoBandwidth / 1024; 43 } else if (videoBandwidth < 1073741824) { 44 units = 'MiBps'; 45 videoBandwidth = videoBandwidth / 1048576; 46 } else { 47 units = 'GiBps'; 48 videoBandwidth = videoBandwidth / 1073741824; 49 } 50 } 51 52 /** 53 * @param {number} value 54 * @param {string} units 55 * @returns {string} Formatted number. 56 */ 57 function formatStatNumber(value, units) { 58 if (value != undefined) { 59 return value.toFixed(2) + ' ' + units; 60 } else { 61 return "n/a"; 62 } 63 } 64 65 var statistics = document.getElementById('statistics'); 66 this.statsElement.innerText = ( 67 'Bandwidth: ' + formatStatNumber(videoBandwidth, units) + 68 ', Frame Rate: ' + formatStatNumber(stats.videoFrameRate, 'fps') + 69 ', Capture: ' + formatStatNumber(stats.captureLatency, 'ms') + 70 ', Encode: ' + formatStatNumber(stats.encodeLatency, 'ms') + 71 ', Decode: ' + formatStatNumber(stats.decodeLatency, 'ms') + 72 ', Render: ' + formatStatNumber(stats.renderLatency, 'ms') + 73 ', Latency: ' + formatStatNumber(stats.roundtripLatency, 'ms')); 74 }; 75 76 /** 77 * Check for the debug toggle hot-key. 78 * 79 * @param {Event} event The keyboard event. 80 * @return {void} Nothing. 81 */ 82 remoting.ConnectionStats.onKeydown = function(event) { 83 var element = /** @type {Element} */ (event.target); 84 if (element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') { 85 return; 86 } 87 if (String.fromCharCode(event.which) == 'D') { 88 remoting.stats.toggle(); 89 } 90 }; 91 92 /** @type {remoting.ConnectionStats} */ 93 remoting.stats = null; 94