32 #define NEGINF -9999.f
50 memset(look,0,
sizeof(*look));
77 for(i=0;i<EHMER_MAX;i++)if(c2[i]>c[
i])c[i]=c2[i];
87 float center_boost,
float center_decay_rate){
92 float *brute_buffer=alloca(n*
sizeof(*brute_buffer));
96 memset(workc,0,
sizeof(workc));
110 if(min>
ATH[j+k+ath_offset])min=
ATH[j+k+ath_offset];
127 float adj=center_boost+abs(
EHMER_OFFSET-k)*center_decay_rate;
128 if(adj<0. && center_boost>0)adj=0.;
129 if(adj>0. && center_boost<0)adj=0.;
138 memcpy(athc[j],ath,EHMER_MAX*
sizeof(**athc));
160 int hi_curve,lo_curve,bin;
174 lo_curve= ceil(
toOC(bin*binHz+1)*2);
176 if(lo_curve>i)lo_curve=
i;
177 if(lo_curve<0)lo_curve=0;
178 if(hi_curve>=P_BANDS)hi_curve=P_BANDS-1;
183 for(j=0;j<
n;j++)brute_buffer[j]=999.;
188 for(k=lo_curve;k<=hi_curve;k++){
192 int lo_bin=
fromOC(j*.125+k*.5-2.0625)/binHz;
193 int hi_bin=
fromOC(j*.125+k*.5-1.9375)/binHz+1;
195 if(lo_bin<0)lo_bin=0;
196 if(lo_bin>n)lo_bin=
n;
197 if(lo_bin<l)l=lo_bin;
198 if(hi_bin<0)hi_bin=0;
199 if(hi_bin>n)hi_bin=
n;
201 for(;l<hi_bin && l<
n;l++)
202 if(brute_buffer[l]>workc[k][m][j])
203 brute_buffer[
l]=workc[
k][
m][
j];
207 if(brute_buffer[l]>workc[k][m][EHMER_MAX-1])
208 brute_buffer[
l]=workc[
k][
m][EHMER_MAX-1];
217 int lo_bin=
fromOC(j*.125+i*.5-2.0625)/binHz;
218 int hi_bin=
fromOC(j*.125+i*.5-1.9375)/binHz+1;
220 if(lo_bin<0)lo_bin=0;
221 if(lo_bin>n)lo_bin=
n;
222 if(lo_bin<l)l=lo_bin;
223 if(hi_bin<0)hi_bin=0;
224 if(hi_bin>n)hi_bin=
n;
226 for(;l<hi_bin && l<
n;l++)
227 if(brute_buffer[l]>workc[k][m][j])
228 brute_buffer[
l]=workc[
k][
m][
j];
232 if(brute_buffer[l]>workc[k][m][EHMER_MAX-1])
233 brute_buffer[
l]=workc[
k][
m][EHMER_MAX-1];
239 int bin=
fromOC(j*.125+i*.5-2.)/binHz;
241 ret[
i][
m][j+2]=-999.;
244 ret[
i][
m][j+2]=-999.;
246 ret[
i][
m][j+2]=brute_buffer[bin];
253 if(ret[i][m][j+2]>-200.
f)
break;
256 for(j=EHMER_MAX-1;j>EHMER_OFFSET+1;j--)
257 if(ret[i][m][j+2]>-200.
f)
289 if(rate < 26000) p->
m_val = 0;
290 else if(rate < 38000) p->
m_val = .94;
291 else if(rate > 46000) p->
m_val = 1.275;
296 int endpos=rint(
fromOC((i+1)*.125-2.)*2*n/rate);
299 float delta=(
ATH[i+1]-base)/(endpos-j);
300 for(;j<endpos && j<
n;j++){
312 float bark=
toBARK(rate/(2*n)*i);
320 p->
bark[
i]=((lo-1)<<16)+(hi-1);
336 float halfoc=
toOC((i+.5)*rate/(2.*n))*2.;
340 if(halfoc<0)halfoc=0;
342 inthalfoc=(
int)halfoc;
343 del=halfoc-inthalfoc;
354 _analysis_output_always(
"noiseoff0",ls,p->
noiseoffset[0],n,1,0,0);
355 _analysis_output_always(
"noiseoff1",ls,p->
noiseoffset[1],n,1,0,0);
356 _analysis_output_always(
"noiseoff2",ls++,p->
noiseoffset[2],n,1,0,0);
388 const float **curves,
391 int linesper,
float dBoffset){
394 const float *posts,*curve;
397 choice=
max(choice,0);
399 posts=curves[choice];
402 seedptr=oc+(posts[0]-
EHMER_OFFSET)*linesper-(linesper>>1);
404 for(i=posts[0];i<post1;i++){
406 float lin=amp+curve[
i];
407 if(seed[seedptr]<lin)seed[seedptr]=lin;
415 const float ***curves,
431 if(f[
i]>max)max=f[
i];
452 long *posstack=alloca(n*
sizeof(*posstack));
453 float *ampstack=alloca(n*
sizeof(*ampstack));
461 ampstack[stack++]=seeds[
i];
464 if(seeds[i]<ampstack[stack-1]){
466 ampstack[stack++]=seeds[
i];
469 if(i<posstack[stack-1]+linesper){
470 if(stack>1 && ampstack[stack-1]<=ampstack[stack-2] &&
471 i<posstack[stack-2]+linesper){
478 ampstack[stack++]=seeds[
i];
489 for(i=0;i<stack;i++){
491 if(i<stack-1 && ampstack[i+1]>ampstack[i]){
492 endpos=posstack[i+1];
494 endpos=posstack[
i]+linesper+1;
497 if(endpos>n)endpos=
n;
498 for(;pos<endpos;pos++)
499 seeds[pos]=ampstack[i];
521 while(linpos+1<p->
n){
522 float minV=seed[pos];
527 if((seed[pos]>
NEGINF && seed[pos]<minV) || minV==
NEGINF)
532 for(;linpos<p->
n && p->
octave[linpos]<=
end;linpos++)
533 if(flr[linpos]<minV)flr[linpos]=minV;
538 for(;linpos<p->
n;linpos++)
539 if(flr[linpos]<minV)flr[linpos]=minV;
550 float *N=alloca(n*
sizeof(*N));
551 float *X=alloca(n*
sizeof(*N));
552 float *
XX=alloca(n*
sizeof(*N));
553 float *Y=alloca(n*
sizeof(*N));
554 float *XY=alloca(n*
sizeof(*N));
556 float tN, tX, tXX, tY, tXY;
566 tN = tX = tXX = tY = tXY = 0.f;
569 if (y < 1.f) y = 1.f;
583 for (i = 1, x = 1.f; i <
n; i++, x += 1.f) {
586 if (y < 1.f) y = 1.f;
603 for (i = 0, x = 0.f;; i++, x += 1.f) {
611 tXX = XX[
hi] + XX[-
lo];
613 tXY = XY[
hi] - XY[-
lo];
615 A = tY * tXX - tX * tXY;
616 B = tN * tXY - tX * tY;
617 D = tN * tXX - tX * tX;
625 for ( ;; i++, x += 1.f) {
633 tXX = XX[
hi] - XX[
lo];
635 tXY = XY[
hi] - XY[
lo];
637 A = tY * tXX - tX * tXY;
638 B = tN * tXY - tX * tY;
639 D = tN * tXX - tX * tX;
641 if (R < 0.f) R = 0.f;
645 for ( ; i <
n; i++, x += 1.f) {
648 if (R < 0.f) R = 0.f;
653 if (fixed <= 0)
return;
655 for (i = 0, x = 0.f;; i++, x += 1.f) {
662 tXX = XX[
hi] + XX[-
lo];
664 tXY = XY[
hi] - XY[-
lo];
667 A = tY * tXX - tX * tXY;
668 B = tN * tXY - tX * tY;
669 D = tN * tXX - tX * tX;
672 if (R - offset < noise[i]) noise[
i] = R -
offset;
674 for ( ;; i++, x += 1.f) {
682 tXX = XX[
hi] - XX[
lo];
684 tXY = XY[
hi] - XY[
lo];
686 A = tY * tXX - tX * tXY;
687 B = tN * tXY - tX * tY;
688 D = tN * tXX - tX * tX;
691 if (R - offset < noise[i]) noise[
i] = R -
offset;
693 for ( ; i <
n; i++, x += 1.f) {
695 if (R - offset < noise[i]) noise[
i] = R -
offset;
704 float *work=alloca(n*
sizeof(*work));
709 for(i=0;i<
n;i++)work[i]=logmdct[i]-logmask[i];
714 for(i=0;i<
n;i++)work[i]=logmdct[i]-work[i];
722 work2[
i]=logmask[
i]+work[
i];
726 _analysis_output(
"median2R",seq/2,work,n,1,0,0);
728 _analysis_output(
"median2L",seq/2,work,n,1,0,0);
731 _analysis_output(
"envelope2R",seq/2,work2,n,1,0,0);
733 _analysis_output(
"envelope2L",seq/2,work2,n,1,0,0);
739 int dB=logmask[
i]+.5;
750 float global_specmax,
751 float local_specmax){
764 logmask[i]=p->
ath[i]+att;
780 float de, coeffi, cx;
788 logmask[
i]=
max(val,tone[i]+toneatt);
800 if(offset_select == 1) {
802 val = val - logmdct[
i];
807 de = 1.0-((val-coeffi)*0.005*cx);
814 if(de < 0) de = 0.0001;
818 de = 1.0-((val-coeffi)*0.0003*cx);
836 float secs=(float)n/vi->
rate;
839 if(amp<-9999)amp=-9999;
844 1.0649863e-07
F, 1.1341951e-07
F, 1.2079015e-07
F, 1.2863978e-07
F,
845 1.3699951e-07
F, 1.4590251e-07
F, 1.5538408e-07
F, 1.6548181e-07
F,
846 1.7623575e-07
F, 1.8768855e-07
F, 1.9988561e-07
F, 2.128753e-07
F,
847 2.2670913e-07
F, 2.4144197e-07
F, 2.5713223e-07
F, 2.7384213e-07
F,
848 2.9163793e-07
F, 3.1059021e-07
F, 3.3077411e-07
F, 3.5226968e-07
F,
849 3.7516214e-07
F, 3.9954229e-07
F, 4.2550680e-07
F, 4.5315863e-07
F,
850 4.8260743e-07
F, 5.1396998e-07
F, 5.4737065e-07
F, 5.8294187e-07
F,
851 6.2082472e-07
F, 6.6116941e-07
F, 7.0413592e-07
F, 7.4989464e-07
F,
852 7.9862701e-07
F, 8.5052630e-07
F, 9.0579828e-07
F, 9.6466216e-07
F,
853 1.0273513e-06
F, 1.0941144e-06
F, 1.1652161e-06
F, 1.2409384e-06
F,
854 1.3215816e-06
F, 1.4074654e-06
F, 1.4989305e-06
F, 1.5963394e-06
F,
855 1.7000785e-06
F, 1.8105592e-06
F, 1.9282195e-06
F, 2.0535261e-06
F,
856 2.1869758e-06
F, 2.3290978e-06
F, 2.4804557e-06
F, 2.6416497e-06
F,
857 2.8133190e-06
F, 2.9961443e-06
F, 3.1908506e-06
F, 3.3982101e-06
F,
858 3.6190449e-06
F, 3.8542308e-06
F, 4.1047004e-06
F, 4.3714470e-06
F,
859 4.6555282e-06
F, 4.9580707e-06
F, 5.2802740e-06
F, 5.6234160e-06
F,
860 5.9888572e-06
F, 6.3780469e-06
F, 6.7925283e-06
F, 7.2339451e-06
F,
861 7.7040476e-06
F, 8.2047000e-06
F, 8.7378876e-06
F, 9.3057248e-06
F,
862 9.9104632e-06
F, 1.0554501e-05
F, 1.1240392e-05
F, 1.1970856e-05
F,
863 1.2748789e-05
F, 1.3577278e-05
F, 1.4459606e-05
F, 1.5399272e-05
F,
864 1.6400004e-05
F, 1.7465768e-05
F, 1.8600792e-05
F, 1.9809576e-05
F,
865 2.1096914e-05
F, 2.2467911e-05
F, 2.3928002e-05
F, 2.5482978e-05
F,
866 2.7139006e-05
F, 2.8902651e-05
F, 3.0780908e-05
F, 3.2781225e-05
F,
867 3.4911534e-05
F, 3.7180282e-05
F, 3.9596466e-05
F, 4.2169667e-05
F,
868 4.4910090e-05
F, 4.7828601e-05
F, 5.0936773e-05
F, 5.4246931e-05
F,
869 5.7772202e-05
F, 6.1526565e-05
F, 6.5524908e-05
F, 6.9783085e-05
F,
870 7.4317983e-05
F, 7.9147585e-05
F, 8.4291040e-05
F, 8.9768747e-05
F,
871 9.5602426e-05
F, 0.00010181521F, 0.00010843174F, 0.00011547824F,
872 0.00012298267F, 0.00013097477F, 0.00013948625F, 0.00014855085F,
873 0.00015820453F, 0.00016848555F, 0.00017943469F, 0.00019109536F,
874 0.00020351382F, 0.00021673929F, 0.00023082423F, 0.00024582449F,
875 0.00026179955F, 0.00027881276F, 0.00029693158F, 0.00031622787F,
876 0.00033677814F, 0.00035866388F, 0.00038197188F, 0.00040679456F,
877 0.00043323036F, 0.00046138411F, 0.00049136745F, 0.00052329927F,
878 0.00055730621F, 0.00059352311F, 0.00063209358F, 0.00067317058F,
879 0.00071691700F, 0.00076350630F, 0.00081312324F, 0.00086596457F,
880 0.00092223983F, 0.00098217216F, 0.0010459992F, 0.0011139742F,
881 0.0011863665F, 0.0012634633F, 0.0013455702F, 0.0014330129F,
882 0.0015261382F, 0.0016253153F, 0.0017309374F, 0.0018434235F,
883 0.0019632195F, 0.0020908006F, 0.0022266726F, 0.0023713743F,
884 0.0025254795F, 0.0026895994F, 0.0028643847F, 0.0030505286F,
885 0.0032487691F, 0.0034598925F, 0.0036847358F, 0.0039241906F,
886 0.0041792066F, 0.0044507950F, 0.0047400328F, 0.0050480668F,
887 0.0053761186F, 0.0057254891F, 0.0060975636F, 0.0064938176F,
888 0.0069158225F, 0.0073652516F, 0.0078438871F, 0.0083536271F,
889 0.0088964928F, 0.009474637F, 0.010090352F, 0.010746080F,
890 0.011444421F, 0.012188144F, 0.012980198F, 0.013823725F,
891 0.014722068F, 0.015678791F, 0.016697687F, 0.017782797F,
892 0.018938423F, 0.020169149F, 0.021479854F, 0.022875735F,
893 0.024362330F, 0.025945531F, 0.027631618F, 0.029427276F,
894 0.031339626F, 0.033376252F, 0.035545228F, 0.037855157F,
895 0.040315199F, 0.042935108F, 0.045725273F, 0.048696758F,
896 0.051861348F, 0.055231591F, 0.058820850F, 0.062643361F,
897 0.066714279F, 0.071049749F, 0.075666962F, 0.080584227F,
898 0.085821044F, 0.091398179F, 0.097337747F, 0.10366330F,
899 0.11039993F, 0.11757434F, 0.12521498F, 0.13335215F,
900 0.14201813F, 0.15124727F, 0.16107617F, 0.17154380F,
901 0.18269168F, 0.19456402F, 0.20720788F, 0.22067342F,
902 0.23501402F, 0.25028656F, 0.26655159F, 0.28387361F,
903 0.30232132F, 0.32196786F, 0.34289114F, 0.36517414F,
904 0.38890521F, 0.41417847F, 0.44109412F, 0.46975890F,
905 0.50028648F, 0.53279791F, 0.56742212F, 0.60429640F,
906 0.64356699F, 0.68538959F, 0.72993007F, 0.77736504F,
907 0.82788260F, 0.88168307F, 0.9389798F, 1.F,
912 float f1=**(
float**)a;
913 float f2=**(
float**)b;
914 return (f1<f2)-(f1>f2);
918 float *
floor,
int *flag,
int i,
int jn){
921 float point = j>=limit-i ? postpoint : prepoint;
922 float r =
fabs(mdct[j])/floor[
j];
937 float **sort = alloca(n*
sizeof(*sort));
947 for(j=0;j<
start;j++){
948 if(!flags || !flags[j]){
951 float ve = q[
j]/f[
j];
953 out[
j] = -rint(sqrt(ve));
955 out[
j] = rint(sqrt(ve));
961 if(!flags || !flags[j]){
964 float ve = q[
j]/f[
j];
970 if(ve<.25f && (!flags || j>=limit-i)){
976 out[
j] = -rint(sqrt(ve));
978 out[
j] = rint(sqrt(ve));
979 q[
j] = out[
j]*out[
j]*f[
j];
989 for(j=0;j<
count;j++){
1014 int sliding_lowpass,
1023 float de=0.1*p->
m_val;
1029 float **raw = alloca(ch*
sizeof(*raw));
1032 float **quant = alloca(ch*
sizeof(*quant));
1035 float **
floor = alloca(ch*
sizeof(*floor));
1038 int **flag = alloca(ch*
sizeof(*flag));
1041 int *
nz = alloca(ch*
sizeof(*nz));
1050 raw[0] = alloca(ch*partition*
sizeof(**raw));
1051 quant[0] = alloca(ch*partition*
sizeof(**quant));
1052 floor[0] = alloca(ch*partition*
sizeof(**floor));
1053 flag[0] = alloca(ch*partition*
sizeof(**flag));
1056 raw[
i] = &raw[0][partition*
i];
1057 quant[
i] = &quant[0][partition*
i];
1058 floor[
i] = &floor[0][partition*
i];
1059 flag[
i] = &flag[0][partition*
i];
1064 for(i=0;i<
n;i+=partition){
1065 int k,
j,jn = partition > n-i ? n-i : partition;
1068 memcpy(nz,nonzero,
sizeof(*nz)*ch);
1071 memset(flag[0],0,ch*partition*
sizeof(**flag));
1073 int *iout = &iwork[
k][
i];
1079 flag_lossless(limit,prepoint,postpoint,&mdct[k][i],floor[k],flag[k],i,jn);
1082 quant[
k][
j] = raw[
k][
j] = mdct[
k][i+
j]*mdct[
k][i+
j];
1083 if(mdct[k][i+j]<0.
f) raw[
k][
j]*=-1.f;
1084 floor[
k][
j]*=floor[
k][
j];
1091 floor[
k][
j] = 1
e-10
f;
1106 int *iM = &iwork[Mi][
i];
1107 int *iA = &iwork[Ai][
i];
1108 float *reM = raw[Mi];
1109 float *reA = raw[Ai];
1110 float *qeM = quant[Mi];
1111 float *qeA = quant[Ai];
1112 float *floorM = floor[Mi];
1113 float *floorA = floor[Ai];
1117 if(nz[Mi] || nz[Ai]){
1118 nz[Mi] = nz[Ai] = 1;
1122 if(j<sliding_lowpass-i){
1127 qeM[
j] = qeM[
j]+qeA[
j];
1136 iA[
j]=(A>0?A-B:B-A);
1138 iA[
j]=(B>0?A-B:B-A);
1143 if(iA[j]>=abs(iM[j])*2){
1155 qeM[
j] =
fabs(reM[j]);
1172 if(reM[j]+reA[j]<0){
1173 reM[
j] = - (qeM[
j] =
fabs(reM[j])+
fabs(reA[j]));
1175 reM[
j] = (qeM[
j] =
fabs(reM[j])+
fabs(reA[j]));
1185 floorM[
j]=floorA[
j]=floorM[
j]+floorA[
j];
1188 acc[track]=
noise_normalize(p,limit,raw[Mi],quant[Mi],floor[Mi],flag[Mi],acc[track],i,jn,iM);
static void seed_chase(float *seeds, int linesper, long n)
void _vi_gpsy_free(vorbis_info_psy_global *i)
static float FLOOR1_fromdB_LOOKUP[256]
static void max_seeds(vorbis_look_psy *p, float *seed, float *flr)
GLuint const GLfloat * val
void _vp_tonemask(vorbis_look_psy *p, float *logfft, float *logmask, float global_specmax, float local_specmax)
static float unitnorm(float x)
static float *** setup_tone_curves(float curveatt_dB[P_BANDS], float binHz, int n, float center_boost, float center_decay_rate)
void _vp_offset_and_mix(vorbis_look_psy *p, float *noise, float *tone, int offset_select, float *logmask, float *mdct, float *logmdct)
float _vp_ampmax_decay(float amp, vorbis_dsp_state *vd)
return Display return Display Bool Bool int int e
static void seed_loop(vorbis_look_psy *p, const float ***curves, const float *f, const float *flr, float *seed, float specmax)
static void attenuate_curve(float *c, float att)
static void flag_lossless(int limit, float prepoint, float postpoint, float *mdct, float *floor, int *flag, int i, int jn)
GLboolean GLboolean GLboolean GLboolean a
static void bark_noise_hybridmp(int n, const long *b, const float *f, float *noise, const float offset, const int fixed)
struct vorbis_info_psy * vi
float noiseoff[P_NOISECURVES][P_BANDS]
vorbis_look_psy_global * _vp_global_look(vorbis_info *vi)
void _vp_couple_quantize_normalize(int blobno, vorbis_info_psy_global *g, vorbis_look_psy *p, vorbis_info_mapping0 *vi, float **mdct, int **iwork, int *nonzero, int sliding_lowpass, int ch)
vorbis_info_psy_global * gi
static void max_curve(float *c, float *c2)
int coupling_postpointamp[PACKETBLOBS]
vorbis_info_psy_global psy_g_param
static void min_curve(float *c, float *c2)
void _vp_psy_clear(vorbis_look_psy *p)
void _vp_psy_init(vorbis_look_psy *p, vorbis_info_psy *vi, vorbis_info_psy_global *gi, int n, long rate)
static const float tonemasks[P_BANDS][6][EHMER_MAX]
#define NOISE_COMPAND_LEVELS
void _vi_psy_free(vorbis_info_psy *i)
float noisecompand[NOISE_COMPAND_LEVELS]
EGLSurface EGLint EGLint y
float tone_masteratt[P_NOISECURVES]
static const double stereo_threshholds_limited[]
int coupling_prepointamp[PACKETBLOBS]
GLenum GLsizei GLsizei GLsizei GLsizei GLbitfield flags
GLdouble GLdouble GLdouble GLdouble q
GLdouble GLdouble GLdouble r
GLdouble GLdouble GLdouble b
GLint GLint GLint GLint GLint w
static const double stereo_threshholds[]
static float noise_normalize(vorbis_look_psy *p, int limit, float *r, float *q, float *f, int *flags, float acc, int i, int n, int *out)
static void seed_curve(float *seed, const float **curves, float amp, int oc, int n, int linesper, float dBoffset)
void _vp_global_free(vorbis_look_psy_global *look)
static int apsort(const void *a, const void *b)
void _vp_noisemask(vorbis_look_psy *p, float *logmdct, float *logmask)
int coupling_pointlimit[2][PACKETBLOBS]
void qsort(void *base, size_t nmemb, size_t size, int(*compare)(const void *, const void *))