diff options
author | trevor <trevor@FreeBSD.org> | 2001-08-29 07:12:06 +0800 |
---|---|---|
committer | trevor <trevor@FreeBSD.org> | 2001-08-29 07:12:06 +0800 |
commit | 3d0accc2d236e2418038e629e801e135693e66a9 (patch) | |
tree | e1aac4e6bbc2a70d9ef91d6ff63502061abbaf7b /audio/libvorbis | |
parent | 1d5b3456ebc67c7b2cbb8e84d2dc5fa351e8457d (diff) | |
download | freebsd-ports-gnome-3d0accc2d236e2418038e629e801e135693e66a9.tar.gz freebsd-ports-gnome-3d0accc2d236e2418038e629e801e135693e66a9.tar.zst freebsd-ports-gnome-3d0accc2d236e2418038e629e801e135693e66a9.zip |
Avoid division by zero when encoding on the Alpha.
Submitted by: Christian Weisgerber (maintainer)
Obtained from: vorbis CVS
Diffstat (limited to 'audio/libvorbis')
-rw-r--r-- | audio/libvorbis/files/patch-lib_psy.c | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/audio/libvorbis/files/patch-lib_psy.c b/audio/libvorbis/files/patch-lib_psy.c new file mode 100644 index 000000000000..5d9cc6a4f8c6 --- /dev/null +++ b/audio/libvorbis/files/patch-lib_psy.c @@ -0,0 +1,167 @@ + +$FreeBSD$ + +--- lib/psy.c.orig Mon Aug 13 03:36:57 2001 ++++ lib/psy.c Tue Aug 28 01:47:19 2001 +@@ -594,95 +594,11 @@ + + } + +-static void bark_noise_pointmp(int n,const long *b, +- const float *f, +- float *noise, +- const int fixed){ +- long i,hi=0,lo=0,hif=0,lof=0; +- double xa=0,xb=0; +- double ya=0,yb=0; +- double x2a=0,x2b=0; +- double y2a=0,y2b=0; +- double xya=0,xyb=0; +- double na=0,nb=0; +- +- for(i=0;i<n;i++){ +- if(hi<n){ +- /* find new lo/hi */ +- int bi=b[i]>>16; +- for(;hi<bi;hi++){ +- double bin=(f[hi]<-140.f?0.:f[hi]+140.); +- double nn= bin*bin; +- na += nn; +- xa += hi*nn; +- ya += bin*nn; +- x2a += hi*hi*nn; +- y2a += bin*bin*nn; +- xya += hi*bin*nn; +- } +- bi=b[i]&0xffff; +- for(;lo<bi;lo++){ +- double bin=(f[lo]<-140.f?0.:f[lo]+140.); +- double nn= bin*bin; +- na -= nn; +- xa -= lo*nn; +- ya -= bin*nn; +- x2a -= lo*lo*nn; +- y2a -= bin*bin*nn; +- xya -= lo*bin*nn; +- } +- } +- +- if(hif<n && fixed>0){ +- int bi=i+fixed/2; +- if(bi>n)bi=n; +- for(;hif<bi;hif++){ +- double bin=(f[hif]<-140.f?0.:f[hif]+140.); +- double nn= bin*bin; +- nb += nn; +- xb += hif*nn; +- yb += bin*nn; +- x2b += hif*hif*nn; +- y2b += bin*bin*nn; +- xyb += hif*bin*nn; +- } +- bi=i-(fixed+1)/2; +- if(bi<0)bi=0; +- for(;lof<bi;lof++){ +- double bin=(f[lof]<-140.f?0.:f[lof]+140.); +- double nn= bin*bin; +- nb -= nn; +- xb -= lof*nn; +- yb -= bin*nn; +- x2b -= lof*lof*nn; +- y2b -= bin*bin*nn; +- xyb -= lof*bin*nn; +- } +- } +- +- { +- double denom=1./(na*x2a-xa*xa); +- double a=(ya*x2a-xya*xa)*denom; +- double b=(na*xya-xa*ya)*denom; +- double va=a+b*i; +- +- if(fixed>0){ +- double denomf=1./(nb*x2b-xb*xb); +- double af=(yb*x2b-xyb*xb)*denomf; +- double bf=(nb*xyb-xb*yb)*denomf; +- double vb=af+bf*i; +- if(va>vb)va=vb; +- } +- +- noise[i]=va-140.f; +- } +- } +-} +- + static void bark_noise_hybridmp(int n,const long *b, +- const float *f, +- float *noise, +- const int fixed){ ++ const float *f, ++ float *noise, ++ const float offset, ++ const int fixed){ + long i,hi=0,lo=0,hif=0,lof=0; + double xa=0,xb=0; + double ya=0,yb=0; +@@ -699,7 +615,7 @@ + /* find new lo/hi */ + int bi=b[i]>>16; + for(;hi<bi;hi++){ +- double bin=f[hi]; ++ double bin=(f[hi]<-offset?0.:f[hi]+offset); + if(bin>0.f){ + double nn= bin*bin; + nn*=nn; +@@ -716,7 +632,7 @@ + } + bi=b[i]&0xffff; + for(;lo<bi;lo++){ +- double bin=f[lo]; ++ double bin=(f[lo]<-offset?0.:f[lo]+offset); + if(bin>0.f){ + double nn= bin*bin; + nn*=nn; +@@ -744,7 +660,7 @@ + if(bi>n)bi=n; + + for(;hif<bi;hif++){ +- double bin=f[hif]; ++ double bin=(f[hif]<-offset?0.:f[hif]+offset); + if(bin>0.f){ + double nn= bin*bin; + nn*=nn; +@@ -762,7 +678,7 @@ + bi=i-(fixed+1)/2; + if(bi<0)bi=0; + for(;lof<bi;lof++){ +- double bin=f[lof]; ++ double bin=(f[lof]<-offset?0.:f[lof]+offset); + if(bin>0.f){ + double nn= bin*bin; + nn*=nn; +@@ -817,7 +733,7 @@ + + } + +- noise[i]=va; ++ noise[i]=va-offset; + } + } + } +@@ -859,13 +775,13 @@ + if(p->vi->noisemaskp){ + float *work=alloca(n*sizeof(float)); + +- bark_noise_pointmp(n,p->bark,logmdct,logmask, +- -1); ++ bark_noise_hybridmp(n,p->bark,logmdct,logmask, ++ 140.,-1); + + for(i=0;i<n;i++)work[i]=logmdct[i]-logmask[i]; + + _analysis_output("medianmdct",seq,work,n,1,0); +- bark_noise_hybridmp(n,p->bark,work,logmask, ++ bark_noise_hybridmp(n,p->bark,work,logmask,0., + p->vi->noisewindowfixed); + + for(i=0;i<n;i++)work[i]=logmdct[i]-work[i]; |