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