summaryrefslogtreecommitdiff
path: root/pjmedia/src
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2008-02-14 19:45:47 +0000
committerBenny Prijono <bennylp@teluu.com>2008-02-14 19:45:47 +0000
commitd8f46101a302542184867ec08f6a8c5bc0a97854 (patch)
treecfc52b0bdada9c9b101587c70d38255dfd11910b /pjmedia/src
parentcfb548dc3cbdb8b5b48e18a9331d0c4f26ad8d80 (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.c17
-rw-r--r--pjmedia/src/pjmedia/stream.c22
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.
*/