Ticket #478: dtmf.patch

File dtmf.patch, 3.1 KB (added by nanang, 11 years ago)
  • pjmedia/include/pjmedia/rtp.h

     
    301301                                          pjmedia_rtp_status *seq_st); 
    302302 
    303303 
     304/** 
     305 * Call this function everytime an RTP packet is received to check whether  
     306 * the packet can be received and to let the RTP session performs its internal 
     307 * calculations. 
     308 * 
     309 * @param ses       The session. 
     310 * @param hdr       The RTP header of the incoming packet. The header must 
     311 *                  be given with fields in network byte order. 
     312 * @param seq_st    Optional structure to receive the status of the RTP packet 
     313 *                  processing. 
     314 * @param check_pt  Flag to indicate whether payload type needs to be validate. 
     315 * 
     316 * @see pjmedia_rtp_session_update() 
     317 */ 
     318PJ_DECL(void) pjmedia_rtp_session_update2(pjmedia_rtp_session *ses,  
     319                                          const pjmedia_rtp_hdr *hdr, 
     320                                          pjmedia_rtp_status *seq_st, 
     321                                          pj_bool_t check_pt); 
     322 
     323 
    304324/* 
    305325 * INTERNAL: 
    306326 */ 
  • pjmedia/src/pjmedia/rtp.c

     
    161161                                         const pjmedia_rtp_hdr *hdr, 
    162162                                         pjmedia_rtp_status *p_seq_st) 
    163163{ 
     164    pjmedia_rtp_session_update2(ses, hdr, p_seq_st, PJ_TRUE); 
     165} 
     166 
     167PJ_DEF(void) pjmedia_rtp_session_update2( pjmedia_rtp_session *ses,  
     168                                          const pjmedia_rtp_hdr *hdr, 
     169                                          pjmedia_rtp_status *p_seq_st, 
     170                                          pj_bool_t check_pt) 
     171{ 
    164172    pjmedia_rtp_status seq_st; 
    165173 
    166174    /* Init status */ 
     
    176184    } 
    177185 
    178186    /* Check payload type. */ 
    179     if (hdr->pt != ses->out_pt) { 
     187    if (check_pt && hdr->pt != ses->out_pt) { 
    180188        if (p_seq_st) { 
    181189            p_seq_st->status.value = seq_st.status.value; 
    182190            p_seq_st->status.flag.bad = 1; 
     
    205213} 
    206214 
    207215 
     216 
    208217void pjmedia_rtp_seq_restart(pjmedia_rtp_seq_session *sess, pj_uint16_t seq) 
    209218{ 
    210219    sess->base_seq = seq; 
  • pjmedia/src/pjmedia/stream.c

     
    960960    if (channel->paused) 
    961961        return; 
    962962 
    963     /* Handle incoming DTMF. */ 
    964     if (hdr->pt == stream->rx_event_pt) { 
    965         handle_incoming_dtmf(stream, payload, payloadlen); 
    966         return; 
    967     } 
    968  
    969963    /* Update RTP session (also checks if RTP session can accept 
    970964     * the incoming packet. 
    971965     */ 
    972     pjmedia_rtp_session_update(&channel->rtp, hdr, &seq_st); 
     966    pjmedia_rtp_session_update2(&channel->rtp, hdr, &seq_st, 
     967        hdr->pt != stream->rx_event_pt); 
    973968    if (seq_st.status.value) { 
    974969        TRC_  ((stream->port.info.name.ptr,  
    975970                "RTP status: badpt=%d, badssrc=%d, dup=%d, " 
     
    996991    if (payloadlen == 0) 
    997992        return; 
    998993 
     994    /* Handle incoming DTMF. */ 
     995    if (hdr->pt == stream->rx_event_pt) { 
     996        handle_incoming_dtmf(stream, payload, payloadlen); 
     997        return; 
     998    } 
     999 
    9991000    /* Put "good" packet to jitter buffer, or reset the jitter buffer 
    10001001     * when RTP session is restarted. 
    10011002     */