Fix a division by zero bug that broke encoding on alpha.

Patch from the Xiphophorus CVS.
This commit is contained in:
naddy 2001-08-28 01:02:17 +00:00
parent 30c8ec7ea4
commit e8acef0975

View File

@ -0,0 +1,165 @@
$OpenBSD: patch-lib_psy_c,v 1.3 2001/08/28 01:02:17 naddy Exp $
--- lib/psy.c.orig Mon Aug 13 03:36:57 2001
+++ lib/psy.c Tue Aug 28 01:52:57 2001
@@ -594,95 +594,11 @@ static void max_seeds(vorbis_look_psy *p
}
-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 @@ static void bark_noise_hybridmp(int n,co
/* 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 @@ static void bark_noise_hybridmp(int n,co
}
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 @@ static void bark_noise_hybridmp(int n,co
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 @@ static void bark_noise_hybridmp(int n,co
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 @@ static void bark_noise_hybridmp(int n,co
}
- noise[i]=va;
+ noise[i]=va-offset;
}
}
}
@@ -859,13 +775,13 @@ void _vp_compute_mask(vorbis_look_psy *p
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];