blob: 91b0eec1431d1bc9094b0f44e193dc790c60daa4 [file] [log] [blame]
// 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);
}