Changeset 384


Ignore:
Timestamp:
Apr 5, 2006 4:56:19 PM (19 years ago)
Author:
bennylp
Message:

Fixed bug in RTT calculation in RTCP and increase RTT resolution to usec

Location:
pjproject/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjmedia/include/pjmedia/rtcp.h

    r383 r384  
    164164    pj_timestamp            ts_freq;    /**< System timestamp frequency.    */ 
    165165 
    166     pjmedia_rtcp_ntp_rec    rtcp_lsr;    /**< NTP ts in last SR received    */ 
     166    pjmedia_rtcp_ntp_rec    rtcp_lsr;   /**< NTP ts in last SR received    */ 
    167167    pj_timestamp            rtcp_lsr_time;/**< Time when last SR is received*/ 
    168     pj_uint32_t             peer_ssrc;   /**< Peer SSRC                     */ 
    169     unsigned                ee_delay;   /**< End-to-end delay, in msec.     */ 
     168    pj_uint32_t             peer_ssrc;  /**< Peer SSRC                      */ 
     169    unsigned                rtt_us;     /**< End-to-end delay, in usec.     */ 
    170170}; 
    171171 
  • pjproject/trunk/pjmedia/src/pjmedia/rtcp.c

    r383 r384  
    2020#include <pjmedia/errno.h> 
    2121#include <pj/assert.h> 
     22#include <pj/log.h> 
    2223#include <pj/os.h> 
    2324#include <pj/sock.h> 
    2425#include <pj/string.h> 
    2526 
     27#define THIS_FILE "rtcp.c" 
    2628 
    2729#define RTCP_SR   200 
     
    3335#endif 
    3436 
     37#if 0 
     38#   define TRACE_(x)    PJ_LOG(3,x) 
     39#else 
     40#   define TRACE_(x) 
     41#endif 
    3542 
    3643/* 
     
    183190    pj_get_timestamp(&session->rtcp_lsr_time); 
    184191 
    185     /* Calculate ee_delay if it has RR */ 
     192    /* Calculate RTT if it has RR */ 
    186193    if (size >= sizeof(pjmedia_rtcp_pkt)) { 
    187194         
    188195        /* Can only calculate if LSR and DLSR is present in RR */ 
    189196        if (rtcp->rr.lsr && rtcp->rr.dlsr) { 
    190             pj_uint32_t lsr, now, dlsr, eedelay; 
     197            pj_uint32_t lsr, now, dlsr; 
     198            pj_uint64_t eedelay; 
    191199            pjmedia_rtcp_ntp_rec ntp; 
    192200 
     
    207215            eedelay = now - lsr - dlsr; 
    208216 
    209             /* Convert end to end delay to msec:  
     217            /* Convert end to end delay to usec (keeping the calculation in 
     218             * 64bit space):: 
    210219             *   session->ee_delay = (eedelay * 1000) / 65536; 
    211220             */ 
    212             session->ee_delay = (eedelay * 1000) >> 16; 
     221            eedelay = (eedelay * 1000000) >> 16; 
     222 
     223            TRACE_((THIS_FILE, "Rx RTCP: lsr=%p, dlsr=%p (%d:%03dms), " 
     224                               "now=%p, rtt=%p", 
     225                    lsr, dlsr, dlsr/65536, (dlsr%65536)*1000/65536, 
     226                    now, (pj_uint32_t)eedelay)); 
     227             
     228            /* Only save calculation if "now" is greater than lsr, or 
     229             * otherwise rtt will be invalid  
     230             */ 
     231            if (now-dlsr >= lsr) { 
     232                session->rtt_us = (pj_uint32_t)eedelay; 
     233            } else { 
     234                TRACE_((THIS_FILE, "NTP clock running backwards?")); 
     235            } 
    213236        } 
    214237    } 
     
    272295    rtcp_pkt->sr.ntp_frac = pj_htonl(ntp.lo); 
    273296     
    274     if (session->rtcp_lsr_time.u64 == 0 || session->rtcp_lsr.lo == 0) { 
     297    if (session->rtcp_lsr_time.u64 == 0) { 
    275298        rtcp_pkt->rr.lsr = 0; 
    276299        rtcp_pkt->rr.dlsr = 0; 
     
    290313        pj_get_timestamp(&ts); 
    291314 
     315        /* Calculate DLSR */ 
     316        ts.u64 -= session->rtcp_lsr_time.u64; 
     317 
    292318        /* Convert interval to 1/65536 seconds value */ 
    293319        ts.u64 = ((ts.u64 - session->rtcp_lsr_time.u64) << 16) /  
  • pjproject/trunk/pjsip-apps/src/samples/siprtp.c

    r383 r384  
    5959    unsigned        loss_min, loss_avg, loss_max; 
    6060    char           *loss_type; 
    61     unsigned        jitter_min, jitter_avg, jitter_max; 
     61    unsigned        jitter_min_us, jitter_avg_us, jitter_max_us; 
    6262    unsigned        rtcp_cnt; 
    6363}; 
     
    254254    { 
    255255        pj_sockaddr_in addr; 
    256  
     256        pjsip_host_port addrname; 
     257 
     258        pj_memset(&addr, 0, sizeof(addr)); 
    257259        addr.sin_family = PJ_AF_INET; 
    258260        addr.sin_addr.s_addr = 0; 
    259261        addr.sin_port = pj_htons((pj_uint16_t)app.sip_port); 
    260262 
    261         status = pjsip_udp_transport_start( app.sip_endpt, &addr, NULL,  
     263        if (app.local_addr) { 
     264            addrname.host = pj_str(app.local_addr); 
     265            addrname.port = app.sip_port; 
     266        } 
     267 
     268        status = pjsip_udp_transport_start( app.sip_endpt, &addr,  
     269                                            (app.local_addr ? &addrname:NULL),  
    262270                                            1, NULL); 
    263         if (status != PJ_SUCCESS) 
     271        if (status != PJ_SUCCESS) { 
     272            app_perror(THIS_FILE, "Unable to start UDP transport", status); 
    264273            return status; 
     274        } 
    265275    } 
    266276 
     
    365375        return -1; 
    366376    } 
    367  
    368377 
    369378    /* RTP port counter */ 
     
    11241133                unsigned jitter; 
    11251134                 
    1126                 jitter = pj_ntohl(strm->rem_rtcp.rr.jitter) * 1000 / 
    1127                          strm->clock_rate; 
    1128                 if (jitter < strm->tx_stat.jitter_min) 
    1129                     strm->tx_stat.jitter_min = jitter; 
    1130                 if (jitter > strm->tx_stat.jitter_max) 
    1131                     strm->tx_stat.jitter_max = jitter; 
    1132                 strm->tx_stat.jitter_avg = (strm->tx_stat.jitter_avg * strm->tx_stat.rtcp_cnt + 
    1133                                             jitter) / (strm->tx_stat.rtcp_cnt + 1); 
     1135                jitter = (unsigned)(pj_ntohl(strm->rem_rtcp.rr.jitter) *  
     1136                                    1000000.0 / strm->clock_rate); 
     1137                if (jitter < strm->tx_stat.jitter_min_us) 
     1138                    strm->tx_stat.jitter_min_us = jitter; 
     1139                if (jitter > strm->tx_stat.jitter_max_us) 
     1140                    strm->tx_stat.jitter_max_us = jitter; 
     1141                strm->tx_stat.jitter_avg_us =  
     1142                        (strm->tx_stat.jitter_avg_us * strm->tx_stat.rtcp_cnt + 
     1143                         jitter) / (strm->tx_stat.rtcp_cnt + 1); 
    11341144 
    11351145                strm->tx_stat.rtcp_cnt++; 
     
    12191229                unsigned jitter; 
    12201230                 
    1221                 jitter = pj_ntohl(rtcp_pkt->rr.jitter) * 1000 / 
    1222                          strm->clock_rate; 
    1223                 if (jitter < strm->rx_stat.jitter_min) 
    1224                     strm->rx_stat.jitter_min = jitter; 
    1225                 if (jitter > strm->rx_stat.jitter_max) 
    1226                     strm->rx_stat.jitter_max = jitter; 
    1227                 strm->rx_stat.jitter_avg = (strm->rx_stat.jitter_avg * strm->rx_stat.rtcp_cnt + 
    1228                                             jitter) / (strm->rx_stat.rtcp_cnt + 1); 
     1231                jitter = (unsigned) (pj_ntohl(rtcp_pkt->rr.jitter) *  
     1232                                     1000000.0 / strm->clock_rate); 
     1233                if (jitter < strm->rx_stat.jitter_min_us) 
     1234                    strm->rx_stat.jitter_min_us = jitter; 
     1235                if (jitter > strm->rx_stat.jitter_max_us) 
     1236                    strm->rx_stat.jitter_max_us = jitter; 
     1237                strm->rx_stat.jitter_avg_us =  
     1238                        (strm->rx_stat.jitter_avg_us * strm->rx_stat.rtcp_cnt + 
     1239                         jitter) / (strm->rx_stat.rtcp_cnt + 1); 
    12291240 
    12301241                strm->rx_stat.rtcp_cnt++; 
     
    12331244            next_rtcp.u64 += (freq.u64 * RTCP_INTERVAL); 
    12341245        } 
    1235  
    12361246    } 
    12371247 
     
    12471257    pj_pool_t *pool; 
    12481258    struct media_stream *audio; 
    1249     pjmedia_sdp_session *local_sdp, *remote_sdp; 
     1259    const pjmedia_sdp_session *local_sdp, *remote_sdp; 
    12501260    struct codec *codec_desc = NULL; 
    12511261    unsigned i; 
     
    14081418        PJ_TIME_VAL_SUB(now, call->connect_time); 
    14091419 
    1410         sprintf(duration, " [duration: %02d:%02d:%02d.%03d]", 
     1420        sprintf(duration, " [duration: %02ld:%02ld:%02ld.%03ld]", 
    14111421                now.sec / 3600, 
    14121422                (now.sec % 3600) / 60, 
     
    14441454            t = call->response_time; 
    14451455            PJ_TIME_VAL_SUB(t, call->start_time); 
    1446             sprintf(pdd, "got 1st response in %d ms", PJ_TIME_VAL_MSEC(t)); 
     1456            sprintf(pdd, "got 1st response in %ld ms", PJ_TIME_VAL_MSEC(t)); 
    14471457        } else { 
    14481458            pdd[0] = '\0'; 
     
    14521462            t = call->connect_time; 
    14531463            PJ_TIME_VAL_SUB(t, call->start_time); 
    1454             sprintf(connectdelay, ", connected after: %d ms", PJ_TIME_VAL_MSEC(t)); 
     1464            sprintf(connectdelay, ", connected after: %ld ms",  
     1465                    PJ_TIME_VAL_MSEC(t)); 
    14551466        } else { 
    14561467            connectdelay[0] = '\0'; 
     
    14651476    } 
    14661477 
    1467     printf("   Stream #0: audio %.*s@%dHz, %dms/frame, %sbps (%sbps +IP hdr)\n", 
    1468            (int)audio->si.fmt.encoding_name.slen, 
    1469            audio->si.fmt.encoding_name.ptr, 
    1470            audio->clock_rate, 
    1471            audio->samples_per_frame * 1000 / audio->clock_rate, 
    1472            good_number(bps, audio->bytes_per_frame * audio->clock_rate / audio->samples_per_frame), 
    1473            good_number(ipbps, (audio->bytes_per_frame+32) * audio->clock_rate / audio->samples_per_frame)); 
     1478    printf("   Stream #0: audio %.*s@%dHz, %dms/frame, %sB/s (%sB/s +IP hdr)\n", 
     1479        (int)audio->si.fmt.encoding_name.slen, 
     1480        audio->si.fmt.encoding_name.ptr, 
     1481        audio->clock_rate, 
     1482        audio->samples_per_frame * 1000 / audio->clock_rate, 
     1483        good_number(bps, audio->bytes_per_frame * audio->clock_rate / audio->samples_per_frame), 
     1484        good_number(ipbps, (audio->bytes_per_frame+32) * audio->clock_rate / audio->samples_per_frame)); 
    14741485 
    14751486    total_loss = (audio->rtcp.rtcp_pkt.rr.total_lost_2 << 16) + 
     
    14791490    printf("              RX total %s packets %sB received (%sB +IP hdr)%s\n" 
    14801491           "                 pkt discards=%d (%3.1f%%), loss=%d (%3.1f%%), reorder=%d (%3.1f%%)%s\n" 
    1481            "                 loss period min=%d ms, avg=%d ms, max=%d ms%s\n" 
    1482            "                 jitter min=%d ms, avg=%d ms, max=%d ms, current=%d ms%s\n", 
     1492           "                 loss period min=%dms, avg=%dms, max=%dms%s\n" 
     1493           "                 jitter min=%5.3fms, avg=%5.3fms, max=%5.3fms, curr=%5.3f ms%s\n", 
    14831494           good_number(packets, audio->rx_stat.pkt), 
    14841495           good_number(bytes, audio->rx_stat.payload), 
     
    14931504           -1, -1, -1,  
    14941505           "", 
    1495            (audio->rx_stat.rtcp_cnt ? audio->rx_stat.jitter_min : -1),  
    1496            (audio->rx_stat.rtcp_cnt ? audio->rx_stat.jitter_avg : -1), 
    1497            (audio->rx_stat.rtcp_cnt ? audio->rx_stat.jitter_max : -1), 
    1498            (audio->rx_stat.rtcp_cnt ? pj_ntohl(audio->rtcp.rtcp_pkt.rr.jitter)*1000/audio->clock_rate : -1), 
     1506           (audio->rx_stat.rtcp_cnt? audio->rx_stat.jitter_min_us/1000.0 : -1.), 
     1507           (audio->rx_stat.rtcp_cnt? audio->rx_stat.jitter_avg_us/1000.0 : -1.), 
     1508           (audio->rx_stat.rtcp_cnt? audio->rx_stat.jitter_max_us/1000.0 : -1.), 
     1509           (audio->rx_stat.rtcp_cnt? pj_ntohl(audio->rtcp.rtcp_pkt.rr.jitter)*1000.0/audio->clock_rate : -1.), 
    14991510           "" 
    15001511           ); 
     
    15071518    printf("              TX total %s packets %sB sent (%sB +IP hdr)%s\n" 
    15081519           "                 pkt discards=%d (%3.1f%%), loss=%d (%3.1f%%), reorder=%d (%3.1f%%)%s\n" 
    1509            "                 loss period min=%d ms, avg=%d ms, max=%d ms%s\n" 
    1510            "                 jitter min=%d ms, avg=%d ms, max=%d ms, current=%d ms%s\n", 
     1520           "                 loss period min=%dms, avg=%dms, max=%dms%s\n" 
     1521           "                 jitter min=%5.3fms, avg=%5.3fms, max=%5.3fms, curr=%5.3f ms%s\n", 
    15111522           good_number(packets, audio->tx_stat.pkt), 
    15121523           good_number(bytes, audio->tx_stat.payload), 
     
    15211532           -1, -1, -1,  
    15221533           "", 
    1523            (audio->tx_stat.rtcp_cnt ? audio->tx_stat.jitter_min : -1),  
    1524            (audio->tx_stat.rtcp_cnt ? audio->tx_stat.jitter_avg : -1), 
    1525            (audio->tx_stat.rtcp_cnt ? audio->tx_stat.jitter_max : -1), 
    1526            (audio->tx_stat.rtcp_cnt ? pj_ntohl(audio->rem_rtcp.rr.jitter)*1000/audio->clock_rate : -1), 
     1534           (audio->tx_stat.rtcp_cnt? audio->tx_stat.jitter_min_us/1000.0 : -1.), 
     1535           (audio->tx_stat.rtcp_cnt? audio->tx_stat.jitter_avg_us/1000.0 : -1.), 
     1536           (audio->tx_stat.rtcp_cnt? audio->tx_stat.jitter_max_us/1000.0 : -1.), 
     1537           (audio->tx_stat.rtcp_cnt? pj_ntohl(audio->rem_rtcp.rr.jitter)*1000.0/audio->clock_rate : -1.), 
    15271538           "" 
    15281539           ); 
    15291540 
    1530     printf("              End to end delay: %u ms\n", audio->rtcp.ee_delay); 
     1541    printf("              End to end delay: %5.3f ms\n",  
     1542           audio->rtcp.rtt_us / 1000.0); 
    15311543 
    15321544} 
Note: See TracChangeset for help on using the changeset viewer.