diff options
Diffstat (limited to 'webrtc/modules/video_coding/test/plotReceiveTrace.m')
-rw-r--r-- | webrtc/modules/video_coding/test/plotReceiveTrace.m | 213 |
1 files changed, 213 insertions, 0 deletions
diff --git a/webrtc/modules/video_coding/test/plotReceiveTrace.m b/webrtc/modules/video_coding/test/plotReceiveTrace.m new file mode 100644 index 0000000000..4d262aa165 --- /dev/null +++ b/webrtc/modules/video_coding/test/plotReceiveTrace.m @@ -0,0 +1,213 @@ +function [t, TS] = plotReceiveTrace(filename, flat) +fid=fopen(filename); +%DEBUG ; ( 8:32:33:375 | 0) VIDEO:1 ; 5260; First packet of frame 1869537938 +%DEBUG ; ( 8:32:33:375 | 0) VIDEO CODING:1 ; 5260; Decoding timestamp 1869534934 +%DEBUG ; ( 8:32:33:375 | 0) VIDEO:1 ; 5260; Render frame 1869534934 at 20772610 +%DEBUG ; ( 8:32:33:375 | 0) VIDEO CODING:-1 ; 5260; Frame decoded: timeStamp=1870511259 decTime=0 maxDecTime=0, at 19965 +%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 +%DEBUG ; ( 8: 5:51:774 | 0) VIDEO:-1 ; 3968; ExtrapolateLocalTime(1870967878)=24971 ms + +if nargin == 1 + flat = 0; +end +line = fgetl(fid); +estimatedArrivalTime = []; +packetTime = []; +firstPacketTime = []; +decodeTime = []; +decodeCompleteTime = []; +renderTime = []; +completeTime = []; +while ischar(line)%line ~= -1 + if length(line) == 0 + line = fgetl(fid); + continue; + end + % Parse the trace line header + [tempres, count] = sscanf(line, 'DEBUG ; (%u:%u:%u:%u |%*lu)%13c:'); + if count < 5 + line = fgetl(fid); + continue; + end + hr=tempres(1); + mn=tempres(2); + sec=tempres(3); + ms=tempres(4); + timeInMs=hr*60*60*1000 + mn*60*1000 + sec*1000 + ms; + label = tempres(5:end); + I = find(label ~= 32); + label = label(I(1):end); % remove white spaces + if ~strncmp(char(label), 'VIDEO', 5) & ~strncmp(char(label), 'VIDEO CODING', 12) + line = fgetl(fid); + continue; + end + message = line(72:end); + + % Parse message + [p, count] = sscanf(message, 'ExtrapolateLocalTime(%lu)=%lu ms'); + if count == 2 + estimatedArrivalTime = [estimatedArrivalTime; p']; + line = fgetl(fid); + continue; + end + + [p, count] = sscanf(message, 'Packet seqNo %u of frame %lu at %lu'); + if count == 3 + packetTime = [packetTime; p']; + line = fgetl(fid); + continue; + end + + [p, count] = sscanf(message, 'First packet of frame %lu at %lu'); + if count == 2 + firstPacketTime = [firstPacketTime; p']; + line = fgetl(fid); + continue; + end + + [p, count] = sscanf(message, 'Decoding timestamp %lu at %lu'); + if count == 2 + decodeTime = [decodeTime; p']; + line = fgetl(fid); + continue; + end + + [p, count] = sscanf(message, 'Render frame %lu at %lu. Render delay %lu, required delay %lu, max decode time %lu, min total delay %lu'); + if count == 6 + renderTime = [renderTime; p']; + line = fgetl(fid); + continue; + end + + [p, count] = sscanf(message, 'Frame decoded: timeStamp=%lu decTime=%d maxDecTime=%lu, at %lu'); + if count == 4 + decodeCompleteTime = [decodeCompleteTime; p']; + line = fgetl(fid); + continue; + end + + [p, count] = sscanf(message, 'Received complete frame timestamp %lu frame type %u frame size %*u at time %lu, jitter estimate was %lu'); + if count == 4 + completeTime = [completeTime; p']; + line = fgetl(fid); + continue; + end + + line = fgetl(fid); +end +fclose(fid); + +t = completeTime(:,3); +TS = completeTime(:,1); + +figure; +subplot(211); +hold on; +slope = 0; + +if sum(size(packetTime)) > 0 + % Plot the time when each packet arrives + firstTimeStamp = packetTime(1,2); + x = (packetTime(:,2) - firstTimeStamp)/90; + if flat + slope = x; + end + firstTime = packetTime(1,3); + plot(x, packetTime(:,3) - firstTime - slope, 'b.'); +else + % Plot the time when the first packet of a frame arrives + firstTimeStamp = firstPacketTime(1,1); + x = (firstPacketTime(:,1) - firstTimeStamp)/90; + if flat + slope = x; + end + firstTime = firstPacketTime(1,2); + plot(x, firstPacketTime(:,2) - firstTime - slope, 'b.'); +end + +% Plot the frame complete time +if prod(size(completeTime)) > 0 + x = (completeTime(:,1) - firstTimeStamp)/90; + if flat + slope = x; + end + plot(x, completeTime(:,3) - firstTime - slope, 'ks'); +end + +% Plot the time the decode starts +if prod(size(decodeTime)) > 0 + x = (decodeTime(:,1) - firstTimeStamp)/90; + if flat + slope = x; + end + plot(x, decodeTime(:,2) - firstTime - slope, 'r.'); +end + +% Plot the decode complete time +if prod(size(decodeCompleteTime)) > 0 + x = (decodeCompleteTime(:,1) - firstTimeStamp)/90; + if flat + slope = x; + end + plot(x, decodeCompleteTime(:,4) - firstTime - slope, 'g.'); +end + +if prod(size(renderTime)) > 0 + % Plot the wanted render time in ms + x = (renderTime(:,1) - firstTimeStamp)/90; + if flat + slope = x; + end + plot(x, renderTime(:,2) - firstTime - slope, 'c-'); + + % Plot the render time if there were no render delay or decoding delay. + x = (renderTime(:,1) - firstTimeStamp)/90; + if flat + slope = x; + end + plot(x, renderTime(:,2) - firstTime - slope - renderTime(:, 3) - renderTime(:, 5), 'c--'); + + % Plot the render time if there were no render delay. + x = (renderTime(:,1) - firstTimeStamp)/90; + if flat + slope = x; + end + plot(x, renderTime(:,2) - firstTime - slope - renderTime(:, 3) - renderTime(:, 5), 'b-'); +end + +%plot(x, 90*x, 'r-'); + +xlabel('RTP timestamp (in ms)'); +ylabel('Time (ms)'); +legend('Packet arrives', 'Frame complete', 'Decode', 'Decode complete', 'Time to render', 'Only jitter', 'Must decode'); + +% subplot(312); +% hold on; +% completeTs = completeTime(:, 1); +% arrivalTs = estimatedArrivalTime(:, 1); +% [c, completeIdx, arrivalIdx] = intersect(completeTs, arrivalTs); +% %plot(completeTs(completeIdx), completeTime(completeIdx, 3) - estimatedArrivalTime(arrivalIdx, 2)); +% timeUntilComplete = completeTime(completeIdx, 3) - estimatedArrivalTime(arrivalIdx, 2); +% devFromAvgCompleteTime = timeUntilComplete - mean(timeUntilComplete); +% plot(completeTs(completeIdx) - completeTs(completeIdx(1)), devFromAvgCompleteTime); +% plot(completeTime(:, 1) - completeTime(1, 1), completeTime(:, 4), 'r'); +% plot(decodeCompleteTime(:, 1) - decodeCompleteTime(1, 1), decodeCompleteTime(:, 2), 'g'); +% plot(decodeCompleteTime(:, 1) - decodeCompleteTime(1, 1), decodeCompleteTime(:, 3), 'k'); +% xlabel('RTP timestamp'); +% ylabel('Time (ms)'); +% legend('Complete time - Estimated arrival time', 'Desired jitter buffer level', 'Actual decode time', 'Max decode time', 0); + +if prod(size(renderTime)) > 0 + subplot(212); + hold on; + firstTime = renderTime(1, 1); + targetDelay = max(renderTime(:, 3) + renderTime(:, 4) + renderTime(:, 5), renderTime(:, 6)); + plot(renderTime(:, 1) - firstTime, renderTime(:, 3), 'r-'); + plot(renderTime(:, 1) - firstTime, renderTime(:, 4), 'b-'); + plot(renderTime(:, 1) - firstTime, renderTime(:, 5), 'g-'); + plot(renderTime(:, 1) - firstTime, renderTime(:, 6), 'k-'); + plot(renderTime(:, 1) - firstTime, targetDelay, 'c-'); + xlabel('RTP timestamp'); + ylabel('Time (ms)'); + legend('Render delay', 'Jitter delay', 'Decode delay', 'Extra delay', 'Min total delay'); +end
\ No newline at end of file |