aboutsummaryrefslogtreecommitdiffstats
path: root/audio/libvorbis
diff options
context:
space:
mode:
authortrevor <trevor@FreeBSD.org>2001-08-29 07:12:06 +0800
committertrevor <trevor@FreeBSD.org>2001-08-29 07:12:06 +0800
commit3d0accc2d236e2418038e629e801e135693e66a9 (patch)
treee1aac4e6bbc2a70d9ef91d6ff63502061abbaf7b /audio/libvorbis
parent1d5b3456ebc67c7b2cbb8e84d2dc5fa351e8457d (diff)
downloadfreebsd-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.c167
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];