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