aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b>2009-10-19 23:44:07 +0000
committerkpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b>2009-10-19 23:44:07 +0000
commit39fa6e067b555647dab9508d66d14b310b9f49a6 (patch)
tree7a1e6a1ae98e1100ed33aa60038a73d7a572fb37
parentc9cddacd4f2f7fd8611736b5fce64b1c6514fbd6 (diff)
Correct timestamp calculations when RTP sample rates over 8kHz are used.
While testing some endpoints that support 16kHz and 32kHz sample rates, some log messages were generated due to calc_rxstamp() computing timestamps in a way that produced odd results, so this patch sanitizes the result of the computations. git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@224670 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r--main/rtp.c23
1 files changed, 14 insertions, 9 deletions
diff --git a/main/rtp.c b/main/rtp.c
index 519ecf35c..12e363809 100644
--- a/main/rtp.c
+++ b/main/rtp.c
@@ -1045,6 +1045,18 @@ struct ast_frame *ast_rtcp_read(struct ast_rtp *rtp)
return f;
}
+static void sanitize_tv(struct timeval *tv)
+{
+ while (tv->tv_usec < 0) {
+ tv->tv_usec += 1000000;
+ tv->tv_sec -= 1;
+ }
+ while (tv->tv_usec >= 1000000) {
+ tv->tv_usec -= 1000000;
+ tv->tv_sec += 1;
+ }
+}
+
static void calc_rxstamp(struct timeval *tv, struct ast_rtp *rtp, unsigned int timestamp, int mark)
{
struct timeval now;
@@ -1064,21 +1076,14 @@ static void calc_rxstamp(struct timeval *tv, struct ast_rtp *rtp, unsigned int t
rtp->rxcore.tv_usec -= (timestamp % rate) * 125;
/* Round to 0.1ms for nice, pretty timestamps */
rtp->rxcore.tv_usec -= rtp->rxcore.tv_usec % 100;
- if (rtp->rxcore.tv_usec < 0) {
- /* Adjust appropriately if necessary */
- rtp->rxcore.tv_usec += 1000000;
- rtp->rxcore.tv_sec -= 1;
- }
+ sanitize_tv(&rtp->rxcore);
}
gettimeofday(&now,NULL);
/* rxcore is the mapping between the RTP timestamp and _our_ real time from gettimeofday() */
tv->tv_sec = rtp->rxcore.tv_sec + timestamp / rate;
tv->tv_usec = rtp->rxcore.tv_usec + (timestamp % rate) * 125;
- if (tv->tv_usec >= 1000000) {
- tv->tv_usec -= 1000000;
- tv->tv_sec += 1;
- }
+ sanitize_tv(tv);
prog = (double)((timestamp-rtp->seedrxts)/(float)(rate));
dtv = (double)rtp->drxcore + (double)(prog);
current_time = (double)now.tv_sec + (double)now.tv_usec/1000000;