Beispiel #1
0
static void *floor0_inverse1(vorbis_block *vb,vorbis_look_floor *i){
  vorbis_look_floor0 *look=(vorbis_look_floor0 *)i;
  vorbis_info_floor0 *info=look->vi;
  int j,k;

  int ampraw=oggpack_read(&vb->opb,info->ampbits);
  if(ampraw>0){ /* also handles the -1 out of data case */
    long maxval=(1<<info->ampbits)-1;
    float amp=(float)ampraw/maxval*info->ampdB;
    int booknum=oggpack_read(&vb->opb,_ilog(info->numbooks));
    
    if(booknum!=-1 && booknum<info->numbooks){ /* be paranoid */
      codec_setup_info  *ci=vb->vd->vi->codec_setup;
      codebook *b=ci->fullbooks+info->books[booknum];
      float last=0.f;

      /* the additional b->dim is a guard against any possible stack
         smash; b->dim is provably more than we can overflow the
         vector */
      float *lsp=_vorbis_block_alloc(vb,sizeof(*lsp)*(look->m+b->dim+1));
            
      for(j=0;j<look->m;j+=b->dim)
	if(vorbis_book_decodev_set(b,lsp+j,&vb->opb,b->dim)==-1)goto eop;
      for(j=0;j<look->m;){
	for(k=0;k<b->dim;k++,j++)lsp[j]+=last;
	last=lsp[j-1];
      }
      
      lsp[look->m]=amp;
      return(lsp);
    }
  }
 eop:
  return(NULL);
}
Beispiel #2
0
static void *floor0_inverse1(vorbis_block *vb,vorbis_look_floor *i,unsigned int channel)
{
 vorbis_look_floor0 *look=(vorbis_look_floor0 *)i;
 vorbis_info_floor0 *info=look->vif0;
 oggpack_buffer *vbopb=&vb->opb;
 int j,k;

 int ampraw=oggpack_read32(vbopb,info->ampbits);
 if(ampraw>0){
  long maxval=(1<<info->ampbits)-1;
  ogg_double_t amp=(ogg_double_t)ampraw/maxval*info->ampdB;
  int booknum=oggpack_read32(vbopb,_ilog(info->numbooks));

  if((booknum>=0) && (booknum<info->numbooks)){
   codec_setup_info  *ci=vb->vd->vi->codec_setup;
   codebook *b=ci->fullbooks+info->books[booknum];
   int bookdim=b->dim;
   ogg_double_t *lsp=look->lsp_data[channel];

   if(vorbis_book_decodev_set(b,lsp,vbopb,bookdim)<0)
    goto eop;

   for(j=bookdim;j<look->m;){
    ogg_double_t last;
    if(vorbis_book_decodev_set(b,lsp+j,vbopb,bookdim)<0)
     goto eop;
    last=lsp[j-1];
    for(k=0;k<bookdim;k++,j++)
     lsp[j]+=last;
   }

   lsp[look->m]=amp;
   return(lsp);
  }
 }
eop:
 return(NULL);
}