1 // Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. 2 // 3 // Use of this source code is governed by a BSD-style license 4 // that can be found in the LICENSE file in the root of the source 5 // tree. An additional intellectual property rights grant can be found 6 // in the file PATENTS. All contributing project authors may 7 // be found in the AUTHORS file in the root of the source tree. 8 // 9 google.load("visualization", "1", {packages:["corechart"]}); 10 11 function openFiles(event) { 12 var files = event.target.files; 13 readAndAnalyzeFiles(files) 14 } 15 16 function readAndAnalyzeFiles(files) { 17 if(!files) { 18 alert("No files have been selected!"); 19 return; 20 } 21 22 var reports = []; 23 var filesNames = []; 24 missingFiles = files.length; 25 26 for(var i = 0; i < files.length; i++) { 27 var reader = new FileReader(); 28 reader.onload = onReaderLoad.bind(reader, files[i].name); 29 reader.readAsText(files[i]); 30 } 31 32 function onReaderLoad(fileName) { 33 reports.push(JSON.parse(this.result)); 34 filesNames.push(fileName); 35 36 missingFiles--; 37 if(missingFiles == 0) { 38 analyzeReports_(reports, filesNames); 39 } 40 } 41 } 42 43 // TODO(houssainy) take the input stats from the select list or 44 // drop down menu in html. 45 function analyzeReports_(reports, filesNames) { 46 filesNames.unshift(""); // ned 47 48 // Rtt 49 analyzeRttData(reports, filesNames, "bot1"); 50 analyzeRttData(reports, filesNames, "bot2"); 51 52 // Send Packets Lost 53 analyzePacketsLostData(reports, filesNames, "bot1"); 54 analyzePacketsLostData(reports, filesNames, "bot2"); 55 56 // Send bandwidth 57 analyzeData(reports, filesNames, "Available Send Bandwidth-bot1", "bot1", 58 "bweforvideo", "googAvailableSendBandwidth"); 59 analyzeData(reports, filesNames, "Available Send Bandwidth-bot2", "bot2", 60 "bweforvideo", "googAvailableSendBandwidth"); 61 62 // Receive bandwidth 63 analyzeData(reports, filesNames, "Available Receive Bandwidth-bot1", "bot1", 64 "bweforvideo", "googAvailableReceiveBandwidth"); 65 analyzeData(reports, filesNames, "Available Receive Bandwidth-bot2", "bot2", 66 "bweforvideo", "googAvailableReceiveBandwidth"); 67 68 drawSeparatorLine(); 69 } 70 71 function analyzeRttData(reports, filesNames, botName) { 72 var outPut = []; 73 outPut.push(filesNames); 74 75 var avergaData = ['Average Rtt x10']; 76 var maxData = ['Max Rtt']; 77 78 var average; 79 var max; 80 for(var index in reports) { 81 average = getStateAverage(reports[index], botName, "Conn-audio-1-0", 82 "googRtt"); 83 avergaData.push(average*10); 84 85 max = getStateMax(reports[index], botName, "Conn-audio-1-0", 86 "googRtt"); 87 maxData.push(max); 88 } 89 outPut.push(avergaData); 90 outPut.push(maxData); 91 92 drawChart("Rtt-" + botName, outPut); 93 } 94 95 function analyzePacketsLostData(reports, filesNames, botName) { 96 var outPut = []; 97 outPut.push(filesNames); 98 99 var maxData = ['Max Send PacketsLost']; 100 var max; 101 for(var index in reports) { 102 max = getStateMax(reports[index], botName, "ssrc_[0-9]+_send", 103 "packetsLost"); 104 maxData.push(max); 105 } 106 outPut.push(maxData); 107 108 drawChart("Send PacketsLost-" + botName, outPut); 109 } 110 111 function analyzeData(reports, filesNames, chartName, botName, reportId, 112 statName) { 113 var outPut = []; 114 outPut.push(filesNames); 115 116 var avergaData = ['Average ' + statName]; 117 var maxData = ['Max ' + statName]; 118 119 var average; 120 var max; 121 for(var index in reports) { 122 average = getStateAverage(reports[index], botName, reportId, statName); 123 avergaData.push(average); 124 125 max = getStateMax(reports[index], botName, reportId, statName); 126 maxData.push(max); 127 } 128 outPut.push(avergaData); 129 outPut.push(maxData); 130 131 drawChart(chartName, outPut); 132 } 133 134 function getStateAverage(reports, botName, reportId, statName) { 135 var sum = 0; 136 var count = 0; 137 138 for (var index in reports) { 139 var data = reports[index].data; 140 if(index == 0 || !data.hasOwnProperty(botName)) 141 continue; 142 143 var stats = data[botName]; 144 for (var key in stats) { 145 if(key.search(reportId) != -1) { 146 var value = parseInt(stats[key][statName]); 147 sum += value; 148 count++; 149 } 150 } 151 } 152 return Math.round(sum/count); 153 } 154 155 function getStateMax(reports, botName, reportId, statName) { 156 var max = -1; 157 158 for (var index in reports) { 159 var data = reports[index].data; 160 if(index == 0 || !data.hasOwnProperty(botName)) 161 continue; 162 163 var stats = data[botName]; 164 for (var key in stats) { 165 if(key.search(reportId) != -1) { 166 var value = parseInt(stats[key][statName]); 167 max = Math.max(value, max); 168 } 169 } 170 } 171 return max; 172 } 173 174 function drawChart(title, data) { 175 var dataTable = google.visualization.arrayToDataTable(data); 176 177 var options = { 178 title: title, 179 }; 180 181 var div = document.createElement('div'); 182 document.body.appendChild(div); 183 184 var chart = new google.visualization.ColumnChart(div); 185 chart.draw(dataTable, options); 186 } 187 188 function drawSeparatorLine() { 189 var hr = document.createElement('hr'); 190 document.body.appendChild(hr); 191 } 192