Changeset 926:466243d373ea in mediastreamer2


Ignore:
Timestamp:
Mar 25, 2010 3:37:06 PM (3 years ago)
Author:
Jehan Monnier <jehan.monnier@…>
Branch:
default
Children:
927:b197ecfe4fde, 929:75f64805a9ae
Parents:
923:e2a0e6eb72d7 (diff), 925:123db0c5e722 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'master' of belledonne-communications.com:mediastreamer2-private

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/gsm.c

    r909 r926  
    2222#include <gsm/gsm.h> 
    2323 
     24#ifdef _MSC_VER 
     25#include <malloc.h> 
     26#define alloca _alloca 
     27#endif 
     28 
    2429typedef struct EncState{ 
    2530        gsm state; 
    2631        uint32_t ts; 
     32        int ptime; 
    2733        MSBufferizer *bufferizer; 
    2834} EncState; 
     35 
     36static int enc_add_fmtp(MSFilter *f, void *arg){ 
     37        const char *fmtp=(const char *)arg; 
     38        EncState *s=(EncState*)f->data; 
     39        char tmp[30]; 
     40        if (fmtp_get_value(fmtp,"ptime",tmp,sizeof(tmp))){ 
     41                int ptime = atoi(tmp); 
     42                switch (ptime) { 
     43                case 20: 
     44                case 40: 
     45                case 60: 
     46                case 80: 
     47                case 100: 
     48                        s->ptime = atoi(tmp); 
     49                        break; 
     50                default: 
     51                        ms_warning("MSGsmEnc: unsupported ptime [%i] using default",ptime); 
     52                } 
     53                ms_message("MSGsmEnc: got ptime=%i using [%i]",ptime,s->ptime); 
     54        } 
     55        return 0; 
     56} 
    2957 
    3058static void enc_init(MSFilter *f){ 
     
    3260        s->state=gsm_create(); 
    3361        s->ts=0; 
     62        s->ptime=20; 
    3463        s->bufferizer=ms_bufferizer_new(); 
    3564        f->data=s; 
     
    4877        EncState *s=(EncState*)f->data; 
    4978        mblk_t *im; 
    50         int16_t buf[320]; 
     79        unsigned int unitary_buff_size = sizeof(int16_t)*160; 
     80        unsigned int buff_size = unitary_buff_size*s->ptime/20; 
     81        int16_t* buff; 
     82        int offset; 
    5183         
    5284        while((im=ms_queue_get(f->inputs[0]))!=NULL){ 
    5385                ms_bufferizer_put(s->bufferizer,im); 
    5486        } 
    55         while(ms_bufferizer_read(s->bufferizer,(uint8_t*)buf,sizeof(buf))==sizeof(buf)) { 
    56                 mblk_t *om=allocb(66,0); 
    57                 gsm_encode(s->state,(gsm_signal*)buf,(gsm_byte*)om->b_wptr); 
    58                 om->b_wptr+=33; 
    59                 gsm_encode(s->state,(gsm_signal*)(buf+160),(gsm_byte*)om->b_wptr); 
    60                 om->b_wptr+=33; 
     87        while(ms_bufferizer_get_avail(s->bufferizer) >= buff_size) { 
     88                buff = (int16_t *)alloca(buff_size); 
     89                ms_bufferizer_read(s->bufferizer,(uint8_t*)buff,buff_size); 
     90                mblk_t *om=allocb(33*s->ptime/20,0); 
     91 
     92                for (offset=0;offset<buff_size;offset+=unitary_buff_size) { 
     93                        gsm_encode(s->state,(gsm_signal*)&buff[offset/sizeof(int16_t)],(gsm_byte*)om->b_wptr); 
     94                        om->b_wptr+=33; 
     95                } 
    6196                mblk_set_timestamp_info(om,s->ts); 
    6297                ms_queue_put(f->outputs[0],om); 
    63                 s->ts+=sizeof(buf)/2; 
    64         } 
    65 } 
     98                s->ts+=buff_size/sizeof(int16_t)/*sizeof(buf)/2*/; 
     99        } 
     100} 
     101static MSFilterMethod enc_methods[]={ 
     102        {       MS_FILTER_ADD_FMTP              ,       enc_add_fmtp}, 
     103        {       0                               ,       NULL            } 
     104}; 
    66105 
    67106#ifdef _MSC_VER 
     
    80119        NULL, 
    81120        enc_uninit, 
    82         NULL 
     121        enc_methods 
    83122}; 
    84123 
     
    96135        .process=enc_process, 
    97136        .uninit=enc_uninit, 
     137        .methods = enc_methods 
    98138}; 
    99139 
     
    117157 
    118158        while((im=ms_queue_get(f->inputs[0]))!=NULL){ 
    119                 om=allocb(frsz,0); 
    120                 if (gsm_decode(s,(gsm_byte*)im->b_rptr,(gsm_signal*)om->b_wptr)<0){ 
    121                         ms_warning("gsm_decode error!"); 
    122                         freemsg(om); 
    123                 }else{ 
    124                         om->b_wptr+=frsz; 
    125                         ms_queue_put(f->outputs[0],om); 
     159                for (;(im->b_wptr-im->b_rptr)>=33;im->b_rptr+=33) { 
     160                        om=allocb(frsz,0); 
     161                        if (gsm_decode(s,(gsm_byte*)im->b_rptr,(gsm_signal*)om->b_wptr)<0){ 
     162                                ms_warning("gsm_decode error!"); 
     163                                freemsg(om); 
     164                        }else{ 
     165                                om->b_wptr+=frsz; 
     166                                ms_queue_put(f->outputs[0],om); 
     167                        } 
    126168                } 
    127169                freemsg(im); 
Note: See TracChangeset for help on using the changeset viewer.