summaryrefslogtreecommitdiff
path: root/pjmedia/src/pjmedia/stream.c
diff options
context:
space:
mode:
Diffstat (limited to 'pjmedia/src/pjmedia/stream.c')
-rw-r--r--pjmedia/src/pjmedia/stream.c22
1 files changed, 15 insertions, 7 deletions
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.
*/