summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pjmedia/include/pjmedia/rtp.h20
-rw-r--r--pjmedia/src/pjmedia/rtp.c17
-rw-r--r--pjmedia/src/pjmedia/stream.c22
3 files changed, 51 insertions, 8 deletions
diff --git a/pjmedia/include/pjmedia/rtp.h b/pjmedia/include/pjmedia/rtp.h
index f41cda05..a21b1f16 100644
--- a/pjmedia/include/pjmedia/rtp.h
+++ b/pjmedia/include/pjmedia/rtp.h
@@ -301,6 +301,26 @@ PJ_DECL(void) pjmedia_rtp_session_update( pjmedia_rtp_session *ses,
pjmedia_rtp_status *seq_st);
+/**
+ * Call this function everytime an RTP packet is received to check whether
+ * the packet can be received and to let the RTP session performs its internal
+ * calculations.
+ *
+ * @param ses The session.
+ * @param hdr The RTP header of the incoming packet. The header must
+ * be given with fields in network byte order.
+ * @param seq_st Optional structure to receive the status of the RTP packet
+ * processing.
+ * @param check_pt Flag to indicate whether payload type needs to be validate.
+ *
+ * @see pjmedia_rtp_session_update()
+ */
+PJ_DECL(void) pjmedia_rtp_session_update2(pjmedia_rtp_session *ses,
+ const pjmedia_rtp_hdr *hdr,
+ pjmedia_rtp_status *seq_st,
+ pj_bool_t check_pt);
+
+
/*
* INTERNAL:
*/
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.
*/