| // Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. | |
| // | |
| // Use of this source code is governed by a BSD-style license | |
| // that can be found in the LICENSE file in the root of the source | |
| // tree. An additional intellectual property rights grant can be found | |
| // in the file PATENTS. All contributing project authors may | |
| // be found in the AUTHORS file in the root of the source tree. | |
| // | |
| google.load("visualization", "1", {packages:["corechart"]}); | |
| function openFiles(event) { | |
| var files = event.target.files; | |
| readAndAnalyzeFiles(files) | |
| } | |
| function readAndAnalyzeFiles(files) { | |
| if(!files) { | |
| alert("No files have been selected!"); | |
| return; | |
| } | |
| var reports = []; | |
| var filesNames = []; | |
| missingFiles = files.length; | |
| for(var i = 0; i < files.length; i++) { | |
| var reader = new FileReader(); | |
| reader.onload = onReaderLoad.bind(reader, files[i].name); | |
| reader.readAsText(files[i]); | |
| } | |
| function onReaderLoad(fileName) { | |
| reports.push(JSON.parse(this.result)); | |
| filesNames.push(fileName); | |
| missingFiles--; | |
| if(missingFiles == 0) { | |
| analyzeReports_(reports, filesNames); | |
| } | |
| } | |
| } | |
| // TODO(houssainy) take the input stats from the select list or | |
| // drop down menu in html. | |
| function analyzeReports_(reports, filesNames) { | |
| filesNames.unshift(""); // ned | |
| // Rtt | |
| analyzeRttData(reports, filesNames, "bot1"); | |
| analyzeRttData(reports, filesNames, "bot2"); | |
| // Send Packets Lost | |
| analyzePacketsLostData(reports, filesNames, "bot1"); | |
| analyzePacketsLostData(reports, filesNames, "bot2"); | |
| // Send bandwidth | |
| analyzeData(reports, filesNames, "Available Send Bandwidth-bot1", "bot1", | |
| "bweforvideo", "googAvailableSendBandwidth"); | |
| analyzeData(reports, filesNames, "Available Send Bandwidth-bot2", "bot2", | |
| "bweforvideo", "googAvailableSendBandwidth"); | |
| // Receive bandwidth | |
| analyzeData(reports, filesNames, "Available Receive Bandwidth-bot1", "bot1", | |
| "bweforvideo", "googAvailableReceiveBandwidth"); | |
| analyzeData(reports, filesNames, "Available Receive Bandwidth-bot2", "bot2", | |
| "bweforvideo", "googAvailableReceiveBandwidth"); | |
| drawSeparatorLine(); | |
| } | |
| function analyzeRttData(reports, filesNames, botName) { | |
| var outPut = []; | |
| outPut.push(filesNames); | |
| var avergaData = ['Average Rtt x10']; | |
| var maxData = ['Max Rtt']; | |
| var average; | |
| var max; | |
| for(var index in reports) { | |
| average = getStateAverage(reports[index], botName, "Conn-audio-1-0", | |
| "googRtt"); | |
| avergaData.push(average*10); | |
| max = getStateMax(reports[index], botName, "Conn-audio-1-0", | |
| "googRtt"); | |
| maxData.push(max); | |
| } | |
| outPut.push(avergaData); | |
| outPut.push(maxData); | |
| drawChart("Rtt-" + botName, outPut); | |
| } | |
| function analyzePacketsLostData(reports, filesNames, botName) { | |
| var outPut = []; | |
| outPut.push(filesNames); | |
| var maxData = ['Max Send PacketsLost']; | |
| var max; | |
| for(var index in reports) { | |
| max = getStateMax(reports[index], botName, "ssrc_[0-9]+_send", | |
| "packetsLost"); | |
| maxData.push(max); | |
| } | |
| outPut.push(maxData); | |
| drawChart("Send PacketsLost-" + botName, outPut); | |
| } | |
| function analyzeData(reports, filesNames, chartName, botName, reportId, | |
| statName) { | |
| var outPut = []; | |
| outPut.push(filesNames); | |
| var avergaData = ['Average ' + statName]; | |
| var maxData = ['Max ' + statName]; | |
| var average; | |
| var max; | |
| for(var index in reports) { | |
| average = getStateAverage(reports[index], botName, reportId, statName); | |
| avergaData.push(average); | |
| max = getStateMax(reports[index], botName, reportId, statName); | |
| maxData.push(max); | |
| } | |
| outPut.push(avergaData); | |
| outPut.push(maxData); | |
| drawChart(chartName, outPut); | |
| } | |
| function getStateAverage(reports, botName, reportId, statName) { | |
| var sum = 0; | |
| var count = 0; | |
| for (var index in reports) { | |
| var data = reports[index].data; | |
| if(index == 0 || !data.hasOwnProperty(botName)) | |
| continue; | |
| var stats = data[botName]; | |
| for (var key in stats) { | |
| if(key.search(reportId) != -1) { | |
| var value = parseInt(stats[key][statName]); | |
| sum += value; | |
| count++; | |
| } | |
| } | |
| } | |
| return Math.round(sum/count); | |
| } | |
| function getStateMax(reports, botName, reportId, statName) { | |
| var max = -1; | |
| for (var index in reports) { | |
| var data = reports[index].data; | |
| if(index == 0 || !data.hasOwnProperty(botName)) | |
| continue; | |
| var stats = data[botName]; | |
| for (var key in stats) { | |
| if(key.search(reportId) != -1) { | |
| var value = parseInt(stats[key][statName]); | |
| max = Math.max(value, max); | |
| } | |
| } | |
| } | |
| return max; | |
| } | |
| function drawChart(title, data) { | |
| var dataTable = google.visualization.arrayToDataTable(data); | |
| var options = { | |
| title: title, | |
| }; | |
| var div = document.createElement('div'); | |
| document.body.appendChild(div); | |
| var chart = new google.visualization.ColumnChart(div); | |
| chart.draw(dataTable, options); | |
| } | |
| function drawSeparatorLine() { | |
| var hr = document.createElement('hr'); | |
| document.body.appendChild(hr); | |
| } |