123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755 |
- #include <stdlib.h>
- #include <math.h>
- #include <string.h>
- #include "vorbis/codec.h"
- #include "codec_internal.h"
- #include "masking.h"
- #include "psy.h"
- #include "os.h"
- #include "lpc.h"
- #include "smallft.h"
- #include "scales.h"
- #include "misc.h"
- #define NEGINF -9999.f
- void _vi_psy_free(vorbis_info_psy *i){
- if(i){
- memset(i,0,sizeof(vorbis_info_psy));
- _ogg_free(i);
- }
- }
- vorbis_info_psy *_vi_psy_copy(vorbis_info_psy *i){
- vorbis_info_psy *ret=_ogg_malloc(sizeof(vorbis_info_psy));
- memcpy(ret,i,sizeof(vorbis_info_psy));
- return(ret);
- }
- static void set_curve(float *ref,float *c,int n, float crate){
- int i,j=0;
- for(i=0;i<MAX_BARK-1;i++){
- int endpos=rint(fromBARK(i+1)*2*n/crate);
- float base=ref[i];
- if(j<endpos){
- float delta=(ref[i+1]-base)/(endpos-j);
- for(;j<endpos && j<n;j++){
- c[j]=base;
- base+=delta;
- }
- }
- }
- }
- static void min_curve(float *c,
- float *c2){
- int i;
- for(i=0;i<EHMER_MAX;i++)if(c2[i]<c[i])c[i]=c2[i];
- }
- static void max_curve(float *c,
- float *c2){
- int i;
- for(i=0;i<EHMER_MAX;i++)if(c2[i]>c[i])c[i]=c2[i];
- }
- static void attenuate_curve(float *c,float att){
- int i;
- for(i=0;i<EHMER_MAX;i++)
- c[i]+=att;
- }
- static void interp_curve(float *c,float *c1,float *c2,float del){
- int i;
- for(i=0;i<EHMER_MAX;i++)
- c[i]=c2[i]*del+c1[i]*(1.f-del);
- }
- static void setup_curve(float **c,
- int band,
- float *curveatt_dB){
- int i,j;
- float ath[EHMER_MAX];
- float tempc[P_LEVELS][EHMER_MAX];
- float *ATH=ATH_Bark_dB_lspconservative;
- memcpy(c[0]+2,c[4]+2,sizeof(float)*EHMER_MAX);
- memcpy(c[2]+2,c[4]+2,sizeof(float)*EHMER_MAX);
-
- for(i=0;i<EHMER_MAX;i++){
- float oc_min=band*.5+(i-EHMER_OFFSET)*.125;
- float oc_max=band*.5+(i-EHMER_OFFSET+1)*.125;
- float bark=toBARK(fromOC(oc_min));
- int ibark=floor(bark);
- float del=bark-ibark;
- float ath_min,ath_max;
- if(ibark<26)
- ath_min=ATH[ibark]*(1.f-del)+ATH[ibark+1]*del;
- else
- ath_min=ATH[25];
- bark=toBARK(fromOC(oc_max));
- ibark=floor(bark);
- del=bark-ibark;
- if(ibark<26)
- ath_max=ATH[ibark]*(1.f-del)+ATH[ibark+1]*del;
- else
- ath_max=ATH[25];
- ath[i]=min(ath_min,ath_max);
- }
-
- for(i=1;i<P_LEVELS;i+=2){
- interp_curve(c[i]+2,c[i-1]+2,c[i+1]+2,.5);
- }
-
-
- for(i=0;i<P_LEVELS;i++){
- attenuate_curve(c[i]+2,curveatt_dB[i]);
- memcpy(tempc[i],ath,EHMER_MAX*sizeof(float));
- attenuate_curve(tempc[i],-i*10.f);
- max_curve(tempc[i],c[i]+2);
- }
-
- for(j=1;j<P_LEVELS;j++){
- min_curve(tempc[j],tempc[j-1]);
- min_curve(c[j]+2,tempc[j]);
- }
-
- for(j=0;j<P_LEVELS;j++){
- for(i=0;i<EHMER_MAX;i++)
- if(c[j][i+2]>-200.f)break;
- c[j][0]=i;
- for(i=EHMER_MAX-1;i>=0;i--)
- if(c[j][i+2]>-200.f)
- break;
- c[j][1]=i;
- }
- }
- void _vp_psy_init(vorbis_look_psy *p,vorbis_info_psy *vi,int n,long rate){
- long i,j,lo=0,hi=0;
- long maxoc;
- memset(p,0,sizeof(vorbis_look_psy));
- p->eighth_octave_lines=vi->eighth_octave_lines;
- p->shiftoc=rint(log(vi->eighth_octave_lines*8)/log(2))-1;
- p->firstoc=toOC(.25f*rate/n)*(1<<(p->shiftoc+1))-vi->eighth_octave_lines;
- maxoc=toOC((n*.5f-.25f)*rate/n)*(1<<(p->shiftoc+1))+.5f;
- p->total_octave_lines=maxoc-p->firstoc+1;
- if(vi->ath)
- p->ath=_ogg_malloc(n*sizeof(float));
- p->octave=_ogg_malloc(n*sizeof(long));
- p->bark=_ogg_malloc(n*sizeof(unsigned long));
- p->vi=vi;
- p->n=n;
-
-
- if(vi->ath)
- set_curve(vi->ath, p->ath,n,rate);
- for(i=0;i<n;i++){
- float bark=toBARK(rate/(2*n)*i);
- for(;lo+vi->noisewindowlomin<i &&
- toBARK(rate/(2*n)*lo)<(bark-vi->noisewindowlo);lo++);
-
- for(;hi<n && (hi<i+vi->noisewindowhimin ||
- toBARK(rate/(2*n)*hi)<(bark+vi->noisewindowhi));hi++);
-
- p->bark[i]=(hi<<16)+lo;
- }
- for(i=0;i<n;i++)
- p->octave[i]=toOC((i*.5f+.25f)*rate/n)*(1<<(p->shiftoc+1))+.5f;
- p->tonecurves=_ogg_malloc(P_BANDS*sizeof(float **));
- p->noisemedian=_ogg_malloc(n*sizeof(int));
- p->noiseoffset=_ogg_malloc(n*sizeof(float));
- p->peakatt=_ogg_malloc(P_BANDS*sizeof(float *));
- for(i=0;i<P_BANDS;i++){
- p->tonecurves[i]=_ogg_malloc(P_LEVELS*sizeof(float *));
- p->peakatt[i]=_ogg_malloc(P_LEVELS*sizeof(float));
- }
- for(i=0;i<P_BANDS;i++)
- for(j=0;j<P_LEVELS;j++){
- p->tonecurves[i][j]=_ogg_malloc((EHMER_MAX+2)*sizeof(float));
- }
-
- memcpy(p->tonecurves[0][4]+2,tone_125_40dB_SL,sizeof(float)*EHMER_MAX);
- memcpy(p->tonecurves[0][6]+2,tone_125_60dB_SL,sizeof(float)*EHMER_MAX);
- memcpy(p->tonecurves[0][8]+2,tone_125_80dB_SL,sizeof(float)*EHMER_MAX);
- memcpy(p->tonecurves[0][10]+2,tone_125_100dB_SL,sizeof(float)*EHMER_MAX);
- memcpy(p->tonecurves[2][4]+2,tone_125_40dB_SL,sizeof(float)*EHMER_MAX);
- memcpy(p->tonecurves[2][6]+2,tone_125_60dB_SL,sizeof(float)*EHMER_MAX);
- memcpy(p->tonecurves[2][8]+2,tone_125_80dB_SL,sizeof(float)*EHMER_MAX);
- memcpy(p->tonecurves[2][10]+2,tone_125_100dB_SL,sizeof(float)*EHMER_MAX);
- memcpy(p->tonecurves[4][4]+2,tone_250_40dB_SL,sizeof(float)*EHMER_MAX);
- memcpy(p->tonecurves[4][6]+2,tone_250_60dB_SL,sizeof(float)*EHMER_MAX);
- memcpy(p->tonecurves[4][8]+2,tone_250_80dB_SL,sizeof(float)*EHMER_MAX);
- memcpy(p->tonecurves[4][10]+2,tone_250_100dB_SL,sizeof(float)*EHMER_MAX);
- memcpy(p->tonecurves[6][4]+2,tone_500_40dB_SL,sizeof(float)*EHMER_MAX);
- memcpy(p->tonecurves[6][6]+2,tone_500_60dB_SL,sizeof(float)*EHMER_MAX);
- memcpy(p->tonecurves[6][8]+2,tone_500_80dB_SL,sizeof(float)*EHMER_MAX);
- memcpy(p->tonecurves[6][10]+2,tone_500_100dB_SL,sizeof(float)*EHMER_MAX);
- memcpy(p->tonecurves[8][4]+2,tone_1000_40dB_SL,sizeof(float)*EHMER_MAX);
- memcpy(p->tonecurves[8][6]+2,tone_1000_60dB_SL,sizeof(float)*EHMER_MAX);
- memcpy(p->tonecurves[8][8]+2,tone_1000_80dB_SL,sizeof(float)*EHMER_MAX);
- memcpy(p->tonecurves[8][10]+2,tone_1000_100dB_SL,sizeof(float)*EHMER_MAX);
- memcpy(p->tonecurves[10][4]+2,tone_2000_40dB_SL,sizeof(float)*EHMER_MAX);
- memcpy(p->tonecurves[10][6]+2,tone_2000_60dB_SL,sizeof(float)*EHMER_MAX);
- memcpy(p->tonecurves[10][8]+2,tone_2000_80dB_SL,sizeof(float)*EHMER_MAX);
- memcpy(p->tonecurves[10][10]+2,tone_2000_100dB_SL,sizeof(float)*EHMER_MAX);
- memcpy(p->tonecurves[12][4]+2,tone_4000_40dB_SL,sizeof(float)*EHMER_MAX);
- memcpy(p->tonecurves[12][6]+2,tone_4000_60dB_SL,sizeof(float)*EHMER_MAX);
- memcpy(p->tonecurves[12][8]+2,tone_4000_80dB_SL,sizeof(float)*EHMER_MAX);
- memcpy(p->tonecurves[12][10]+2,tone_4000_100dB_SL,sizeof(float)*EHMER_MAX);
- memcpy(p->tonecurves[14][4]+2,tone_8000_40dB_SL,sizeof(float)*EHMER_MAX);
- memcpy(p->tonecurves[14][6]+2,tone_8000_60dB_SL,sizeof(float)*EHMER_MAX);
- memcpy(p->tonecurves[14][8]+2,tone_8000_80dB_SL,sizeof(float)*EHMER_MAX);
- memcpy(p->tonecurves[14][10]+2,tone_8000_100dB_SL,sizeof(float)*EHMER_MAX);
- memcpy(p->tonecurves[16][4]+2,tone_8000_40dB_SL,sizeof(float)*EHMER_MAX);
- memcpy(p->tonecurves[16][6]+2,tone_8000_60dB_SL,sizeof(float)*EHMER_MAX);
- memcpy(p->tonecurves[16][8]+2,tone_8000_80dB_SL,sizeof(float)*EHMER_MAX);
- memcpy(p->tonecurves[16][10]+2,tone_8000_100dB_SL,sizeof(float)*EHMER_MAX);
-
- for(i=1;i<P_BANDS;i+=2)
- for(j=4;j<P_LEVELS;j+=2){
- memcpy(p->tonecurves[i][j]+2,p->tonecurves[i-1][j]+2,EHMER_MAX*sizeof(float));
-
- min_curve(p->tonecurves[i][j]+2,p->tonecurves[i+1][j]+2);
- }
-
- for(i=0;i<P_BANDS;i++)
- setup_curve(p->tonecurves[i],i,vi->toneatt[i]);
-
- for(i=0;i<P_BANDS;i++)
- for(j=0;j<P_LEVELS;j++){
- p->peakatt[i][j]=p->vi->peakatt[i][j];
- }
-
- for(i=0;i<n;i++){
- float halfoc=toOC((i+.5)*rate/(2.*n))*2.+2.;
- int inthalfoc;
- float del;
-
- if(halfoc<0)halfoc=0;
- if(halfoc>=P_BANDS-1)halfoc=P_BANDS-1;
- inthalfoc=(int)halfoc;
- del=halfoc-inthalfoc;
- p->noisemedian[i]=rint(
- (p->vi->noisemedian[inthalfoc*2]*(1.-del) +
- p->vi->noisemedian[inthalfoc*2+2]*del)*1024.f);
- p->noiseoffset[i]=
- p->vi->noisemedian[inthalfoc*2+1]*(1.-del) +
- p->vi->noisemedian[inthalfoc*2+3]*del -
- 140.f;
- }
-
- }
- void _vp_psy_clear(vorbis_look_psy *p){
- int i,j;
- if(p){
- if(p->ath)_ogg_free(p->ath);
- if(p->octave)_ogg_free(p->octave);
- if(p->bark)_ogg_free(p->bark);
- if(p->tonecurves){
- for(i=0;i<P_BANDS;i++){
- for(j=0;j<P_LEVELS;j++){
- _ogg_free(p->tonecurves[i][j]);
- }
- _ogg_free(p->tonecurves[i]);
- _ogg_free(p->peakatt[i]);
- }
- _ogg_free(p->tonecurves);
- _ogg_free(p->noisemedian);
- _ogg_free(p->noiseoffset);
- _ogg_free(p->peakatt);
- }
- memset(p,0,sizeof(vorbis_look_psy));
- }
- }
- static void seed_curve(float *seed,
- const float **curves,
- float amp,
- int oc, int n,
- int linesper,float dBoffset){
- int i,post1;
- int seedptr;
- const float *posts,*curve;
- int choice=(int)((amp+dBoffset)*.1f);
- choice=max(choice,0);
- choice=min(choice,P_LEVELS-1);
- posts=curves[choice];
- curve=posts+2;
- post1=(int)posts[1];
- seedptr=oc+(posts[0]-16)*linesper-(linesper>>1);
- for(i=posts[0];i<post1;i++){
- if(seedptr>0){
- float lin=amp+curve[i];
- if(seed[seedptr]<lin)seed[seedptr]=lin;
- }
- seedptr+=linesper;
- if(seedptr>=n)break;
- }
- }
- static void seed_peak(float *seed,
- const float *att,
- float amp,
- int oc,
- int linesper,
- float dBoffset){
- long seedptr;
- int choice=(int)((amp+dBoffset)*.1f);
- choice=max(choice,0);
- choice=min(choice,P_LEVELS-1);
- seedptr=oc-(linesper>>1);
- amp+=att[choice];
- if(seed[seedptr]<amp)seed[seedptr]=amp;
- }
- static void seed_loop(vorbis_look_psy *p,
- const float ***curves,
- const float **att,
- const float *f,
- const float *flr,
- float *minseed,
- float *maxseed,
- float specmax){
- vorbis_info_psy *vi=p->vi;
- long n=p->n,i;
- float dBoffset=vi->max_curve_dB-specmax;
-
- for(i=0;i<n;i++){
- float max=f[i];
- long oc=p->octave[i];
- while(i+1<n && p->octave[i+1]==oc){
- i++;
- if(f[i]>max)max=f[i];
- }
- if(max>flr[i]){
- oc=oc>>p->shiftoc;
- if(oc>=P_BANDS)oc=P_BANDS-1;
- if(oc<0)oc=0;
- if(vi->tonemaskp)
- seed_curve(minseed,
- curves[oc],
- max,
- p->octave[i]-p->firstoc,
- p->total_octave_lines,
- p->eighth_octave_lines,
- dBoffset);
- if(vi->peakattp)
- seed_peak(maxseed,
- att[oc],
- max,
- p->octave[i]-p->firstoc,
- p->eighth_octave_lines,
- dBoffset);
- }
- }
- }
- static void bound_loop(vorbis_look_psy *p,
- float *f,
- float *seeds,
- float *flr,
- float att){
- long n=p->n,i;
- long off=(p->eighth_octave_lines>>1)+p->firstoc;
- long *ocp=p->octave;
- for(i=0;i<n;i++){
- long oc=ocp[i]-off;
- float v=f[i]+att;
- if(seeds[oc]<v)seeds[oc]=v;
- }
- }
- static void seed_chase(float *seeds, int linesper, long n){
- long *posstack=alloca(n*sizeof(long));
- float *ampstack=alloca(n*sizeof(float));
- long stack=0;
- long pos=0;
- long i;
- for(i=0;i<n;i++){
- if(stack<2){
- posstack[stack]=i;
- ampstack[stack++]=seeds[i];
- }else{
- while(1){
- if(seeds[i]<ampstack[stack-1]){
- posstack[stack]=i;
- ampstack[stack++]=seeds[i];
- break;
- }else{
- if(i<posstack[stack-1]+linesper){
- if(stack>1 && ampstack[stack-1]<=ampstack[stack-2] &&
- i<posstack[stack-2]+linesper){
-
- stack--;
- continue;
- }
- }
- posstack[stack]=i;
- ampstack[stack++]=seeds[i];
- break;
- }
- }
- }
- }
-
- for(i=0;i<stack;i++){
- long endpos;
- if(i<stack-1 && ampstack[i+1]>ampstack[i]){
- endpos=posstack[i+1];
- }else{
- endpos=posstack[i]+linesper+1;
- }
- if(endpos>n)endpos=n;
- for(;pos<endpos;pos++)
- seeds[pos]=ampstack[i];
- }
-
-
- }
- static void max_seeds(vorbis_look_psy *p,float *minseed,float *maxseed,
- float *flr){
- long n=p->total_octave_lines;
- int linesper=p->eighth_octave_lines;
- long linpos=0;
- long pos;
- seed_chase(minseed,linesper,n);
- seed_chase(maxseed,linesper,n);
-
- pos=p->octave[0]-p->firstoc-(linesper>>1);
- while(linpos+1<p->n){
- float min=minseed[pos];
- float max=maxseed[pos];
- long end=((p->octave[linpos]+p->octave[linpos+1])>>1)-p->firstoc;
- while(pos+1<=end){
- pos++;
- if((minseed[pos]>NEGINF && minseed[pos]<min) || min==NEGINF)
- min=minseed[pos];
- if(maxseed[pos]>max)max=maxseed[pos];
- }
- if(max<min)max=min;
-
-
- end=pos+p->firstoc;
- for(;linpos<p->n && p->octave[linpos]<=end;linpos++)
- if(flr[linpos]<max)flr[linpos]=max;
- }
-
- {
- float min=minseed[p->total_octave_lines-1];
- float max=maxseed[p->total_octave_lines-1];
- if(max<min)max=min;
- for(;linpos<p->n;linpos++)
- if(flr[linpos]<max)flr[linpos]=max;
- }
-
- }
- #define BINCOUNT 280
- #define LASTBIN (BINCOUNT-1)
- static int psy_dBquant(const float *x){
- int i= *x*2.f+279.5f;
- if(i>279)return(279);
- if(i<0)return(0);
- return i;
- }
- static void bark_noise_median(int n,const long *b,const float *f,
- float *noise,
- float lowidth,float hiwidth,
- int lomin,int himin,
- const int *thresh,const float *off,
- int fixed){
- int i=0,lo=-1,hi=-1,fixedc=0;
- int median=LASTBIN>>1;
- int barkradix[BINCOUNT];
- int barkcountbelow=0;
- int fixedradix[BINCOUNT];
- int fixedcountbelow=0;
- memset(barkradix,0,sizeof(barkradix));
- if(fixed>0){
- memset(fixedradix,0,sizeof(fixedradix));
-
- for(i=0;i<(fixed>>1);i++){
- int bin=psy_dBquant(f+i);
- fixedradix[bin]++;
- fixedc++;
- if(bin<=median)
- fixedcountbelow++;
- }
- }
- for(i=0;i<n;i++){
-
- int bi=b[i]>>16;
- for(;hi<bi;hi++){
- int bin=psy_dBquant(f+hi);
- barkradix[bin]++;
- if(bin<=median)
- barkcountbelow++;
- }
- bi=b[i]&0xffff;
- for(;lo<bi;lo++){
- int bin=psy_dBquant(f+lo);
- barkradix[bin]--;
- if(bin<=median)
- barkcountbelow--;
- }
- if(fixed>0){
- bi=i+(fixed>>1);
- if(bi<n){
- int bin=psy_dBquant(f+bi);
- fixedradix[bin]++;
- fixedc++;
- if(bin<=median)
- fixedcountbelow++;
- }
-
- bi-=fixed;
- if(bi>=0){
- int bin=psy_dBquant(f+bi);
- fixedradix[bin]--;
- fixedc--;
- if(bin<=median)
- fixedcountbelow--;
- }
- }
-
- {
- int bark_th = (thresh[i]*(hi-lo)+512)/1024;
-
- if(fixed>0){
- int fixed_th = (thresh[i]*(fixedc)+512)/1024;
-
- while(bark_th>=barkcountbelow &&
- fixed_th>=fixedcountbelow
- ){
- median++;
- barkcountbelow+=barkradix[median];
- fixedcountbelow+=fixedradix[median];
- }
-
- while(bark_th<barkcountbelow ||
- fixed_th<fixedcountbelow
- ){
- barkcountbelow-=barkradix[median];
- fixedcountbelow-=fixedradix[median];
- median--;
- }
- }else{
- while(bark_th>=barkcountbelow){
- median++;
- barkcountbelow+=barkradix[median];
- }
-
- while(bark_th<barkcountbelow){
- barkcountbelow-=barkradix[median];
- median--;
- }
- }
- }
- noise[i]= (median+1)*.5f+off[i];
- }
- }
- float _vp_compute_mask(vorbis_look_psy *p,
- float *fft,
- float *mdct,
- float *mask,
- float specmax){
- int i,n=p->n;
- float localmax=NEGINF;
- static int seq=0;
- float *minseed=alloca(sizeof(float)*p->total_octave_lines);
- float *maxseed=alloca(sizeof(float)*p->total_octave_lines);
- for(i=0;i<p->total_octave_lines;i++)minseed[i]=maxseed[i]=NEGINF;
-
- for(i=0;i<n;i++)
- if(fft[i]>localmax)localmax=fft[i];
- if(specmax<localmax)specmax=localmax;
-
- if(p->vi->noisemaskp){
- bark_noise_median(n,p->bark,mdct,mask,
- p->vi->noisewindowlo,
- p->vi->noisewindowhi,
- p->vi->noisewindowlomin,
- p->vi->noisewindowhimin,
- p->noisemedian,
- p->noiseoffset,
- p->vi->noisewindowfixed);
-
- for(i=0;i<n;i++)
- if(mask[i]>specmax+p->vi->noisemaxsupp)
- mask[i]=specmax+p->vi->noisemaxsupp;
- _analysis_output("noise",seq,mask,n,0,0);
- }else{
- for(i=0;i<n;i++)mask[i]=NEGINF;
- }
-
- if(p->vi->ath){
- float att=localmax+p->vi->ath_adjatt;
- if(att<p->vi->ath_maxatt)att=p->vi->ath_maxatt;
- for(i=0;i<n;i++){
- float av=p->ath[i]+att;
- if(av>mask[i])mask[i]=av;
- }
- }
-
-
- seed_loop(p,
- (const float ***)p->tonecurves,
- (const float **)p->peakatt,fft,mask,minseed,maxseed,specmax);
- bound_loop(p,mdct,maxseed,mask,p->vi->bound_att_dB);
- max_seeds(p,minseed,maxseed,mask);
-
- for(i=0;i<n;i++)if(mdct[i]>=mask[i])break;
- if(i==n)
- for(i=0;i<n;i++)mask[i]=NEGINF;
- else
- for(i=0;i<n;i++)fft[i]=max(mdct[i],fft[i]);
- seq++;
- return(specmax);
- }
- float _vp_ampmax_decay(float amp,vorbis_dsp_state *vd){
- vorbis_info *vi=vd->vi;
- codec_setup_info *ci=vi->codec_setup;
- int n=ci->blocksizes[vd->W]/2;
- float secs=(float)n/vi->rate;
- amp+=secs*ci->ampmax_att_per_sec;
- if(amp<-9999)amp=-9999;
- return(amp);
- }
|