Changeset 2241 for pjproject/trunk


Ignore:
Timestamp:
Aug 26, 2008 4:51:28 PM (16 years ago)
Author:
nanang
Message:

Ticket #602:

  • Introduced new API pjmedia_rtp_session_init2() to enable intializing RTP session with non-default initial settings
  • Updated stream so it can be created with non-default initial RTP settings.
  • Updated pjsua-lib to make sure RTP timestamp and sequence contigue when stream session is restarted.
Location:
pjproject/trunk
Files:
8 edited

Legend:

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

    r2039 r2241  
    211211     
    212212    pj_math_stat             rtt;   /**< Round trip delay statistic(in usec)*/ 
     213 
     214    pj_uint32_t              rtp_tx_last_ts; /**< Last TX RTP timestamp.    */ 
     215    pj_uint16_t              rtp_tx_last_seq;/**< Last TX RTP sequence.     */ 
    213216}; 
    214217 
  • pjproject/trunk/pjmedia/include/pjmedia/rtp.h

    r2039 r2241  
    221221}; 
    222222 
     223 
     224/** 
     225 * RTP session settings. 
     226 */ 
     227typedef struct pjmedia_rtp_session_setting 
     228{ 
     229    pj_uint8_t       flags;         /**< Bitmask flags to specify whether such 
     230                                         field is set. Bitmask contents are: 
     231                                         (bit #0 is LSB) 
     232                                         bit #0: default payload type 
     233                                         bit #1: sender SSRC 
     234                                         bit #2: sequence 
     235                                         bit #3: timestamp                  */ 
     236    int              default_pt;    /**< Default payload type.              */ 
     237    pj_uint32_t      sender_ssrc;   /**< Sender SSRC.                       */ 
     238    pj_uint16_t      seq;           /**< Sequence.                          */ 
     239    pj_uint32_t      ts;            /**< Timestamp.                         */ 
     240} pjmedia_rtp_session_setting; 
     241 
     242 
    223243/** 
    224244 * @see pjmedia_rtp_status 
     
    239259                                               int default_pt,  
    240260                                               pj_uint32_t sender_ssrc ); 
     261 
     262/** 
     263 * This function will initialize the RTP session according to given parameters 
     264 * defined in RTP session settings. 
     265 * 
     266 * @param ses           The session. 
     267 * @param settings      RTP session settings. 
     268 * 
     269 * @return              PJ_SUCCESS if successfull. 
     270 */ 
     271PJ_DECL(pj_status_t) pjmedia_rtp_session_init2(  
     272                                    pjmedia_rtp_session *ses, 
     273                                    pjmedia_rtp_session_setting settings); 
     274 
    241275 
    242276/** 
  • pjproject/trunk/pjmedia/include/pjmedia/stream.h

    r2236 r2241  
    113113    int                 rx_event_pt;/**< Incoming pt for telephone-events.  */ 
    114114    pj_uint32_t         ssrc;       /**< RTP SSRC.                          */ 
     115    pj_uint32_t         rtp_ts;     /**< Initial RTP timestamp.             */ 
     116    pj_uint16_t         rtp_seq;    /**< Initial RTP sequence number.       */ 
     117    pj_uint8_t          rtp_seq_ts_set; 
     118                                    /**< Bitmask flags if initial RTP sequence  
     119                                         and/or timestamp for sender are set. 
     120                                         bit 0/LSB : sequence flag  
     121                                         bit 1     : timestamp flag         */ 
    115122    int                 jb_init;    /**< Jitter buffer init delay in msec.   
    116123                                         (-1 for default).                  */ 
  • pjproject/trunk/pjmedia/src/pjmedia/rtp.c

    r2039 r2241  
    8585} 
    8686 
     87PJ_DEF(pj_status_t) pjmedia_rtp_session_init2(  
     88                                    pjmedia_rtp_session *ses, 
     89                                    pjmedia_rtp_session_setting settings) 
     90{ 
     91    pj_status_t status; 
     92    int          pt = 0; 
     93    pj_uint32_t  sender_ssrc = 0; 
     94 
     95    if (settings.flags & 1) 
     96        pt = settings.default_pt; 
     97    if (settings.flags & 2) 
     98        sender_ssrc = settings.sender_ssrc; 
     99 
     100    status = pjmedia_rtp_session_init(ses, pt, sender_ssrc); 
     101    if (status != PJ_SUCCESS) 
     102        return status; 
     103 
     104    if (settings.flags & 4) { 
     105        ses->out_extseq = settings.seq; 
     106        ses->out_hdr.seq = pj_htons((pj_uint16_t)ses->out_extseq); 
     107    } 
     108    if (settings.flags & 8) 
     109        ses->out_hdr.ts = pj_htonl(settings.ts); 
     110 
     111    return PJ_SUCCESS; 
     112} 
     113 
    87114 
    88115PJ_DEF(pj_status_t) pjmedia_rtp_encode_rtp( pjmedia_rtp_session *ses,  
  • pjproject/trunk/pjmedia/src/pjmedia/stream.c

    r2224 r2241  
    873873    /* Update stat */ 
    874874    pjmedia_rtcp_tx_rtp(&stream->rtcp, frame_out.size); 
     875    stream->rtcp.stat.rtp_tx_last_ts = pj_ntohl(stream->enc->rtp.out_hdr.ts); 
     876    stream->rtcp.stat.rtp_tx_last_seq = pj_ntohs(stream->enc->rtp.out_hdr.seq); 
    875877 
    876878    return PJ_SUCCESS; 
     
    14131415    /* Create RTP and RTCP sessions: */ 
    14141416 
    1415     status = pjmedia_rtp_session_init(&channel->rtp, pt, param->ssrc); 
     1417    if (param->rtp_seq_ts_set == 0) { 
     1418        status = pjmedia_rtp_session_init(&channel->rtp, pt, param->ssrc); 
     1419    } else { 
     1420        pjmedia_rtp_session_setting settings; 
     1421 
     1422        settings.flags = (param->rtp_seq_ts_set << 2) | 3; 
     1423        settings.default_pt = pt; 
     1424        settings.sender_ssrc = param->ssrc; 
     1425        settings.seq = param->rtp_seq; 
     1426        settings.ts = param->rtp_ts; 
     1427        status = pjmedia_rtp_session_init2(&channel->rtp, settings); 
     1428    } 
    14161429    if (status != PJ_SUCCESS) 
    14171430        return status; 
  • pjproject/trunk/pjsip/include/pjsua-lib/pjsua_internal.h

    r2191 r2241  
    6767    int                  audio_idx; /**< Index of m=audio in SDP.           */ 
    6868    pj_uint32_t          ssrc;      /**< RTP SSRC                           */ 
     69    pj_uint32_t          rtp_tx_ts; /**< Initial RTP timestamp for sender.  */ 
     70    pj_uint16_t          rtp_tx_seq;/**< Initial RTP sequence for sender.   */ 
     71    pj_uint8_t           rtp_tx_seq_ts_set; 
     72                                    /**< Bitmask flags if initial RTP sequence 
     73                                         and/or timestamp for sender are set. 
     74                                         bit 0/LSB : sequence flag  
     75                                         bit 1     : timestamp flag         */ 
    6976    int                  conf_slot; /**< Slot # in conference bridge.       */ 
    7077    pjsip_evsub         *xfer_sub;  /**< Xfer server subscription, if this 
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_call.c

    r2191 r2241  
    106106    call->audio_idx = -1; 
    107107    call->ssrc = pj_rand(); 
     108    call->rtp_tx_seq = 0; 
     109    call->rtp_tx_ts = 0; 
     110    call->rtp_tx_seq_ts_set = 0; 
    108111    call->xfer_sub = NULL; 
    109112    call->last_code = (pjsip_status_code) 0; 
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_media.c

    r2235 r2241  
    11591159 
    11601160    if (call->session) { 
     1161        pjmedia_rtcp_stat stat; 
     1162 
     1163        if (pjmedia_session_get_stream_stat(call->session,  
     1164                                            call->audio_idx,  
     1165                                            &stat) == PJ_SUCCESS) 
     1166        { 
     1167            /* Save RTP timestamp & sequence, so when media session is  
     1168             * restarted, those values will be restored as the initial  
     1169             * RTP timestamp & sequence of the new media session. So in  
     1170             * the same call session, RTP timestamp and sequence are  
     1171             * guaranteed to be contigue. 
     1172             */ 
     1173            call->rtp_tx_seq_ts_set = 1 | (1 << 1); 
     1174            call->rtp_tx_seq = stat.rtp_tx_last_seq; 
     1175            call->rtp_tx_ts = stat.rtp_tx_last_ts; 
     1176        } 
     1177 
    11611178        if (pjsua_var.ua_cfg.cb.on_stream_destroyed) { 
    11621179            pjsua_var.ua_cfg.cb.on_stream_destroyed(call_id, call->session, 0); 
     
    13221339        /* Set SSRC */ 
    13231340        si->ssrc = call->ssrc; 
     1341 
     1342        /* Set RTP timestamp & sequence, normally these value are intialized 
     1343         * automatically when stream session created, but for some cases (e.g: 
     1344         * call reinvite, call update) timestamp and sequence need to be kept 
     1345         * contigue. 
     1346         */ 
     1347        si->rtp_ts = call->rtp_tx_ts; 
     1348        si->rtp_seq = call->rtp_tx_seq; 
     1349        si->rtp_seq_ts_set = call->rtp_tx_seq_ts_set; 
    13241350 
    13251351        /* Create session based on session info. */ 
Note: See TracChangeset for help on using the changeset viewer.