Ignore:
Timestamp:
Feb 10, 2006 3:57:08 PM (18 years ago)
Author:
bennylp
Message:

Added pjmedia-codec library

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjmedia/src/pjmedia/g711.c

    r159 r176  
    4141 
    4242/* Prototypes for G711 factory */ 
    43 static pj_status_t g711_match_id( pjmedia_codec_factory *factory, const pjmedia_codec_info *id ); 
    44 static pj_status_t g711_default_attr( pjmedia_codec_factory *factory, const pjmedia_codec_info *id, pjmedia_codec_param *attr ); 
    45 static pj_status_t g711_enum_codecs (pjmedia_codec_factory *factory, unsigned *count, pjmedia_codec_info codecs[]); 
    46 static pj_status_t g711_alloc_codec( pjmedia_codec_factory *factory, const pjmedia_codec_info *id, pjmedia_codec **p_codec); 
    47 static pj_status_t g711_dealloc_codec( pjmedia_codec_factory *factory, pjmedia_codec *codec ); 
     43static pj_status_t g711_test_alloc( pjmedia_codec_factory *factory,  
     44                                    const pjmedia_codec_info *id ); 
     45static pj_status_t g711_default_attr( pjmedia_codec_factory *factory,  
     46                                      const pjmedia_codec_info *id,  
     47                                      pjmedia_codec_param *attr ); 
     48static pj_status_t g711_enum_codecs (pjmedia_codec_factory *factory,  
     49                                     unsigned *count,  
     50                                     pjmedia_codec_info codecs[]); 
     51static pj_status_t g711_alloc_codec( pjmedia_codec_factory *factory,  
     52                                     const pjmedia_codec_info *id,  
     53                                     pjmedia_codec **p_codec); 
     54static pj_status_t g711_dealloc_codec( pjmedia_codec_factory *factory,  
     55                                       pjmedia_codec *codec ); 
    4856 
    4957/* Prototypes for G711 implementation. */ 
    50 static pj_status_t  g711_codec_default_attr (pjmedia_codec *codec, pjmedia_codec_param *attr); 
    51 static pj_status_t  g711_init( pjmedia_codec *codec, pj_pool_t *pool ); 
    52 static pj_status_t  g711_open( pjmedia_codec *codec, pjmedia_codec_param *attr ); 
     58static pj_status_t  g711_codec_default_attr (pjmedia_codec *codec,  
     59                                             pjmedia_codec_param *attr); 
     60static pj_status_t  g711_init( pjmedia_codec *codec,  
     61                               pj_pool_t *pool ); 
     62static pj_status_t  g711_open( pjmedia_codec *codec,  
     63                               pjmedia_codec_param *attr ); 
    5364static pj_status_t  g711_close( pjmedia_codec *codec ); 
    54 static pj_status_t  g711_encode( pjmedia_codec *codec, const struct pjmedia_frame *input, 
    55                                  unsigned output_buf_len, struct pjmedia_frame *output); 
    56 static pj_status_t  g711_decode( pjmedia_codec *codec, const struct pjmedia_frame *input, 
    57                                  unsigned output_buf_len, struct pjmedia_frame *output); 
     65static pj_status_t  g711_get_frames(pjmedia_codec *codec, 
     66                                    void *pkt, 
     67                                    pj_size_t pkt_size, 
     68                                    unsigned *frame_cnt, 
     69                                    pjmedia_frame frames[]); 
     70static pj_status_t  g711_encode( pjmedia_codec *codec,  
     71                                 const struct pjmedia_frame *input, 
     72                                 unsigned output_buf_len,  
     73                                 struct pjmedia_frame *output); 
     74static pj_status_t  g711_decode( pjmedia_codec *codec,  
     75                                 const struct pjmedia_frame *input, 
     76                                 unsigned output_buf_len,  
     77                                 struct pjmedia_frame *output); 
    5878 
    5979/* Definition for G711 codec operations. */ 
     
    6484    &g711_open, 
    6585    &g711_close, 
     86    &g711_get_frames, 
    6687    &g711_encode, 
    6788    &g711_decode 
     
    7192static pjmedia_codec_factory_op g711_factory_op = 
    7293{ 
    73     &g711_match_id, 
     94    &g711_test_alloc, 
    7495    &g711_default_attr, 
    7596    &g711_enum_codecs, 
     
    129150} 
    130151 
    131 static pj_status_t g711_match_id( pjmedia_codec_factory *factory, const pjmedia_codec_info *id ) 
     152static pj_status_t g711_test_alloc( pjmedia_codec_factory *factory, const pjmedia_codec_info *id ) 
    132153{ 
    133154    PJ_UNUSED_ARG(factory); 
     
    143164    PJ_UNUSED_ARG(factory); 
    144165 
    145     memset(attr, 0, sizeof(pjmedia_codec_param)); 
     166    pj_memset(attr, 0, sizeof(pjmedia_codec_param)); 
    146167    attr->sample_rate = 8000; 
    147168    attr->avg_bps = G711_BPS; 
     
    156177 
    157178static pj_status_t g711_enum_codecs(pjmedia_codec_factory *factory,  
    158                                     unsigned *count,  
     179                                    unsigned *max_count,  
    159180                                    pjmedia_codec_info codecs[]) 
    160181{ 
     182    unsigned count = 0; 
     183 
    161184    PJ_UNUSED_ARG(factory); 
    162185 
    163     if (*count > 0) { 
    164         codecs[0].type = PJMEDIA_TYPE_AUDIO; 
    165         codecs[0].pt = PJMEDIA_RTP_PT_PCMU; 
    166         codecs[0].encoding_name = pj_str("PCMU"); 
    167         codecs[0].sample_rate = 8000; 
     186    if (count < *max_count) { 
     187        codecs[count].type = PJMEDIA_TYPE_AUDIO; 
     188        codecs[count].pt = PJMEDIA_RTP_PT_PCMU; 
     189        codecs[count].encoding_name = pj_str("PCMU"); 
     190        codecs[count].sample_rate = 8000; 
     191        ++count; 
    168192    } 
    169     if (*count > 1) { 
     193    if (count < *max_count) { 
    170194        codecs[1].type = PJMEDIA_TYPE_AUDIO; 
    171195        codecs[1].pt = PJMEDIA_RTP_PT_PCMA; 
    172196        codecs[1].encoding_name = pj_str("PCMA"); 
    173197        codecs[1].sample_rate = 8000; 
     198        ++count; 
    174199    } 
    175200 
    176     if (*count > 0) *count=1; 
    177     if (*count > 1) *count=2; 
     201    *max_count = count; 
    178202 
    179203    return PJ_SUCCESS; 
     
    258282    PJ_UNUSED_ARG(codec); 
    259283    /* Nothing to do */ 
     284    return PJ_SUCCESS; 
     285} 
     286 
     287static pj_status_t  g711_get_frames(pjmedia_codec *codec, 
     288                                    void *pkt, 
     289                                    pj_size_t pkt_size, 
     290                                    unsigned *frame_cnt, 
     291                                    pjmedia_frame frames[]) 
     292{ 
     293    unsigned count = 0; 
     294 
     295    PJ_UNUSED_ARG(codec); 
     296    PJ_ASSERT_RETURN(frame_cnt, PJ_EINVAL); 
     297 
     298    while (pkt_size >= 160 && count < *frame_cnt) { 
     299        frames[0].type = PJMEDIA_FRAME_TYPE_AUDIO; 
     300        frames[0].buf = pkt; 
     301        frames[0].size = 160; 
     302 
     303        pkt = ((char*)pkt) + 160; 
     304        pkt_size -= 160; 
     305 
     306        ++count; 
     307    } 
     308 
     309    *frame_cnt = count; 
    260310    return PJ_SUCCESS; 
    261311} 
Note: See TracChangeset for help on using the changeset viewer.