summaryrefslogtreecommitdiff
path: root/pjmedia/src
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2006-04-04 19:43:24 +0000
committerBenny Prijono <bennylp@teluu.com>2006-04-04 19:43:24 +0000
commit102399153cc12f988c4e1039caab8cd159dd1019 (patch)
treec1744cfabe9ed1cd33428ffaf90b65b298fea456 /pjmedia/src
parent95b4193bb46c59b412d752c3315a4d0273109f34 (diff)
Changed RTCP timing to use high resolution timestamp
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@381 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjmedia/src')
-rw-r--r--pjmedia/src/pjmedia/rtcp.c40
-rw-r--r--pjmedia/src/pjmedia/stream.c2
2 files changed, 34 insertions, 8 deletions
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: */