| Index: tools/matlab/rtpAnalyze.m
|
| diff --git a/tools/matlab/rtpAnalyze.m b/tools/matlab/rtpAnalyze.m
|
| deleted file mode 100644
|
| index c51af9cca5b06d04bd9b0c2c01d330d5fa0ff7a7..0000000000000000000000000000000000000000
|
| --- a/tools/matlab/rtpAnalyze.m
|
| +++ /dev/null
|
| @@ -1,251 +0,0 @@
|
| -function rtpAnalyze( input_file )
|
| -%RTP_ANALYZE Analyze RTP stream(s) from a txt file
|
| -% The function takes the output from the command line tool rtp_analyze
|
| -% and analyzes the stream(s) therein. First, process your rtpdump file
|
| -% through rtp_analyze (from command line):
|
| -% $ out/Debug/rtp_analyze my_file.rtp my_file.txt
|
| -% Then load it with this function (in Matlab):
|
| -% >> rtpAnalyze('my_file.txt')
|
| -
|
| -% Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
|
| -%
|
| -% Use of this source code is governed by a BSD-style license
|
| -% that can be found in the LICENSE file in the root of the source
|
| -% tree. An additional intellectual property rights grant can be found
|
| -% in the file PATENTS. All contributing project authors may
|
| -% be found in the AUTHORS file in the root of the source tree.
|
| -
|
| -[SeqNo,TimeStamp,ArrTime,Size,PT,M,SSRC] = importfile(input_file);
|
| -
|
| -%% Filter out RTCP packets.
|
| -% These appear as RTP packets having payload types 72 through 76.
|
| -ix = not(ismember(PT, 72:76));
|
| -fprintf('Removing %i RTCP packets\n', length(SeqNo) - sum(ix));
|
| -SeqNo = SeqNo(ix);
|
| -TimeStamp = TimeStamp(ix);
|
| -ArrTime = ArrTime(ix);
|
| -Size = Size(ix);
|
| -PT = PT(ix);
|
| -M = M(ix);
|
| -SSRC = SSRC(ix);
|
| -
|
| -%% Find streams.
|
| -[uSSRC, ~, uix] = unique(SSRC);
|
| -
|
| -% If there are multiple streams, select one and purge the other
|
| -% streams from the data vectors. If there is only one stream, the
|
| -% vectors are good to use as they are.
|
| -if length(uSSRC) > 1
|
| - for i=1:length(uSSRC)
|
| - uPT = unique(PT(uix == i));
|
| - fprintf('%i: %s (%d packets, pt: %i', i, uSSRC{i}, ...
|
| - length(find(uix==i)), uPT(1));
|
| - if length(uPT) > 1
|
| - fprintf(', %i', uPT(2:end));
|
| - end
|
| - fprintf(')\n');
|
| - end
|
| - sel = input('Select stream number: ');
|
| - if sel < 1 || sel > length(uSSRC)
|
| - error('Out of range');
|
| - end
|
| - ix = find(uix == sel);
|
| - % This is where the data vectors are trimmed.
|
| - SeqNo = SeqNo(ix);
|
| - TimeStamp = TimeStamp(ix);
|
| - ArrTime = ArrTime(ix);
|
| - Size = Size(ix);
|
| - PT = PT(ix);
|
| - M = M(ix);
|
| - SSRC = SSRC(ix);
|
| -end
|
| -
|
| -%% Unwrap SeqNo and TimeStamp.
|
| -SeqNoUW = maxUnwrap(SeqNo, 65535);
|
| -TimeStampUW = maxUnwrap(TimeStamp, 4294967295);
|
| -
|
| -%% Generate some stats for the stream.
|
| -fprintf('Statistics:\n');
|
| -fprintf('SSRC: %s\n', SSRC{1});
|
| -uPT = unique(PT);
|
| -if length(uPT) > 1
|
| - warning('This tool cannot yet handle changes in codec sample rate');
|
| -end
|
| -fprintf('Payload type(s): %i', uPT(1));
|
| -if length(uPT) > 1
|
| - fprintf(', %i', uPT(2:end));
|
| -end
|
| -fprintf('\n');
|
| -fprintf('Packets: %i\n', length(SeqNo));
|
| -SortSeqNo = sort(SeqNoUW);
|
| -fprintf('Missing sequence numbers: %i\n', ...
|
| - length(find(diff(SortSeqNo) > 1)));
|
| -fprintf('Duplicated packets: %i\n', length(find(diff(SortSeqNo) == 0)));
|
| -reorderIx = findReorderedPackets(SeqNoUW);
|
| -fprintf('Reordered packets: %i\n', length(reorderIx));
|
| -tsdiff = diff(TimeStampUW);
|
| -tsdiff = tsdiff(diff(SeqNoUW) == 1);
|
| -[utsdiff, ~, ixtsdiff] = unique(tsdiff);
|
| -fprintf('Common packet sizes:\n');
|
| -for i = 1:length(utsdiff)
|
| - fprintf(' %i samples (%i%%)\n', ...
|
| - utsdiff(i), ...
|
| - round(100 * length(find(ixtsdiff == i))/length(ixtsdiff)));
|
| -end
|
| -
|
| -%% Trying to figure out sample rate.
|
| -fs_est = (TimeStampUW(end) - TimeStampUW(1)) / (ArrTime(end) - ArrTime(1));
|
| -fs_vec = [8, 16, 32, 48];
|
| -fs = 0;
|
| -for f = fs_vec
|
| - if abs((fs_est-f)/f) < 0.05 % 5% margin
|
| - fs = f;
|
| - break;
|
| - end
|
| -end
|
| -if fs == 0
|
| - fprintf('Cannot determine sample rate. I get it to %.2f kHz\n', ...
|
| - fs_est);
|
| - fs = input('Please, input a sample rate (in kHz): ');
|
| -else
|
| - fprintf('Sample rate estimated to %i kHz\n', fs);
|
| -end
|
| -
|
| -SendTimeMs = (TimeStampUW - TimeStampUW(1)) / fs;
|
| -
|
| -fprintf('Stream duration at sender: %.1f seconds\n', ...
|
| - (SendTimeMs(end) - SendTimeMs(1)) / 1000);
|
| -
|
| -fprintf('Stream duration at receiver: %.1f seconds\n', ...
|
| - (ArrTime(end) - ArrTime(1)) / 1000);
|
| -
|
| -fprintf('Clock drift: %.2f%%\n', ...
|
| - 100 * ((ArrTime(end) - ArrTime(1)) / ...
|
| - (SendTimeMs(end) - SendTimeMs(1)) - 1));
|
| -
|
| -fprintf('Sent average bitrate: %i kbps\n', ...
|
| - round(sum(Size) * 8 / (SendTimeMs(end)-SendTimeMs(1))));
|
| -
|
| -fprintf('Received average bitrate: %i kbps\n', ...
|
| - round(sum(Size) * 8 / (ArrTime(end)-ArrTime(1))));
|
| -
|
| -%% Plots.
|
| -delay = ArrTime - SendTimeMs;
|
| -delay = delay - min(delay);
|
| -delayOrdered = delay;
|
| -delayOrdered(reorderIx) = nan; % Set reordered packets to NaN.
|
| -delayReordered = delay(reorderIx); % Pick the reordered packets.
|
| -sendTimeMsReordered = SendTimeMs(reorderIx);
|
| -
|
| -% Sort time arrays in packet send order.
|
| -[~, sortix] = sort(SeqNoUW);
|
| -SendTimeMs = SendTimeMs(sortix);
|
| -Size = Size(sortix);
|
| -delayOrdered = delayOrdered(sortix);
|
| -
|
| -figure
|
| -plot(SendTimeMs / 1000, delayOrdered, ...
|
| - sendTimeMsReordered / 1000, delayReordered, 'r.');
|
| -xlabel('Send time [s]');
|
| -ylabel('Relative transport delay [ms]');
|
| -title(sprintf('SSRC: %s', SSRC{1}));
|
| -
|
| -SendBitrateKbps = 8 * Size(1:end-1) ./ diff(SendTimeMs);
|
| -figure
|
| -plot(SendTimeMs(1:end-1)/1000, SendBitrateKbps);
|
| -xlabel('Send time [s]');
|
| -ylabel('Send bitrate [kbps]');
|
| -end
|
| -
|
| -%% Subfunctions.
|
| -
|
| -% findReorderedPackets returns the index to all packets that are considered
|
| -% old compared with the largest seen sequence number. The input seqNo must
|
| -% be unwrapped for this to work.
|
| -function reorderIx = findReorderedPackets(seqNo)
|
| -largestSeqNo = seqNo(1);
|
| -reorderIx = [];
|
| -for i = 2:length(seqNo)
|
| - if seqNo(i) < largestSeqNo
|
| - reorderIx = [reorderIx; i]; %#ok<AGROW>
|
| - else
|
| - largestSeqNo = seqNo(i);
|
| - end
|
| -end
|
| -end
|
| -
|
| -%% Auto-generated subfunction.
|
| -function [SeqNo,TimeStamp,SendTime,Size,PT,M,SSRC] = ...
|
| - importfile(filename, startRow, endRow)
|
| -%IMPORTFILE Import numeric data from a text file as column vectors.
|
| -% [SEQNO,TIMESTAMP,SENDTIME,SIZE,PT,M,SSRC] = IMPORTFILE(FILENAME) Reads
|
| -% data from text file FILENAME for the default selection.
|
| -%
|
| -% [SEQNO,TIMESTAMP,SENDTIME,SIZE,PT,M,SSRC] = IMPORTFILE(FILENAME,
|
| -% STARTROW, ENDROW) Reads data from rows STARTROW through ENDROW of text
|
| -% file FILENAME.
|
| -%
|
| -% Example:
|
| -% [SeqNo,TimeStamp,SendTime,Size,PT,M,SSRC] =
|
| -% importfile('rtpdump_recv.txt',2, 123);
|
| -%
|
| -% See also TEXTSCAN.
|
| -
|
| -% Auto-generated by MATLAB on 2015/05/28 09:55:50
|
| -
|
| -%% Initialize variables.
|
| -if nargin<=2
|
| - startRow = 2;
|
| - endRow = inf;
|
| -end
|
| -
|
| -%% Format string for each line of text:
|
| -% column1: double (%f)
|
| -% column2: double (%f)
|
| -% column3: double (%f)
|
| -% column4: double (%f)
|
| -% column5: double (%f)
|
| -% column6: double (%f)
|
| -% column7: text (%s)
|
| -% For more information, see the TEXTSCAN documentation.
|
| -formatSpec = '%5f%11f%11f%6f%6f%3f%s%[^\n\r]';
|
| -
|
| -%% Open the text file.
|
| -fileID = fopen(filename,'r');
|
| -
|
| -%% Read columns of data according to format string.
|
| -% This call is based on the structure of the file used to generate this
|
| -% code. If an error occurs for a different file, try regenerating the code
|
| -% from the Import Tool.
|
| -dataArray = textscan(fileID, formatSpec, endRow(1)-startRow(1)+1, ...
|
| - 'Delimiter', '', 'WhiteSpace', '', 'HeaderLines', startRow(1)-1, ...
|
| - 'ReturnOnError', false);
|
| -for block=2:length(startRow)
|
| - frewind(fileID);
|
| - dataArrayBlock = textscan(fileID, formatSpec, ...
|
| - endRow(block)-startRow(block)+1, 'Delimiter', '', 'WhiteSpace', ...
|
| - '', 'HeaderLines', startRow(block)-1, 'ReturnOnError', false);
|
| - for col=1:length(dataArray)
|
| - dataArray{col} = [dataArray{col};dataArrayBlock{col}];
|
| - end
|
| -end
|
| -
|
| -%% Close the text file.
|
| -fclose(fileID);
|
| -
|
| -%% Post processing for unimportable data.
|
| -% No unimportable data rules were applied during the import, so no post
|
| -% processing code is included. To generate code which works for
|
| -% unimportable data, select unimportable cells in a file and regenerate the
|
| -% script.
|
| -
|
| -%% Allocate imported array to column variable names
|
| -SeqNo = dataArray{:, 1};
|
| -TimeStamp = dataArray{:, 2};
|
| -SendTime = dataArray{:, 3};
|
| -Size = dataArray{:, 4};
|
| -PT = dataArray{:, 5};
|
| -M = dataArray{:, 6};
|
| -SSRC = dataArray{:, 7};
|
| -end
|
| -
|
|
|