1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgfunction [t, TS] = plotReceiveTrace(filename, flat)
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgfid=fopen(filename);
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org%DEBUG     ; ( 8:32:33:375 |    0)        VIDEO:1          ;      5260; First packet of frame 1869537938
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org%DEBUG     ; ( 8:32:33:375 |    0) VIDEO CODING:1          ;      5260; Decoding timestamp 1869534934
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org%DEBUG     ; ( 8:32:33:375 |    0)        VIDEO:1          ;      5260; Render frame 1869534934 at 20772610
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org%DEBUG     ; ( 8:32:33:375 |    0) VIDEO CODING:-1         ;      5260; Frame decoded: timeStamp=1870511259 decTime=0 maxDecTime=0, at 19965
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org%DEBUG     ; ( 7:59:42:500 |    0)        VIDEO:-1         ;      2500; Received complete frame timestamp 1870514263 frame type 1 frame size 7862 at time 19965, jitter estimate was 130
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org%DEBUG     ; ( 8: 5:51:774 |    0)        VIDEO:-1         ;      3968; ExtrapolateLocalTime(1870967878)=24971 ms
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgif nargin == 1
11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    flat = 0;
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgend
13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgline = fgetl(fid);
14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgestimatedArrivalTime = [];
15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgpacketTime = [];
16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgfirstPacketTime = [];
17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgdecodeTime = [];
18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgdecodeCompleteTime = [];
19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgrenderTime = [];
20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgcompleteTime = [];
21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgwhile ischar(line)%line ~= -1
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if length(line) == 0
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        line = fgetl(fid);
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        continue;
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    end
26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    % Parse the trace line header
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    [tempres, count] = sscanf(line, 'DEBUG     ; (%u:%u:%u:%u |%*lu)%13c:');
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if count < 5
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        line = fgetl(fid);
30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        continue;
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    end
32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    hr=tempres(1);
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    mn=tempres(2);
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    sec=tempres(3);
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ms=tempres(4);
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    timeInMs=hr*60*60*1000 + mn*60*1000 + sec*1000 + ms;
37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    label = tempres(5:end);
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    I = find(label ~= 32); 
39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    label = label(I(1):end); % remove white spaces
40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if ~strncmp(char(label), 'VIDEO', 5) & ~strncmp(char(label), 'VIDEO CODING', 12)
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        line = fgetl(fid);
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        continue;
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    end
44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    message = line(72:end);
45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    
46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    % Parse message
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    [p, count] = sscanf(message, 'ExtrapolateLocalTime(%lu)=%lu ms');
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if count == 2
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        estimatedArrivalTime = [estimatedArrivalTime; p'];
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        line = fgetl(fid);
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        continue;
52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    end
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    
54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    [p, count] = sscanf(message, 'Packet seqNo %u of frame %lu at %lu');
55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if count == 3
56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        packetTime = [packetTime; p'];
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        line = fgetl(fid);
58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        continue;
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    end
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    [p, count] = sscanf(message, 'First packet of frame %lu at %lu');
62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if count == 2
63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        firstPacketTime = [firstPacketTime; p'];
64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        line = fgetl(fid);
65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        continue;
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    end
67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    
68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    [p, count] = sscanf(message, 'Decoding timestamp %lu at %lu');
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if count == 2
70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        decodeTime = [decodeTime; p'];
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        line = fgetl(fid);
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        continue;        
73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    end
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    [p, count] = sscanf(message, 'Render frame %lu at %lu. Render delay %lu, required delay %lu, max decode time %lu, min total delay %lu');
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if count == 6
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        renderTime = [renderTime; p'];
78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        line = fgetl(fid);
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        continue;
80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    end
81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    [p, count] = sscanf(message, 'Frame decoded: timeStamp=%lu decTime=%d maxDecTime=%lu, at %lu');
83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if count == 4
84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        decodeCompleteTime = [decodeCompleteTime; p'];
85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        line = fgetl(fid);
86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        continue;
87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    end
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    [p, count] = sscanf(message, 'Received complete frame timestamp %lu frame type %u frame size %*u at time %lu, jitter estimate was %lu');
90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if count == 4
91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        completeTime = [completeTime; p'];
92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        line = fgetl(fid);
93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        continue;
94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    end
95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    
96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    line = fgetl(fid);
97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgend
98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgfclose(fid);
99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgt = completeTime(:,3);
101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTS = completeTime(:,1);
102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgfigure;
104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgsubplot(211);
105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orghold on;
106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgslope = 0;
107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgif sum(size(packetTime)) > 0
109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    % Plot the time when each packet arrives
110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    firstTimeStamp = packetTime(1,2);
111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    x = (packetTime(:,2) - firstTimeStamp)/90;
112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if flat
113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        slope = x;
114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    end
115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    firstTime = packetTime(1,3);
116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    plot(x, packetTime(:,3) - firstTime - slope, 'b.');
117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgelse
118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    % Plot the time when the first packet of a frame arrives
119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    firstTimeStamp = firstPacketTime(1,1);
120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    x = (firstPacketTime(:,1) - firstTimeStamp)/90;
121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if flat
122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        slope = x;
123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    end
124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    firstTime = firstPacketTime(1,2);
125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    plot(x, firstPacketTime(:,2) - firstTime - slope, 'b.');
126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgend
127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org% Plot the frame complete time
129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgif prod(size(completeTime)) > 0
130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    x = (completeTime(:,1) - firstTimeStamp)/90;
131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if flat
132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        slope = x;
133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    end
134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    plot(x, completeTime(:,3) - firstTime - slope, 'ks');
135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgend
136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org% Plot the time the decode starts
138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgif prod(size(decodeTime)) > 0
139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    x = (decodeTime(:,1) - firstTimeStamp)/90;
140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if flat
141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        slope = x;
142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    end
143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    plot(x, decodeTime(:,2) - firstTime - slope, 'r.');
144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgend
145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org% Plot the decode complete time
147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgif prod(size(decodeCompleteTime)) > 0
148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    x = (decodeCompleteTime(:,1) - firstTimeStamp)/90;
149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if flat
150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        slope = x;
151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    end
152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    plot(x, decodeCompleteTime(:,4) - firstTime - slope, 'g.');
153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgend
154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgif prod(size(renderTime)) > 0
156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    % Plot the wanted render time in ms
157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    x = (renderTime(:,1) - firstTimeStamp)/90;
158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if flat
159b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        slope = x;
160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    end
161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    plot(x, renderTime(:,2) - firstTime - slope, 'c-');
162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    
163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    % Plot the render time if there were no render delay or decoding delay.
164b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    x = (renderTime(:,1) - firstTimeStamp)/90;
165b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if flat
166b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        slope = x;
167b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    end
168b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    plot(x, renderTime(:,2) - firstTime - slope - renderTime(:, 3) - renderTime(:, 5), 'c--');
169b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    
170b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    % Plot the render time if there were no render delay.
171b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    x = (renderTime(:,1) - firstTimeStamp)/90;
172b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if flat
173b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        slope = x;
174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    end
175b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    plot(x, renderTime(:,2) - firstTime - slope - renderTime(:, 3) - renderTime(:, 5), 'b-');
176b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgend
177b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
178b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org%plot(x, 90*x, 'r-');
179b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
180b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgxlabel('RTP timestamp (in ms)');
181b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgylabel('Time (ms)');
182b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orglegend('Packet arrives', 'Frame complete', 'Decode', 'Decode complete', 'Time to render', 'Only jitter', 'Must decode');
183b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
184b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org% subplot(312);
185b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org% hold on;
186b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org% completeTs = completeTime(:, 1);
187b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org% arrivalTs = estimatedArrivalTime(:, 1);
188b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org% [c, completeIdx, arrivalIdx] = intersect(completeTs, arrivalTs);
189b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org% %plot(completeTs(completeIdx), completeTime(completeIdx, 3) - estimatedArrivalTime(arrivalIdx, 2));
190b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org% timeUntilComplete = completeTime(completeIdx, 3) - estimatedArrivalTime(arrivalIdx, 2);
191b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org% devFromAvgCompleteTime = timeUntilComplete - mean(timeUntilComplete);
192b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org% plot(completeTs(completeIdx) - completeTs(completeIdx(1)), devFromAvgCompleteTime);
193b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org% plot(completeTime(:, 1) - completeTime(1, 1), completeTime(:, 4), 'r');
194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org% plot(decodeCompleteTime(:, 1) - decodeCompleteTime(1, 1), decodeCompleteTime(:, 2), 'g');
195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org% plot(decodeCompleteTime(:, 1) - decodeCompleteTime(1, 1), decodeCompleteTime(:, 3), 'k');
196b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org% xlabel('RTP timestamp');
197b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org% ylabel('Time (ms)');
198b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org% legend('Complete time - Estimated arrival time', 'Desired jitter buffer level', 'Actual decode time', 'Max decode time', 0);
199b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
200b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgif prod(size(renderTime)) > 0
201b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    subplot(212);
202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    hold on;
203b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    firstTime = renderTime(1, 1);
204b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    targetDelay = max(renderTime(:, 3) + renderTime(:, 4) + renderTime(:, 5), renderTime(:, 6));
205b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    plot(renderTime(:, 1) - firstTime, renderTime(:, 3), 'r-');
206b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    plot(renderTime(:, 1) - firstTime, renderTime(:, 4), 'b-');
207b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    plot(renderTime(:, 1) - firstTime, renderTime(:, 5), 'g-');
208b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    plot(renderTime(:, 1) - firstTime, renderTime(:, 6), 'k-');
209b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    plot(renderTime(:, 1) - firstTime, targetDelay, 'c-');
210b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    xlabel('RTP timestamp');
211b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ylabel('Time (ms)');
212b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    legend('Render delay', 'Jitter delay', 'Decode delay', 'Extra delay', 'Min total delay');
213b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgend