Changeset 926:466243d373ea in mediastreamer2 for src/gsm.c
- Timestamp:
- Mar 25, 2010 3:37:06 PM (3 years ago)
- 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. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/gsm.c
r909 r926 22 22 #include <gsm/gsm.h> 23 23 24 #ifdef _MSC_VER 25 #include <malloc.h> 26 #define alloca _alloca 27 #endif 28 24 29 typedef struct EncState{ 25 30 gsm state; 26 31 uint32_t ts; 32 int ptime; 27 33 MSBufferizer *bufferizer; 28 34 } EncState; 35 36 static 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 } 29 57 30 58 static void enc_init(MSFilter *f){ … … 32 60 s->state=gsm_create(); 33 61 s->ts=0; 62 s->ptime=20; 34 63 s->bufferizer=ms_bufferizer_new(); 35 64 f->data=s; … … 48 77 EncState *s=(EncState*)f->data; 49 78 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; 51 83 52 84 while((im=ms_queue_get(f->inputs[0]))!=NULL){ 53 85 ms_bufferizer_put(s->bufferizer,im); 54 86 } 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 } 61 96 mblk_set_timestamp_info(om,s->ts); 62 97 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 } 101 static MSFilterMethod enc_methods[]={ 102 { MS_FILTER_ADD_FMTP , enc_add_fmtp}, 103 { 0 , NULL } 104 }; 66 105 67 106 #ifdef _MSC_VER … … 80 119 NULL, 81 120 enc_uninit, 82 NULL121 enc_methods 83 122 }; 84 123 … … 96 135 .process=enc_process, 97 136 .uninit=enc_uninit, 137 .methods = enc_methods 98 138 }; 99 139 … … 117 157 118 158 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 } 126 168 } 127 169 freemsg(im);
Note: See TracChangeset
for help on using the changeset viewer.
