summaryrefslogtreecommitdiff
path: root/pjmedia
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2007-06-20 04:34:56 +0000
committerBenny Prijono <bennylp@teluu.com>2007-06-20 04:34:56 +0000
commitff591488bfa7b642ae00ab48cff03129f6c71ae1 (patch)
tree443796973b4bc03a67354ff7884f4c7ef0e107b7 /pjmedia
parent80bfcc379cb70228d0ad6c85fd9fee3362f02240 (diff)
Ticket #335: Detect timestamp jump to avoid excessive CPU usage in master clock (thanks ChenHuan)
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1378 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjmedia')
-rw-r--r--pjmedia/src/pjmedia/clock_thread.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/pjmedia/src/pjmedia/clock_thread.c b/pjmedia/src/pjmedia/clock_thread.c
index 6dd8a25f..8ce30eb8 100644
--- a/pjmedia/src/pjmedia/clock_thread.c
+++ b/pjmedia/src/pjmedia/clock_thread.c
@@ -27,7 +27,7 @@
/*
* Implementation of media clock with OS thread.
*/
-
+#define MAX_JUMP 500
struct pjmedia_clock
{
@@ -184,6 +184,10 @@ PJ_DEF(pj_bool_t) pjmedia_clock_wait( pjmedia_clock *clock,
clock->timestamp.u64 += clock->samples_per_frame;
/* Calculate next tick */
+ if (clock->next_tick.u64+MAX_JUMP < now.u64) {
+ /* Timestamp has made large jump, adjust next_tick */
+ clock->next_tick.u64 = now.u64;
+ }
clock->next_tick.u64 += clock->interval.u64;
/* Done */
@@ -229,6 +233,10 @@ static int clock_thread(void *arg)
clock->timestamp.u64 += clock->samples_per_frame;
/* Calculate next tick */
+ if (clock->next_tick.u64+MAX_JUMP < now.u64) {
+ /* Timestamp has made large jump, adjust next_tick */
+ clock->next_tick.u64 = now.u64;
+ }
clock->next_tick.u64 += clock->interval.u64;
pj_lock_release(clock->lock);