Added detection/protection against inaccurate timestamp in RTCP
git-svn-id: https://svn.pjsip.org/repos/pjproject/trunk@388 74dad513-b988-da41-8d7b-12977e46ad98
This commit is contained in:
parent
2a81634f62
commit
d7a13f1e35
|
@ -37,7 +37,7 @@
|
||||||
#if 0
|
#if 0
|
||||||
# define TRACE_(x) PJ_LOG(3,x)
|
# define TRACE_(x) PJ_LOG(3,x)
|
||||||
#else
|
#else
|
||||||
# define TRACE_(x)
|
# define TRACE_(x) ;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -189,6 +189,10 @@ PJ_DEF(void) pjmedia_rtcp_rx_rtcp( pjmedia_rtcp_session *session,
|
||||||
/* Calculate SR arrival time for DLSR */
|
/* Calculate SR arrival time for DLSR */
|
||||||
pj_get_timestamp(&session->rx_lsr_time);
|
pj_get_timestamp(&session->rx_lsr_time);
|
||||||
|
|
||||||
|
TRACE_((THIS_FILE, "Rx RTCP SR: ntp-ts=%p, time=%p",
|
||||||
|
session->rx_lsr,
|
||||||
|
(pj_uint32_t)(session->rx_lsr_time.u64*65536/session->ts_freq.u64)));
|
||||||
|
|
||||||
/* Calculate RTT if it has RR */
|
/* Calculate RTT if it has RR */
|
||||||
if (size >= sizeof(pjmedia_rtcp_pkt)) {
|
if (size >= sizeof(pjmedia_rtcp_pkt)) {
|
||||||
|
|
||||||
|
@ -220,7 +224,7 @@ PJ_DEF(void) pjmedia_rtcp_rx_rtcp( pjmedia_rtcp_session *session,
|
||||||
*/
|
*/
|
||||||
eedelay = (eedelay * 1000000) >> 16;
|
eedelay = (eedelay * 1000000) >> 16;
|
||||||
|
|
||||||
TRACE_((THIS_FILE, "Rx RTCP: lsr=%p, dlsr=%p (%d:%03dms), "
|
TRACE_((THIS_FILE, "Rx RTCP RR: lsr=%p, dlsr=%p (%d:%03dms), "
|
||||||
"now=%p, rtt=%p",
|
"now=%p, rtt=%p",
|
||||||
lsr, dlsr, dlsr/65536, (dlsr%65536)*1000/65536,
|
lsr, dlsr, dlsr/65536, (dlsr%65536)*1000/65536,
|
||||||
now, (pj_uint32_t)eedelay));
|
now, (pj_uint32_t)eedelay));
|
||||||
|
@ -231,7 +235,7 @@ PJ_DEF(void) pjmedia_rtcp_rx_rtcp( pjmedia_rtcp_session *session,
|
||||||
if (now-dlsr >= lsr) {
|
if (now-dlsr >= lsr) {
|
||||||
session->rtt_us = (pj_uint32_t)eedelay;
|
session->rtt_us = (pj_uint32_t)eedelay;
|
||||||
} else {
|
} else {
|
||||||
TRACE_((THIS_FILE, "NTP clock running backwards?"));
|
PJ_LOG(3, (THIS_FILE, "Internal NTP clock skew detected"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -301,7 +305,11 @@ PJ_DEF(void) pjmedia_rtcp_build_rtcp(pjmedia_rtcp_session *session,
|
||||||
pj_timestamp ts;
|
pj_timestamp ts;
|
||||||
pj_uint32_t lsr = session->rx_lsr;
|
pj_uint32_t lsr = session->rx_lsr;
|
||||||
pj_uint64_t lsr_time = session->rx_lsr_time.u64;
|
pj_uint64_t lsr_time = session->rx_lsr_time.u64;
|
||||||
|
pj_uint32_t dlsr;
|
||||||
|
|
||||||
|
/* Convert LSR time to 1/65536 seconds resolution */
|
||||||
|
lsr_time = (lsr_time << 16) / session->ts_freq.u64;
|
||||||
|
|
||||||
/* Fill in LSR.
|
/* Fill in LSR.
|
||||||
LSR is the middle 32bit of the last SR NTP time received.
|
LSR is the middle 32bit of the last SR NTP time received.
|
||||||
*/
|
*/
|
||||||
|
@ -313,9 +321,20 @@ PJ_DEF(void) pjmedia_rtcp_build_rtcp(pjmedia_rtcp_session *session,
|
||||||
pj_get_timestamp(&ts);
|
pj_get_timestamp(&ts);
|
||||||
|
|
||||||
/* Convert interval to 1/65536 seconds value */
|
/* Convert interval to 1/65536 seconds value */
|
||||||
ts.u64 = ((ts.u64 - lsr_time) << 16) / session->ts_freq.u64;
|
ts.u64 = (ts.u64 << 16) / session->ts_freq.u64;
|
||||||
|
|
||||||
rtcp_pkt->rr.dlsr = pj_htonl( (pj_uint32_t)ts.u64 );
|
/* Get DLSR */
|
||||||
|
dlsr = (pj_uint32_t)(ts.u64 - lsr_time);
|
||||||
|
rtcp_pkt->rr.dlsr = pj_htonl(dlsr);
|
||||||
|
|
||||||
|
TRACE_((THIS_FILE, "Tx RTCP RR: lsr=%p, lsr_time=%p, now=%p, dlsr=%p"
|
||||||
|
"(%ds:%03dms)",
|
||||||
|
lsr,
|
||||||
|
(pj_uint32_t)lsr_time,
|
||||||
|
(pj_uint32_t)ts.u64,
|
||||||
|
dlsr,
|
||||||
|
dlsr/65536,
|
||||||
|
(dlsr%65536)*1000/65536 ));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -175,7 +175,8 @@ static void destroy_call_media(unsigned call_index);
|
||||||
static void app_perror(const char *sender, const char *title,
|
static void app_perror(const char *sender, const char *title,
|
||||||
pj_status_t status);
|
pj_status_t status);
|
||||||
|
|
||||||
|
/* Print call */
|
||||||
|
static void print_call(int call_index);
|
||||||
|
|
||||||
|
|
||||||
/* This is a PJSIP module to be registered by application to handle
|
/* This is a PJSIP module to be registered by application to handle
|
||||||
|
@ -675,6 +676,13 @@ static void call_on_state_changed( pjsip_inv_session *inv,
|
||||||
|
|
||||||
pj_time_val null_time = {0, 0};
|
pj_time_val null_time = {0, 0};
|
||||||
|
|
||||||
|
PJ_LOG(3,(THIS_FILE, "Call #%d disconnected. Reason=%s",
|
||||||
|
call->index,
|
||||||
|
pjsip_get_status_text(inv->cause)->ptr));
|
||||||
|
PJ_LOG(3,(THIS_FILE, "Call #%d statistics:", call->index));
|
||||||
|
print_call(call->index);
|
||||||
|
|
||||||
|
|
||||||
call->inv = NULL;
|
call->inv = NULL;
|
||||||
inv->mod_data[mod_siprtp.id] = NULL;
|
inv->mod_data[mod_siprtp.id] = NULL;
|
||||||
|
|
||||||
|
@ -684,9 +692,6 @@ static void call_on_state_changed( pjsip_inv_session *inv,
|
||||||
call->response_time = null_time;
|
call->response_time = null_time;
|
||||||
call->connect_time = null_time;
|
call->connect_time = null_time;
|
||||||
|
|
||||||
PJ_LOG(3,(THIS_FILE, "Call #%d disconnected. Reason=%s",
|
|
||||||
call->index,
|
|
||||||
pjsip_get_status_text(inv->cause)->ptr));
|
|
||||||
|
|
||||||
} else if (inv->state == PJSIP_INV_STATE_CONFIRMED) {
|
} else if (inv->state == PJSIP_INV_STATE_CONFIRMED) {
|
||||||
|
|
||||||
|
@ -1471,7 +1476,7 @@ static void print_call(int call_index)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (call->media[0].thread == NULL) {
|
if (call->inv == NULL || call->inv->state < PJSIP_INV_STATE_CONFIRMED) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue