1fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin# This script filters the PERF traces based on the specified parameters and
2fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin# measures the rate of the filtered traces.  This can be used to measure
3fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin# video encode/decode/preview frame rates.
4fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin# 
5fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin# Fields in a PERF CSV line:
6fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#
7fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin# $1 - time stamp
8fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin# $2 - PID
9fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin# $3 - address
10fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin# $4 - component
11fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin# $5-$10 - domains (AD, VD, ID, AE, VE, IE)
12fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin# $11 - component type
13fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin# $12 - operation
14fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin# $13-... operation specific arguments:
15fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#    Buffer:
16fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin# $13 - sending|received|xfering
17fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin# $14 - frame|buffer
18fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin# $15 - from
19fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin# $16 - to
20fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin# $17 - size
21fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin# $18 - address 1
22fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin# $19 - address 2
23fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#    Boundary:
24fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin# $13 - hex
25fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin# $14 - textual
26fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
27fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin# initialize variables
28fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinBEGIN {
29fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   FS = ",";                         # reading a CSV file
30fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
31fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   what = what ? what : "frame";     # what buffers are we looking at
32fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   how  = how  ? how  : "sending";   # what is the operation
33fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   to   = to   ? to   : "";          # who are the recipients of these buffers
34fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   from = from ? from : "";          # who are the senders of these buffers
35fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
36fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   # boundary - only log buffer traces in the steady state of this component
37fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   boundary = boundary ? boundary : "****";
38fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
39fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   min  = (size != "") ? (size) : (min != "") ? (min) : 1;   # min size of buffers to watch
40fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   max  = (size != "") ? (size) : (max != "") ? (max) : 5e9; # max size of buffers to watch
41fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   # Additional variables not set:
42fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
43fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   # debug    - debug flag
44fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   # after    - only measure frames after the specified #
45fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   # who      - who is logging these buffer transfers
46fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
47fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   # get variable assignments from ARGV
48fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   for (i=1; i<ARGC; i++) {
49fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin      arg = ARGV[i];
50fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin      if      (gsub("^what=",    "",arg)) { what     = arg }
51fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin      else if (gsub("^to=",      "",arg)) { to       = arg }
52fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin      else if (gsub("^from=",    "",arg)) { from     = arg }
53fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin      else if (gsub("^how=",     "",arg)) { how      = arg }
54fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin      else if (gsub("^who=",     "",arg)) { who      = arg }
55fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin      else if (gsub("^boundary=","",arg)) { boundary = arg }
56fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin      else if (gsub("^after=",   "",arg)) { after    = arg }
57fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin      else if (gsub("^debug=",   "",arg)) { debug    = arg }
58fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin      else if (gsub("^size=",    "",arg)) { min = max = (arg) }
59fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin      else if (gsub("^min=",     "",arg)) { min      = (arg) }
60fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin      else if (gsub("^max=",     "",arg)) { max      = (arg) }
61fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
62fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin      else continue;
63fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin      delete ARGV[i];
64fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   }
65fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
66fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   if (!who) {
67fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin      print "Must specify component to observe";
68fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin      exit 1;
69fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   }
70fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
71fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   # we are using the component thread as boundary by default
72fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   if (boundary == "****") {
73fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin      if (substr(who, 0, 3) == "VP_" ||
74fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin          substr(who, 0, 3) == "VD_" ||
75fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin          substr(who, 0, 3) == "VE_" ||
76fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin          substr(who, 0, 3) == "CAM") {
77fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin         boundary = substr(who, 0, 3) "T";
78fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin      }
79fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   }
80fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
81fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   after++;   # we always have to after the 1st time stamp to get a time delta
82fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   skip = after + 1;
83fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
84fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   # start counting unless boundary is set, in which case
85fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   count = boundary ? skip : 0;
86fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
87fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   # initialize counters
88fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   x = xx = N = 0;
89fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   x_no_pause = xx_no_pause = N_no_pause = 0;
90fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
91fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   if (debug > 1) {
92fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin      print "who = ", who
93fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin      print "how = ", how
94fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin      print "what = ", what
95fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin      print "from = ", (from ? from : "UNDEFINED")
96fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin      print "to = ", (to ? to : "UNDEFINED")
97fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin      print "min = ", min
98fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin      print "max = ", max
99fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   }
100fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
101fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   # convert to decimal
102fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   min = min + 0
103fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   max = max + 0
104fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
105fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
106fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin# Check for non-CSV trace file
107fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/^</ {
108fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   print "ERROR: non-CSV file encountered.  Please use csv = 1 in ./perf.ini";
109fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   exit;
110fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
111fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
112fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin# Count frames
113fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#   frames start with a number, with operation "Buffer"
114fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/^[0-9]/ && $4 == who && $12 == "Buffer" &&
115fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#   how and what has to match
116fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#   if from or to are specified they also have to match
117fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin$13 == how && $14 == what && (!from || ($15 == from)) && (!to || ($16 == to)) &&
118fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#   size has to fall in the range specified, we have to add 0 because of a
119fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#   rare rounding issue in AWK when comparing hex and decimal numbers
120fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin((0 + $17) >= min) &&
121fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin((0 + $17) <= max) {
122fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   # debug
123fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   if (debug) { print $0 }
124fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
125fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   # increase the count from the boundary
126fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   if (count == after) {
127fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin      delta = $1 - last;
128fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin      if (delta >= 2) {
129fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin         print "Warning: Found a pause of", delta, "seconds";
130fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin      }
131fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin      else
132fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin      {
133fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin         x_no_pause  += delta;
134fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin         xx_no_pause += delta * delta;
135fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin         N_no_pause++;
136fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin      }
137fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin      x  += delta;
138fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin      xx += delta * delta;
139fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin      N++;
140fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   }
141fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   if (count < after) { count++; }
142fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   last = $1;
143fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
144fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
145fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin# Check boundaries
146fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/Steady/ && $12 == "Boundary" && $4 == boundary {
147fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   # debug
148fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   if (debug) { print $0 }
149fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
150fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   # start counting if starting steady state, skip counting if ending steady
151fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   # state
152fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   count = /started/ ? 0 : skip;
153fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
154fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
155fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinEND {
156fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   # calculate inverse (1/x) average and variance
157fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   if (N) {
158fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin      x /= N;
159fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin      xx /= N;
160fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin      s = xx ? (x * x / xx) : 0;
161fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin      result = 1/x " fps (s=" s ") (from " N " data points)";
162fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin      print "Rate is", result;
163fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
164fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin      if (N != N_no_pause) {
165fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin         if (N_no_pause) {
166fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            x = x_no_pause / N_no_pause;
167fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            xx = xx_no_pause / N_no_pause;
168fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            s = xx ? (x * x / xx) : 1;
169fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            result = 1/x " fps (s=" s ") (from " N " data points)";
170fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            print "(Adjusted rate without pauses is", result, ")";
171fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin         } else {
172fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            print "(Not enough data to calculate adjusted rate without pauses)";
173fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin         }
174fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin      }
175fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   } else {
176fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin      print "Error:   Not enough data to calculate rate";
177fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   }
178fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
179fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
180