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//
9google.load("visualization", "1", {packages:["corechart"]});
10
11function openFiles(event) {
12  var files = event.target.files;
13  readAndAnalyzeFiles(files)
14}
15
16function 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.
45function 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
71function 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
95function 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
111function 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
134function 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
155function 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
174function 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
188function drawSeparatorLine()  {
189  var hr = document.createElement('hr');
190  document.body.appendChild(hr);
191}
192