Ignore:
Timestamp:
Dec 30, 2010 4:31:16 PM (13 years ago)
Author:
ming
Message:

Re #1184: Adding pjmedia_clock_src for the purpose of audio and video synchronization and also to provide synchronization mechanism between two medias in general.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/branches/projects/2.0-dev/pjmedia/src/pjmedia/clock_thread.c

    r3392 r3402  
    2424#include <pj/os.h> 
    2525#include <pj/pool.h> 
     26#include <pj/string.h> 
     27#include <pj/compat/high_precision.h> 
     28 
     29/* API: Init clock source */ 
     30PJ_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 */ 
     47PJ_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 */ 
     60PJ_DEF(pj_status_t) 
     61pjmedia_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) */ 
     78PJ_DEF(pj_uint32_t) 
     79pjmedia_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} 
    26104 
    27105 
Note: See TracChangeset for help on using the changeset viewer.