| // 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); |
| } |