#!/bin/bash

# Copyright (c) 2013 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.

# To set up in e.g. Eclipse, run a separate shell and pipe the output from the
# test into this script.
#
# In Eclipse, that amounts to creating a Run Configuration which starts
# "/bin/bash" with the arguments "-c [trunk_path]/out/Debug/modules_unittests
# --gtest_filter=*BweTest* | [trunk_path]/webrtc/modules/
# remote_bitrate_estimator/bwe_plot.

# bwe_plot.sh supports multiple figures (windows), the figure is specified as an
# identifier at the first argument after the PLOT command. Each figure has a
# single y axis and a dual y axis mode. If any line specifies an axis by ending
# with "#<axis number (1 or 2)>" two y axis will be used, the first will be
# assumed to represent bitrate (in kbps) and the second will be assumed to
# represent time deltas (in ms).

log=$(</dev/stdin)

function gen_gnuplot_input {
  colors=(a7001f 0a60c2 b2582b 21a66c d6604d 4393c3 f4a582 92c5de edcbb7 b1c5d0)
  plots=$(echo "$log" | grep "^PLOT")
  figures=($(echo "$plots" | cut -f 2 | sort | uniq))

  for figure in "${figures[@]}" ; do
    data_sets=$(echo "$plots" | grep "^PLOT.$figure" | cut -f 3 | sort | uniq)
    linetypes=($(echo "$data_sets" | grep "#" | cut -d '#' -f 2 | \
      cut -d ' ' -f 1))
    echo -n "reset; "
    echo -n "set terminal wxt $figure size 1440,900 font \"Arial,9\"; "
    echo -n "set xlabel \"Seconds\"; "
    if (( "${#linetypes[@]}" > "0" )); then
      echo -n "set ylabel 'bitrate (kbps)';"
      echo -n "set ytics nomirror;"
      echo -n "set y2label 'time delta (ms)';"
      echo -n "set y2tics nomirror;"
    fi
    echo -n "plot "
    i=0
    for set in $data_sets ; do
      (( i++ )) && echo -n ","
      echo -n "'-' with "
      echo -n "linespoints "
      echo -n "ps 0.5 "
      echo -n "lc rgbcolor \"#${colors[$(($i % 10))]}\" "
      if (( "${#linetypes[@]}" > "0" )); then
        if (( "$i" <= "${#linetypes[@]}" )); then
          echo -n "axes x1y${linetypes[$i - 1]} "
        else
          # If no line type is specified, but line types are used, we will
          # default to the bitrate axis.
          echo -n "axes x1y1 "
        fi
      fi
      echo -n "title \"$set\" "
    done
    echo
    for set in $data_sets ; do
      echo "$log" | grep "^PLOT.$figure.$set" | cut -f 4,5
      echo "e"
    done
  done
}

gen_gnuplot_input | gnuplot -persist
