diff options
author | Monty <xiphmont@xiph.org> | 2010-03-26 05:30:11 +0000 |
---|---|---|
committer | Monty <xiphmont@xiph.org> | 2010-03-26 05:30:11 +0000 |
commit | 90cb20ed01ad20e4fa9c8b75e5484f8f61e9d847 (patch) | |
tree | 1d705754d148acce030ec5fa09bd05f254ec8d60 | |
parent | b13882809953d3029ab5c6dcd0dfe528d5a97cea (diff) | |
download | libvorbis-git-90cb20ed01ad20e4fa9c8b75e5484f8f61e9d847.tar.gz |
Revert floor1 line fitting to exact 1.2.3 behavior; the apparently better
weighting of 1.3.0pre was slightly dropping PEAQ and slightly increasing
bitrate.
svn path=/trunk/vorbis/; revision=17075
-rw-r--r-- | lib/floor1.c | 39 |
1 files changed, 16 insertions, 23 deletions
diff --git a/lib/floor1.c b/lib/floor1.c index 99358880..5c290fc1 100644 --- a/lib/floor1.c +++ b/lib/floor1.c @@ -470,27 +470,28 @@ static int accumulate_fit(const float *flr,const float *mdct, static int fit_line(lsfit_acc *a,int fits,int *y0,int *y1, vorbis_info_floor1 *info){ - double weight; - double xa=0,ya=0,x2a=0,y2a=0,xya=0,an=0; 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;i<fits;i++){ - xa+=a[i].xa; - ya+=a[i].ya; - x2a+=a[i].x2a; - y2a+=a[i].y2a; - xya+=a[i].xya; - an+=a[i].an; - - xb+=a[i].xb; - yb+=a[i].yb; - x2b+=a[i].x2b; - y2b+=a[i].y2b; - xyb+=a[i].xyb; - bn+=a[i].bn; + + /* This process is a bit odd as I'm preserving the weighting + behavior of 1.2.3 for now. Although I can hear no difference, + what appears to be a better more straightforward weighting + slightly drops PEAQ and increases bitrate. For that reason, + I'm preserving the old behavior until I can explain why the + bettwer weighting measures poorly. */ + + double weight = floor((a[i].bn+a[i].an)*info->twofitweight/(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){ @@ -511,14 +512,6 @@ static int fit_line(lsfit_acc *a,int fits,int *y0,int *y1, bn++; } - weight = (bn+an)*info->twofitweight/(an+1)+1.; - xb += xa * weight; - yb += ya * weight; - x2b += x2a * weight; - y2b += y2a * weight; - xyb += xya * weight; - bn += an * weight; - { double denom=(bn*x2b-xb*xb); |