Changeset 621


Ignore:
Timestamp:
Jul 22, 2006 12:53:04 PM (18 years ago)
Author:
bennylp
Message:

Few changes in siprtp:
(1) Added "s" command to show summary of all calls statistic
(2) Media start delay changed from 1000ms to 50ms
(3) Changed print_call to use LOG instead of printf, so that it can be turned off

Location:
pjproject/trunk/pjsip-apps/src/samples
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip-apps/src/samples/siprtp.c

    r615 r621  
    718718        } 
    719719 
    720         PJ_LOG(3,(THIS_FILE, "Call #%d disconnected. Reason=%s", 
     720        PJ_LOG(3,(THIS_FILE, "Call #%d disconnected. Reason=%d (%.*s)", 
    721721                  call->index, 
    722                   pjsip_get_status_text(inv->cause)->ptr)); 
     722                  inv->cause, 
     723                  (int)inv->cause_text.slen, 
     724                  inv->cause_text.ptr)); 
    723725        PJ_LOG(3,(THIS_FILE, "Call #%d statistics:", call->index)); 
    724726        print_call(call->index); 
     
    11451147 
    11461148    /* Let things settle */ 
    1147     pj_thread_sleep(1000); 
     1149    pj_thread_sleep(100); 
    11481150 
    11491151    msec_interval = strm->samples_per_frame * 1000 / strm->clock_rate; 
     
    13891391 * USER INTERFACE STUFFS 
    13901392 */ 
     1393 
     1394static void call_get_duration(int call_index, pj_time_val *dur) 
     1395{ 
     1396    struct call *call = &app.call[call_index]; 
     1397    pjsip_inv_session *inv; 
     1398 
     1399    dur->sec = dur->msec = 0; 
     1400 
     1401    if (!call) 
     1402        return; 
     1403 
     1404    inv = call->inv; 
     1405    if (!inv) 
     1406        return; 
     1407 
     1408    if (inv->state >= PJSIP_INV_STATE_CONFIRMED && call->connect_time.sec) { 
     1409 
     1410        pj_gettimeofday(dur); 
     1411        PJ_TIME_VAL_SUB((*dur), call->connect_time); 
     1412    } 
     1413} 
     1414 
     1415 
     1416static const char *good_number(char *buf, pj_int32_t val) 
     1417{ 
     1418    if (val < 1000) { 
     1419        pj_ansi_sprintf(buf, "%d", val); 
     1420    } else if (val < 1000000) { 
     1421        pj_ansi_sprintf(buf, "%d.%02dK",  
     1422                        val / 1000, 
     1423                        (val % 1000) / 100); 
     1424    } else { 
     1425        pj_ansi_sprintf(buf, "%d.%02dM",  
     1426                        val / 1000000, 
     1427                        (val % 1000000) / 10000); 
     1428    } 
     1429 
     1430    return buf; 
     1431} 
     1432 
     1433 
     1434 
     1435static void print_avg_stat(void) 
     1436{ 
     1437#define MIN_(var,val)      if ((int)val < (int)var) var = val 
     1438#define MAX_(var,val)      if ((int)val > (int)var) var = val 
     1439#define AVG_(var,val)      var = ( ((var * count) + val) / (count+1) ) 
     1440#define BIGVAL              0x7FFFFFFFL 
     1441    struct stat_entry 
     1442    { 
     1443        int min, avg, max; 
     1444    }; 
     1445 
     1446    struct stat_entry call_dur, call_pdd; 
     1447    pjmedia_rtcp_stat min_stat, avg_stat, max_stat; 
     1448 
     1449    char srx_min[16], srx_avg[16], srx_max[16]; 
     1450    char brx_min[16], brx_avg[16], brx_max[16]; 
     1451    char stx_min[16], stx_avg[16], stx_max[16]; 
     1452    char btx_min[16], btx_avg[16], btx_max[16]; 
     1453 
     1454 
     1455    unsigned i, count; 
     1456 
     1457    pj_bzero(&call_dur, sizeof(call_dur));  
     1458    call_dur.min = BIGVAL; 
     1459 
     1460    pj_bzero(&call_pdd, sizeof(call_pdd));  
     1461    call_pdd.min = BIGVAL; 
     1462 
     1463    pj_bzero(&min_stat, sizeof(min_stat)); 
     1464    min_stat.rx.pkt = min_stat.tx.pkt = BIGVAL; 
     1465    min_stat.rx.bytes = min_stat.tx.bytes = BIGVAL; 
     1466    min_stat.rx.loss = min_stat.tx.loss = BIGVAL; 
     1467    min_stat.rx.dup = min_stat.tx.dup = BIGVAL; 
     1468    min_stat.rx.reorder = min_stat.tx.reorder = BIGVAL; 
     1469    min_stat.rx.jitter.min = min_stat.tx.jitter.min = BIGVAL; 
     1470    min_stat.rtt.min = BIGVAL; 
     1471 
     1472    pj_bzero(&avg_stat, sizeof(avg_stat)); 
     1473    pj_bzero(&max_stat, sizeof(max_stat)); 
     1474 
     1475 
     1476    for (i=0, count=0; i<app.max_calls; ++i) { 
     1477 
     1478        struct call *call = &app.call[i]; 
     1479        struct media_stream *audio = &call->media[0]; 
     1480        pj_time_val dur; 
     1481        unsigned msec_dur; 
     1482 
     1483        if (call->inv == NULL ||  
     1484            call->inv->state < PJSIP_INV_STATE_CONFIRMED || 
     1485            call->connect_time.sec == 0)  
     1486        { 
     1487            continue; 
     1488        } 
     1489 
     1490        /* Duration */ 
     1491        call_get_duration(i, &dur); 
     1492        msec_dur = PJ_TIME_VAL_MSEC(dur); 
     1493 
     1494        MIN_(call_dur.min, msec_dur); 
     1495        MAX_(call_dur.max, msec_dur); 
     1496        AVG_(call_dur.avg, msec_dur); 
     1497 
     1498        /* Connect delay */ 
     1499        if (call->connect_time.sec) { 
     1500            pj_time_val t = call->connect_time; 
     1501            PJ_TIME_VAL_SUB(t, call->start_time); 
     1502            msec_dur = PJ_TIME_VAL_MSEC(t); 
     1503        } else { 
     1504            msec_dur = 10; 
     1505        } 
     1506 
     1507        MIN_(call_pdd.min, msec_dur); 
     1508        MAX_(call_pdd.max, msec_dur); 
     1509        AVG_(call_pdd.avg, msec_dur); 
     1510 
     1511        /* RX Statistisc: */ 
     1512 
     1513        /* Packets */ 
     1514        MIN_(min_stat.rx.pkt, audio->rtcp.stat.rx.pkt); 
     1515        MAX_(max_stat.rx.pkt, audio->rtcp.stat.rx.pkt); 
     1516        AVG_(avg_stat.rx.pkt, audio->rtcp.stat.rx.pkt); 
     1517 
     1518        /* Bytes */ 
     1519        MIN_(min_stat.rx.bytes, audio->rtcp.stat.rx.bytes); 
     1520        MAX_(max_stat.rx.bytes, audio->rtcp.stat.rx.bytes); 
     1521        AVG_(avg_stat.rx.bytes, audio->rtcp.stat.rx.bytes); 
     1522 
     1523 
     1524        /* Packet loss */ 
     1525        MIN_(min_stat.rx.loss, audio->rtcp.stat.rx.loss); 
     1526        MAX_(max_stat.rx.loss, audio->rtcp.stat.rx.loss); 
     1527        AVG_(avg_stat.rx.loss, audio->rtcp.stat.rx.loss); 
     1528 
     1529        /* Packet dup */ 
     1530        MIN_(min_stat.rx.dup, audio->rtcp.stat.rx.dup); 
     1531        MAX_(max_stat.rx.dup, audio->rtcp.stat.rx.dup); 
     1532        AVG_(avg_stat.rx.dup, audio->rtcp.stat.rx.dup); 
     1533 
     1534        /* Packet reorder */ 
     1535        MIN_(min_stat.rx.reorder, audio->rtcp.stat.rx.reorder); 
     1536        MAX_(max_stat.rx.reorder, audio->rtcp.stat.rx.reorder); 
     1537        AVG_(avg_stat.rx.reorder, audio->rtcp.stat.rx.reorder); 
     1538 
     1539        /* Jitter  */ 
     1540        MIN_(min_stat.rx.jitter.min, audio->rtcp.stat.rx.jitter.min); 
     1541        MAX_(max_stat.rx.jitter.max, audio->rtcp.stat.rx.jitter.max); 
     1542        AVG_(avg_stat.rx.jitter.avg, audio->rtcp.stat.rx.jitter.avg); 
     1543 
     1544 
     1545        /* TX Statistisc: */ 
     1546 
     1547        /* Packets */ 
     1548        MIN_(min_stat.tx.pkt, audio->rtcp.stat.tx.pkt); 
     1549        MAX_(max_stat.tx.pkt, audio->rtcp.stat.tx.pkt); 
     1550        AVG_(avg_stat.tx.pkt, audio->rtcp.stat.tx.pkt); 
     1551 
     1552        /* Bytes */ 
     1553        MIN_(min_stat.tx.bytes, audio->rtcp.stat.tx.bytes); 
     1554        MAX_(max_stat.tx.bytes, audio->rtcp.stat.tx.bytes); 
     1555        AVG_(avg_stat.tx.bytes, audio->rtcp.stat.tx.bytes); 
     1556 
     1557        /* Packet loss */ 
     1558        MIN_(min_stat.tx.loss, audio->rtcp.stat.tx.loss); 
     1559        MAX_(max_stat.tx.loss, audio->rtcp.stat.tx.loss); 
     1560        AVG_(avg_stat.tx.loss, audio->rtcp.stat.tx.loss); 
     1561 
     1562        /* Packet dup */ 
     1563        MIN_(min_stat.tx.dup, audio->rtcp.stat.tx.dup); 
     1564        MAX_(max_stat.tx.dup, audio->rtcp.stat.tx.dup); 
     1565        AVG_(avg_stat.tx.dup, audio->rtcp.stat.tx.dup); 
     1566 
     1567        /* Packet reorder */ 
     1568        MIN_(min_stat.tx.reorder, audio->rtcp.stat.tx.reorder); 
     1569        MAX_(max_stat.tx.reorder, audio->rtcp.stat.tx.reorder); 
     1570        AVG_(avg_stat.tx.reorder, audio->rtcp.stat.tx.reorder); 
     1571 
     1572        /* Jitter  */ 
     1573        MIN_(min_stat.tx.jitter.min, audio->rtcp.stat.tx.jitter.min); 
     1574        MAX_(max_stat.tx.jitter.max, audio->rtcp.stat.tx.jitter.max); 
     1575        AVG_(avg_stat.tx.jitter.avg, audio->rtcp.stat.tx.jitter.avg); 
     1576 
     1577 
     1578        /* RTT */ 
     1579        MIN_(min_stat.rtt.min, audio->rtcp.stat.rtt.min); 
     1580        MAX_(max_stat.rtt.max, audio->rtcp.stat.rtt.max); 
     1581        AVG_(avg_stat.rtt.avg, audio->rtcp.stat.rtt.avg); 
     1582 
     1583        ++count; 
     1584    } 
     1585 
     1586    if (count == 0) { 
     1587        puts("No active calls"); 
     1588        return; 
     1589    } 
     1590 
     1591    printf("Total %d call(s) active.\n" 
     1592           "                    Average Statistics\n" 
     1593           "                    min     avg     max \n" 
     1594           "                -----------------------\n" 
     1595           " call duration: %7d %7d %7d %s\n" 
     1596           " connect delay: %7d %7d %7d %s\n" 
     1597           " RX stat:\n" 
     1598           "       packets: %7s %7s %7s %s\n" 
     1599           "       payload: %7s %7s %7s %s\n" 
     1600           "          loss: %7d %7d %7d %s\n" 
     1601           "  percent loss: %7.3f %7.3f %7.3f %s\n" 
     1602           "           dup: %7d %7d %7d %s\n" 
     1603           "       reorder: %7d %7d %7d %s\n" 
     1604           "        jitter: %7.3f %7.3f %7.3f %s\n" 
     1605           " TX stat:\n" 
     1606           "       packets: %7s %7s %7s %s\n" 
     1607           "       payload: %7s %7s %7s %s\n" 
     1608           "          loss: %7d %7d %7d %s\n" 
     1609           "  percent loss: %7.3f %7.3f %7.3f %s\n" 
     1610           "           dup: %7d %7d %7d %s\n" 
     1611           "       reorder: %7d %7d %7d %s\n" 
     1612           "        jitter: %7.3f %7.3f %7.3f %s\n" 
     1613           " RTT          : %7.3f %7.3f %7.3f %s\n" 
     1614           , 
     1615           count, 
     1616           call_dur.min/1000, call_dur.avg/1000, call_dur.max/1000,  
     1617           "seconds", 
     1618 
     1619           call_pdd.min, call_pdd.avg, call_pdd.max,  
     1620           "ms", 
     1621 
     1622           /* rx */ 
     1623 
     1624           good_number(srx_min, min_stat.rx.pkt), 
     1625           good_number(srx_avg, avg_stat.rx.pkt), 
     1626           good_number(srx_max, max_stat.rx.pkt), 
     1627           "packets", 
     1628 
     1629           good_number(brx_min, min_stat.rx.bytes), 
     1630           good_number(brx_avg, avg_stat.rx.bytes), 
     1631           good_number(brx_max, max_stat.rx.bytes), 
     1632           "bytes", 
     1633 
     1634           min_stat.rx.loss, avg_stat.rx.loss, max_stat.rx.loss, 
     1635           "packets", 
     1636            
     1637           min_stat.rx.loss*100.0/(min_stat.rx.pkt+min_stat.rx.loss), 
     1638           avg_stat.rx.loss*100.0/(avg_stat.rx.pkt+avg_stat.rx.loss), 
     1639           max_stat.rx.loss*100.0/(max_stat.rx.pkt+max_stat.rx.loss), 
     1640           "%", 
     1641 
     1642 
     1643           min_stat.rx.dup, avg_stat.rx.dup, max_stat.rx.dup, 
     1644           "packets", 
     1645 
     1646           min_stat.rx.reorder, avg_stat.rx.reorder, max_stat.rx.reorder, 
     1647           "packets", 
     1648 
     1649           min_stat.rx.jitter.min/1000.0,  
     1650           avg_stat.rx.jitter.avg/1000.0,  
     1651           max_stat.rx.jitter.max/1000.0, 
     1652           "ms", 
     1653         
     1654           /* tx */ 
     1655 
     1656           good_number(stx_min, min_stat.tx.pkt), 
     1657           good_number(stx_avg, avg_stat.tx.pkt), 
     1658           good_number(stx_max, max_stat.tx.pkt), 
     1659           "packets", 
     1660 
     1661           good_number(btx_min, min_stat.tx.bytes), 
     1662           good_number(btx_avg, avg_stat.tx.bytes), 
     1663           good_number(btx_max, max_stat.tx.bytes), 
     1664           "bytes", 
     1665 
     1666           min_stat.tx.loss, avg_stat.tx.loss, max_stat.tx.loss, 
     1667           "packets", 
     1668            
     1669           min_stat.rx.loss*100.0/(min_stat.rx.pkt+min_stat.rx.loss), 
     1670           avg_stat.rx.loss*100.0/(avg_stat.rx.pkt+avg_stat.rx.loss), 
     1671           max_stat.rx.loss*100.0/(max_stat.rx.pkt+max_stat.rx.loss), 
     1672           "%", 
     1673 
     1674           min_stat.tx.dup, avg_stat.tx.dup, max_stat.tx.dup, 
     1675           "packets", 
     1676 
     1677           min_stat.tx.reorder, avg_stat.tx.reorder, max_stat.tx.reorder, 
     1678           "packets", 
     1679 
     1680           min_stat.tx.jitter.min/1000.0,  
     1681           avg_stat.tx.jitter.avg/1000.0,  
     1682           max_stat.tx.jitter.max/1000.0, 
     1683           "ms", 
     1684 
     1685           /* rtt */ 
     1686           min_stat.rtt.min/1000.0,  
     1687           avg_stat.rtt.avg/1000.0,  
     1688           max_stat.rtt.max/1000.0, 
     1689           "ms" 
     1690           ); 
     1691 
     1692} 
     1693 
     1694 
    13911695#include "siprtp_report.c" 
    13921696 
     
    14551759"\n" 
    14561760"Enter menu character:\n" 
     1761"  s    Summary\n" 
    14571762"  l    List all calls\n" 
    14581763"  h    Hangup a call\n" 
     
    14751780 
    14761781        switch (input1[0]) { 
     1782 
     1783        case 's': 
     1784            print_avg_stat(); 
     1785            break; 
     1786 
    14771787        case 'l': 
    14781788            list_calls(); 
  • pjproject/trunk/pjsip-apps/src/samples/siprtp_report.c

    r568 r621  
    2626 * functionality (such as writing to XML file). 
    2727 */ 
    28  
    29 static const char *good_number(char *buf, pj_int32_t val) 
    30 { 
    31     if (val < 1000) { 
    32         pj_ansi_sprintf(buf, "%d", val); 
    33     } else if (val < 1000000) { 
    34         pj_ansi_sprintf(buf, "%d.%dK",  
    35                         val / 1000, 
    36                         (val % 1000) / 100); 
    37     } else { 
    38         pj_ansi_sprintf(buf, "%d.%02dM",  
    39                         val / 1000000, 
    40                         (val % 1000000) / 10000); 
    41     } 
    42  
    43     return buf; 
    44 } 
    4528 
    4629 
     
    5538    char duration[80], last_update[80]; 
    5639    char bps[16], ipbps[16], packets[16], bytes[16], ipbytes[16]; 
     40    unsigned decor; 
    5741    pj_time_val now; 
     42 
     43 
     44    decor = pj_log_get_decor(); 
     45    pj_log_set_decor(PJ_LOG_HAS_NEWLINE); 
    5846 
    5947    pj_gettimeofday(&now); 
     
    8068 
    8169    /* Call number and state */ 
    82     printf("Call #%d: %s%s\n", call_index, pjsip_inv_state_name(inv->state),  
    83                                duration); 
     70    PJ_LOG(3, (THIS_FILE, 
     71              "Call #%d: %s%s",  
     72              call_index, pjsip_inv_state_name(inv->state),  
     73              duration)); 
    8474 
    8575 
     
    9282        userinfo[len] = '\0'; 
    9383 
    94     printf("   %s\n", userinfo); 
     84    PJ_LOG(3, (THIS_FILE, "   %s", userinfo)); 
    9585 
    9686 
     
    9888        call->connect_time.sec == 0)  
    9989    { 
     90        pj_log_set_decor(decor); 
    10091        return; 
    10192    } 
     
    124115        } 
    125116 
    126         printf("   Signaling quality: %s%s\n", pdd, connectdelay); 
    127     } 
    128  
    129  
    130     printf("   Stream #0: audio %.*s@%dHz, %dms/frame, %sB/s (%sB/s +IP hdr)\n", 
     117        PJ_LOG(3, (THIS_FILE,  
     118                   "   Signaling quality: %s%s", pdd, connectdelay)); 
     119    } 
     120 
     121 
     122    PJ_LOG(3, (THIS_FILE, 
     123               "   Stream #0: audio %.*s@%dHz, %dms/frame, %sB/s (%sB/s +IP hdr)", 
    131124        (int)audio->si.fmt.encoding_name.slen, 
    132125        audio->si.fmt.encoding_name.ptr, 
     
    134127        audio->samples_per_frame * 1000 / audio->clock_rate, 
    135128        good_number(bps, audio->bytes_per_frame * audio->clock_rate / audio->samples_per_frame), 
    136         good_number(ipbps, (audio->bytes_per_frame+32) * audio->clock_rate / audio->samples_per_frame)); 
     129        good_number(ipbps, (audio->bytes_per_frame+32) * audio->clock_rate / audio->samples_per_frame))); 
    137130 
    138131    if (audio->rtcp.stat.rx.update_cnt == 0) 
     
    148141    } 
    149142 
    150     printf("              RX stat last update: %s\n" 
     143    PJ_LOG(3, (THIS_FILE,  
     144           "              RX stat last update: %s\n" 
    151145           "                 total %s packets %sB received (%sB +IP hdr)%s\n" 
    152146           "                 pkt loss=%d (%3.1f%%), dup=%d (%3.1f%%), reorder=%d (%3.1f%%)%s\n" 
    153147           "                       (msec)    min     avg     max     last\n" 
    154148           "                 loss period: %7.3f %7.3f %7.3f %7.3f%s\n" 
    155            "                 jitter     : %7.3f %7.3f %7.3f %7.3f%s\n", 
     149           "                 jitter     : %7.3f %7.3f %7.3f %7.3f%s", 
    156150           last_update, 
    157151           good_number(packets, audio->rtcp.stat.rx.pkt), 
     
    176170           audio->rtcp.stat.rx.jitter.last / 1000.0, 
    177171           "" 
    178            ); 
     172           )); 
    179173 
    180174 
     
    191185    } 
    192186 
    193     printf("              TX stat last update: %s\n" 
     187    PJ_LOG(3, (THIS_FILE, 
     188           "              TX stat last update: %s\n" 
    194189           "                 total %s packets %sB sent (%sB +IP hdr)%s\n" 
    195190           "                 pkt loss=%d (%3.1f%%), dup=%d (%3.1f%%), reorder=%d (%3.1f%%)%s\n" 
    196191           "                       (msec)    min     avg     max     last\n" 
    197192           "                 loss period: %7.3f %7.3f %7.3f %7.3f%s\n" 
    198            "                 jitter     : %7.3f %7.3f %7.3f %7.3f%s\n", 
     193           "                 jitter     : %7.3f %7.3f %7.3f %7.3f%s", 
    199194           last_update, 
    200195           good_number(packets, audio->rtcp.stat.tx.pkt), 
     
    219214           audio->rtcp.stat.tx.jitter.last / 1000.0, 
    220215           "" 
    221            ); 
    222  
    223  
    224     printf("             RTT delay      : %7.3f %7.3f %7.3f %7.3f%s\n",  
     216           )); 
     217 
     218 
     219    PJ_LOG(3, (THIS_FILE, 
     220           "             RTT delay      : %7.3f %7.3f %7.3f %7.3f%s\n",  
    225221           audio->rtcp.stat.rtt.min / 1000.0, 
    226222           audio->rtcp.stat.rtt.avg / 1000.0, 
     
    228224           audio->rtcp.stat.rtt.last / 1000.0, 
    229225           "" 
    230            ); 
    231  
     226           )); 
     227 
     228    pj_log_set_decor(decor); 
    232229} 
    233230 
Note: See TracChangeset for help on using the changeset viewer.