diff options
author | Benny Prijono <bennylp@teluu.com> | 2007-06-20 04:34:56 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2007-06-20 04:34:56 +0000 |
commit | ff591488bfa7b642ae00ab48cff03129f6c71ae1 (patch) | |
tree | 443796973b4bc03a67354ff7884f4c7ef0e107b7 /pjmedia | |
parent | 80bfcc379cb70228d0ad6c85fd9fee3362f02240 (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.c | 10 |
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); |