X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=lib%2Ffloor1.c;h=e1dc2c7288e6d9fff99d50c567623c620338efe9;hb=55fddec43e7fbd4aed1680e7ae7013f4095fd92b;hp=1e320887ba7bd60d8366e773c6419b830dfd1ef2;hpb=cbf2877701c6d6522602599f5d8ea27877c5c63d;p=platform%2Fupstream%2Flibvorbis.git diff --git a/lib/floor1.c b/lib/floor1.c index 1e32088..e1dc2c7 100644 --- a/lib/floor1.c +++ b/lib/floor1.c @@ -31,15 +31,22 @@ #define floor1_rangedB 140 /* floor 1 fixed at -140dB to 0dB range */ typedef struct lsfit_acc{ - long x0; - long x1; - - long xa; - long ya; - long x2a; - long y2a; - long xya; - long an; + int x0; + int x1; + + int xa; + int ya; + int x2a; + int y2a; + int xya; + int an; + + int xb; + int yb; + int x2b; + int y2b; + int xyb; + int bn; } lsfit_acc; /***********************************************/ @@ -381,7 +388,7 @@ static void render_line(int n, int x0,int x1,int y0,int y1,float *d){ } } -static void render_line0(int x0,int x1,int y0,int y1,int *d){ +static void render_line0(int n, int x0,int x1,int y0,int y1,int *d){ int dy=y1-y0; int adx=x1-x0; int ady=abs(dy); @@ -393,8 +400,12 @@ static void render_line0(int x0,int x1,int y0,int y1,int *d){ ady-=abs(base*adx); - d[x]=y; - while(++xx1)n=x1; + + if(x=adx){ err-=adx; @@ -412,7 +423,7 @@ static int accumulate_fit(const float *flr,const float *mdct, int n,vorbis_info_floor1 *info){ long i; - long xa=0,ya=0,x2a=0,y2a=0,xya=0,na=0, xb=0,yb=0,x2b=0,y2b=0,xyb=0,nb=0; + int xa=0,ya=0,x2a=0,y2a=0,xya=0,na=0, xb=0,yb=0,x2b=0,y2b=0,xyb=0,nb=0; memset(a,0,sizeof(*a)); a->x0=x0; @@ -440,72 +451,65 @@ static int accumulate_fit(const float *flr,const float *mdct, } } - xb+=xa; - yb+=ya; - x2b+=x2a; - y2b+=y2a; - xyb+=xya; - nb+=na; + a->xa=xa; + a->ya=ya; + a->x2a=x2a; + a->y2a=y2a; + a->xya=xya; + a->an=na; - /* weight toward the actually used frequencies if we meet the threshhold */ - { - int weight=nb*info->twofitweight/(na+1); - - a->xa=xa*weight+xb; - a->ya=ya*weight+yb; - a->x2a=x2a*weight+x2b; - a->y2a=y2a*weight+y2b; - a->xya=xya*weight+xyb; - a->an=na*weight+nb; - } + a->xb=xb; + a->yb=yb; + a->x2b=x2b; + a->y2b=y2b; + a->xyb=xyb; + a->bn=nb; return(na); } -static int fit_line(lsfit_acc *a,int fits,int *y0,int *y1){ - long x=0,y=0,x2=0,y2=0,xy=0,an=0,i; - long x0=a[0].x0; - long x1=a[fits-1].x1; +static int fit_line(lsfit_acc *a,int fits,int *y0,int *y1, + vorbis_info_floor1 *info){ + double xb=0,yb=0,x2b=0,y2b=0,xyb=0,bn=0; + int i; + int x0=a[0].x0; + int x1=a[fits-1].x1; for(i=0;itwofitweight/(a[i].an+1)+1.; + + xb+=a[i].xb + a[i].xa * weight; + yb+=a[i].yb + a[i].ya * weight; + x2b+=a[i].x2b + a[i].x2a * weight; + y2b+=a[i].y2b + a[i].y2a * weight; + xyb+=a[i].xyb + a[i].xya * weight; + bn+=a[i].bn + a[i].an * weight; } if(*y0>=0){ - x+= x0; - y+= *y0; - x2+= x0 * x0; - y2+= *y0 * *y0; - xy+= *y0 * x0; - an++; + xb+= x0; + yb+= *y0; + x2b+= x0 * x0; + y2b+= *y0 * *y0; + xyb+= *y0 * x0; + bn++; } if(*y1>=0){ - x+= x1; - y+= *y1; - x2+= x1 * x1; - y2+= *y1 * *y1; - xy+= *y1 * x1; - an++; + xb+= x1; + yb+= *y1; + x2b+= x1 * x1; + y2b+= *y1 * *y1; + xyb+= *y1 * x1; + bn++; } { - /* need 64 bit multiplies, which C doesn't give portably as int */ - double fx=x; - double fx2=x2; - double denom=(an*fx2-fx*fx); + double denom=(bn*x2b-xb*xb); if(denom>0.){ - double fy=y; - double fxy=xy; - - double a=(fy*fx2-fxy*fx)/denom; - double b=(an*fxy-fx*fy)/denom; + double a=(yb*x2b-xyb*xb)/denom; + double b=(bn*xyb-xb*yb)/denom; *y0=rint(a+b*x0); *y1=rint(a+b*x1); @@ -524,16 +528,6 @@ 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){ - long y=0; - int i; - - for(i=0;imult; + int n=ci->blocksizes[vb->W]/2; + for(j=1;jposts;j++){ int current=look->forward_index[j]; int hy=post[current]&0x7fff; @@ -953,7 +949,7 @@ int floor1_encode(oggpack_buffer *opb,vorbis_block *vb, hy*=info->mult; hx=info->postlist[current]; - render_line0(lx,hx,ly,hy,ilogmask); + render_line0(n,lx,hx,ly,hy,ilogmask); lx=hx; ly=hy; @@ -1039,7 +1035,7 @@ static void *floor1_inverse1(vorbis_block *vb,vorbis_look_floor *in){ } } - fit_value[i]=val+predicted; + fit_value[i]=val+predicted&0x7fff; fit_value[look->loneighbor[i-2]]&=0x7fff; fit_value[look->hineighbor[i-2]]&=0x7fff; @@ -1070,13 +1066,18 @@ static int floor1_inverse2(vorbis_block *vb,vorbis_look_floor *in,void *memo, int hx=0; int lx=0; int ly=fit_value[0]*info->mult; + /* guard lookup against out-of-range values */ + ly=(ly<0?0:ly>255?255:ly); + for(j=1;jposts;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]; + hy*=info->mult; + /* guard lookup against out-of-range values */ + hy=(hy<0?0:hy>255?255:hy); render_line(n,lx,hx,ly,hy,out);