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/include/pjmedia/rtcp.h | 6 +++++- pjmedia/src/pjmedia/rtcp.c | 40 +++++++++++++++++++++++++++++++++------- pjmedia/src/pjmedia/stream.c | 2 +- 3 files changed, 39 insertions(+), 9 deletions(-) (limited to 'pjmedia') diff --git a/pjmedia/include/pjmedia/rtcp.h b/pjmedia/include/pjmedia/rtcp.h index f39c7800..ccd32a20 100644 --- a/pjmedia/include/pjmedia/rtcp.h +++ b/pjmedia/include/pjmedia/rtcp.h @@ -27,6 +27,7 @@ #include #include + PJ_BEGIN_DECL @@ -148,12 +149,14 @@ struct pjmedia_rtcp_session pjmedia_rtp_seq_session seq_ctrl; /**< RTCP sequence number control. */ + unsigned clock_rate; /**< Clock rate. */ pj_uint32_t received; /**< # pkts received */ pj_uint32_t expected_prior; /**< # pkts expected at last interval */ pj_uint32_t received_prior; /**< # pkts received at last interval */ pj_int32_t transit; /**< Relative trans time for prev pkt */ pj_uint32_t jitter; /**< Estimated jitter */ - + pj_timestamp ts_freq; /**< System timestamp frequency. */ + pjmedia_rtcp_ntp_rec rtcp_lsr; /**< NTP ts in last SR received */ unsigned rtcp_lsr_time; /**< Time when last SR is received.*/ pj_uint32_t peer_ssrc; /**< Peer SSRC */ @@ -173,6 +176,7 @@ typedef struct pjmedia_rtcp_session pjmedia_rtcp_session; * @param ssrc The SSRC used in to identify the session. */ PJ_DECL(void) pjmedia_rtcp_init( pjmedia_rtcp_session *session, + unsigned clock_rate, pj_uint32_t ssrc ); 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