Changeset 3224


Ignore:
Timestamp:
Jun 26, 2010 4:43:50 AM (9 years ago)
Author:
nanang
Message:

Fix #740:

  • Fixed zeroed/unset RTP timestamp in RTCP sender report.
Location:
pjproject/trunk/pjmedia
Files:
3 edited

Legend:

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

    r2394 r3224  
    247247    pj_timestamp            ts_base;    /**< Base system timestamp.         */ 
    248248    pj_timestamp            ts_freq;    /**< System timestamp frequency.    */ 
     249    pj_uint32_t             rtp_ts_base;/**< Base RTP timestamp.            */ 
    249250 
    250251    pj_uint32_t             rx_lsr;     /**< NTP ts in last SR received     */ 
     
    275276 
    276277/** 
     278 * RTCP session settings. 
     279 */ 
     280typedef struct pjmedia_rtcp_session_setting 
     281{ 
     282    char            *name;              /**< RTCP session name.         */ 
     283    unsigned         clock_rate;        /**< Sequence.                  */ 
     284    unsigned         samples_per_frame; /**< Timestamp.                 */ 
     285    pj_uint32_t      ssrc;              /**< Sender SSRC.               */ 
     286    pj_uint32_t      rtp_ts_base;       /**< Base RTP timestamp.        */ 
     287} pjmedia_rtcp_session_setting; 
     288 
     289 
     290/** 
     291 * Initialize RTCP session setting. 
     292 * 
     293 * @param settings          The RTCP session setting to be initialized. 
     294 */ 
     295PJ_DECL(void) pjmedia_rtcp_session_setting_default( 
     296                                    pjmedia_rtcp_session_setting *settings); 
     297 
     298 
     299/** 
    277300 * Initialize RTCP session. 
    278301 * 
     
    292315 
    293316/** 
     317 * Initialize RTCP session. 
     318 * 
     319 * @param session           The session 
     320 * @param settings          The RTCP session settings. 
     321 */ 
     322PJ_DECL(void) pjmedia_rtcp_init2(pjmedia_rtcp_session *session, 
     323                                 const pjmedia_rtcp_session_setting *settings); 
     324 
     325 
     326/** 
    294327 * Utility function to retrieve current NTP timestamp. 
    295328 * 
  • pjproject/trunk/pjmedia/src/pjmedia/rtcp.c

    r2422 r3224  
    126126 
    127127 
     128/* 
     129 * Initialize RTCP session setting. 
     130 */ 
     131PJ_DEF(void) pjmedia_rtcp_session_setting_default( 
     132                                    pjmedia_rtcp_session_setting *settings) 
     133{ 
     134    pj_bzero(&settings, sizeof(*settings)); 
     135} 
     136 
     137 
     138/* 
     139 * Initialize RTCP session. 
     140 */ 
    128141PJ_DEF(void) pjmedia_rtcp_init(pjmedia_rtcp_session *sess,  
    129142                               char *name, 
     
    132145                               pj_uint32_t ssrc) 
    133146{ 
     147    pjmedia_rtcp_session_setting settings; 
     148 
     149    pjmedia_rtcp_session_setting_default(&settings); 
     150    settings.name = name; 
     151    settings.clock_rate = clock_rate; 
     152    settings.samples_per_frame = samples_per_frame; 
     153    settings.ssrc = ssrc; 
     154 
     155    pjmedia_rtcp_init2(sess, &settings); 
     156} 
     157 
     158 
     159/* 
     160 * Initialize RTCP session. 
     161 */ 
     162PJ_DEF(void) pjmedia_rtcp_init2( pjmedia_rtcp_session *sess, 
     163                                 const pjmedia_rtcp_session_setting *settings) 
     164{ 
    134165    pjmedia_rtcp_sr_pkt *sr_pkt = &sess->rtcp_sr_pkt; 
    135166    pj_time_val now; 
     
    142173 
    143174    /* Name */ 
    144     sess->name = name ? name : (char*)THIS_FILE, 
     175    sess->name = settings->name ? settings->name : (char*)THIS_FILE; 
    145176 
    146177    /* Set clock rate */ 
    147     sess->clock_rate = clock_rate; 
    148     sess->pkt_size = samples_per_frame; 
     178    sess->clock_rate = settings->clock_rate; 
     179    sess->pkt_size = settings->samples_per_frame; 
    149180 
    150181    /* Init common RTCP SR header */ 
     
    153184    sr_pkt->common.pt = RTCP_SR; 
    154185    sr_pkt->common.length = pj_htons(12); 
    155     sr_pkt->common.ssrc = pj_htonl(ssrc); 
     186    sr_pkt->common.ssrc = pj_htonl(settings->ssrc); 
    156187     
    157188    /* Copy to RTCP RR header */ 
     
    167198    pj_get_timestamp(&sess->ts_base); 
    168199    pj_get_timestamp_freq(&sess->ts_freq); 
     200    sess->rtp_ts_base = settings->rtp_ts_base; 
    169201 
    170202    /* Initialize statistics states */ 
     
    572604     */ 
    573605    if (sess->stat.tx.pkt != pj_ntohl(sess->rtcp_sr_pkt.sr.sender_pcount)) { 
     606        pj_time_val ts_time; 
     607        pj_uint32_t rtp_ts; 
    574608 
    575609        /* So we should send RTCP SR */ 
     
    589623        sr->ntp_sec = pj_htonl(ntp.hi); 
    590624        sr->ntp_frac = pj_htonl(ntp.lo); 
     625 
     626        /* Fill in RTP timestamp (corresponds to NTP timestamp) in SR. */ 
     627        ts_time.sec = ntp.hi - sess->tv_base.sec - JAN_1970; 
     628        ts_time.msec = (long)(ntp.lo * 1000.0 / 0xFFFFFFFF); 
     629        rtp_ts = sess->rtp_ts_base + 
     630                 (pj_uint32_t)(sess->clock_rate*ts_time.sec) + 
     631                 (pj_uint32_t)(sess->clock_rate*ts_time.msec/1000); 
     632        sr->rtp_ts = pj_htonl(rtp_ts); 
    591633 
    592634        TRACE_((sess->name, "TX RTCP SR: ntp_ts=%p",  
  • pjproject/trunk/pjmedia/src/pjmedia/stream.c

    r3220 r3224  
    21222122                                       stream->codec_param.info.channel_cnt; 
    21232123 
    2124     /* Init RTCP session: */ 
    2125  
    2126     /* Special case for G.722 */ 
    21272124    if (info->fmt.pt == PJMEDIA_RTP_PT_G722) { 
    2128         pjmedia_rtcp_init(&stream->rtcp, stream->port.info.name.ptr, 
    2129                           8000,  
    2130                           160, 
    2131                           info->ssrc); 
    21322125        stream->has_g722_mpeg_bug = PJ_TRUE; 
    21332126        /* RTP clock rate = 1/2 real clock rate */ 
    21342127        stream->rtp_tx_ts_len_per_pkt >>= 1; 
    2135     } else { 
    2136         pjmedia_rtcp_init(&stream->rtcp, stream->port.info.name.ptr, 
    2137                           info->fmt.clock_rate,  
    2138                           stream->port.info.samples_per_frame,  
    2139                           info->ssrc); 
    2140     } 
    2141 #else 
    2142     pjmedia_rtcp_init(&stream->rtcp, stream->port.info.name.ptr, 
    2143                       info->fmt.clock_rate,  
    2144                       stream->port.info.samples_per_frame,  
    2145                       info->ssrc); 
     2128    } 
    21462129#endif 
    21472130 
     
    21982181        goto err_cleanup; 
    21992182 
     2183 
     2184    /* Init RTCP session: */ 
     2185 
     2186    { 
     2187        pjmedia_rtcp_session_setting rtcp_setting; 
     2188 
     2189        pjmedia_rtcp_session_setting_default(&rtcp_setting); 
     2190        rtcp_setting.name = stream->port.info.name.ptr; 
     2191        rtcp_setting.ssrc = info->ssrc; 
     2192        rtcp_setting.rtp_ts_base = pj_ntohl(stream->enc->rtp.out_hdr.ts); 
     2193        rtcp_setting.clock_rate = info->fmt.clock_rate; 
     2194        rtcp_setting.samples_per_frame = stream->port.info.samples_per_frame; 
     2195 
     2196#if defined(PJMEDIA_HANDLE_G722_MPEG_BUG) && (PJMEDIA_HANDLE_G722_MPEG_BUG!=0) 
     2197        /* Special case for G.722 */ 
     2198        if (info->fmt.pt == PJMEDIA_RTP_PT_G722) { 
     2199            rtcp_setting.clock_rate = 8000; 
     2200            rtcp_setting.samples_per_frame = 160; 
     2201        } 
     2202#endif 
     2203 
     2204        pjmedia_rtcp_init2(&stream->rtcp, &rtcp_setting); 
     2205    } 
    22002206 
    22012207    /* Only attach transport when stream is ready. */ 
Note: See TracChangeset for help on using the changeset viewer.