21 #include "../ogg/ogg.h"
22 #include "../vorbis/codec.h"
31 #define floor1_rangedB 140
68 memset(info,0,
sizeof(*info));
81 memset(look,0,
sizeof(*look));
86 static int ilog(
unsigned int v){
95 static int ilog2(
unsigned int v){
121 for(j=0;j<maxclass+1;j++){
132 rangebits=ilog2(maxposit);
144 int j,k,count=0,maxclass=-1,rangebits;
155 for(j=0;j<maxclass+1;j++){
188 floor1_free_info(info);
192 static int icomp(
const void *
a,
const void *
b){
193 return(**(
int **)a-**(
int **)b);
219 for(i=0;i<n;i++)sortpointer[
i]=info->
postlist+
i;
220 qsort(sortpointer,n,
sizeof(*sortpointer),icomp);
255 if(x>lx && x<currentx){
271 static int render_point(
int x0,
int x1,
int y0,
int y1,
int x){
282 if(dy<0)
return(y0-off);
287 static int vorbis_dBquant(
const float *x){
288 int i= *x*7.3142857f+1023.5f;
289 if(i>1023)
return(1023);
294 static float FLOOR1_fromdB_LOOKUP[256]={
295 1.0649863e-07
F, 1.1341951e-07
F, 1.2079015e-07
F, 1.2863978e-07
F,
296 1.3699951e-07
F, 1.4590251e-07
F, 1.5538408e-07
F, 1.6548181e-07
F,
297 1.7623575e-07
F, 1.8768855e-07
F, 1.9988561e-07
F, 2.128753e-07
F,
298 2.2670913e-07
F, 2.4144197e-07
F, 2.5713223e-07
F, 2.7384213e-07
F,
299 2.9163793e-07
F, 3.1059021e-07
F, 3.3077411e-07
F, 3.5226968e-07
F,
300 3.7516214e-07
F, 3.9954229e-07
F, 4.2550680e-07
F, 4.5315863e-07
F,
301 4.8260743e-07
F, 5.1396998e-07
F, 5.4737065e-07
F, 5.8294187e-07
F,
302 6.2082472e-07
F, 6.6116941e-07
F, 7.0413592e-07
F, 7.4989464e-07
F,
303 7.9862701e-07
F, 8.5052630e-07
F, 9.0579828e-07
F, 9.6466216e-07
F,
304 1.0273513e-06
F, 1.0941144e-06
F, 1.1652161e-06
F, 1.2409384e-06
F,
305 1.3215816e-06
F, 1.4074654e-06
F, 1.4989305e-06
F, 1.5963394e-06
F,
306 1.7000785e-06
F, 1.8105592e-06
F, 1.9282195e-06
F, 2.0535261e-06
F,
307 2.1869758e-06
F, 2.3290978e-06
F, 2.4804557e-06
F, 2.6416497e-06
F,
308 2.8133190e-06
F, 2.9961443e-06
F, 3.1908506e-06
F, 3.3982101e-06
F,
309 3.6190449e-06
F, 3.8542308e-06
F, 4.1047004e-06
F, 4.3714470e-06
F,
310 4.6555282e-06
F, 4.9580707e-06
F, 5.2802740e-06
F, 5.6234160e-06
F,
311 5.9888572e-06
F, 6.3780469e-06
F, 6.7925283e-06
F, 7.2339451e-06
F,
312 7.7040476e-06
F, 8.2047000e-06
F, 8.7378876e-06
F, 9.3057248e-06
F,
313 9.9104632e-06
F, 1.0554501e-05
F, 1.1240392e-05
F, 1.1970856e-05
F,
314 1.2748789e-05
F, 1.3577278e-05
F, 1.4459606e-05
F, 1.5399272e-05
F,
315 1.6400004e-05
F, 1.7465768e-05
F, 1.8600792e-05
F, 1.9809576e-05
F,
316 2.1096914e-05
F, 2.2467911e-05
F, 2.3928002e-05
F, 2.5482978e-05
F,
317 2.7139006e-05
F, 2.8902651e-05
F, 3.0780908e-05
F, 3.2781225e-05
F,
318 3.4911534e-05
F, 3.7180282e-05
F, 3.9596466e-05
F, 4.2169667e-05
F,
319 4.4910090e-05
F, 4.7828601e-05
F, 5.0936773e-05
F, 5.4246931e-05
F,
320 5.7772202e-05
F, 6.1526565e-05
F, 6.5524908e-05
F, 6.9783085e-05
F,
321 7.4317983e-05
F, 7.9147585e-05
F, 8.4291040e-05
F, 8.9768747e-05
F,
322 9.5602426e-05
F, 0.00010181521F, 0.00010843174F, 0.00011547824F,
323 0.00012298267F, 0.00013097477F, 0.00013948625F, 0.00014855085F,
324 0.00015820453F, 0.00016848555F, 0.00017943469F, 0.00019109536F,
325 0.00020351382F, 0.00021673929F, 0.00023082423F, 0.00024582449F,
326 0.00026179955F, 0.00027881276F, 0.00029693158F, 0.00031622787F,
327 0.00033677814F, 0.00035866388F, 0.00038197188F, 0.00040679456F,
328 0.00043323036F, 0.00046138411F, 0.00049136745F, 0.00052329927F,
329 0.00055730621F, 0.00059352311F, 0.00063209358F, 0.00067317058F,
330 0.00071691700F, 0.00076350630F, 0.00081312324F, 0.00086596457F,
331 0.00092223983F, 0.00098217216F, 0.0010459992F, 0.0011139742F,
332 0.0011863665F, 0.0012634633F, 0.0013455702F, 0.0014330129F,
333 0.0015261382F, 0.0016253153F, 0.0017309374F, 0.0018434235F,
334 0.0019632195F, 0.0020908006F, 0.0022266726F, 0.0023713743F,
335 0.0025254795F, 0.0026895994F, 0.0028643847F, 0.0030505286F,
336 0.0032487691F, 0.0034598925F, 0.0036847358F, 0.0039241906F,
337 0.0041792066F, 0.0044507950F, 0.0047400328F, 0.0050480668F,
338 0.0053761186F, 0.0057254891F, 0.0060975636F, 0.0064938176F,
339 0.0069158225F, 0.0073652516F, 0.0078438871F, 0.0083536271F,
340 0.0088964928F, 0.009474637F, 0.010090352F, 0.010746080F,
341 0.011444421F, 0.012188144F, 0.012980198F, 0.013823725F,
342 0.014722068F, 0.015678791F, 0.016697687F, 0.017782797F,
343 0.018938423F, 0.020169149F, 0.021479854F, 0.022875735F,
344 0.024362330F, 0.025945531F, 0.027631618F, 0.029427276F,
345 0.031339626F, 0.033376252F, 0.035545228F, 0.037855157F,
346 0.040315199F, 0.042935108F, 0.045725273F, 0.048696758F,
347 0.051861348F, 0.055231591F, 0.058820850F, 0.062643361F,
348 0.066714279F, 0.071049749F, 0.075666962F, 0.080584227F,
349 0.085821044F, 0.091398179F, 0.097337747F, 0.10366330F,
350 0.11039993F, 0.11757434F, 0.12521498F, 0.13335215F,
351 0.14201813F, 0.15124727F, 0.16107617F, 0.17154380F,
352 0.18269168F, 0.19456402F, 0.20720788F, 0.22067342F,
353 0.23501402F, 0.25028656F, 0.26655159F, 0.28387361F,
354 0.30232132F, 0.32196786F, 0.34289114F, 0.36517414F,
355 0.38890521F, 0.41417847F, 0.44109412F, 0.46975890F,
356 0.50028648F, 0.53279791F, 0.56742212F, 0.60429640F,
357 0.64356699F, 0.68538959F, 0.72993007F, 0.77736504F,
358 0.82788260F, 0.88168307F, 0.9389798F, 1.F,
361 static void render_line(
int x0,
int x1,
int y0,
int y1,
float *d){
366 int sy=(dy<0?base-1:base+1);
373 d[
x]*=FLOOR1_fromdB_LOOKUP[
y];
382 d[
x]*=FLOOR1_fromdB_LOOKUP[
y];
386 static void render_line0(
int x0,
int x1,
int y0,
int y1,
int *d){
391 int sy=(dy<0?base-1:base+1);
412 static int accumulate_fit(
const float *flr,
const float *mdct,
416 int quantized=vorbis_dBquant(flr+x0);
418 long xa=0,ya=0,x2a=0,y2a=0,xya=0,na=0, xb=0,yb=0,x2b=0,y2b=0,xyb=0,nb=0;
420 memset(a,0,
sizeof(*a));
426 int quantized=vorbis_dBquant(flr+i);
432 y2a += quantized*quantized;
439 y2b += quantized*quantized;
459 a->
x2a=x2a*weight+x2b;
460 a->
y2a=y2a*weight+y2b;
461 a->
xya=xya*weight+xyb;
468 static void fit_line(
lsfit_acc *a,
int fits,
int *y0,
int *y1){
469 long x=0,y=0,
x2=0,
y2=0,xy=0,an=0,
i;
471 long x1=a[fits-1].
x1;
506 double denom=1./(an*fx2-fx*fx);
507 double a=(fy*fx2-fxy*fx)*denom;
508 double b=(an*fxy-fx*fy)*denom;
513 if(*y0>1023)*y0=1023;
514 if(*y1>1023)*y1=1023;
534 static int inspect_error(
int x0,
int x1,
int y0,
int y1,
const float *
mask,
541 int sy=(dy<0?base-1:base+1);
545 int val=vorbis_dBquant(mask+x);
555 if(y+info->
maxover<val)
return(1);
568 val=vorbis_dBquant(mask+x);
569 mse+=((y-val)*(y-val));
573 if(y+info->
maxover<val)
return(1);
581 if(mse/n>info->
maxerr)
return(1);
585 static int post_Y(
int *
A,
int *
B,
int pos){
591 return (A[pos]+B[pos])>>1;
597 const float *logmdct,
598 const float *logmask){
602 long posts=look->
posts;
613 for(i=0;i<posts;i++)fit_valueA[i]=-200;
614 for(i=0;i<posts;i++)fit_valueB[i]=-200;
615 for(i=0;i<posts;i++)loneighbor[i]=0;
616 for(i=0;i<posts;i++)hineighbor[i]=1;
617 for(i=0;i<posts;i++)memo[i]=-1;
622 nonzero+=accumulate_fit(logmask,logmdct,0,n,fits,n,info);
624 for(i=0;i<posts-1;i++)
625 nonzero+=accumulate_fit(logmask,logmdct,look->
sorted_index[i],
634 fit_line(fits,posts-1,&y0,&y1);
645 for(i=2;i<posts;i++){
647 int ln=loneighbor[sortpos];
648 int hn=hineighbor[sortpos];
661 int ly=post_Y(fit_valueA,fit_valueB,ln);
662 int hy=post_Y(fit_valueA,fit_valueB,hn);
664 if(ly==-1 || hy==-1){
668 if(inspect_error(lx,hx,ly,hy,logmask,logmdct,info)){
674 fit_line(fits+lsortpos,sortpos-lsortpos,&ly0,&ly1);
675 fit_line(fits+sortpos,hsortpos-sortpos,&hy0,&hy1);
679 if(ln==0)fit_valueA[ln]=ly0;
683 if(hn==1)fit_valueB[hn]=hy1;
685 if(ly1>=0 || hy0>=0){
687 for(j=sortpos-1;j>=0;j--)
688 if(hineighbor[j]==hn)
692 for(j=sortpos+1;j<posts;j++)
693 if(loneighbor[j]==ln)
710 output[0]=post_Y(fit_valueA,fit_valueB,0);
711 output[1]=post_Y(fit_valueA,fit_valueB,1);
716 for(i=2;i<posts;i++){
724 int predicted=render_point(x0,x1,y0,y1,info->
postlist[i]);
725 int vx=post_Y(fit_valueA,fit_valueB,i);
727 if(vx>=0 && predicted!=vx){
730 output[
i]= predicted|0x8000;
744 long posts=look->
posts;
750 for(i=0;i<posts;i++){
751 output[
i]=((65536-del)*(A[i]&0x7fff)+del*(B[
i]&0x7fff)+32768)>>16;
752 if(A[i]&0x8000 && B[i]&0x8000)output[
i]|=0x8000;
761 int *post,
int *ilogmask){
766 long posts=look->
posts;
775 for(i=0;i<posts;i++){
776 int val=post[
i]&0x7fff;
791 post[
i]=val | (post[
i]&0x8000);
798 for(i=2;i<posts;i++){
806 int predicted=render_point(x0,x1,y0,y1,info->
postlist[i]);
808 if((post[i]&0x8000) || (predicted==post[i])){
809 post[
i]=predicted|0x8000;
813 int headroom=(look->
quant_q-predicted<predicted?
814 look->
quant_q-predicted:predicted);
816 int val=post[
i]-predicted;
857 int csub=1<<csubbits;
858 int bookas[8]={0,0,0,0,0,0,0,0};
882 cval|= bookas[k]<<cshift;
893 sprintf(buffer,
"line_%dx%ld_class%d.vqd",
894 vb->
pcmend/2,posts-2,
class);
895 of=fopen(buffer,
"a");
896 fprintf(of,
"%d\n",cval);
907 if(out[j+k]<(books+book)->entries)
917 sprintf(buffer,
"line_%dx%ld_%dsub%d.vqd",
918 vb->
pcmend/2,posts-2,
class,bookas[k]);
919 of=fopen(buffer,
"a");
920 fprintf(of,
"%d\n",out[j+k]);
934 int ly=post[0]*info->
mult;
935 for(j=1;j<look->
posts;j++){
937 int hy=post[current]&0x7fff;
938 if(hy==post[current]){
943 render_line0(lx,hx,ly,hy,ilogmask);
949 for(j=hx;j<vb->
pcmend/2;j++)ilogmask[j]=ly;
955 memset(ilogmask,0,vb->
pcmend/2*
sizeof(*ilogmask));
981 int csub=1<<csubbits;
988 if(cval==-1)
goto eop;
1005 for(i=2;i<look->
posts;i++){
1011 int hiroom=look->
quant_q-predicted;
1012 int loroom=predicted;
1013 int room=(hiroom<loroom?hiroom:loroom)<<1;
1014 int val=fit_value[
i];
1021 val = -1-(val-hiroom);
1031 fit_value[
i]=val+predicted;
1036 fit_value[
i]=predicted|0x8000;
1058 int *fit_value=(
int *)memo;
1061 int ly=fit_value[0]*info->
mult;
1062 for(j=1;j<look->
posts;j++){
1064 int hy=fit_value[current]&0x7fff;
1065 if(hy==fit_value[current]){
1070 render_line(lx,hx,ly,hy,out);
1076 for(j=hx;j<
n;j++)out[j]*=FLOOR1_fromdB_LOOKUP[ly];
1079 memset(out,0,
sizeof(*out)*n);
1085 &floor1_pack,&floor1_unpack,&floor1_look,&floor1_free_info,
1086 &floor1_free_look,&floor1_inverse1,&floor1_inverse2
int class_subbook[VIF_CLASS][8]
static_codebook * book_param[256]
int vorbis_book_encode(codebook *book, int a, oggpack_buffer *b)
void oggpack_write(oggpack_buffer *b, unsigned long value, int bits)
int class_subs[VIF_CLASS]
int hineighbor[VIF_POSIT]
int reverse_index[VIF_POSIT+2]
vorbis_func_floor floor1_exportbundle
int partitionclass[VIF_PARTS]
int * floor1_fit(vorbis_block *vb, vorbis_look_floor1 *look, const float *logmdct, const float *logmask)
long vorbis_book_decode(codebook *book, oggpack_buffer *b)
int loneighbor[VIF_POSIT]
GLuint GLuint GLsizei count
int sorted_index[VIF_POSIT+2]
GLubyte GLubyte GLubyte a
GLdouble GLdouble GLdouble y2
int forward_index[VIF_POSIT+2]
static WindowRef ValidModeCallbackProc inCallback OSStatus err
struct lsfit_acc lsfit_acc
long oggpack_read(oggpack_buffer *b, int bits)
int class_book[VIF_CLASS]
int sprintf(idStr &string, const char *fmt,...)
int * floor1_interpolate_fit(vorbis_block *vb, vorbis_look_floor1 *look, int *A, int *B, int del)
int postlist[VIF_POSIT+2]
void * _vorbis_block_alloc(vorbis_block *vb, long bytes)
int floor1_encode(vorbis_block *vb, vorbis_look_floor1 *look, int *post, int *ilogmask)