From f2a3e51a35a8dde136be4547dc6b6db697eb16fd Mon Sep 17 00:00:00 2001 From: Benny Prijono Date: Thu, 29 Jun 2006 09:51:09 +0000 Subject: [PATCH] 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: https://svn.pjsip.org/repos/pjproject/trunk@567 74dad513-b988-da41-8d7b-12977e46ad98 --- pjmedia/include/pjmedia/rtcp.h | 1 + pjmedia/src/pjmedia/rtcp.c | 22 ++++++++++++++++++---- 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 b515dac77..149678d53 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 f96d818c5..d37b7fdab 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 4539ee59f..16d2cf626 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;