diff options
author | Benny Prijono <bennylp@teluu.com> | 2008-02-14 19:45:47 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2008-02-14 19:45:47 +0000 |
commit | d8f46101a302542184867ec08f6a8c5bc0a97854 (patch) | |
tree | cfc52b0bdada9c9b101587c70d38255dfd11910b /pjmedia/src | |
parent | cfb548dc3cbdb8b5b48e18a9331d0c4f26ad8d80 (diff) |
Ticket #478: Handle duplicated/misordered incoming DTMF packets
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1798 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjmedia/src')
-rw-r--r-- | pjmedia/src/pjmedia/rtp.c | 17 | ||||
-rw-r--r-- | pjmedia/src/pjmedia/stream.c | 22 |
2 files changed, 31 insertions, 8 deletions
diff --git a/pjmedia/src/pjmedia/rtp.c b/pjmedia/src/pjmedia/rtp.c index 9658a1c4..a353b013 100644 --- a/pjmedia/src/pjmedia/rtp.c +++ b/pjmedia/src/pjmedia/rtp.c @@ -161,8 +161,22 @@ PJ_DEF(void) pjmedia_rtp_session_update( pjmedia_rtp_session *ses, const pjmedia_rtp_hdr *hdr, pjmedia_rtp_status *p_seq_st) { + pjmedia_rtp_session_update2(ses, hdr, p_seq_st, PJ_TRUE); +} + +PJ_DEF(void) pjmedia_rtp_session_update2( pjmedia_rtp_session *ses, + const pjmedia_rtp_hdr *hdr, + pjmedia_rtp_status *p_seq_st, + pj_bool_t check_pt) +{ pjmedia_rtp_status seq_st; + /* for now check_pt MUST be either PJ_TRUE or PJ_FALSE. + * In the future we might change check_pt from boolean to + * unsigned integer to accommodate more flags. + */ + pj_assert(check_pt==PJ_TRUE || check_pt==PJ_FALSE); + /* Init status */ seq_st.status.value = 0; seq_st.diff = 0; @@ -176,7 +190,7 @@ PJ_DEF(void) pjmedia_rtp_session_update( pjmedia_rtp_session *ses, } /* Check payload type. */ - if (hdr->pt != ses->out_pt) { + if (check_pt && hdr->pt != ses->out_pt) { if (p_seq_st) { p_seq_st->status.value = seq_st.status.value; p_seq_st->status.flag.bad = 1; @@ -205,6 +219,7 @@ PJ_DEF(void) pjmedia_rtp_session_update( pjmedia_rtp_session *ses, } + void pjmedia_rtp_seq_restart(pjmedia_rtp_seq_session *sess, pj_uint16_t seq) { sess->base_seq = seq; diff --git a/pjmedia/src/pjmedia/stream.c b/pjmedia/src/pjmedia/stream.c index d4496612..a7690c56 100644 --- a/pjmedia/src/pjmedia/stream.c +++ b/pjmedia/src/pjmedia/stream.c @@ -960,16 +960,11 @@ static void on_rx_rtp( void *data, if (channel->paused) return; - /* Handle incoming DTMF. */ - if (hdr->pt == stream->rx_event_pt) { - handle_incoming_dtmf(stream, payload, payloadlen); - return; - } - /* Update RTP session (also checks if RTP session can accept * the incoming packet. */ - pjmedia_rtp_session_update(&channel->rtp, hdr, &seq_st); + pjmedia_rtp_session_update2(&channel->rtp, hdr, &seq_st, + hdr->pt != stream->rx_event_pt); if (seq_st.status.value) { TRC_ ((stream->port.info.name.ptr, "RTP status: badpt=%d, badssrc=%d, dup=%d, " @@ -996,6 +991,19 @@ static void on_rx_rtp( void *data, if (payloadlen == 0) return; + /* Handle incoming DTMF. */ + if (hdr->pt == stream->rx_event_pt) { + /* Ignore out-of-order packet as it will be detected as new + * digit. Also ignore duplicate packet as it serves no use. + */ + if (seq_st.status.flag.outorder || seq_st.status.flag.dup) { + return; + } + + handle_incoming_dtmf(stream, payload, payloadlen); + return; + } + /* Put "good" packet to jitter buffer, or reset the jitter buffer * when RTP session is restarted. */ |