Add plotter script to plot internal test's stats

Bug: webrtc:10138
Change-Id: I2b9d55559cf6a123914e5a597a5bf6ea6e2aa4d7
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/152721
Commit-Queue: Artem Titov <titovartem@webrtc.org>
Reviewed-by: Patrik Höglund <phoglund@webrtc.org>
Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#29177}
diff --git a/rtc_tools/metrics_plotter.py b/rtc_tools/metrics_plotter.py
new file mode 100644
index 0000000..d045763
--- /dev/null
+++ b/rtc_tools/metrics_plotter.py
@@ -0,0 +1,73 @@
+#!/usr/bin/env python
+# Copyright (c) 2019 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.
+"""Plots metrics from stdin.
+
+Expected format:
+PLOTTABLE_DATA: <json data>
+Where json data has the following format:
+{
+  "graph_name": "<graph name>",
+  "trace_name": "<test suite name>",
+  "units": "<units>",
+  "mean": <mean value>,
+  "std": <standard deviation value>,
+  "samples": [
+    { "time": <sample time in us>, "value": <sample value> },
+    ...
+  ]
+}
+"""
+
+import fileinput
+import json
+import matplotlib.pyplot as plt
+
+LINE_PREFIX = 'PLOTTABLE_DATA: '
+
+GRAPH_NAME = 'graph_name'
+TRACE_NAME = 'trace_name'
+UNITS = 'units'
+
+MICROSECONDS_IN_SECOND = 1e6
+
+
+def main():
+  metrics = []
+  for line in fileinput.input():
+    line = line.strip()
+    if line.startswith(LINE_PREFIX):
+      line = line.replace(LINE_PREFIX, '')
+      metrics.append(json.loads(line))
+    else:
+      print line
+
+  for metric in metrics:
+    figure = plt.figure()
+    figure.canvas.set_window_title(metric[TRACE_NAME])
+
+    x_values = []
+    y_values = []
+    start_x = None
+    for sample in metric['samples']:
+      if start_x is None:
+        start_x = sample['time']
+      # Time is us, we want to show it in seconds.
+      x_values.append((sample['time'] - start_x) / MICROSECONDS_IN_SECOND)
+      y_values.append(sample['value'])
+
+    plt.ylabel('%s (%s)' % (metric[GRAPH_NAME], metric[UNITS]))
+    plt.xlabel('time (ms)')
+    plt.title(metric[GRAPH_NAME])
+    plt.plot(x_values, y_values)
+
+  plt.show()
+
+
+if __name__ == '__main__':
+  main()