Changeset 617:eadc4ce98867 in roaraudio


Ignore:
Timestamp:
08/20/08 02:00:51 (16 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

added a lot encoder code, changed struct to include the needed buffers, init new vars

Location:
roard
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • roard/codecfilter_speex.c

    r616 r617  
    2424 self->i_rest  = NULL; 
    2525 self->fi_rest = 0; 
     26 self->o_rest  = NULL; 
     27 self->fo_rest = 0; 
    2628 
    2729 speex_bits_init(&(self->bits)); 
     
    195197 uint16_t mode = ROAR_SPEEX_MODE_UWB; 
    196198 int tmp; 
     199 int fs2; 
     200 int ret = 0; 
     201 int need_extra; 
    197202 
    198203 if ( ! self->encoder ) { 
     
    217222  speex_encoder_ctl(self->encoder, SPEEX_GET_FRAME_SIZE, &(self->frame_size)); 
    218223 
    219  } 
    220  
    221  return -1; 
     224  fs2 = self->frame_size * 2; 
     225 
     226  if ( !self->cd ) { 
     227   self->cd = malloc(fs2); 
     228   if ( !self->cd ) 
     229    return 0; 
     230  } 
     231 
     232  if ( !self->o_rest ) { 
     233   self->o_rest = malloc(fs2); 
     234   if ( !self->o_rest ) 
     235    return 0; 
     236  } 
     237 } 
     238 
     239 fs2 = self->frame_size * 2; 
     240 
     241 if ( self->fo_rest ) { // ignore the rest for the moment 
     242  if ( (self->fo_rest + len) > fs2 ) { 
     243   need_extra = fs2 - self->fo_rest; 
     244   memcpy(self->o_rest + self->fo_rest, buf, need_extra); 
     245 
     246   speex_bits_reset(&(self->bits)); 
     247 
     248   speex_encode_int(self->encoder, (spx_int16_t *) self->o_rest, &(self->bits)); 
     249 
     250   mode = speex_bits_write(&(self->bits), self->cd, fs2); 
     251 
     252   tmp = mode = ROAR_HOST2NET16(mode); 
     253   stream_vio_s_write(self->stream, &mode, 2); 
     254   if ( stream_vio_s_write(self->stream, self->cd, tmp) != tmp ) 
     255    return -1; 
     256 
     257   buf += need_extra; 
     258   ret += need_extra; 
     259   len -= need_extra; 
     260   self->fo_rest = 0; 
     261  } else { // just add the data to o_rest 
     262   memcpy(self->o_rest + self->fo_rest, buf, len); 
     263   self->fo_rest += len; 
     264   return len; 
     265  } 
     266 } 
     267 
     268 // TODO: do we realy need such a loop? 
     269 while (len > fs2) { 
     270  ROAR_WARN("cf_speex_write(*): Discarding a full block of data as non-o_rest encoding is not supported!"); 
     271  len -= fs2; 
     272  buf += fs2; 
     273  ret += fs2; 
     274 } 
     275 
     276 if ( len ) { // we still have some data, add this to o_rest 
     277  memcpy(self->o_rest, buf, len); 
     278  self->fo_rest = len; 
     279  ret += len; 
     280 } 
     281 
     282 return ret; 
    222283} 
    223284 
  • roard/include/codecfilter_speex.h

    r396 r617  
    1818 void     * i_rest; /* rest... */ 
    1919 int fi_rest; 
     20 char * o_rest; 
     21 int fo_rest; /* how much is in rest? */ 
    2022 
    2123/* 
     
    2426 int out_size; 
    2527 char * i_rest; 
    26  char * o_rest; 
    2728 int s_buf; 
    2829 int fi_rest; /-* how much is in rest? *-/ 
    29  int fo_rest; /-* how much is in rest? *-/ 
    3030*/ 
    3131}; 
Note: See TracChangeset for help on using the changeset viewer.