Ignore:
Timestamp:
Apr 24, 2006 11:13:00 PM (18 years ago)
Author:
bennylp
Message:

Better support for continuing media when peer has restarted transmission/RTP session

File:
1 edited

Legend:

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

    r390 r408  
    2020#include <pjmedia/errno.h> 
    2121#include <pj/log.h> 
    22 #include <pj/os.h>      /* pj_gettimeofday() */ 
    2322#include <pj/sock.h>    /* pj_htonx, pj_htonx */ 
    2423#include <pj/assert.h> 
     24#include <pj/rand.h> 
    2525#include <pj/string.h> 
    2626 
     
    4040 
    4141PJ_DEF(pj_status_t) pjmedia_rtp_session_init( pjmedia_rtp_session *ses, 
    42                                          int default_pt, pj_uint32_t sender_ssrc ) 
    43 { 
    44     PJ_LOG(5, (THIS_FILE, "pjmedia_rtp_session_init: ses=%p, default_pt=%d, ssrc=0x%x", 
     42                                              int default_pt,  
     43                                              pj_uint32_t sender_ssrc ) 
     44{ 
     45    PJ_LOG(5, (THIS_FILE,  
     46               "pjmedia_rtp_session_init: ses=%p, default_pt=%d, ssrc=0x%x", 
    4547               ses, default_pt, sender_ssrc)); 
    4648 
     
    5153    } 
    5254 
    53     /* If sender_ssrc is not specified, create from time value. */ 
     55    /* If sender_ssrc is not specified, create from random value. */ 
    5456    if (sender_ssrc == 0 || sender_ssrc == (pj_uint32_t)-1) { 
    55         pj_time_val tv; 
    56  
    57         pj_gettimeofday(&tv); 
    58         sender_ssrc  = (pj_uint32_t) pj_htonl(tv.sec); 
     57        sender_ssrc = pj_htonl(pj_rand()); 
    5958    } else { 
    6059        sender_ssrc = pj_htonl(sender_ssrc); 
    6160    } 
    6261 
    63     /* Initialize session. */ 
    64     ses->out_extseq = 0; 
     62    /* Initialize session.  
     63     * Initial sequence number SHOULD be random, according to RFC 3550. 
     64     */ 
     65    ses->out_extseq = pj_rand(); 
    6566    ses->peer_ssrc = 0; 
    6667     
    67     /* Sequence number will be initialized when the first RTP packet is receieved. */ 
     68    /* Sequence number will be initialized when the first RTP packet  
     69     * is receieved. 
     70     */ 
    6871 
    6972    /* Build default header for outgoing RTP packet. */ 
     
    8689 
    8790 
    88 PJ_DEF(pj_status_t) pjmedia_rtp_encode_rtp( pjmedia_rtp_session *ses, int pt, int m, 
    89                                        int payload_len, int ts_len, 
    90                                        const void **rtphdr, int *hdrlen ) 
    91 { 
    92     PJ_UNUSED_ARG(payload_len) 
    93  
    94     PJ_LOG(6, (THIS_FILE,  
    95               "pjmedia_rtp_encode_rtp: ses=%p, pt=%d, m=%d, pt_len=%d, ts_len=%d", 
    96               ses, pt, m, payload_len, ts_len)); 
     91PJ_DEF(pj_status_t) pjmedia_rtp_encode_rtp( pjmedia_rtp_session *ses,  
     92                                            int pt, int m, 
     93                                            int payload_len, int ts_len, 
     94                                            const void **rtphdr, int *hdrlen ) 
     95{ 
     96    PJ_UNUSED_ARG(payload_len); 
    9797 
    9898    /* Update timestamp */ 
     
    122122 
    123123PJ_DEF(pj_status_t) pjmedia_rtp_decode_rtp( pjmedia_rtp_session *ses,  
    124                                        const void *pkt, int pkt_len, 
    125                                        const pjmedia_rtp_hdr **hdr, 
    126                                        const void **payload, 
    127                                        unsigned *payloadlen) 
     124                                            const void *pkt, int pkt_len, 
     125                                            const pjmedia_rtp_hdr **hdr, 
     126                                            const void **payload, 
     127                                            unsigned *payloadlen) 
    128128{ 
    129129    int offset; 
    130130 
    131     PJ_UNUSED_ARG(ses) 
    132  
    133     PJ_LOG(6, (THIS_FILE,  
    134               "pjmedia_rtp_decode_rtp: ses=%p, pkt=%p, pkt_len=%d", 
    135               ses, pkt, pkt_len)); 
     131    PJ_UNUSED_ARG(ses); 
    136132 
    137133    /* Assume RTP header at the start of packet. We'll verify this later. */ 
     
    140136    /* Check RTP header sanity. */ 
    141137    if ((*hdr)->v != RTP_VERSION) { 
    142         PJ_LOG(4, (THIS_FILE, "  invalid RTP version!")); 
    143138        return PJMEDIA_RTP_EINVER; 
    144139    } 
     
    149144    /* Adjust offset if RTP extension is used. */ 
    150145    if ((*hdr)->x) { 
    151         pjmedia_rtp_ext_hdr *ext = (pjmedia_rtp_ext_hdr*) (((pj_uint8_t*)pkt) + offset); 
     146        pjmedia_rtp_ext_hdr *ext = (pjmedia_rtp_ext_hdr*)  
     147                                    (((pj_uint8_t*)pkt) + offset); 
    152148        offset += (pj_ntohs(ext->length) * sizeof(pj_uint32_t)); 
    153149    } 
     
    171167    pjmedia_rtp_status seq_st; 
    172168 
    173     /* Check SSRC. */ 
    174     if (ses->peer_ssrc == 0) ses->peer_ssrc = pj_ntohl(hdr->ssrc); 
    175     /* 
    176     if (pj_ntohl(ses->peer_ssrc) != hdr->ssrc) { 
    177         PJ_LOG(4, (THIS_FILE, "pjmedia_rtp_session_update: ses=%p, invalid ssrc 0x%p (!=0x%p)", 
    178                    ses, pj_ntohl(hdr->ssrc), ses->peer_ssrc)); 
    179         return PJMEDIA_RTP_EINSSRC; 
    180     } 
    181     */ 
    182  
    183169    /* Init status */ 
    184170    seq_st.status.value = 0; 
    185171    seq_st.diff = 0; 
    186172 
     173    /* Check SSRC. */ 
     174    if (ses->peer_ssrc == 0) ses->peer_ssrc = pj_ntohl(hdr->ssrc); 
     175 
     176    if (pj_ntohl(hdr->ssrc) != ses->peer_ssrc) { 
     177        seq_st.status.flag.badssrc = 1; 
     178        ses->peer_ssrc = pj_ntohl(hdr->ssrc); 
     179    } 
     180 
    187181    /* Check payload type. */ 
    188182    if (hdr->pt != ses->out_pt) { 
    189         PJ_LOG(4, (THIS_FILE,  
    190                    "pjmedia_rtp_session_update: ses=%p, invalid payload " 
    191                    "type %d (expecting %d)", 
    192                    ses, hdr->pt, ses->out_pt)); 
    193183        if (p_seq_st) { 
     184            p_seq_st->status.value = seq_st.status.value; 
    194185            p_seq_st->status.flag.bad = 1; 
    195186            p_seq_st->status.flag.badpt = 1; 
Note: See TracChangeset for help on using the changeset viewer.