Ignore:
Timestamp:
Oct 24, 2011 9:28:13 AM (13 years ago)
Author:
ming
Message:

Re #1395: Backport of PJSIP 1.x branch into PJSIP 2.0 trunk

TODO: ticket #1268 (Option for automatic/manual sending of RTCP SDES/BYE for the stream) for video stream.

Location:
pjproject/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk

  • pjproject/trunk/pjmedia/src/pjmedia/transport_udp.c

    r3553 r3841  
    8484    pj_sockaddr         rtcp_addr_name; /**< Published RTCP address.        */ 
    8585    pj_sockaddr         rtcp_src_addr;  /**< Actual source RTCP address.    */ 
     86    unsigned            rtcp_src_cnt;   /**< How many pkt from this addr.   */ 
    8687    int                 rtcp_addr_len;  /**< Length of RTCP src address.    */ 
    8788    pj_ioqueue_key_t   *rtcp_key;       /**< RTCP socket key in ioqueue     */ 
     
    453454        void (*cb)(void*,void*,pj_ssize_t); 
    454455        void *user_data; 
     456        pj_bool_t discard = PJ_FALSE; 
    455457 
    456458        cb = udp->rtp_cb; 
     
    463465                          "RX RTP packet dropped because of pkt lost " 
    464466                          "simulation")); 
    465                 goto read_next_packet; 
     467                discard = PJ_TRUE; 
    466468            } 
    467469        } 
    468  
    469  
    470         if (udp->attached && cb) 
    471             (*cb)(user_data, udp->rtp_pkt, bytes_read); 
    472470 
    473471        /* See if source address of RTP packet is different than the  
     
    479477            (udp->options & PJMEDIA_UDP_NO_SRC_ADDR_CHECKING)==0)  
    480478        { 
    481             if (pj_sockaddr_cmp(&udp->rem_rtp_addr, &udp->rtp_src_addr) != 0) { 
    482  
     479            if (pj_sockaddr_cmp(&udp->rem_rtp_addr, &udp->rtp_src_addr) == 0) { 
     480                /* We're still receiving from rem_rtp_addr. Don't switch. */ 
     481                udp->rtp_src_cnt = 0; 
     482            } else { 
    483483                udp->rtp_src_cnt++; 
    484484 
    485                 if (udp->rtp_src_cnt >= PJMEDIA_RTP_NAT_PROBATION_CNT) { 
     485                if (udp->rtp_src_cnt < PJMEDIA_RTP_NAT_PROBATION_CNT) { 
     486                    discard = PJ_TRUE; 
     487                } else { 
    486488                 
    487489                    char addr_text[80]; 
     
    517519 
    518520                        PJ_LOG(4,(udp->base.name, 
    519                                   "Remote RTCP address switched to %s", 
     521                                  "Remote RTCP address switched to predicted" 
     522                                  " address %s", 
    520523                                  pj_sockaddr_print(&udp->rtcp_src_addr,  
    521524                                                    addr_text, 
     
    527530        } 
    528531 
    529 read_next_packet: 
     532        if (!discard && udp->attached && cb) 
     533            (*cb)(user_data, udp->rtp_pkt, bytes_read); 
     534 
    530535        bytes_read = sizeof(udp->rtp_pkt); 
    531536        udp->rtp_addrlen = sizeof(udp->rtp_src_addr); 
     
    569574         */ 
    570575        if (bytes_read>0 && 
    571             (udp->options & PJMEDIA_UDP_NO_SRC_ADDR_CHECKING)==0 && 
    572             pj_sockaddr_cmp(&udp->rem_rtcp_addr, &udp->rtcp_src_addr) != 0) 
     576            (udp->options & PJMEDIA_UDP_NO_SRC_ADDR_CHECKING)==0) 
    573577        { 
    574             char addr_text[80]; 
    575  
    576             pj_memcpy(&udp->rem_rtcp_addr, &udp->rtcp_src_addr, 
    577                       sizeof(pj_sockaddr)); 
    578  
    579             PJ_LOG(4,(udp->base.name, 
    580                       "Remote RTCP address switched to %s", 
    581                       pj_sockaddr_print(&udp->rtcp_src_addr, addr_text, 
    582                                         sizeof(addr_text), 3))); 
     578            if (pj_sockaddr_cmp(&udp->rem_rtcp_addr, &udp->rtcp_src_addr) == 0) { 
     579                /* Still receiving from rem_rtcp_addr, don't switch */ 
     580                udp->rtcp_src_cnt = 0; 
     581            } else { 
     582                ++udp->rtcp_src_cnt; 
     583 
     584                if (udp->rtcp_src_cnt >= PJMEDIA_RTCP_NAT_PROBATION_CNT ) { 
     585                    char addr_text[80]; 
     586 
     587                    udp->rtcp_src_cnt = 0; 
     588                    pj_memcpy(&udp->rem_rtcp_addr, &udp->rtcp_src_addr, 
     589                              sizeof(pj_sockaddr)); 
     590 
     591                    PJ_LOG(4,(udp->base.name, 
     592                              "Remote RTCP address switched to %s", 
     593                              pj_sockaddr_print(&udp->rtcp_src_addr, addr_text, 
     594                                                sizeof(addr_text), 3))); 
     595                } 
     596            } 
    583597        } 
    584598 
     
    678692    pj_bzero(&udp->rtcp_src_addr, sizeof(udp->rtcp_src_addr)); 
    679693    udp->rtp_src_cnt = 0; 
     694    udp->rtcp_src_cnt = 0; 
    680695 
    681696    /* Unlock keys */ 
Note: See TracChangeset for help on using the changeset viewer.