| Index: webrtc/modules/remote_bitrate_estimator/test/plot_dynamics.py | 
| diff --git a/webrtc/modules/remote_bitrate_estimator/test/plot_dynamics.py b/webrtc/modules/remote_bitrate_estimator/test/plot_dynamics.py | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..f825be41fdc90665e8928b09bd1902894182f83a | 
| --- /dev/null | 
| +++ b/webrtc/modules/remote_bitrate_estimator/test/plot_dynamics.py | 
| @@ -0,0 +1,154 @@ | 
| +#!/usr/bin/env python | 
| +# Copyright (c) 2015 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. | 
| + | 
| +# This script is used to plot simulation dynamics. | 
| +# Able to plot each flow separately. Other plot boxes can be added, | 
| +# currently one for Throughput, one for Latency and one for Packet Loss. | 
| + | 
| +import matplotlib | 
| +import matplotlib.pyplot as plt | 
| +import math | 
| +import numpy | 
| +import re | 
| +import sys | 
| + | 
| + | 
| +class Variable: | 
| +  def __init__(self, variable): | 
| +    self._ID = variable[0] | 
| +    self._xlabel = variable[1] | 
| +    self._ylabel = variable[2] | 
| +    self._subplot = variable[3] | 
| +    self._y_max = variable[4] | 
| +    self._samples = dict() | 
| + | 
| +  def getID(self): | 
| +    return self._ID | 
| + | 
| +  def getXLabel(self): | 
| +    return self._xlabel | 
| + | 
| +  def getYLabel(self): | 
| +    return self._ylabel | 
| + | 
| +  def getSubplot(self): | 
| +    return self._subplot | 
| + | 
| +  def getYMax(self): | 
| +    return self._y_max | 
| + | 
| +  def getNumberOfFlows(self): | 
| +    return len(self._samples) | 
| + | 
| + | 
| +  def addSample(self, line): | 
| +    groups = re.search(r'/\d_(\w+)#\d@(\w*)', line) | 
| +    var_name = groups.group(1) | 
| +    alg_name = groups.group(2) | 
| + | 
| +    if alg_name not in self._samples.keys(): | 
| +      self._samples[alg_name] = {} | 
| + | 
| +    if var_name not in self._samples[alg_name].keys(): | 
| +      self._samples[alg_name][var_name] = [] | 
| + | 
| +    sample = re.search(r'(\d+\.\d+)\t([-]?\d+\.\d+)', line) | 
| +    s = (sample.group(1),sample.group(2)) | 
| +    self._samples[alg_name][var_name].append(s) | 
| + | 
| +def plotVar(v, ax, show_legend, show_x_label): | 
| +  if show_x_label: | 
| +    ax.set_xlabel(v.getXLabel(), fontsize='large') | 
| +  ax.set_ylabel(v.getYLabel(), fontsize='large') | 
| + | 
| +  for alg in v._samples.keys(): | 
| +    i = 1 | 
| +    for series in v._samples[alg].keys(): | 
| +      x = [sample[0] for sample in v._samples[alg][series]] | 
| +      y = [sample[1] for sample in v._samples[alg][series]] | 
| +      x = numpy.array(x) | 
| +      y = numpy.array(y) | 
| +      line = plt.plot(x, y, label=alg, linewidth=4.0) | 
| +      colormap = {'Available1':'#AAAAAA', | 
| +                  'Available2':'#AAAAAA', | 
| +                  'GCC1':'#80D000', | 
| +                  'GCC2':'#008000', | 
| +                  'GCC3':'#00F000', | 
| +                  'GCC4':'#00B000', | 
| +                  'GCC5':'#70B020', | 
| +                  'NADA1':'#0000AA', | 
| +                  'NADA2':'#A0A0FF', | 
| +                  'NADA3':'#0000FF', | 
| +                  'NADA4':'#C0A0FF', | 
| +                  'NADA5':'#9060B0', | 
| +                  'TCP1':'#AAAAAA', | 
| +                  'TCP2':'#AAAAAA', | 
| +                  'TCP3':'#AAAAAA', | 
| +                  'TCP4':'#AAAAAA', | 
| +                  'TCP5':'#AAAAAA', | 
| +                  'TCP6':'#AAAAAA', | 
| +                  'TCP7':'#AAAAAA', | 
| +                  'TCP8':'#AAAAAA', | 
| +                  'TCP9':'#AAAAAA', | 
| +                  'TCP10':'#AAAAAA',} | 
| + | 
| +      plt.setp(line, color=colormap[alg + str(i)]) | 
| +      if alg.startswith('Available'): | 
| +        plt.setp(line, linestyle='--') | 
| +      plt.grid(True) | 
| + | 
| +      x1, x2, y1, y2 = plt.axis() | 
| +      if v.getYMax() >= 0: | 
| +        y2 = v.getYMax() | 
| +      plt.axis((0, x2, 0, y2)) | 
| +      i += 1 | 
| + | 
| +    if show_legend: | 
| +      legend = plt.legend(loc='upper right', shadow=True, | 
| +                          fontsize='large', ncol=len(v._samples)) | 
| + | 
| +if __name__ == '__main__': | 
| + | 
| +  variables = [ | 
| +          ('Throughput_kbps', "Time (s)", "Throughput (kbps)", 1, 4000), | 
| +          ('Delay_ms', "Time (s)", "One-way Delay (ms)", 2, 500), | 
| +          ('Packet_Loss', "Time (s)", "Packet Loss Ratio", 3, 1.0), | 
| +          ] | 
| + | 
| +  var = [] | 
| + | 
| +  # Create objects. | 
| +  for variable in variables: | 
| +    var.append(Variable(variable)) | 
| + | 
| +  # Add samples to the objects. | 
| +  for line in sys.stdin: | 
| +    if line.startswith("[ RUN      ]"): | 
| +        test_name = re.search('\.(\w+)', line).group(1) | 
| +    if line.startswith("PLOT"): | 
| +      for v in var: | 
| +        if v.getID() in line: | 
| +          v.addSample(line) | 
| + | 
| +  matplotlib.rcParams.update({'font.size': 20}) | 
| + | 
| +  # Plot variables. | 
| +  fig = plt.figure() | 
| + | 
| +  # Offest and threshold on the same plot. | 
| +  n = var[-1].getSubplot() | 
| +  i = 0 | 
| +  for v in var: | 
| +    ax = fig.add_subplot(n, 1, v.getSubplot()) | 
| +    plotVar(v, ax, i == 0, i == n - 1) | 
| +    i += 1 | 
| + | 
| +  #fig.savefig(test_name+".jpg") | 
| +  plt.show() | 
| + | 
|  |