diff options
-rw-r--r-- | pjmedia/include/pjmedia/rtcp.h | 1 | ||||
-rw-r--r-- | pjmedia/src/pjmedia/rtcp.c | 22 | ||||
-rw-r--r-- | pjmedia/src/pjmedia/rtp.c | 12 |
3 files changed, 23 insertions, 12 deletions
diff --git a/pjmedia/include/pjmedia/rtcp.h b/pjmedia/include/pjmedia/rtcp.h index b515dac7..149678d5 100644 --- a/pjmedia/include/pjmedia/rtcp.h +++ b/pjmedia/include/pjmedia/rtcp.h @@ -239,6 +239,7 @@ struct pjmedia_rtcp_session pjmedia_rtcp_pkt rtcp_pkt; /**< Cached RTCP packet. */ pjmedia_rtp_seq_session seq_ctrl; /**< RTCP sequence number control. */ + unsigned rtp_last_ts;/**< Last timestamp in RX RTP pkt. */ unsigned clock_rate; /**< Clock rate of the stream */ unsigned pkt_size; /**< Avg pkt size, in samples. */ diff --git a/pjmedia/src/pjmedia/rtcp.c b/pjmedia/src/pjmedia/rtcp.c index f96d818c..d37b7fda 100644 --- a/pjmedia/src/pjmedia/rtcp.c +++ b/pjmedia/src/pjmedia/rtcp.c @@ -140,6 +140,9 @@ PJ_DEF(void) pjmedia_rtcp_init(pjmedia_rtcp_session *sess, pj_memset(&sess->stat, 0, sizeof(pjmedia_rtcp_stat)); sess->avg_jitter = 0; + /* Last RX timestamp in RTP packet */ + sess->rtp_last_ts = (unsigned)-1; + /* Name */ sess->name = name ? name : THIS_FILE, @@ -197,12 +200,18 @@ PJ_DEF(void) pjmedia_rtcp_rx_rtp(pjmedia_rtcp_session *sess, pjmedia_rtp_status seq_st; unsigned last_seq; + if (sess->stat.rx.pkt == 0) { + /* Init sequence for the first time. */ + pjmedia_rtp_seq_init(&sess->seq_ctrl, (pj_uint16_t)seq); + } + sess->stat.rx.pkt++; sess->stat.rx.bytes += payload; - /* Update sequence numbers. */ + /* Process the RTP packet. */ last_seq = sess->seq_ctrl.max_seq; pjmedia_rtp_seq_update(&sess->seq_ctrl, (pj_uint16_t)seq, &seq_st); + if (seq_st.status.flag.restart) { rtcp_init_seq(sess); } @@ -212,7 +221,7 @@ PJ_DEF(void) pjmedia_rtcp_rx_rtp(pjmedia_rtcp_session *sess, TRACE_((sess->name, "Duplicate packet detected")); } - if (seq_st.status.flag.outorder) { + if (seq_st.status.flag.outorder && !seq_st.status.flag.probation) { sess->stat.rx.reorder++; TRACE_((sess->name, "Out-of-order packet detected")); } @@ -258,9 +267,11 @@ PJ_DEF(void) pjmedia_rtcp_rx_rtp(pjmedia_rtcp_session *sess, /* - * Calculate jitter only when sequence is good (see RFC 3550 section A.8) + * Calculate jitter only when sequence is good (see RFC 3550 section A.8), + * AND only when the timestamp is different than the last packet + * (see RTP FAQ). */ - if (seq_st.diff == 1) { + if (seq_st.diff == 1 && rtp_ts != sess->rtp_last_ts) { /* Get arrival time and convert timestamp to samples */ pj_get_timestamp(&ts); ts.u64 = ts.u64 * sess->clock_rate / sess->ts_freq.u64; @@ -309,6 +320,9 @@ PJ_DEF(void) pjmedia_rtcp_rx_rtp(pjmedia_rtcp_session *sess, sess->stat.rx.jitter.last = jitter; } } + + /* Update timestamp of last RX RTP packet */ + sess->rtp_last_ts = rtp_ts; } PJ_DEF(void) pjmedia_rtcp_tx_rtp(pjmedia_rtcp_session *sess, diff --git a/pjmedia/src/pjmedia/rtp.c b/pjmedia/src/pjmedia/rtp.c index 4539ee59..16d2cf62 100644 --- a/pjmedia/src/pjmedia/rtp.c +++ b/pjmedia/src/pjmedia/rtp.c @@ -59,18 +59,14 @@ PJ_DEF(pj_status_t) pjmedia_rtp_session_init( pjmedia_rtp_session *ses, sender_ssrc = pj_htonl(sender_ssrc); } - /* Initialize session. - * Initial sequence number SHOULD be random, according to RFC 3550. - */ + /* Initialize session. */ + pj_memset(ses, 0, sizeof(*ses)); + + /* Initial sequence number SHOULD be random, according to RFC 3550. */ ses->out_extseq = pj_rand(); ses->peer_ssrc = 0; - /* Sequence number will be initialized when the first RTP packet - * is receieved. - */ - /* Build default header for outgoing RTP packet. */ - pj_memset(ses, 0, sizeof(*ses)); ses->out_hdr.v = RTP_VERSION; ses->out_hdr.p = 0; ses->out_hdr.x = 0; |