summaryrefslogtreecommitdiff
path: root/pjmedia
diff options
context:
space:
mode:
Diffstat (limited to 'pjmedia')
-rw-r--r--pjmedia/include/pjmedia/rtcp.h1
-rw-r--r--pjmedia/src/pjmedia/rtcp.c22
-rw-r--r--pjmedia/src/pjmedia/rtp.c12
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;