Ignore:
Timestamp:
Apr 29, 2008 5:15:41 PM (12 years ago)
Author:
nanang
Message:

More on ticket #513:

  • Added RTCP XR print reports to streamutil.c
  • Added new API pjmedia_stream_get_stat_xr()
  • Added field rtcp_xr_enabled to stream info structure
  • Swapped the wrong RTCP XR statistic storage (encoding direction should be stored in TX, decoding direction in RX, it was the opposite)
File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjmedia/src/pjmedia/rtcp_xr.c

    r1942 r1943  
    8787    pj_bzero(session, sizeof(pjmedia_rtcp_xr_session)); 
    8888 
     89    session->name = parent_session->name; 
    8990    session->rtcp_session = parent_session; 
    9091    pj_memcpy(&session->pkt.common, &session->rtcp_session->rtcp_sr_pkt.common, 
     
    9394 
    9495    /* Init config */ 
    95     session->stat.tx.voip_mtc.gmin = (pj_uint8_t)(gmin? gmin : DEFAULT_GMIN); 
     96    session->stat.rx.voip_mtc.gmin = (pj_uint8_t)(gmin? gmin : DEFAULT_GMIN); 
    9697    session->ptime = session->rtcp_session->pkt_size * 1000 /  
    9798                     session->rtcp_session->clock_rate; 
     
    99100 
    100101    /* Init Statistics Summary fields which have non-zero default */ 
    101     session->stat.tx.stat_sum.jitter.min = (unsigned) -1; 
    102     session->stat.tx.stat_sum.toh.min = (unsigned) -1; 
     102    session->stat.rx.stat_sum.jitter.min = (unsigned) -1; 
     103    session->stat.rx.stat_sum.toh.min = (unsigned) -1; 
    103104 
    104105    /* Init VoIP Metrics fields which have non-zero default */ 
     106    session->stat.rx.voip_mtc.signal_lvl = 127; 
     107    session->stat.rx.voip_mtc.noise_lvl = 127; 
     108    session->stat.rx.voip_mtc.rerl = 127; 
     109    session->stat.rx.voip_mtc.r_factor = 127; 
     110    session->stat.rx.voip_mtc.ext_r_factor = 127; 
     111    session->stat.rx.voip_mtc.mos_lq = 127; 
     112    session->stat.rx.voip_mtc.mos_cq = 127; 
     113 
    105114    session->stat.tx.voip_mtc.signal_lvl = 127; 
    106115    session->stat.tx.voip_mtc.noise_lvl = 127; 
     
    190199    /* Build this block if we have received packets since last build */ 
    191200    if ((rpt_types == 0 || (rpt_types & PJMEDIA_RTCP_XR_STATS)) && 
    192         sess->stat.tx.stat_sum.count > 0) 
     201        sess->stat.rx.stat_sum.count > 0) 
    193202    { 
    194203        pjmedia_rtcp_xr_rb_stats *r; 
     
    199208 
    200209        /* Init block header */ 
    201         specific |= sess->stat.tx.stat_sum.l ? (1 << 7) : 0; 
    202         specific |= sess->stat.tx.stat_sum.d ? (1 << 6) : 0; 
    203         specific |= sess->stat.tx.stat_sum.j ? (1 << 5) : 0; 
    204         specific |= (sess->stat.tx.stat_sum.t & 3) << 3; 
     210        specific |= sess->stat.rx.stat_sum.l ? (1 << 7) : 0; 
     211        specific |= sess->stat.rx.stat_sum.d ? (1 << 6) : 0; 
     212        specific |= sess->stat.rx.stat_sum.j ? (1 << 5) : 0; 
     213        specific |= (sess->stat.rx.stat_sum.t & 3) << 3; 
    205214        r->header.bt = BT_STATS; 
    206215        r->header.specific = specific; 
     
    210219        r->ssrc = pj_htonl(sess->rtcp_session->peer_ssrc); 
    211220        r->begin_seq = pj_htons((pj_uint16_t) 
    212                                 (sess->stat.tx.stat_sum.begin_seq & 0xFFFF)); 
     221                                (sess->stat.rx.stat_sum.begin_seq & 0xFFFF)); 
    213222        r->end_seq = pj_htons((pj_uint16_t) 
    214                               (sess->stat.tx.stat_sum.end_seq & 0xFFFF)); 
    215         if (sess->stat.tx.stat_sum.l) { 
    216             r->lost = pj_htonl(sess->stat.tx.stat_sum.lost); 
    217         } 
    218         if (sess->stat.tx.stat_sum.d) { 
    219             r->dup = pj_htonl(sess->stat.tx.stat_sum.dup); 
    220         } 
    221         if (sess->stat.tx.stat_sum.j) { 
    222             r->jitter_min = pj_htonl(sess->stat.tx.stat_sum.jitter.min); 
    223             r->jitter_max = pj_htonl(sess->stat.tx.stat_sum.jitter.max); 
    224             r->jitter_mean = pj_htonl(sess->stat.tx.stat_sum.jitter.mean); 
    225             sess->stat.tx.stat_sum.jitter.dev =  
    226                                 my_isqrt(sess->stat.tx.stat_sum.jitter.dev); 
    227             r->jitter_dev = pj_htonl(sess->stat.tx.stat_sum.jitter.dev); 
    228         } 
    229         if (sess->stat.tx.stat_sum.t) { 
    230             r->toh_min = sess->stat.tx.stat_sum.toh.min; 
    231             r->toh_max = sess->stat.tx.stat_sum.toh.max; 
    232             r->toh_mean = sess->stat.tx.stat_sum.toh.mean; 
    233             sess->stat.tx.stat_sum.toh.dev =  
    234                                 my_isqrt(sess->stat.tx.stat_sum.toh.dev); 
    235             r->toh_dev = sess->stat.tx.stat_sum.toh.dev; 
     223                              (sess->stat.rx.stat_sum.end_seq & 0xFFFF)); 
     224        if (sess->stat.rx.stat_sum.l) { 
     225            r->lost = pj_htonl(sess->stat.rx.stat_sum.lost); 
     226        } 
     227        if (sess->stat.rx.stat_sum.d) { 
     228            r->dup = pj_htonl(sess->stat.rx.stat_sum.dup); 
     229        } 
     230        if (sess->stat.rx.stat_sum.j) { 
     231            r->jitter_min = pj_htonl(sess->stat.rx.stat_sum.jitter.min); 
     232            r->jitter_max = pj_htonl(sess->stat.rx.stat_sum.jitter.max); 
     233            r->jitter_mean = pj_htonl(sess->stat.rx.stat_sum.jitter.mean); 
     234            sess->stat.rx.stat_sum.jitter.dev =  
     235                                my_isqrt(sess->stat.rx.stat_sum.jitter.dev); 
     236            r->jitter_dev = pj_htonl(sess->stat.rx.stat_sum.jitter.dev); 
     237        } 
     238        if (sess->stat.rx.stat_sum.t) { 
     239            r->toh_min = sess->stat.rx.stat_sum.toh.min; 
     240            r->toh_max = sess->stat.rx.stat_sum.toh.max; 
     241            r->toh_mean = sess->stat.rx.stat_sum.toh.mean; 
     242            sess->stat.rx.stat_sum.toh.dev =  
     243                                my_isqrt(sess->stat.rx.stat_sum.toh.dev); 
     244            r->toh_dev = sess->stat.rx.stat_sum.toh.dev; 
    236245        } 
    237246 
    238247        /* Reset TX statistics summary each time built */ 
    239         pj_bzero(&sess->stat.tx.stat_sum, sizeof(sess->stat.tx.stat_sum)); 
    240         sess->stat.tx.stat_sum.jitter.min = (unsigned) -1; 
    241         sess->stat.tx.stat_sum.toh.min = (unsigned) -1; 
     248        pj_bzero(&sess->stat.rx.stat_sum, sizeof(sess->stat.rx.stat_sum)); 
     249        sess->stat.rx.stat_sum.jitter.min = (unsigned) -1; 
     250        sess->stat.rx.stat_sum.toh.min = (unsigned) -1; 
    242251 
    243252        /* Finally */ 
    244253        size += sizeof(pjmedia_rtcp_xr_rb_stats); 
     254        pj_gettimeofday(&sess->stat.rx.stat_sum.update); 
    245255    } 
    246256 
     
    289299                p23 = 1 - c22/(c22 + c23); 
    290300            } 
    291             sess->stat.tx.voip_mtc.burst_den = (pj_uint8_t)(256*p23/(p23 + p32)); 
    292             sess->stat.tx.voip_mtc.gap_den = (pj_uint8_t)(256*c14/(c11 + c14)); 
     301            sess->stat.rx.voip_mtc.burst_den = (pj_uint8_t)(256*p23/(p23 + p32)); 
     302            sess->stat.rx.voip_mtc.gap_den = (pj_uint8_t)(256*c14/(c11 + c14)); 
    293303 
    294304            /* Calculate burst and gap durations in ms */ 
    295             sess->stat.tx.voip_mtc.gap_dur = (pj_uint16_t)((c11+c14+c13)*m/c13); 
    296             sess->stat.tx.voip_mtc.burst_dur = (pj_uint16_t)(ctotal*m/c13 -  
    297                                                sess->stat.tx.voip_mtc.gap_dur); 
     305            sess->stat.rx.voip_mtc.gap_dur = (pj_uint16_t)((c11+c14+c13)*m/c13); 
     306            sess->stat.rx.voip_mtc.burst_dur = (pj_uint16_t)(ctotal*m/c13 -  
     307                                               sess->stat.rx.voip_mtc.gap_dur); 
    298308        } else { 
    299309            /* No burst occurred yet until this time? 
    300310             * Just report full gap. 
    301311             */ 
    302             ctotal = sess->rtcp_session->stat.rx.pkt; 
    303  
    304             sess->stat.tx.voip_mtc.burst_den = 0; 
    305             sess->stat.tx.voip_mtc.gap_den = (pj_uint8_t)(256 *  
     312            ctotal = sess->rtcp_session->stat.rx.pkt +  
     313                     sess->voip_mtc_stat.loss_count + 
     314                     sess->voip_mtc_stat.discard_count; 
     315 
     316            sess->stat.rx.voip_mtc.burst_den = 0; 
     317            sess->stat.rx.voip_mtc.gap_den = (pj_uint8_t)(256 *  
    306318                                        (sess->voip_mtc_stat.loss_count +  
    307319                                        sess->voip_mtc_stat.discard_count) /  
     
    309321 
    310322            /* Calculate burst and gap durations in ms */ 
    311             sess->stat.tx.voip_mtc.gap_dur = (pj_uint16_t)((m*ctotal) < 0xFFFF? 
     323            sess->stat.rx.voip_mtc.gap_dur = (pj_uint16_t)((m*ctotal) < 0xFFFF? 
    312324                                             (m*ctotal) : 0xFFFF); 
    313             sess->stat.tx.voip_mtc.burst_dur = 0; 
     325            sess->stat.rx.voip_mtc.burst_dur = 0; 
    314326        } 
    315327 
    316328        /* Calculate loss and discard rates */ 
    317         sess->stat.tx.voip_mtc.loss_rate = (pj_uint8_t) 
     329        sess->stat.rx.voip_mtc.loss_rate = (pj_uint8_t) 
    318330                             (256 * sess->voip_mtc_stat.loss_count / ctotal); 
    319         sess->stat.tx.voip_mtc.discard_rate = (pj_uint8_t) 
     331        sess->stat.rx.voip_mtc.discard_rate = (pj_uint8_t) 
    320332                             (256 * sess->voip_mtc_stat.discard_count / ctotal); 
    321333 
     
    324336         */ 
    325337        if (sess->stat.rtt.last) 
    326             sess->stat.tx.voip_mtc.rnd_trip_delay = (pj_uint16_t) 
     338            sess->stat.rx.voip_mtc.rnd_trip_delay = (pj_uint16_t) 
    327339                                    (sess->stat.rtt.last / 1000); 
    328340        else if (sess->rtcp_session->stat.rtt.last) 
    329             sess->stat.tx.voip_mtc.rnd_trip_delay = (pj_uint16_t) 
     341            sess->stat.rx.voip_mtc.rnd_trip_delay = (pj_uint16_t) 
    330342                                    (sess->rtcp_session->stat.rtt.last / 1000); 
    331343         
     
    337349         * is taken to be totally around 50 ms. 
    338350         */ 
    339         sess->stat.tx.voip_mtc.end_sys_delay = (pj_uint16_t) 
    340                                 (sess->stat.tx.voip_mtc.rnd_trip_delay / 2 + 
    341                                  sess->stat.tx.voip_mtc.jb_nom + 50); 
     351        sess->stat.rx.voip_mtc.end_sys_delay = (pj_uint16_t) 
     352                                (sess->stat.rx.voip_mtc.rnd_trip_delay / 2 + 
     353                                 sess->stat.rx.voip_mtc.jb_nom + 50); 
    342354 
    343355        /* Generate block contents */ 
    344356        r->ssrc             = pj_htonl(sess->rtcp_session->peer_ssrc); 
    345         r->loss_rate        = sess->stat.tx.voip_mtc.loss_rate; 
    346         r->discard_rate     = sess->stat.tx.voip_mtc.discard_rate; 
    347         r->burst_den        = sess->stat.tx.voip_mtc.burst_den; 
    348         r->gap_den          = sess->stat.tx.voip_mtc.gap_den; 
    349         r->burst_dur        = pj_htons(sess->stat.tx.voip_mtc.burst_dur); 
    350         r->gap_dur          = pj_htons(sess->stat.tx.voip_mtc.gap_dur); 
    351         r->rnd_trip_delay   = pj_htons(sess->stat.tx.voip_mtc.rnd_trip_delay); 
    352         r->end_sys_delay    = pj_htons(sess->stat.tx.voip_mtc.end_sys_delay); 
    353         r->signal_lvl       = sess->stat.tx.voip_mtc.signal_lvl; 
    354         r->noise_lvl        = sess->stat.tx.voip_mtc.noise_lvl; 
    355         r->rerl             = sess->stat.tx.voip_mtc.rerl; 
    356         r->gmin             = sess->stat.tx.voip_mtc.gmin; 
    357         r->r_factor         = sess->stat.tx.voip_mtc.r_factor; 
    358         r->ext_r_factor     = sess->stat.tx.voip_mtc.ext_r_factor; 
    359         r->mos_lq           = sess->stat.tx.voip_mtc.mos_lq; 
    360         r->mos_cq           = sess->stat.tx.voip_mtc.mos_cq; 
    361         r->rx_config        = sess->stat.tx.voip_mtc.rx_config; 
    362         r->jb_nom           = pj_htons(sess->stat.tx.voip_mtc.jb_nom); 
    363         r->jb_max           = pj_htons(sess->stat.tx.voip_mtc.jb_max); 
    364         r->jb_abs_max       = pj_htons(sess->stat.tx.voip_mtc.jb_abs_max); 
     357        r->loss_rate        = sess->stat.rx.voip_mtc.loss_rate; 
     358        r->discard_rate     = sess->stat.rx.voip_mtc.discard_rate; 
     359        r->burst_den        = sess->stat.rx.voip_mtc.burst_den; 
     360        r->gap_den          = sess->stat.rx.voip_mtc.gap_den; 
     361        r->burst_dur        = pj_htons(sess->stat.rx.voip_mtc.burst_dur); 
     362        r->gap_dur          = pj_htons(sess->stat.rx.voip_mtc.gap_dur); 
     363        r->rnd_trip_delay   = pj_htons(sess->stat.rx.voip_mtc.rnd_trip_delay); 
     364        r->end_sys_delay    = pj_htons(sess->stat.rx.voip_mtc.end_sys_delay); 
     365        /* signal & noise level encoded in two's complement form */ 
     366        r->signal_lvl       = (sess->stat.rx.voip_mtc.signal_lvl >= 0)? 
     367                              sess->stat.rx.voip_mtc.signal_lvl : 
     368                              (sess->stat.rx.voip_mtc.signal_lvl + 256); 
     369        r->noise_lvl        = (sess->stat.rx.voip_mtc.noise_lvl >= 0)? 
     370                              sess->stat.rx.voip_mtc.noise_lvl : 
     371                              (sess->stat.rx.voip_mtc.noise_lvl + 256); 
     372        r->rerl             = sess->stat.rx.voip_mtc.rerl; 
     373        r->gmin             = sess->stat.rx.voip_mtc.gmin; 
     374        r->r_factor         = sess->stat.rx.voip_mtc.r_factor; 
     375        r->ext_r_factor     = sess->stat.rx.voip_mtc.ext_r_factor; 
     376        r->mos_lq           = sess->stat.rx.voip_mtc.mos_lq; 
     377        r->mos_cq           = sess->stat.rx.voip_mtc.mos_cq; 
     378        r->rx_config        = sess->stat.rx.voip_mtc.rx_config; 
     379        r->jb_nom           = pj_htons(sess->stat.rx.voip_mtc.jb_nom); 
     380        r->jb_max           = pj_htons(sess->stat.rx.voip_mtc.jb_max); 
     381        r->jb_abs_max       = pj_htons(sess->stat.rx.voip_mtc.jb_abs_max); 
    365382 
    366383        /* Finally */ 
    367384        size += sizeof(pjmedia_rtcp_xr_rb_voip_mtc); 
     385        pj_gettimeofday(&sess->stat.rx.voip_mtc.update); 
    368386    } 
    369387 
     
    533551        pj_uint8_t flags = rb_stats->header.specific; 
    534552 
    535         pj_bzero(&sess->stat.rx.stat_sum, sizeof(sess->stat.rx.stat_sum)); 
     553        pj_bzero(&sess->stat.tx.stat_sum, sizeof(sess->stat.tx.stat_sum)); 
    536554 
    537555        /* Range of packets sequence reported in this blocks */ 
    538         sess->stat.rx.stat_sum.begin_seq = pj_ntohs(rb_stats->begin_seq); 
    539         sess->stat.rx.stat_sum.end_seq   = pj_ntohs(rb_stats->end_seq); 
     556        sess->stat.tx.stat_sum.begin_seq = pj_ntohs(rb_stats->begin_seq); 
     557        sess->stat.tx.stat_sum.end_seq   = pj_ntohs(rb_stats->end_seq); 
    540558 
    541559        /* Get flags of valid fields */ 
    542         sess->stat.rx.stat_sum.l = (flags & (1 << 7)) != 0; 
    543         sess->stat.rx.stat_sum.d = (flags & (1 << 6)) != 0; 
    544         sess->stat.rx.stat_sum.j = (flags & (1 << 5)) != 0; 
    545         sess->stat.rx.stat_sum.t = (flags & (3 << 3)) != 0; 
     560        sess->stat.tx.stat_sum.l = (flags & (1 << 7)) != 0; 
     561        sess->stat.tx.stat_sum.d = (flags & (1 << 6)) != 0; 
     562        sess->stat.tx.stat_sum.j = (flags & (1 << 5)) != 0; 
     563        sess->stat.tx.stat_sum.t = (flags & (3 << 3)) != 0; 
    546564 
    547565        /* Fetch the reports info */ 
    548         if (sess->stat.rx.stat_sum.l) { 
    549             sess->stat.rx.stat_sum.lost = pj_ntohl(rb_stats->lost); 
    550         } 
    551  
    552         if (sess->stat.rx.stat_sum.d) { 
    553             sess->stat.rx.stat_sum.dup = pj_ntohl(rb_stats->dup); 
    554         } 
    555  
    556         if (sess->stat.rx.stat_sum.j) { 
    557             sess->stat.rx.stat_sum.jitter.min = pj_ntohl(rb_stats->jitter_min); 
    558             sess->stat.rx.stat_sum.jitter.max = pj_ntohl(rb_stats->jitter_max); 
    559             sess->stat.rx.stat_sum.jitter.mean = pj_ntohl(rb_stats->jitter_mean); 
    560             sess->stat.rx.stat_sum.jitter.dev = pj_ntohl(rb_stats->jitter_dev); 
    561         } 
    562  
    563         if (sess->stat.rx.stat_sum.t) { 
    564             sess->stat.rx.stat_sum.toh.min = rb_stats->toh_min; 
    565             sess->stat.rx.stat_sum.toh.max = rb_stats->toh_max; 
    566             sess->stat.rx.stat_sum.toh.mean = rb_stats->toh_mean; 
    567             sess->stat.rx.stat_sum.toh.dev = rb_stats->toh_dev; 
    568         } 
     566        if (sess->stat.tx.stat_sum.l) { 
     567            sess->stat.tx.stat_sum.lost = pj_ntohl(rb_stats->lost); 
     568        } 
     569 
     570        if (sess->stat.tx.stat_sum.d) { 
     571            sess->stat.tx.stat_sum.dup = pj_ntohl(rb_stats->dup); 
     572        } 
     573 
     574        if (sess->stat.tx.stat_sum.j) { 
     575            sess->stat.tx.stat_sum.jitter.min = pj_ntohl(rb_stats->jitter_min); 
     576            sess->stat.tx.stat_sum.jitter.max = pj_ntohl(rb_stats->jitter_max); 
     577            sess->stat.tx.stat_sum.jitter.mean = pj_ntohl(rb_stats->jitter_mean); 
     578            sess->stat.tx.stat_sum.jitter.dev = pj_ntohl(rb_stats->jitter_dev); 
     579        } 
     580 
     581        if (sess->stat.tx.stat_sum.t) { 
     582            sess->stat.tx.stat_sum.toh.min = rb_stats->toh_min; 
     583            sess->stat.tx.stat_sum.toh.max = rb_stats->toh_max; 
     584            sess->stat.tx.stat_sum.toh.mean = rb_stats->toh_mean; 
     585            sess->stat.tx.stat_sum.toh.dev = rb_stats->toh_dev; 
     586        } 
     587 
     588        pj_gettimeofday(&sess->stat.tx.stat_sum.update); 
    569589    } 
    570590 
    571591    /* Receiving VoIP Metrics */ 
    572592    if (rb_voip_mtc) { 
    573         sess->stat.rx.voip_mtc.loss_rate = rb_voip_mtc->loss_rate; 
    574         sess->stat.rx.voip_mtc.discard_rate = rb_voip_mtc->discard_rate; 
    575         sess->stat.rx.voip_mtc.burst_den = rb_voip_mtc->burst_den; 
    576         sess->stat.rx.voip_mtc.gap_den = rb_voip_mtc->gap_den; 
    577         sess->stat.rx.voip_mtc.burst_dur = pj_ntohs(rb_voip_mtc->burst_dur); 
    578         sess->stat.rx.voip_mtc.gap_dur = pj_ntohs(rb_voip_mtc->gap_dur); 
    579         sess->stat.rx.voip_mtc.rnd_trip_delay =  
     593        sess->stat.tx.voip_mtc.loss_rate = rb_voip_mtc->loss_rate; 
     594        sess->stat.tx.voip_mtc.discard_rate = rb_voip_mtc->discard_rate; 
     595        sess->stat.tx.voip_mtc.burst_den = rb_voip_mtc->burst_den; 
     596        sess->stat.tx.voip_mtc.gap_den = rb_voip_mtc->gap_den; 
     597        sess->stat.tx.voip_mtc.burst_dur = pj_ntohs(rb_voip_mtc->burst_dur); 
     598        sess->stat.tx.voip_mtc.gap_dur = pj_ntohs(rb_voip_mtc->gap_dur); 
     599        sess->stat.tx.voip_mtc.rnd_trip_delay =  
    580600                                        pj_ntohs(rb_voip_mtc->rnd_trip_delay); 
    581         sess->stat.rx.voip_mtc.end_sys_delay =  
     601        sess->stat.tx.voip_mtc.end_sys_delay =  
    582602                                        pj_ntohs(rb_voip_mtc->end_sys_delay); 
    583         sess->stat.rx.voip_mtc.signal_lvl = rb_voip_mtc->signal_lvl; 
    584         sess->stat.rx.voip_mtc.noise_lvl = rb_voip_mtc->noise_lvl; 
    585         sess->stat.rx.voip_mtc.rerl = rb_voip_mtc->rerl; 
    586         sess->stat.rx.voip_mtc.gmin = rb_voip_mtc->gmin; 
    587         sess->stat.rx.voip_mtc.r_factor = rb_voip_mtc->r_factor; 
    588         sess->stat.rx.voip_mtc.ext_r_factor = rb_voip_mtc->ext_r_factor; 
    589         sess->stat.rx.voip_mtc.mos_lq = rb_voip_mtc->mos_lq; 
    590         sess->stat.rx.voip_mtc.mos_cq = rb_voip_mtc->mos_cq; 
    591         sess->stat.rx.voip_mtc.rx_config = rb_voip_mtc->rx_config; 
    592         sess->stat.rx.voip_mtc.jb_nom = pj_ntohs(rb_voip_mtc->jb_nom); 
    593         sess->stat.rx.voip_mtc.jb_max = pj_ntohs(rb_voip_mtc->jb_max); 
    594         sess->stat.rx.voip_mtc.jb_abs_max = pj_ntohs(rb_voip_mtc->jb_abs_max); 
     603        /* signal & noise level encoded in two's complement form */ 
     604        sess->stat.tx.voip_mtc.signal_lvl = (rb_voip_mtc->signal_lvl > 127)? 
     605                    (rb_voip_mtc->signal_lvl - 256) : rb_voip_mtc->signal_lvl; 
     606        sess->stat.tx.voip_mtc.noise_lvl = (rb_voip_mtc->noise_lvl > 127)? 
     607                    (rb_voip_mtc->noise_lvl - 256) : rb_voip_mtc->noise_lvl; 
     608        sess->stat.tx.voip_mtc.rerl = rb_voip_mtc->rerl; 
     609        sess->stat.tx.voip_mtc.gmin = rb_voip_mtc->gmin; 
     610        sess->stat.tx.voip_mtc.r_factor = rb_voip_mtc->r_factor; 
     611        sess->stat.tx.voip_mtc.ext_r_factor = rb_voip_mtc->ext_r_factor; 
     612        sess->stat.tx.voip_mtc.mos_lq = rb_voip_mtc->mos_lq; 
     613        sess->stat.tx.voip_mtc.mos_cq = rb_voip_mtc->mos_cq; 
     614        sess->stat.tx.voip_mtc.rx_config = rb_voip_mtc->rx_config; 
     615        sess->stat.tx.voip_mtc.jb_nom = pj_ntohs(rb_voip_mtc->jb_nom); 
     616        sess->stat.tx.voip_mtc.jb_max = pj_ntohs(rb_voip_mtc->jb_max); 
     617        sess->stat.tx.voip_mtc.jb_abs_max = pj_ntohs(rb_voip_mtc->jb_abs_max); 
     618 
     619        pj_gettimeofday(&sess->stat.tx.voip_mtc.update); 
    595620    } 
    596621} 
     
    665690 
    666691    /* Update statistics summary */ 
    667     sess->stat.tx.stat_sum.count++; 
    668  
    669     if (sess->stat.tx.stat_sum.begin_seq == 0 ||  
    670         sess->stat.tx.stat_sum.begin_seq > ext_seq) 
     692    sess->stat.rx.stat_sum.count++; 
     693 
     694    if (sess->stat.rx.stat_sum.begin_seq == 0 ||  
     695        sess->stat.rx.stat_sum.begin_seq > ext_seq) 
    671696    { 
    672         sess->stat.tx.stat_sum.begin_seq = ext_seq; 
    673     } 
    674  
    675     if (sess->stat.tx.stat_sum.end_seq == 0 ||  
    676         sess->stat.tx.stat_sum.end_seq < ext_seq) 
     697        sess->stat.rx.stat_sum.begin_seq = ext_seq; 
     698    } 
     699 
     700    if (sess->stat.rx.stat_sum.end_seq == 0 ||  
     701        sess->stat.rx.stat_sum.end_seq < ext_seq) 
    677702    { 
    678         sess->stat.tx.stat_sum.end_seq = ext_seq; 
     703        sess->stat.rx.stat_sum.end_seq = ext_seq; 
    679704    } 
    680705 
    681706    if (lost >= 0) { 
    682         sess->stat.tx.stat_sum.l = PJ_TRUE; 
     707        sess->stat.rx.stat_sum.l = PJ_TRUE; 
    683708        if (lost > 0) 
    684             sess->stat.tx.stat_sum.lost++; 
     709            sess->stat.rx.stat_sum.lost++; 
    685710    } 
    686711 
    687712    if (dup >= 0) { 
    688         sess->stat.tx.stat_sum.d = PJ_TRUE; 
     713        sess->stat.rx.stat_sum.d = PJ_TRUE; 
    689714        if (dup > 0) 
    690             sess->stat.tx.stat_sum.dup++; 
     715            sess->stat.rx.stat_sum.dup++; 
    691716    } 
    692717 
     
    694719        pj_int32_t diff; 
    695720 
    696         sess->stat.tx.stat_sum.j = PJ_TRUE; 
    697         if (sess->stat.tx.stat_sum.jitter.min > (pj_uint32_t)jitter) 
    698             sess->stat.tx.stat_sum.jitter.min = jitter; 
    699         if (sess->stat.tx.stat_sum.jitter.max < (pj_uint32_t)jitter) 
    700             sess->stat.tx.stat_sum.jitter.max = jitter; 
    701         sess->stat.tx.stat_sum.jitter.mean =  
    702             (jitter + sess->stat.tx.stat_sum.jitter.mean *  
    703              sess->stat.tx.stat_sum.jitter.count) / 
    704             (sess->stat.tx.stat_sum.jitter.count + 1); 
    705  
    706         diff = sess->stat.tx.stat_sum.jitter.mean - jitter; 
    707         sess->stat.tx.stat_sum.jitter.dev = 
    708             (diff * diff + sess->stat.tx.stat_sum.jitter.dev *  
    709              sess->stat.tx.stat_sum.jitter.count) / 
    710             (sess->stat.tx.stat_sum.jitter.count + 1); 
    711  
    712         ++sess->stat.tx.stat_sum.jitter.count; 
     721        sess->stat.rx.stat_sum.j = PJ_TRUE; 
     722        if (sess->stat.rx.stat_sum.jitter.min > (pj_uint32_t)jitter) 
     723            sess->stat.rx.stat_sum.jitter.min = jitter; 
     724        if (sess->stat.rx.stat_sum.jitter.max < (pj_uint32_t)jitter) 
     725            sess->stat.rx.stat_sum.jitter.max = jitter; 
     726        sess->stat.rx.stat_sum.jitter.mean =  
     727            (jitter + sess->stat.rx.stat_sum.jitter.mean *  
     728             sess->stat.rx.stat_sum.jitter.count) / 
     729            (sess->stat.rx.stat_sum.jitter.count + 1); 
     730 
     731        diff = sess->stat.rx.stat_sum.jitter.mean - jitter; 
     732        sess->stat.rx.stat_sum.jitter.dev = 
     733            (diff * diff + sess->stat.rx.stat_sum.jitter.dev *  
     734             sess->stat.rx.stat_sum.jitter.count) / 
     735            (sess->stat.rx.stat_sum.jitter.count + 1); 
     736 
     737        ++sess->stat.rx.stat_sum.jitter.count; 
    713738    } 
    714739 
     
    716741        pj_int32_t diff; 
    717742 
    718         sess->stat.tx.stat_sum.t = toh_ipv4? 1 : 2; 
    719  
    720         if (sess->stat.tx.stat_sum.toh.min > (pj_uint32_t)toh) 
    721             sess->stat.tx.stat_sum.toh.min = toh; 
    722         if (sess->stat.tx.stat_sum.toh.max < (pj_uint32_t)toh) 
    723             sess->stat.tx.stat_sum.toh.max = toh; 
    724         sess->stat.tx.stat_sum.toh.mean =  
    725             (toh + sess->stat.tx.stat_sum.toh.mean *  
    726              sess->stat.tx.stat_sum.toh.count) / 
    727             (sess->stat.tx.stat_sum.toh.count + 1); 
    728  
    729         diff = sess->stat.tx.stat_sum.toh.mean - toh; 
    730         sess->stat.tx.stat_sum.toh.dev = 
    731             (diff * diff + sess->stat.tx.stat_sum.toh.dev *  
    732              sess->stat.tx.stat_sum.toh.count) / 
    733             (sess->stat.tx.stat_sum.toh.count + 1); 
    734  
    735         ++sess->stat.tx.stat_sum.toh.count; 
     743        sess->stat.rx.stat_sum.t = toh_ipv4? 1 : 2; 
     744 
     745        if (sess->stat.rx.stat_sum.toh.min > (pj_uint32_t)toh) 
     746            sess->stat.rx.stat_sum.toh.min = toh; 
     747        if (sess->stat.rx.stat_sum.toh.max < (pj_uint32_t)toh) 
     748            sess->stat.rx.stat_sum.toh.max = toh; 
     749        sess->stat.rx.stat_sum.toh.mean =  
     750            (toh + sess->stat.rx.stat_sum.toh.mean *  
     751             sess->stat.rx.stat_sum.toh.count) / 
     752            (sess->stat.rx.stat_sum.toh.count + 1); 
     753 
     754        diff = sess->stat.rx.stat_sum.toh.mean - toh; 
     755        sess->stat.rx.stat_sum.toh.dev = 
     756            (diff * diff + sess->stat.rx.stat_sum.toh.dev *  
     757             sess->stat.rx.stat_sum.toh.count) / 
     758            (sess->stat.rx.stat_sum.toh.count + 1); 
     759 
     760        ++sess->stat.rx.stat_sum.toh.count; 
    736761    } 
    737762 
     
    753778        } 
    754779        else { 
    755             if(sess->voip_mtc_stat.pkt >= sess->stat.tx.voip_mtc.gmin) { 
     780            if(sess->voip_mtc_stat.pkt >= sess->stat.rx.voip_mtc.gmin) { 
    756781                /* Gap condition */ 
    757782                if(sess->voip_mtc_stat.lost == 1) { 
     
    801826    switch(info) { 
    802827        case PJMEDIA_RTCP_XR_INFO_SIGNAL_LVL: 
    803             sess->stat.tx.voip_mtc.signal_lvl = (pj_uint8_t) v; 
     828            sess->stat.rx.voip_mtc.signal_lvl = (pj_int8_t) v; 
    804829            break; 
    805830 
    806831        case PJMEDIA_RTCP_XR_INFO_NOISE_LVL: 
    807             sess->stat.tx.voip_mtc.noise_lvl = (pj_uint8_t) v; 
     832            sess->stat.rx.voip_mtc.noise_lvl = (pj_int8_t) v; 
    808833            break; 
    809834 
    810835        case PJMEDIA_RTCP_XR_INFO_RERL: 
    811             sess->stat.tx.voip_mtc.rerl = (pj_uint8_t) v; 
     836            sess->stat.rx.voip_mtc.rerl = (pj_uint8_t) v; 
    812837            break; 
    813838 
    814839        case PJMEDIA_RTCP_XR_INFO_R_FACTOR: 
    815             sess->stat.tx.voip_mtc.ext_r_factor = (pj_uint8_t) v; 
     840            sess->stat.rx.voip_mtc.ext_r_factor = (pj_uint8_t) v; 
    816841            break; 
    817842 
    818843        case PJMEDIA_RTCP_XR_INFO_MOS_LQ: 
    819             sess->stat.tx.voip_mtc.mos_lq = (pj_uint8_t) v; 
     844            sess->stat.rx.voip_mtc.mos_lq = (pj_uint8_t) v; 
    820845            break; 
    821846 
    822847        case PJMEDIA_RTCP_XR_INFO_MOS_CQ: 
    823             sess->stat.tx.voip_mtc.mos_cq = (pj_uint8_t) v; 
     848            sess->stat.rx.voip_mtc.mos_cq = (pj_uint8_t) v; 
    824849            break; 
    825850 
    826851        case PJMEDIA_RTCP_XR_INFO_CONF_PLC: 
    827852            if (v >= 0 && v <= 3) { 
    828                 sess->stat.tx.voip_mtc.rx_config &= 0x3F; 
    829                 sess->stat.tx.voip_mtc.rx_config |= (pj_uint8_t) (v << 6); 
     853                sess->stat.rx.voip_mtc.rx_config &= 0x3F; 
     854                sess->stat.rx.voip_mtc.rx_config |= (pj_uint8_t) (v << 6); 
    830855            } 
    831856            break; 
     
    833858        case PJMEDIA_RTCP_XR_INFO_CONF_JBA: 
    834859            if (v >= 0 && v <= 3) { 
    835                 sess->stat.tx.voip_mtc.rx_config &= 0xCF; 
    836                 sess->stat.tx.voip_mtc.rx_config |= (pj_uint8_t) (v << 4); 
     860                sess->stat.rx.voip_mtc.rx_config &= 0xCF; 
     861                sess->stat.rx.voip_mtc.rx_config |= (pj_uint8_t) (v << 4); 
    837862            } 
    838863            break; 
     
    840865        case PJMEDIA_RTCP_XR_INFO_CONF_JBR: 
    841866            if (v >= 0 && v <= 15) { 
    842                 sess->stat.tx.voip_mtc.rx_config &= 0xF0; 
    843                 sess->stat.tx.voip_mtc.rx_config |= (pj_uint8_t) v; 
     867                sess->stat.rx.voip_mtc.rx_config &= 0xF0; 
     868                sess->stat.rx.voip_mtc.rx_config |= (pj_uint8_t) v; 
    844869            } 
    845870            break; 
    846871 
    847872        case PJMEDIA_RTCP_XR_INFO_JB_NOM: 
    848             sess->stat.tx.voip_mtc.jb_nom = (pj_uint16_t) v; 
     873            sess->stat.rx.voip_mtc.jb_nom = (pj_uint16_t) v; 
    849874            break; 
    850875 
    851876        case PJMEDIA_RTCP_XR_INFO_JB_MAX: 
    852             sess->stat.tx.voip_mtc.jb_max = (pj_uint16_t) v; 
     877            sess->stat.rx.voip_mtc.jb_max = (pj_uint16_t) v; 
    853878            break; 
    854879 
    855880        case PJMEDIA_RTCP_XR_INFO_JB_ABS_MAX: 
    856             sess->stat.tx.voip_mtc.jb_abs_max = (pj_uint16_t) v; 
     881            sess->stat.rx.voip_mtc.jb_abs_max = (pj_uint16_t) v; 
    857882            break; 
    858883 
Note: See TracChangeset for help on using the changeset viewer.