summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2006-06-29 09:51:09 +0000
committerBenny Prijono <bennylp@teluu.com>2006-06-29 09:51:09 +0000
commitf5ac454bfdeea60297c45f6bc46349db25ab2e29 (patch)
tree04c70f4bd8b97640c8cbaba35f2f6f773c7240b2
parentd463c94a3efd508b854292436c55015edba80f74 (diff)
Minor bug fix and enhancements: (1) fixed bug that caused out-of-order status to be raised when incoming sequence number is random, (2) changed RTCP to only calculate jitter when the RTP timestamp of the packet is different than previous one, and (3) change RTP to randomize initial sequence number
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@567 74dad513-b988-da41-8d7b-12977e46ad98
-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;