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
This commit is contained in:
Benny Prijono 2006-06-29 09:51:09 +00:00
parent d28101325a
commit f2a3e51a35
3 changed files with 23 additions and 12 deletions

View File

@ -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. */

View File

@ -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,

View File

@ -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;