diff options
author | Monty <xiphmont@xiph.org> | 2001-06-15 22:07:06 +0000 |
---|---|---|
committer | Monty <xiphmont@xiph.org> | 2001-06-15 22:07:06 +0000 |
commit | 7a88cb2ce0b8589b8bab37e27454411a89520247 (patch) | |
tree | a38248271cd1a7d3a96db520b0e1605ab8b79cba | |
parent | 8d96e574de435ef69c82a34be48f257606f0a2e6 (diff) | |
download | libvorbis-git-7a88cb2ce0b8589b8bab37e27454411a89520247.tar.gz |
Restore the correct version; the default: bugfix commit and then
partial rollback had removed a month's worth of changes.
Monty
svn path=/trunk/vorbis/; revision=1480
-rw-r--r-- | lib/floor1.c | 104 |
1 files changed, 70 insertions, 34 deletions
diff --git a/lib/floor1.c b/lib/floor1.c index fa274af0..241cb82a 100644 --- a/lib/floor1.c +++ b/lib/floor1.c @@ -11,7 +11,7 @@ ******************************************************************** function: floor backend 1 implementation - last mod: $Id: floor1.c,v 1.7 2001/06/15 21:15:39 xiphmont Exp $ + last mod: $Id: floor1.c,v 1.8 2001/06/15 22:07:06 xiphmont Exp $ ********************************************************************/ @@ -86,10 +86,10 @@ static void floor1_free_info(vorbis_info_floor *i){ static void floor1_free_look(vorbis_look_floor *i){ vorbis_look_floor1 *look=(vorbis_look_floor1 *)i; if(i){ - /*fprintf(stderr,"floor 1 bit usage: %ld:%ld:%ld (%ld/frame), mse:%gdB\n", + fprintf(stderr,"floor 1 bit usage: %ld:%ld:%ld (%ld/frame), mse:%gdB\n", look->postbits/look->seq,look->classbits/look->seq,look->subbits/look->seq, (look->postbits+look->subbits+look->classbits)/look->seq, - sqrt(look->mse/look->seq));*/ + sqrt(look->mse/look->seq)); memset(look,0,sizeof(vorbis_look_floor1)); free(i); @@ -382,6 +382,31 @@ static void render_line(int x0,int x1,int y0,int y1,float *d){ ady-=abs(base*adx); + d[x]*=FLOOR_fromdB_LOOKUP[y]; + while(++x<x1){ + err=err+ady; + if(err>=adx){ + err-=adx; + y+=sy; + }else{ + y+=base; + } + d[x]*=FLOOR_fromdB_LOOKUP[y]; + } +} + +static void render_line0(int x0,int x1,int y0,int y1,float *d){ + int dy=y1-y0; + int adx=x1-x0; + int ady=abs(dy); + int base=dy/adx; + int sy=(dy<0?base-1:base+1); + int x=x0; + int y=y0; + int err=0; + + ady-=abs(base*adx); + d[x]=FLOOR_fromdB_LOOKUP[y]; while(++x<x1){ err=err+ady; @@ -510,7 +535,6 @@ static int fit_line(lsfit_acc *a,int fits,int *y0,int *y1){ double fx=x; double fy=y; double fx2=x2; - double fy2=y2; double fxy=xy; double denom=1./(an*fx2-fx*fx); double a=(fy*fx2-fxy*fx)*denom; @@ -528,7 +552,7 @@ static int fit_line(lsfit_acc *a,int fits,int *y0,int *y1){ } } -static void fit_line_point(lsfit_acc *a,int fits,int *y0,int *y1){ +/*static void fit_line_point(lsfit_acc *a,int fits,int *y0,int *y1){ long y=0; int i; @@ -536,7 +560,7 @@ static void fit_line_point(lsfit_acc *a,int fits,int *y0,int *y1){ y+=a[i].ya; *y0=*y1=y; -} + }*/ static int inspect_error(int x0,int x1,int y0,int y1,const float *mask, const float *mdct, @@ -959,13 +983,14 @@ static int floor1_forward(vorbis_block *vb,vorbis_look_floor *in, int hx; int lx=0; int ly=fit_valueA[0]*info->mult; + for(j=1;j<posts;j++){ int current=look->forward_index[j]; if(!(fit_valueA[current]&0x8000)){ int hy=(fit_valueA[current]&0x7fff)*info->mult; hx=info->postlist[current]; - render_line(lx,hx,ly,hy,codedflr); + render_line0(lx,hx,ly,hy,codedflr); lx=hx; ly=hy; @@ -996,19 +1021,18 @@ static int floor1_forward(vorbis_block *vb,vorbis_look_floor *in, return(nonzero); } -static int floor1_inverse(vorbis_block *vb,vorbis_look_floor *in,float *out){ +static void *floor1_inverse1(vorbis_block *vb,vorbis_look_floor *in){ vorbis_look_floor1 *look=(vorbis_look_floor1 *)in; vorbis_info_floor1 *info=look->vi; - + codec_setup_info *ci=vb->vd->vi->codec_setup; - int n=ci->blocksizes[vb->mode]/2; int i,j,k; codebook *books=((backend_lookup_state *)(vb->vd->backend_state))-> fullbooks; /* unpack wrapped/predicted values from stream */ if(oggpack_read(&vb->opb,1)==1){ - int fit_value[VIF_POSIT+2]; + int *fit_value=_vorbis_block_alloc(vb,(look->posts)*sizeof(int)); fit_value[0]=oggpack_read(&vb->opb,ilog(look->quant_q-1)); fit_value[1]=oggpack_read(&vb->opb,ilog(look->quant_q-1)); @@ -1079,32 +1103,44 @@ static int floor1_inverse(vorbis_block *vb,vorbis_look_floor *in,float *out){ } - /* render the lines */ - { - int hx; - int lx=0; - int ly=fit_value[0]*info->mult; - for(j=1;j<look->posts;j++){ - int current=look->forward_index[j]; - int hy=fit_value[current]&0x7fff; - if(hy==fit_value[current]){ + return(fit_value); + } + eop: + return(NULL); +} - hy*=info->mult; - hx=info->postlist[current]; - - render_line(lx,hx,ly,hy,out); - - lx=hx; - ly=hy; - } +static int floor1_inverse2(vorbis_block *vb,vorbis_look_floor *in,void *memo, + float *out){ + vorbis_look_floor1 *look=(vorbis_look_floor1 *)in; + vorbis_info_floor1 *info=look->vi; + + codec_setup_info *ci=vb->vd->vi->codec_setup; + int n=ci->blocksizes[vb->mode]/2; + int j; + + if(memo){ + /* render the lines */ + int *fit_value=(int *)memo; + int hx; + int lx=0; + int ly=fit_value[0]*info->mult; + for(j=1;j<look->posts;j++){ + int current=look->forward_index[j]; + int hy=fit_value[current]&0x7fff; + if(hy==fit_value[current]){ + + hy*=info->mult; + hx=info->postlist[current]; + + render_line(lx,hx,ly,hy,out); + + lx=hx; + ly=hy; } - for(j=hx;j<n;j++)out[j]=out[j-1]; /* be certain */ - } + } + for(j=hx;j<n;j++)out[j]*=out[j-1]; /* be certain */ return(1); } - - /* fall through */ - eop: memset(out,0,sizeof(float)*n); return(0); } @@ -1112,6 +1148,6 @@ static int floor1_inverse(vorbis_block *vb,vorbis_look_floor *in,float *out){ /* export hooks */ vorbis_func_floor floor1_exportbundle={ &floor1_pack,&floor1_unpack,&floor1_look,&floor1_copy_info,&floor1_free_info, - &floor1_free_look,&floor1_forward,&floor1_inverse + &floor1_free_look,&floor1_forward,&floor1_inverse1,&floor1_inverse2 }; |