From 102399153cc12f988c4e1039caab8cd159dd1019 Mon Sep 17 00:00:00 2001 From: Benny Prijono Date: Tue, 4 Apr 2006 19:43:24 +0000 Subject: Changed RTCP timing to use high resolution timestamp git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@381 74dad513-b988-da41-8d7b-12977e46ad98 --- pjmedia/src/pjmedia/rtcp.c | 40 +++++++++++++++++++++++++++++++++------- pjmedia/src/pjmedia/stream.c | 2 +- 2 files changed, 34 insertions(+), 8 deletions(-) (limited to 'pjmedia/src') diff --git a/pjmedia/src/pjmedia/rtcp.c b/pjmedia/src/pjmedia/rtcp.c index 7bd5a7d8..3ce2783e 100644 --- a/pjmedia/src/pjmedia/rtcp.c +++ b/pjmedia/src/pjmedia/rtcp.c @@ -27,6 +27,8 @@ #define RTCP_RR 201 +#define USE_TIMESTAMP PJ_HAS_HIGH_RES_TIMER + /* * Get NTP time. @@ -45,12 +47,16 @@ static void rtcp_get_ntp_time(struct pjmedia_rtcp_ntp_rec *ntp) PJ_DEF(void) pjmedia_rtcp_init(pjmedia_rtcp_session *s, + unsigned clock_rate, pj_uint32_t ssrc) { pjmedia_rtcp_pkt *rtcp_pkt = &s->rtcp_pkt; pj_memset(rtcp_pkt, 0, sizeof(pjmedia_rtcp_pkt)); + /* Set clock rate */ + s->clock_rate = clock_rate; + /* Init time */ s->rtcp_lsr.hi = s->rtcp_lsr.lo = 0; s->rtcp_lsr_time = 0; @@ -64,6 +70,11 @@ PJ_DEF(void) pjmedia_rtcp_init(pjmedia_rtcp_session *s, /* Init SR */ rtcp_pkt->sr.ssrc = pj_htonl(ssrc); + /* Get timestamp frequency */ +#if USE_TIMESTAMP + pj_get_timestamp_freq(&s->ts_freq); +#endif + /* RR will be initialized on receipt of the first RTP packet. */ } @@ -90,8 +101,6 @@ PJ_DEF(void) pjmedia_rtcp_rx_rtp(pjmedia_rtcp_session *s, { pj_uint32_t arrival; pj_int32_t transit; - unsigned long timer_tick; - pj_time_val tv; int status; /* Update sequence numbers (received, lost, etc). */ @@ -106,15 +115,32 @@ PJ_DEF(void) pjmedia_rtcp_rx_rtp(pjmedia_rtcp_session *s, ++s->received; - pj_gettimeofday(&tv); - timer_tick = tv.sec * 1000 + tv.msec; - /* * Calculate jitter (s->jitter is in timer tick unit) */ - PJ_TODO(SUPPORT_JITTER_CALCULATION_FOR_NON_8KHZ_SAMPLE_RATE) +#if USE_TIMESTAMP + { + pj_timestamp ts; + + pj_get_timestamp(&ts); + + /* Convert timestamp to samples */ + ts.u64 = ts.u64 * s->clock_rate / s->ts_freq.u64; + arrival = (pj_uint32_t)ts.u64; + } +#else + { + pj_time_val tv; + unsigned long timer_tick; + + pj_gettimeofday(&tv); + timer_tick = tv.sec * 1000 + tv.msec; + + /* Convert timer tick to samples */ + arrival = timer_tick * s->clock_rate / 1000; + } +#endif - arrival = timer_tick << 3; // 8 samples per ms. transit = arrival - rtp_ts; if (s->transit == 0) { diff --git a/pjmedia/src/pjmedia/stream.c b/pjmedia/src/pjmedia/stream.c index 95d9a7c9..6f0d4881 100644 --- a/pjmedia/src/pjmedia/stream.c +++ b/pjmedia/src/pjmedia/stream.c @@ -738,7 +738,7 @@ PJ_DEF(pj_status_t) pjmedia_stream_create( pjmedia_endpt *endpt, /* Init RTCP session: */ - pjmedia_rtcp_init(&stream->rtcp, info->ssrc); + pjmedia_rtcp_init(&stream->rtcp, info->fmt.sample_rate, info->ssrc); /* Create jitter buffer: */ -- cgit v1.2.3