X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=lib%2Fpsy.c;h=036b094aa763b3c8773386c17f548f70dfd1bc58;hb=0657aee69dec8508a0011f47f3b69d7538e9d262;hp=2361eee621ded289ebd0e477492514bd7d2577af;hpb=399301e3bd2f1ae0f313c834aec21c1cd746ff96;p=platform%2Fupstream%2Flibvorbis.git diff --git a/lib/psy.c b/lib/psy.c index 2361eee..036b094 100644 --- a/lib/psy.c +++ b/lib/psy.c @@ -6,12 +6,11 @@ * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * * * * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2010 * - * by the Xiph.Org Foundation http://www.xiph.org/ * + * by the Xiph.Org Foundation https://xiph.org/ * * * ******************************************************************** function: psychoacoustics not including preecho - last mod: $Id$ ********************************************************************/ @@ -600,11 +599,12 @@ static void bark_noise_hybridmp(int n,const long *b, XY[i] = tXY; } - for (i = 0, x = 0.f;; i++, x += 1.f) { + for (i = 0, x = 0.f; i < n; i++, x += 1.f) { lo = b[i] >> 16; - if( lo>=0 ) break; hi = b[i] & 0xffff; + if( lo>=0 || -lo>=n ) break; + if( hi>=n ) break; tN = N[hi] + N[-lo]; tX = X[hi] - X[-lo]; @@ -616,17 +616,17 @@ static void bark_noise_hybridmp(int n,const long *b, B = tN * tXY - tX * tY; D = tN * tXX - tX * tX; R = (A + x * B) / D; - if (R < 0.f) - R = 0.f; + if (R < 0.f) R = 0.f; noise[i] = R - offset; } - for ( ;; i++, x += 1.f) { + for ( ; i < n; i++, x += 1.f) { lo = b[i] >> 16; hi = b[i] & 0xffff; - if(hi>=n)break; + if( lo<0 || lo>=n ) break; + if( hi>=n ) break; tN = N[hi] - N[lo]; tX = X[hi] - X[lo]; @@ -642,6 +642,7 @@ static void bark_noise_hybridmp(int n,const long *b, noise[i] = R - offset; } + for ( ; i < n; i++, x += 1.f) { R = (A + x * B) / D; @@ -652,10 +653,11 @@ static void bark_noise_hybridmp(int n,const long *b, if (fixed <= 0) return; - for (i = 0, x = 0.f;; i++, x += 1.f) { + for (i = 0, x = 0.f; i < n; i++, x += 1.f) { hi = i + fixed / 2; lo = hi - fixed; - if(lo>=0)break; + if ( hi>=n ) break; + if ( lo>=0 ) break; tN = N[hi] + N[-lo]; tX = X[hi] - X[-lo]; @@ -671,11 +673,12 @@ static void bark_noise_hybridmp(int n,const long *b, if (R - offset < noise[i]) noise[i] = R - offset; } - for ( ;; i++, x += 1.f) { + for ( ; i < n; i++, x += 1.f) { hi = i + fixed / 2; lo = hi - fixed; - if(hi>=n)break; + if ( hi>=n ) break; + if ( lo<0 ) break; tN = N[hi] - N[lo]; tX = X[hi] - X[lo]; @@ -939,6 +942,9 @@ static float noise_normalize(vorbis_look_psy *p, int limit, float *r, float *q, int start = (vi->normal_p ? vi->normal_start-i : n); if(start>n)start=n; + /* force classic behavior where only energy in the current band is considered */ + acc=0.f; + /* still responsible for populating *out where noise norm not in effect. There's no need to [re]populate *q in these areas */ for(j=0;jcoupling_pointlimit[p->vi->blockflag][blobno]; float prepoint=stereo_threshholds[g->coupling_prepointamp[blobno]]; float postpoint=stereo_threshholds[g->coupling_postpointamp[blobno]]; +#if 0 float de=0.1*p->m_val; /* a blend of the AoTuV M2 and M3 code here and below */ +#endif /* mdct is our raw mdct output, floor not removed. */ /* inout passes in the ifloor, passes back quantized result */ @@ -1062,7 +1070,7 @@ void _vp_couple_quantize_normalize(int blobno, int k,j,jn = partition > n-i ? n-i : partition; int step,track = 0; - memcpy(nz,nonzero,sizeof(nz)); + memcpy(nz,nonzero,sizeof(*nz)*ch); /* prefill */ memset(flag[0],0,ch*partition*sizeof(**flag)); @@ -1077,7 +1085,7 @@ void _vp_couple_quantize_normalize(int blobno, for(j=0;jabs(B)||B>abs(A) ? A-B : B-A); - if(abs(B)>abs(A))iM[j]=B; + if(abs(A)>abs(B)){ + iA[j]=(A>0?A-B:B-A); + }else{ + iA[j]=(B>0?A-B:B-A); + iM[j]=B; + } /* collapse two equivalent tuples to one */ - if(abs(iM[j])*2==iA[j]){ + if(iA[j]>=abs(iM[j])*2){ iA[j]= -iA[j]; iM[j]= -iM[j]; } + } }else{ /* lossy (point) coupling */ - if(jcoupling_steps;i++){ + /* make sure coupling a zero and a nonzero channel results in two + nonzero channels. */ + if(nonzero[vi->coupling_mag[i]] || + nonzero[vi->coupling_ang[i]]){ + nonzero[vi->coupling_mag[i]]=1; + nonzero[vi->coupling_ang[i]]=1; + } + } }