lossprob.pl
上传用户:wzkunzhan
上传日期:2022-04-23
资源大小:2618k
文件大小:10k
- # File: lossprob.pl
- #
- # Modified OpenPhone based Voice Evaluation Tool (MOBVET) Version 0.1
- # --------------------------------------------------------------------
- # Voice Over IP Laboratory (http://www.voip.nce.ufrj.br)
- # Federal University of Rio de Janeiro
- # Copyright (c) 2002-2004 UFRJ (Federal University of Rio de Janeiro).
- # The contents of this file are subject to the Mozilla Public License
- # Version 1.0 (the "License"); you may not use this file except in
- # compliance with the License. You may obtain a copy of the License at
- # http://www.mozilla.org/MPL/
- #! c:/perl/bin/perl.exe -w
- #Receives value in milliseconds and converts it to the string format "mm:ss.xxxx" or "hh:mm:ss.xxxx"
-
- sub ms
- {
- my $arg = shift;
-
- my ($h, $r, $m, $s, $ms);
- $h = int ($arg / 3600000);
- $r = $arg % 3600000;
- $m = int ($r / 60000);
- $r = $r % 60000;
- $s = int ($r / 1000);
- $ms = $r % 1000;
- if ($h > 0) {
- return (sprintf("%d:%02d:%02d.%03d",$h,$m,$s,$ms));
- } else {
- return (sprintf("%d:%02d.%03d",$m,$s,$ms));
- }
-
- }
- #Receives the string int the "mm:ss.xxxx <lixo>"
- #ou "hh:mm:ss.xxxx <lixo>" format and converts it to milliseconds
- sub converte_para_Milisegundos
- {
- my $arg = shift;
- if ($arg =~ /(d*):(d*):(d*).(d*)/o ) {
- return ( (($1*3600)+$2*60+$3)*1000 +$4 );
- } elsif ($arg =~ /(d*):(d*).(d*)/o ) {
- return ( (($1*60)+$2)*1000 +$3 );
- }
- printf ("Parametro Invalido: %sn", $arg);
- }
- sub calculappl {
- my $origem = shift;
- my $destino = shift;
- my $notfirst = 0;
- my $too_late_ant = 0;
- my $lost_ant = 0;
- # Envio
- @eventosL = ();
- # Recebimento
- @eventosR = ();
- $buffer_size = 116; # initial value for dejitter buffer
-
- open(LOG_ORIGEM, "$origem.H323") or die "reading source file $origem";
- foreach $line (<LOG_ORIGEM>)
- {
- #0:02.910 LogChanRx:8076cd0 RTP Jitter buffer size decreased to 925 (115ms)
- if($line =~ /Jitter buffer size .*tos(d*)s/o ) {
- #refresh buffer size
- $buffer_size = int($1/8);
- }
- # 0:49.961 RTP Jitter:86527e0 RTP Receive statistics: packets=410 octets=11360 lost=1 tooLate=0 order=0 avgTime=120 maxTime=120 minTime=120 jitterInstant=8 jitter=2
- elsif($line =~ /RTP Jitter.*Receive statistics.*tooLate=(d*)s.*jitter=(d*)/o ) {
- $too_late = $1;
- $Djitter = $2;
- }
- elsif($line =~ /(.*)SentSenderReport:s*ssrc=(d*)s*ntp=(.*)s*rtp=(d*)s*psent=(d*)s*osent=(d*)/o ) {
- $rtp = $4;
- $psent = $5;
- $time = converte_para_Milisegundos ($1);
- # L1
- push @eventosL, "SS:".$time.":".$rtp."-".$psent;
- }
- elsif($line =~ /(.*)OnRxSenderReport:s*ssrc=(d*)s*ntp=(.*)s*rtp=(d*)s*psent=(d*)s*osent=(d*)/o ) {
- $rtp = $4;
- $psent = $5;
- $time = converte_para_Milisegundos ($1);
- # L2
- push @eventosL, "RS:".$time.":".$rtp."-".$psent;
- }
- elsif($line =~ /(.*)SentReceiverReport:s*ssrc=(d*)s*fraction=(d*)s*lost=(d*)s*last_seq=(d*)s*jitter=(d*)s*lsr=(d*)s*dlsr=(d*)/o ) {
- $lost = $4;
- $last_seq = $5;
- $jitter = $6;
- $time = converte_para_Milisegundos ($1);
- # L3
- push @eventosL, "SR:".$time.":".$last_seq."-".$jitter.":".$lost.":".$too_late.":".$Djitter.":".$buffer_size;
- }
- elsif($line =~ /(.*)OnRxSenderReport *RR:s*ssrc=(d*)s*fraction=(d*)s*lost=(d*)s*last_seq=(d*)s*jitter=(d*)/o ) {
- $last_seq = $5;
- $jitter = $6;
- $time = converte_para_Milisegundos ($1);
- # L4
- push @eventosL, "RR:".$time.":".$last_seq."-".$jitter;
- }
-
-
-
- }
- close(LOG_ORIGEM);
- $buffer_size = 116; # tamanho inicial do buffer de conpensacao de jitter
- open(LOG_DESTINO,"$destino.H323");
- foreach $line (<LOG_DESTINO>)
- {
- #0:02.910 LogChanRx:8076cd0 RTP Jitter buffer size decreased to 925 (115ms)
- if($line =~ /Jitter buffer size .*tos(d*)s/o ) {
- #atualiza tamanho do buffer
- $buffer_size = int($1/8);
- }
- if ($line =~ /RTP Jitter.*Receive statistics.*tooLate=(d*)s.*jitter=(d*)/o ) {
- $too_late = $1;
- $Djitter = $2;
- }
- elsif($line =~ /(.*)SentSenderReport:s*ssrc=(d*)s*ntp=(.*)s*rtp=(d*)s*psent=(d*)s*osent=(d*)/o ) {
- $rtp = $4;
- $psent = $5;
- $time = converte_para_Milisegundos ($1);
- # R1
- push @eventosR, "SS:".$time.":".$rtp."-".$psent;
- }
- elsif($line =~ /(.*)OnRxSenderReport:s*ssrc=(d*)s*ntp=(.*)s*rtp=(d*)s*psent=(d*)s*osent=(d*)/o ) {
- $rtp = $4;
- $psent = $5;
- $time = converte_para_Milisegundos ($1);
- # R2
- push @eventosR, "RS:".$time.":".$rtp."-".$psent;
- }
- elsif($line =~ /(.*)SentReceiverReport:s*ssrc=(d*)s*fraction=(d*)s*lost=(d*)s*last_seq=(d*)s*jitter=(d*)s*lsr=(d*)s*dlsr=(d*)/o ) {
- $lost = $4;
- $last_seq = $5;
- $jitter = $6;
- $time = converte_para_Milisegundos ($1);
- # R3
- push @eventosR, "SR:".$time.":".$last_seq."-".$jitter.":".$lost.":".$too_late.":".$Djitter.":".$buffer_size;
- }
- elsif($line =~ /(.*)OnRxSenderReport *RR:s*ssrc=(d*)s*fraction=(d*)s*lost=(d*)s*last_seq=(d*)s*jitter=(d*)/o ) {
- $last_seq = $5;
- $jitter = $6;
- $time = converte_para_Milisegundos ($1);
- # R4
- push @eventosR, "RR:".$time.":".$last_seq."-".$jitter;
- }
- }
- close(LOG_DESTINO);
- # Pesquisa:
- # 1- Pega o proximo registro Sender Report do log Local (ssrL)
- # 2- Procura pela recepcao do mesmo no log Remoto (rsrR), com o mesmo RTP.
- # Senao achar, volta para o passo 1
- # 3- Procura pelo primeiro registro Sent Receiver Report (srrR), que tenha
- # ocorrido imediatamente apos o rsrR do item 2, tambem no log Remoto
- # 4- Procura por Receiver Receiver Report (rrrL) no log Local com o mesmo
- # lost last_seq jitter do srrR do item 3.
- # 5- Calcula RTT (rrrL - ssrL) - (srrR - rsrR) e grava registro no
- # arquivo com tempo do rrrL e rtt
- $totL = @eventosL;
- $totR = @eventosR;
- $dbg=0;
- if ($dbg > 0) { print "Origem $origemn Destino $destinon Total de registros L=$totL R=$totRn"; }
- open (PPL, ">$origem.ppl");
- for ($indL=0; $indL<$totL-1; $indL++) { # Para cada valor de L1
- # Procura pelo envio de um Send Receiver Report
- if ($eventosL[$indL] =~ /^SR/o ) {
- ($tipo_L, $timestamp, $id_L, $lost, $too_late, $Djitter, $buffer) = split (":", $eventosL[$indL]);
- ($last_seq, $jitter) = split ("-", $id_L);
- } else {
- next;
- }
-
-
- $t4 = 0;
- for ($j=$indL-1; $j>0; $j--) {
- if ($eventosL[$j] =~ /^R/o ) {
- ($tipo_L, $t4, $id_L) = split (":", $eventosL[$j]);
- $posicao = $j;
- last;
- }
- }
-
- if ($t4 == 0) {
- #print "Nao achei evento de recepcao antes de $indL ($eventosL[$indL])n";
- next;
- }
- if ($tipo_L eq "RR") {
- $target = "SR";
- } else {
- $target = "SS";
- }
- $t3 = 0;
- $proximo = 0;
- # Procura por registro recebido com mesmo psent ou last_seq
- for ($j=0; $j<$totR; $j++) {
- ($tipo_R, $time, $id_R) = split (":", $eventosR[$j]); # R2
- if ( ($tipo_R eq $target) and ($id_L eq $id_R) ) {
- $proximo = $j-1;
- $t3 = $time;
- if ($indL == $dbg) { print "Achei a recepcao em $j $eventosR[$j]n"; }
- last;
- }
- }
- if ($proximo == 0) {
- #print "Nao tem nenhum recepcao (T2) antes do envio (T3) de $destino para $origemn";
- next;
- }
- # Se nao achou o envio do SR, volta pro inicio;
- if ($t3 == 0) {
- #print "Nao achei o envio (T3) da recepcao (T4 $target $t1) de $origem para $destinon";
- next;
- }
-
- # Procura agora por uma recepcao anterior de um Receiver Report
- $t2 = 0;
- for ($j=$proximo; $j>0; $j--) {
- ($proximotipo_R, $time, $id_R) = split (":", $eventosR[$j]); # R3
- if ($proximotipo_R =~ /^R/o) {
- $t2 = $time;
- if ($indL == $dbg) { print "T3 no registro $j $eventosR[$j], $t3n"; }
- last;
- }
- }
-
- # Se nao achou nenhum Receive antes de T3, volta pro inicio;
- if ($t2 == 0) {
- #print "Nao achei receive report antes (T3 $t3) de $destino para $origemn";
- next;
- }
- if ($proximotipo_R eq "RR") {
- $target = "SR";
- } else {
- $target = "SS";
- }
- if ($indL == $dbg) { print "Agora vou procurar $target com $id_R n"; }
- $t1 = 0;
- for ($j=$posicao-1; $j>0; $j--) {
- if ($indL == $dbg) { print "Analizando $j $eventosL[$j]n"; }
- ($tipo_L, $time, $id_L) = split (":", $eventosL[$j]);
- if ( ($tipo_L eq $target) and ($id_L eq $id_R) ) {
- $t1 = $time;
- last;
- }
- }
- if ($t1 == 0) {
- #printf ("Nao achei o envio (T1) do receive (T2 $t2 $target) de $origem para $destinon");
- next;
- }
- # Se chegamos ate' aqui, temos os quatro registros. Vamos calcular o
- # rtt e gravar no arquivo. Vou considerar o instante da medida o tempo
- # medio entre o envio do sender report e a recepcao do receiver report.
- $rtt = ($t4 - $t1) - ($t3 - $t2);
- if ($rtt < 0) {
- #print "EEEEPPPAAAAAAAA!!!!!!!!!! $rtt < 0 arquivo $origem $destino , registro $indLn $eventosL[$indL]n";
- next;
- }
-
- if ($notfirst) {
- printf PPL ("%s %d %d %d %d %d %dn", ms($timestamp_ant), $rtt_ant, ($last_seq-$last_seq_ant), ($lost_ant-$lost_ant_ant), ($too_late_ant-$too_late_ant_ant), $Djitter_ant, $buffer );
- }
-
- $notfirst=1;
- $timestamp_ant=$timestamp;
- $lost_ant_ant = $lost_ant;
- $too_late_ant_ant = $too_late_ant;
- $rtt_ant = $rtt;
- $lost_ant = $lost;
- $too_late_ant = $too_late;
- $last_seq_ant = $last_seq;
- $Djitter_ant = $Djitter;
-
- } # fim do loop
-
-
- close (PPL);
- } # fim da subtorina calculappl
- ############################################
- $nomeorigem = "sideA";
- $nomedestino = "sideB";
- calculappl ($nomeorigem, $nomedestino);
- calculappl ($nomedestino, $nomeorigem);