summaryrefslogtreecommitdiff
path: root/pjmedia
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
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')
-rw-r--r--pjmedia/include/pjmedia/rtcp.h6
-rw-r--r--pjmedia/src/pjmedia/rtcp.c40
-rw-r--r--pjmedia/src/pjmedia/stream.c2
3 files changed, 39 insertions, 9 deletions
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 <pjmedia/types.h>
#include <pjmedia/rtp.h>
+
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: */