21 #include "../vorbis/codec.h"
32 #define NEGINF -9999.f
33 static double stereo_threshholds[]={0.0, .5, 1.0, 1.5, 2.5, 4.5, 8.5, 16.5, 9e10};
49 memset(look,0,
sizeof(*look));
56 memset(i,0,
sizeof(*i));
63 memset(i,0,
sizeof(*i));
68 static void min_curve(
float *
c,
73 static void max_curve(
float *c,
76 for(i=0;i<EHMER_MAX;i++)if(c2[i]>c[
i])c[i]=c2[i];
79 static void attenuate_curve(
float *c,
float att){
85 static float ***setup_tone_curves(
float curveatt_dB[
P_BANDS],
float binHz,
int n,
86 float center_boost,
float center_decay_rate){
91 float *brute_buffer=alloca(n*
sizeof(*brute_buffer));
95 memset(workc,0,
sizeof(workc));
109 if(min>ATH[j+k+ath_offset])min=ATH[j+k+ath_offset];
119 memcpy(workc[i][j+2],tonemasks[i][j],EHMER_MAX*
sizeof(*tonemasks[i][j]));
120 memcpy(workc[i][0],tonemasks[i][0],EHMER_MAX*
sizeof(*tonemasks[i][0]));
121 memcpy(workc[i][1],tonemasks[i][0],EHMER_MAX*
sizeof(*tonemasks[i][0]));
126 float adj=center_boost+abs(
EHMER_OFFSET-k)*center_decay_rate;
127 if(adj<0. && center_boost>0)adj=0.;
128 if(adj>0. && center_boost<0)adj=0.;
136 attenuate_curve(workc[i][j],curveatt_dB[i]+100.-(j<2?2:j)*10.-
P_LEVEL_0);
137 memcpy(athc[j],ath,EHMER_MAX*
sizeof(**athc));
138 attenuate_curve(athc[j],+100.-j*10.
f-
P_LEVEL_0);
139 max_curve(athc[j],workc[i][j]);
153 min_curve(athc[j],athc[j-1]);
154 min_curve(workc[i][j],athc[j]);
159 int hi_curve,lo_curve,bin;
172 bin=floor(
fromOC(i*.5)/binHz);
173 lo_curve= ceil(
toOC(bin*binHz+1)*2);
174 hi_curve= floor(
toOC((bin+1)*binHz)*2);
175 if(lo_curve>i)lo_curve=
i;
176 if(lo_curve<0)lo_curve=0;
177 if(hi_curve>=P_BANDS)hi_curve=P_BANDS-1;
182 for(j=0;j<
n;j++)brute_buffer[j]=999.;
187 for(k=lo_curve;k<=hi_curve;k++){
191 int lo_bin=
fromOC(j*.125+k*.5-2.0625)/binHz;
192 int hi_bin=
fromOC(j*.125+k*.5-1.9375)/binHz+1;
194 if(lo_bin<0)lo_bin=0;
195 if(lo_bin>n)lo_bin=
n;
196 if(lo_bin<l)l=lo_bin;
197 if(hi_bin<0)hi_bin=0;
198 if(hi_bin>n)hi_bin=
n;
200 for(;l<hi_bin && l<
n;l++)
201 if(brute_buffer[l]>workc[k][m][j])
202 brute_buffer[
l]=workc[k][m][
j];
206 if(brute_buffer[l]>workc[k][m][EHMER_MAX-1])
207 brute_buffer[
l]=workc[k][m][EHMER_MAX-1];
216 int lo_bin=
fromOC(j*.125+i*.5-2.0625)/binHz;
217 int hi_bin=
fromOC(j*.125+i*.5-1.9375)/binHz+1;
219 if(lo_bin<0)lo_bin=0;
220 if(lo_bin>n)lo_bin=
n;
221 if(lo_bin<l)l=lo_bin;
222 if(hi_bin<0)hi_bin=0;
223 if(hi_bin>n)hi_bin=
n;
225 for(;l<hi_bin && l<
n;l++)
226 if(brute_buffer[l]>workc[k][m][j])
227 brute_buffer[
l]=workc[k][m][
j];
231 if(brute_buffer[l]>workc[k][m][EHMER_MAX-1])
232 brute_buffer[
l]=workc[k][m][EHMER_MAX-1];
238 int bin=
fromOC(j*.125+i*.5-2.)/binHz;
240 ret[
i][m][j+2]=-999.;
243 ret[
i][m][j+2]=-999.;
245 ret[
i][m][j+2]=brute_buffer[bin];
252 if(ret[i][m][j+2]>-200.
f)
break;
255 for(j=EHMER_MAX-1;j>EHMER_OFFSET+1;j--)
256 if(ret[i][m][j+2]>-200.
f)
268 long i,
j,lo=-99,hi=1;
270 memset(p,0,
sizeof(*p));
289 int endpos=rint(
fromOC((i+1)*.125-2.)*2*n/rate);
292 float delta=(ATH[i+1]-base)/(endpos-j);
293 for(;j<endpos && j<
n;j++){
301 float bark=
toBARK(rate/(2*n)*i);
309 p->
bark[
i]=((lo-1)<<16)+(hi-1);
325 float halfoc=
toOC((i+.5)*rate/(2.*n))*2.;
329 if(halfoc<0)halfoc=0;
330 if(halfoc>=P_BANDS-1)halfoc=P_BANDS-1;
331 inthalfoc=(
int)halfoc;
332 del=halfoc-inthalfoc;
371 memset(p,0,
sizeof(*p));
376 static void seed_curve(
float *seed,
377 const float **curves,
380 int linesper,
float dBoffset){
383 const float *posts,*curve;
386 choice=
max(choice,0);
387 choice=
min(choice,P_LEVELS-1);
388 posts=curves[choice];
391 seedptr=oc+(posts[0]-
EHMER_OFFSET)*linesper-(linesper>>1);
393 for(i=posts[0];i<post1;i++){
395 float lin=amp+curve[
i];
396 if(seed[seedptr]<lin)seed[seedptr]=lin;
404 const float ***curves,
418 while(i+1<n && p->
octave[i+1]==oc){
420 if(f[i]>max)max=f[
i];
426 if(oc>=P_BANDS)oc=P_BANDS-1;
440 static void seed_chase(
float *seeds,
int linesper,
long n){
441 long *posstack=alloca(n*
sizeof(*posstack));
442 float *ampstack=alloca(n*
sizeof(*ampstack));
450 ampstack[stack++]=seeds[
i];
453 if(seeds[i]<ampstack[stack-1]){
455 ampstack[stack++]=seeds[
i];
458 if(i<posstack[stack-1]+linesper){
459 if(stack>1 && ampstack[stack-1]<=ampstack[stack-2] &&
460 i<posstack[stack-2]+linesper){
467 ampstack[stack++]=seeds[
i];
478 for(i=0;i<stack;i++){
480 if(i<stack-1 && ampstack[i+1]>ampstack[i]){
481 endpos=posstack[i+1];
483 endpos=posstack[
i]+linesper+1;
486 if(endpos>n)endpos=
n;
487 for(;pos<endpos;pos++)
488 seeds[pos]=ampstack[i];
506 seed_chase(seed,linesper,n);
510 while(linpos+1<p->
n){
511 float minV=seed[pos];
516 if((seed[pos]>
NEGINF && seed[pos]<minV) || minV==
NEGINF)
521 for(;linpos<p->
n && p->
octave[linpos]<=
end;linpos++)
522 if(flr[linpos]<minV)flr[linpos]=minV;
527 for(;linpos<p->
n;linpos++)
528 if(flr[linpos]<minV)flr[linpos]=minV;
533 static void bark_noise_hybridmp(
int n,
const long *
b,
539 float *
N=alloca(n*
sizeof(*N));
540 float *X=alloca(n*
sizeof(*N));
541 float *XX=alloca(n*
sizeof(*N));
542 float *Y=alloca(n*
sizeof(*N));
543 float *XY=alloca(n*
sizeof(*N));
545 float tN, tX, tXX, tY, tXY;
552 tN = tX = tXX = tY = tXY = 0.f;
555 if (y < 1.f) y = 1.f;
569 for (i = 1, x = 1.f; i <
n; i++, x += 1.f) {
572 if (y < 1.f) y = 1.f;
589 for (i = 0, x = 0.f;; i++, x += 1.f) {
597 tXX = XX[hi] + XX[-lo];
599 tXY = XY[hi] - XY[-lo];
601 A = tY * tXX - tX * tXY;
602 B = tN * tXY - tX * tY;
603 D = tN * tXX - tX * tX;
611 for ( ;; i++, x += 1.f) {
619 tXX = XX[hi] - XX[lo];
621 tXY = XY[hi] - XY[lo];
623 A = tY * tXX - tX * tXY;
624 B = tN * tXY - tX * tY;
625 D = tN * tXX - tX * tX;
627 if (R < 0.f) R = 0.f;
631 for ( ; i <
n; i++, x += 1.f) {
634 if (R < 0.f) R = 0.f;
639 if (fixed <= 0)
return;
641 for (i = 0, x = 0.f;; i++, x += 1.f) {
648 tXX = XX[hi] + XX[-lo];
650 tXY = XY[hi] - XY[-lo];
653 A = tY * tXX - tX * tXY;
654 B = tN * tXY - tX * tY;
655 D = tN * tXX - tX * tX;
658 if (R - offset < noise[i]) noise[
i] = R -
offset;
660 for ( ;; i++, x += 1.f) {
668 tXX = XX[hi] - XX[lo];
670 tXY = XY[hi] - XY[lo];
672 A = tY * tXX - tX * tXY;
673 B = tN * tXY - tX * tY;
674 D = tN * tXX - tX * tX;
677 if (R - offset < noise[i]) noise[
i] = R -
offset;
679 for ( ; i <
n; i++, x += 1.f) {
681 if (R - offset < noise[i]) noise[
i] = R -
offset;
685 static float FLOOR1_fromdB_INV_LOOKUP[256]={
686 0.F, 8.81683e+06
F, 8.27882e+06
F, 7.77365e+06
F,
687 7.29930e+06
F, 6.85389e+06
F, 6.43567e+06
F, 6.04296e+06
F,
688 5.67422e+06
F, 5.32798e+06
F, 5.00286e+06
F, 4.69759e+06
F,
689 4.41094e+06
F, 4.14178e+06
F, 3.88905e+06
F, 3.65174e+06
F,
690 3.42891e+06
F, 3.21968e+06
F, 3.02321e+06
F, 2.83873e+06
F,
691 2.66551e+06
F, 2.50286e+06
F, 2.35014e+06
F, 2.20673e+06
F,
692 2.07208e+06
F, 1.94564e+06
F, 1.82692e+06
F, 1.71544e+06
F,
693 1.61076e+06
F, 1.51247e+06
F, 1.42018e+06
F, 1.33352e+06
F,
694 1.25215e+06
F, 1.17574e+06
F, 1.10400e+06
F, 1.03663e+06
F,
695 973377.F, 913981.F, 858210.F, 805842.F,
696 756669.F, 710497.F, 667142.F, 626433.F,
697 588208.F, 552316.F, 518613.F, 486967.F,
698 457252.F, 429351.F, 403152.F, 378551.F,
699 355452.F, 333762.F, 313396.F, 294273.F,
700 276316.F, 259455.F, 243623.F, 228757.F,
701 214798.F, 201691.F, 189384.F, 177828.F,
702 166977.F, 156788.F, 147221.F, 138237.F,
703 129802.F, 121881.F, 114444.F, 107461.F,
704 100903.F, 94746.3F, 88964.9F, 83536.2F,
705 78438.8F, 73652.5F, 69158.2F, 64938.1F,
706 60975.6F, 57254.9F, 53761.2F, 50480.6F,
707 47400.3F, 44507.9F, 41792.0F, 39241.9F,
708 36847.3F, 34598.9F, 32487.7F, 30505.3F,
709 28643.8F, 26896.0F, 25254.8F, 23713.7F,
710 22266.7F, 20908.0F, 19632.2F, 18434.2F,
711 17309.4F, 16253.1F, 15261.4F, 14330.1F,
712 13455.7F, 12634.6F, 11863.7F, 11139.7F,
713 10460.0F, 9821.72F, 9222.39F, 8659.64F,
714 8131.23F, 7635.06F, 7169.17F, 6731.70F,
715 6320.93F, 5935.23F, 5573.06F, 5232.99F,
716 4913.67F, 4613.84F, 4332.30F, 4067.94F,
717 3819.72F, 3586.64F, 3367.78F, 3162.28F,
718 2969.31F, 2788.13F, 2617.99F, 2458.24F,
719 2308.24F, 2167.39F, 2035.14F, 1910.95F,
720 1794.35F, 1684.85F, 1582.04F, 1485.51F,
721 1394.86F, 1309.75F, 1229.83F, 1154.78F,
722 1084.32F, 1018.15F, 956.024F, 897.687F,
723 842.910F, 791.475F, 743.179F, 697.830F,
724 655.249F, 615.265F, 577.722F, 542.469F,
725 509.367F, 478.286F, 449.101F, 421.696F,
726 395.964F, 371.803F, 349.115F, 327.812F,
727 307.809F, 289.026F, 271.390F, 254.830F,
728 239.280F, 224.679F, 210.969F, 198.096F,
729 186.008F, 174.658F, 164.000F, 153.993F,
730 144.596F, 135.773F, 127.488F, 119.708F,
731 112.404F, 105.545F, 99.1046F, 93.0572F,
732 87.3788F, 82.0469F, 77.0404F, 72.3394F,
733 67.9252F, 63.7804F, 59.8885F, 56.2341F,
734 52.8027F, 49.5807F, 46.5553F, 43.7144F,
735 41.0470F, 38.5423F, 36.1904F, 33.9821F,
736 31.9085F, 29.9614F, 28.1332F, 26.4165F,
737 24.8045F, 23.2910F, 21.8697F, 20.5352F,
738 19.2822F, 18.1056F, 17.0008F, 15.9634F,
739 14.9893F, 14.0746F, 13.2158F, 12.4094F,
740 11.6522F, 10.9411F, 10.2735F, 9.64662F,
741 9.05798F, 8.50526F, 7.98626F, 7.49894F,
742 7.04135F, 6.61169F, 6.20824F, 5.82941F,
743 5.47370F, 5.13970F, 4.82607F, 4.53158F,
744 4.25507F, 3.99542F, 3.75162F, 3.52269F,
745 3.30774F, 3.10590F, 2.91638F, 2.73842F,
746 2.57132F, 2.41442F, 2.26709F, 2.12875F,
747 1.99885F, 1.87688F, 1.76236F, 1.65482F,
748 1.55384F, 1.45902F, 1.36999F, 1.28640F,
749 1.20790F, 1.13419F, 1.06499F, 1.F
756 int sliding_lowpass){
760 if(sliding_lowpass>n)sliding_lowpass=
n;
762 for(i=0;i<sliding_lowpass;i++){
764 mdct[
i]*FLOOR1_fromdB_INV_LOOKUP[codedflr[
i]];
776 float *work=alloca(n*
sizeof(*work));
778 bark_noise_hybridmp(n,p->
bark,logmdct,logmask,
781 for(i=0;i<
n;i++)work[i]=logmdct[i]-logmask[i];
783 bark_noise_hybridmp(n,p->
bark,work,logmask,0.,
786 for(i=0;i<
n;i++)work[i]=logmdct[i]-work[i];
794 work2[
i]=logmask[
i]+work[
i];
811 int dB=logmask[
i]+.5;
822 float global_specmax,
823 float local_specmax){
836 logmask[i]=p->
ath[i]+att;
839 seed_loop(p,(
const float ***)p->
tonecurves,logfft,logmask,seed,global_specmax);
840 max_seeds(p,seed,logmask);
855 logmask[
i]=
max(val,tone[i]+toneatt);
868 if(amp<-9999)amp=-9999;
872 static void couple_lossless(
float A,
float B,
873 float *qA,
float *qB){
874 int test1=fabs(*qA)>fabs(*qB);
875 test1-= fabs(*qA)<fabs(*qB);
877 if(!test1)test1=((fabs(A)>fabs(B))<<1)-1;
879 *qB=(*qA>0.f?*qA-*qB:*qB-*qA);
882 *qB=(*qB>0.f?*qA-*qB:*qB-*qA);
886 if(*qB>fabs(*qA)*1.9999f){
892 static float hypot_lookup[32]={
893 -0.009935, -0.011245, -0.012726, -0.014397,
894 -0.016282, -0.018407, -0.020800, -0.023494,
895 -0.026522, -0.029923, -0.033737, -0.038010,
896 -0.042787, -0.048121, -0.054064, -0.060671,
897 -0.068000, -0.076109, -0.085054, -0.094892,
898 -0.105675, -0.117451, -0.130260, -0.144134,
899 -0.159093, -0.175146, -0.192286, -0.210490,
900 -0.229718, -0.249913, -0.271001, -0.292893};
902 static void precomputed_couple_point(
float premag,
903 int floorA,
int floorB,
904 float *mag,
float *ang){
906 int test=(floorA>floorB)-1;
907 int offset=31-abs(floorA-floorB);
908 float floormag=hypot_lookup[((offset<0)-1)&
offset]+1.f;
910 floormag*=FLOOR1_fromdB_INV_LOOKUP[(floorB&
test)|(floorA&(~
test))];
912 *mag=premag*floormag;
922 static float dipole_hypot(
float a,
float b){
924 if(b>0.)
return sqrt(a*a+b*b);
925 if(a>-b)
return sqrt(a*a-b*b);
926 return -sqrt(b*b-a*a);
928 if(b<0.)
return -sqrt(a*a+b*b);
929 if(-a>b)
return -sqrt(a*a-b*b);
930 return sqrt(b*b-a*a);
932 static float round_hypot(
float a,
float b){
934 if(b>0.)
return sqrt(a*a+b*b);
935 if(a>-b)
return sqrt(a*a+b*b);
936 return -sqrt(b*b+a*a);
938 if(b<0.)
return -sqrt(a*a+b*b);
939 if(-a>b)
return -sqrt(a*a+b*b);
940 return sqrt(b*b+a*a);
959 ret[i][j]=dipole_hypot(mdctM[j],mdctA[j]);
961 ret[i][j]=round_hypot(mdctM[j],mdctA[j]);
968 static int apsort(
const void *a,
const void *b){
969 float f1=fabs(**(
float**)a);
970 float f2=fabs(**(
float**)b);
971 return (f1<f2)-(f1>f2);
984 float **work=alloca(
sizeof(*work)*partition);
989 for(j=0;j<
n;j+=partition){
990 for(k=0;k<partition;k++)work[k]=mags[i]+k+j;
991 qsort(work,partition,
sizeof(*work),apsort);
992 for(k=0;k<partition;k++)ret[i][k+j]=work[k]-mags[i];
1001 float *magnitudes,
int *sortedindex){
1005 float **work=alloca(
sizeof(*work)*partition);
1008 for(j=start;j<
n;j+=partition){
1009 if(j+partition>n)partition=n-
j;
1010 for(i=0;i<partition;i++)work[i]=magnitudes+i+j;
1011 qsort(work,partition,
sizeof(*work),apsort);
1012 for(i=0;i<partition;i++){
1013 sortedindex[i+j-
start]=work[
i]-magnitudes;
1019 float *
in,
float *out,
int *sortedindex){
1020 int flag=0,
i,j=0,n=p->
n;
1031 for(;j+partition<=
n;j+=partition){
1035 for(i=j;i<j+partition;i++)
1038 for(i=0;i<partition;i++){
1039 k=sortedindex[i+j-
start];
1041 if(in[k]*in[k]>=.25f){
1046 if(acc<vi->normal_thresh)
break;
1047 out[k]=unitnorm(in[k]);
1052 for(;i<partition;i++){
1053 k=sortedindex[i+j-
start];
1073 int sliding_lowpass){
1105 int pointlimit=limit;
1110 for(j=0;j<p->
n;j+=partition){
1113 for(k=0;k<partition;k++){
1116 if(l<sliding_lowpass){
1117 if((l>=limit && fabs(rM[l])<postpoint && fabs(rA[l])<postpoint) ||
1118 (fabs(rM[l])<prepoint && fabs(rA[l])<prepoint)){
1121 precomputed_couple_point(mag_memo[i][l],
1122 floorM[l],floorA[l],
1125 if(rint(qM[l])==0.f)acc+=qM[
l]*qM[
l];
1127 couple_lossless(rM[l],rA[l],qM+l,qA+l);
1137 int l=mag_sort[
i][j+k];
1138 if(l<sliding_lowpass && l>=pointlimit && rint(qM[l])==0.f){
1139 qM[
l]=unitnorm(qM[l]);
void _vi_gpsy_free(vorbis_info_psy_global *i)
int ** _vp_quantize_couple_sort(vorbis_block *vb, vorbis_look_psy *p, vorbis_info_mapping0 *vi, float **mags)
void _vp_tonemask(vorbis_look_psy *p, float *logfft, float *logmask, float global_specmax, float local_specmax)
void _analysis_output(char *base, int i, float *v, int n, int bark, int dB, ogg_int64_t off)
float _vp_ampmax_decay(float amp, vorbis_dsp_state *vd)
void _analysis_output_always(char *base, int i, float *v, int n, int bark, int dB, ogg_int64_t off)
void _vp_noise_normalize_sort(vorbis_look_psy *p, float *magnitudes, int *sortedindex)
struct vorbis_info_psy * vi
float noiseoff[P_NOISECURVES][P_BANDS]
void _vp_offset_and_mix(vorbis_look_psy *p, float *noise, float *tone, int offset_select, float *logmask)
void _vp_remove_floor(vorbis_look_psy *p, float *mdct, int *codedflr, float *residue, int sliding_lowpass)
vorbis_info_psy_global * gi
int coupling_postpointamp[PACKETBLOBS]
vorbis_info_psy_global psy_g_param
GLubyte GLubyte GLubyte GLubyte w
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)
#define NOISE_COMPAND_LEVELS
void _vi_psy_free(vorbis_info_psy *i)
float noisecompand[NOISE_COMPAND_LEVELS]
GLubyte GLubyte GLubyte a
void _vp_global_free(vorbis_look_psy_global *look)
void _vp_couple(int blobno, vorbis_info_psy_global *g, vorbis_look_psy *p, vorbis_info_mapping0 *vi, float **res, float **mag_memo, int **mag_sort, int **ifloor, int *nonzero, int sliding_lowpass)
float tone_masteratt[P_NOISECURVES]
int coupling_prepointamp[PACKETBLOBS]
vorbis_look_psy_global * _vp_global_look(vorbis_info *vi)
void _vp_noise_normalize(vorbis_look_psy *p, float *in, float *out, int *sortedindex)
float ** _vp_quantize_couple_memo(vorbis_block *vb, vorbis_info_psy_global *g, vorbis_look_psy *p, vorbis_info_mapping0 *vi, float **mdct)
void _vp_noisemask(vorbis_look_psy *p, float *logmdct, float *logmask)
int coupling_pointlimit[2][PACKETBLOBS]
void * _vorbis_block_alloc(vorbis_block *vb, long bytes)