- Timestamp:
- Dec 30, 2010 4:31:16 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/branches/projects/2.0-dev/pjmedia/src/pjmedia/clock_thread.c
r3392 r3402 24 24 #include <pj/os.h> 25 25 #include <pj/pool.h> 26 #include <pj/string.h> 27 #include <pj/compat/high_precision.h> 28 29 /* API: Init clock source */ 30 PJ_DEF(pj_status_t) pjmedia_clock_src_init( pjmedia_clock_src *clocksrc, 31 pjmedia_type media_type, 32 unsigned clock_rate, 33 unsigned ptime_usec ) 34 { 35 PJ_ASSERT_RETURN(clocksrc, PJ_EINVAL); 36 37 clocksrc->media_type = media_type; 38 clocksrc->clock_rate = clock_rate; 39 clocksrc->ptime_usec = ptime_usec; 40 pj_set_timestamp32(&clocksrc->timestamp, 0, 0); 41 pj_get_timestamp(&clocksrc->last_update); 42 43 return PJ_SUCCESS; 44 } 45 46 /* API: Update clock source */ 47 PJ_DECL(pj_status_t) pjmedia_clock_src_update( pjmedia_clock_src *clocksrc, 48 const pj_timestamp *timestamp ) 49 { 50 PJ_ASSERT_RETURN(clocksrc, PJ_EINVAL); 51 52 if (timestamp) 53 pj_memcpy(&clocksrc->timestamp, timestamp, sizeof(pj_timestamp)); 54 pj_get_timestamp(&clocksrc->last_update); 55 56 return PJ_SUCCESS; 57 } 58 59 /* API: Get clock source's current timestamp */ 60 PJ_DEF(pj_status_t) 61 pjmedia_clock_src_get_current_timestamp( const pjmedia_clock_src *clocksrc, 62 pj_timestamp *timestamp) 63 { 64 pj_timestamp now; 65 unsigned elapsed_ms; 66 67 PJ_ASSERT_RETURN(clocksrc && timestamp, PJ_EINVAL); 68 69 pj_get_timestamp(&now); 70 elapsed_ms = pj_elapsed_msec(&clocksrc->last_update, &now); 71 pj_memcpy(timestamp, &clocksrc->timestamp, sizeof(pj_timestamp)); 72 pj_add_timestamp32(timestamp, elapsed_ms * clocksrc->clock_rate / 1000); 73 74 return PJ_SUCCESS; 75 } 76 77 /* API: Get clock source's time (in ms) */ 78 PJ_DEF(pj_uint32_t) 79 pjmedia_clock_src_get_time_msec( const pjmedia_clock_src *clocksrc ) 80 { 81 pj_timestamp ts; 82 83 pjmedia_clock_src_get_current_timestamp(clocksrc, &ts); 84 85 #if PJ_HAS_INT64 86 if (ts.u64 > 0x3FFFFFFFFFFFFFUL) 87 return (pj_uint32_t)(ts.u64 / clocksrc->clock_rate * 1000); 88 else 89 return (pj_uint32_t)(ts.u64 * 1000 / clocksrc->clock_rate); 90 #elif PJ_HAS_FLOATING_POINT 91 return (pj_uint32_t)((1.0 * ts.u32.hi * 0xFFFFFFFFUL + ts.u32.lo) 92 * 1000.0 / clocksrc->clock_rate); 93 #else 94 if (ts.u32.lo > 0x3FFFFFUL) 95 return (pj_uint32_t)(0xFFFFFFFFUL / clocksrc->clock_rate * ts.u32.hi 96 * 1000UL + ts.u32.lo / clocksrc->clock_rate * 97 1000UL); 98 else 99 return (pj_uint32_t)(0xFFFFFFFFUL / clocksrc->clock_rate * ts.u32.hi 100 * 1000UL + ts.u32.lo * 1000UL / 101 clocksrc->clock_rate); 102 #endif 103 } 26 104 27 105
Note: See TracChangeset
for help on using the changeset viewer.