1 /********************************************************************
3 * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
4 * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
5 * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
6 * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
8 * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 *
9 * by the Xiph.Org Foundation http://www.xiph.org/ *
11 ********************************************************************
13 function: floor backend 1 implementation
16 ********************************************************************/
22 #include "vorbis/codec.h"
23 #include "codec_internal.h"
31 #define floor1_rangedB 140 /* floor 1 fixed at -140dB to 0dB range */
33 typedef struct lsfit_acc{
45 /***********************************************/
47 static void floor1_free_info(vorbis_info_floor *i){
48 vorbis_info_floor1 *info=(vorbis_info_floor1 *)i;
50 memset(info,0,sizeof(*info));
55 static void floor1_free_look(vorbis_look_floor *i){
56 vorbis_look_floor1 *look=(vorbis_look_floor1 *)i;
58 /*fprintf(stderr,"floor 1 bit usage %f:%f (%f total)\n",
59 (float)look->phrasebits/look->frames,
60 (float)look->postbits/look->frames,
61 (float)(look->postbits+look->phrasebits)/look->frames);*/
63 memset(look,0,sizeof(*look));
68 static int ilog(unsigned int v){
77 static int ilog2(unsigned int v){
87 static void floor1_pack (vorbis_info_floor *i,oggpack_buffer *opb){
88 vorbis_info_floor1 *info=(vorbis_info_floor1 *)i;
92 int maxposit=info->postlist[1];
95 /* save out partitions */
96 oggpack_write(opb,info->partitions,5); /* only 0 to 31 legal */
97 for(j=0;j<info->partitions;j++){
98 oggpack_write(opb,info->partitionclass[j],4); /* only 0 to 15 legal */
99 if(maxclass<info->partitionclass[j])maxclass=info->partitionclass[j];
102 /* save out partition classes */
103 for(j=0;j<maxclass+1;j++){
104 oggpack_write(opb,info->class_dim[j]-1,3); /* 1 to 8 */
105 oggpack_write(opb,info->class_subs[j],2); /* 0 to 3 */
106 if(info->class_subs[j])oggpack_write(opb,info->class_book[j],8);
107 for(k=0;k<(1<<info->class_subs[j]);k++)
108 oggpack_write(opb,info->class_subbook[j][k]+1,8);
111 /* save out the post list */
112 oggpack_write(opb,info->mult-1,2); /* only 1,2,3,4 legal now */
113 oggpack_write(opb,ilog2(maxposit),4);
114 rangebits=ilog2(maxposit);
116 for(j=0,k=0;j<info->partitions;j++){
117 count+=info->class_dim[info->partitionclass[j]];
119 oggpack_write(opb,info->postlist[k+2],rangebits);
123 static int icomp(const void *a,const void *b){
124 return(**(int **)a-**(int **)b);
127 static vorbis_info_floor *floor1_unpack (vorbis_info *vi,oggpack_buffer *opb){
128 codec_setup_info *ci=vi->codec_setup;
129 int j,k,count=0,maxclass=-1,rangebits;
131 vorbis_info_floor1 *info=_ogg_calloc(1,sizeof(*info));
132 /* read partitions */
133 info->partitions=oggpack_read(opb,5); /* only 0 to 31 legal */
134 for(j=0;j<info->partitions;j++){
135 info->partitionclass[j]=oggpack_read(opb,4); /* only 0 to 15 legal */
136 if(maxclass<info->partitionclass[j])maxclass=info->partitionclass[j];
139 /* read partition classes */
140 for(j=0;j<maxclass+1;j++){
141 info->class_dim[j]=oggpack_read(opb,3)+1; /* 1 to 8 */
142 info->class_subs[j]=oggpack_read(opb,2); /* 0,1,2,3 bits */
143 if(info->class_subs[j]<0)
145 if(info->class_subs[j])info->class_book[j]=oggpack_read(opb,8);
146 if(info->class_book[j]<0 || info->class_book[j]>=ci->books)
148 for(k=0;k<(1<<info->class_subs[j]);k++){
149 info->class_subbook[j][k]=oggpack_read(opb,8)-1;
150 if(info->class_subbook[j][k]<-1 || info->class_subbook[j][k]>=ci->books)
155 /* read the post list */
156 info->mult=oggpack_read(opb,2)+1; /* only 1,2,3,4 legal now */
157 rangebits=oggpack_read(opb,4);
159 for(j=0,k=0;j<info->partitions;j++){
160 count+=info->class_dim[info->partitionclass[j]];
162 int t=info->postlist[k+2]=oggpack_read(opb,rangebits);
163 if(t<0 || t>=(1<<rangebits))
168 info->postlist[1]=1<<rangebits;
170 /* don't allow repeated values in post list as they'd result in
171 zero-length segments */
173 int *sortpointer[VIF_POSIT+2];
174 for(j=0;j<count+2;j++)sortpointer[j]=info->postlist+j;
175 qsort(sortpointer,count+2,sizeof(*sortpointer),icomp);
177 for(j=1;j<count+2;j++)
178 if(*sortpointer[j-1]==*sortpointer[j])goto err_out;
184 floor1_free_info(info);
188 static vorbis_look_floor *floor1_look(vorbis_dsp_state *vd,
189 vorbis_info_floor *in){
191 int *sortpointer[VIF_POSIT+2];
192 vorbis_info_floor1 *info=(vorbis_info_floor1 *)in;
193 vorbis_look_floor1 *look=_ogg_calloc(1,sizeof(*look));
197 look->n=info->postlist[1];
199 /* we drop each position value in-between already decoded values,
200 and use linear interpolation to predict each new value past the
201 edges. The positions are read in the order of the position
202 list... we precompute the bounding positions in the lookup. Of
203 course, the neighbors can change (if a position is declined), but
204 this is an initial mapping */
206 for(i=0;i<info->partitions;i++)n+=info->class_dim[info->partitionclass[i]];
210 /* also store a sorted position index */
211 for(i=0;i<n;i++)sortpointer[i]=info->postlist+i;
212 qsort(sortpointer,n,sizeof(*sortpointer),icomp);
214 /* points from sort order back to range number */
215 for(i=0;i<n;i++)look->forward_index[i]=sortpointer[i]-info->postlist;
216 /* points from range order to sorted position */
217 for(i=0;i<n;i++)look->reverse_index[look->forward_index[i]]=i;
218 /* we actually need the post values too */
219 for(i=0;i<n;i++)look->sorted_index[i]=info->postlist[look->forward_index[i]];
221 /* quantize values to multiplier spec */
223 case 1: /* 1024 -> 256 */
226 case 2: /* 1024 -> 128 */
229 case 3: /* 1024 -> 86 */
232 case 4: /* 1024 -> 64 */
237 /* discover our neighbors for decode where we don't use fit flags
238 (that would push the neighbors outward) */
244 int currentx=info->postlist[i+2];
246 int x=info->postlist[j];
247 if(x>lx && x<currentx){
251 if(x<hx && x>currentx){
256 look->loneighbor[i]=lo;
257 look->hineighbor[i]=hi;
263 static int render_point(int x0,int x1,int y0,int y1,int x){
264 y0&=0x7fff; /* mask off flag */
274 if(dy<0)return(y0-off);
279 static int vorbis_dBquant(const float *x){
280 int i= *x*7.3142857f+1023.5f;
281 if(i>1023)return(1023);
286 static const float FLOOR1_fromdB_LOOKUP[256]={
287 1.0649863e-07F, 1.1341951e-07F, 1.2079015e-07F, 1.2863978e-07F,
288 1.3699951e-07F, 1.4590251e-07F, 1.5538408e-07F, 1.6548181e-07F,
289 1.7623575e-07F, 1.8768855e-07F, 1.9988561e-07F, 2.128753e-07F,
290 2.2670913e-07F, 2.4144197e-07F, 2.5713223e-07F, 2.7384213e-07F,
291 2.9163793e-07F, 3.1059021e-07F, 3.3077411e-07F, 3.5226968e-07F,
292 3.7516214e-07F, 3.9954229e-07F, 4.2550680e-07F, 4.5315863e-07F,
293 4.8260743e-07F, 5.1396998e-07F, 5.4737065e-07F, 5.8294187e-07F,
294 6.2082472e-07F, 6.6116941e-07F, 7.0413592e-07F, 7.4989464e-07F,
295 7.9862701e-07F, 8.5052630e-07F, 9.0579828e-07F, 9.6466216e-07F,
296 1.0273513e-06F, 1.0941144e-06F, 1.1652161e-06F, 1.2409384e-06F,
297 1.3215816e-06F, 1.4074654e-06F, 1.4989305e-06F, 1.5963394e-06F,
298 1.7000785e-06F, 1.8105592e-06F, 1.9282195e-06F, 2.0535261e-06F,
299 2.1869758e-06F, 2.3290978e-06F, 2.4804557e-06F, 2.6416497e-06F,
300 2.8133190e-06F, 2.9961443e-06F, 3.1908506e-06F, 3.3982101e-06F,
301 3.6190449e-06F, 3.8542308e-06F, 4.1047004e-06F, 4.3714470e-06F,
302 4.6555282e-06F, 4.9580707e-06F, 5.2802740e-06F, 5.6234160e-06F,
303 5.9888572e-06F, 6.3780469e-06F, 6.7925283e-06F, 7.2339451e-06F,
304 7.7040476e-06F, 8.2047000e-06F, 8.7378876e-06F, 9.3057248e-06F,
305 9.9104632e-06F, 1.0554501e-05F, 1.1240392e-05F, 1.1970856e-05F,
306 1.2748789e-05F, 1.3577278e-05F, 1.4459606e-05F, 1.5399272e-05F,
307 1.6400004e-05F, 1.7465768e-05F, 1.8600792e-05F, 1.9809576e-05F,
308 2.1096914e-05F, 2.2467911e-05F, 2.3928002e-05F, 2.5482978e-05F,
309 2.7139006e-05F, 2.8902651e-05F, 3.0780908e-05F, 3.2781225e-05F,
310 3.4911534e-05F, 3.7180282e-05F, 3.9596466e-05F, 4.2169667e-05F,
311 4.4910090e-05F, 4.7828601e-05F, 5.0936773e-05F, 5.4246931e-05F,
312 5.7772202e-05F, 6.1526565e-05F, 6.5524908e-05F, 6.9783085e-05F,
313 7.4317983e-05F, 7.9147585e-05F, 8.4291040e-05F, 8.9768747e-05F,
314 9.5602426e-05F, 0.00010181521F, 0.00010843174F, 0.00011547824F,
315 0.00012298267F, 0.00013097477F, 0.00013948625F, 0.00014855085F,
316 0.00015820453F, 0.00016848555F, 0.00017943469F, 0.00019109536F,
317 0.00020351382F, 0.00021673929F, 0.00023082423F, 0.00024582449F,
318 0.00026179955F, 0.00027881276F, 0.00029693158F, 0.00031622787F,
319 0.00033677814F, 0.00035866388F, 0.00038197188F, 0.00040679456F,
320 0.00043323036F, 0.00046138411F, 0.00049136745F, 0.00052329927F,
321 0.00055730621F, 0.00059352311F, 0.00063209358F, 0.00067317058F,
322 0.00071691700F, 0.00076350630F, 0.00081312324F, 0.00086596457F,
323 0.00092223983F, 0.00098217216F, 0.0010459992F, 0.0011139742F,
324 0.0011863665F, 0.0012634633F, 0.0013455702F, 0.0014330129F,
325 0.0015261382F, 0.0016253153F, 0.0017309374F, 0.0018434235F,
326 0.0019632195F, 0.0020908006F, 0.0022266726F, 0.0023713743F,
327 0.0025254795F, 0.0026895994F, 0.0028643847F, 0.0030505286F,
328 0.0032487691F, 0.0034598925F, 0.0036847358F, 0.0039241906F,
329 0.0041792066F, 0.0044507950F, 0.0047400328F, 0.0050480668F,
330 0.0053761186F, 0.0057254891F, 0.0060975636F, 0.0064938176F,
331 0.0069158225F, 0.0073652516F, 0.0078438871F, 0.0083536271F,
332 0.0088964928F, 0.009474637F, 0.010090352F, 0.010746080F,
333 0.011444421F, 0.012188144F, 0.012980198F, 0.013823725F,
334 0.014722068F, 0.015678791F, 0.016697687F, 0.017782797F,
335 0.018938423F, 0.020169149F, 0.021479854F, 0.022875735F,
336 0.024362330F, 0.025945531F, 0.027631618F, 0.029427276F,
337 0.031339626F, 0.033376252F, 0.035545228F, 0.037855157F,
338 0.040315199F, 0.042935108F, 0.045725273F, 0.048696758F,
339 0.051861348F, 0.055231591F, 0.058820850F, 0.062643361F,
340 0.066714279F, 0.071049749F, 0.075666962F, 0.080584227F,
341 0.085821044F, 0.091398179F, 0.097337747F, 0.10366330F,
342 0.11039993F, 0.11757434F, 0.12521498F, 0.13335215F,
343 0.14201813F, 0.15124727F, 0.16107617F, 0.17154380F,
344 0.18269168F, 0.19456402F, 0.20720788F, 0.22067342F,
345 0.23501402F, 0.25028656F, 0.26655159F, 0.28387361F,
346 0.30232132F, 0.32196786F, 0.34289114F, 0.36517414F,
347 0.38890521F, 0.41417847F, 0.44109412F, 0.46975890F,
348 0.50028648F, 0.53279791F, 0.56742212F, 0.60429640F,
349 0.64356699F, 0.68538959F, 0.72993007F, 0.77736504F,
350 0.82788260F, 0.88168307F, 0.9389798F, 1.F,
353 static void render_line(int n, int x0,int x1,int y0,int y1,float *d){
358 int sy=(dy<0?base-1:base+1);
368 d[x]*=FLOOR1_fromdB_LOOKUP[y];
378 d[x]*=FLOOR1_fromdB_LOOKUP[y];
382 static void render_line0(int x0,int x1,int y0,int y1,int *d){
387 int sy=(dy<0?base-1:base+1);
407 /* the floor has already been filtered to only include relevant sections */
408 static int accumulate_fit(const float *flr,const float *mdct,
409 int x0, int x1,lsfit_acc *a,
410 int n,vorbis_info_floor1 *info){
413 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;
415 memset(a,0,sizeof(*a));
421 int quantized=vorbis_dBquant(flr+i);
423 if(mdct[i]+info->twofitatten>=flr[i]){
427 y2a += quantized*quantized;
434 y2b += quantized*quantized;
448 /* weight toward the actually used frequencies if we meet the threshhold */
450 int weight=nb*info->twofitweight/(na+1);
454 a->x2a=x2a*weight+x2b;
455 a->y2a=y2a*weight+y2b;
456 a->xya=xya*weight+xyb;
463 static int fit_line(lsfit_acc *a,int fits,int *y0,int *y1){
464 long x=0,y=0,x2=0,y2=0,xy=0,an=0,i;
466 long x1=a[fits-1].x1;
496 /* need 64 bit multiplies, which C doesn't give portably as int */
499 double denom=(an*fx2-fx*fx);
505 double a=(fy*fx2-fxy*fx)/denom;
506 double b=(an*fxy-fx*fy)/denom;
510 /* limit to our range! */
511 if(*y0>1023)*y0=1023;
512 if(*y1>1023)*y1=1023;
525 /*static void fit_line_point(lsfit_acc *a,int fits,int *y0,int *y1){
529 for(i=0;i<fits && y==0;i++)
535 static int inspect_error(int x0,int x1,int y0,int y1,const float *mask,
537 vorbis_info_floor1 *info){
542 int sy=(dy<0?base-1:base+1);
546 int val=vorbis_dBquant(mask+x);
555 if(mdct[x]+info->twofitatten>=mask[x]){
556 if(y+info->maxover<val)return(1);
557 if(y-info->maxunder>val)return(1);
569 val=vorbis_dBquant(mask+x);
570 mse+=((y-val)*(y-val));
572 if(mdct[x]+info->twofitatten>=mask[x]){
574 if(y+info->maxover<val)return(1);
575 if(y-info->maxunder>val)return(1);
580 if(info->maxover*info->maxover/n>info->maxerr)return(0);
581 if(info->maxunder*info->maxunder/n>info->maxerr)return(0);
582 if(mse/n>info->maxerr)return(1);
586 static int post_Y(int *A,int *B,int pos){
592 return (A[pos]+B[pos])>>1;
595 int *floor1_fit(vorbis_block *vb,vorbis_look_floor1 *look,
596 const float *logmdct, /* in */
597 const float *logmask){
599 vorbis_info_floor1 *info=look->vi;
601 long posts=look->posts;
603 lsfit_acc fits[VIF_POSIT+1];
604 int fit_valueA[VIF_POSIT+2]; /* index by range list position */
605 int fit_valueB[VIF_POSIT+2]; /* index by range list position */
607 int loneighbor[VIF_POSIT+2]; /* sorted index of range list position (+2) */
608 int hineighbor[VIF_POSIT+2];
610 int memo[VIF_POSIT+2];
612 for(i=0;i<posts;i++)fit_valueA[i]=-200; /* mark all unused */
613 for(i=0;i<posts;i++)fit_valueB[i]=-200; /* mark all unused */
614 for(i=0;i<posts;i++)loneighbor[i]=0; /* 0 for the implicit 0 post */
615 for(i=0;i<posts;i++)hineighbor[i]=1; /* 1 for the implicit post at n */
616 for(i=0;i<posts;i++)memo[i]=-1; /* no neighbor yet */
618 /* quantize the relevant floor points and collect them into line fit
619 structures (one per minimal division) at the same time */
621 nonzero+=accumulate_fit(logmask,logmdct,0,n,fits,n,info);
623 for(i=0;i<posts-1;i++)
624 nonzero+=accumulate_fit(logmask,logmdct,look->sorted_index[i],
625 look->sorted_index[i+1],fits+i,
630 /* start by fitting the implicit base case.... */
633 fit_line(fits,posts-1,&y0,&y1);
640 /* Non degenerate case */
641 /* start progressive splitting. This is a greedy, non-optimal
642 algorithm, but simple and close enough to the best
644 for(i=2;i<posts;i++){
645 int sortpos=look->reverse_index[i];
646 int ln=loneighbor[sortpos];
647 int hn=hineighbor[sortpos];
649 /* eliminate repeat searches of a particular range with a memo */
651 /* haven't performed this error search yet */
652 int lsortpos=look->reverse_index[ln];
653 int hsortpos=look->reverse_index[hn];
657 /* A note: we want to bound/minimize *local*, not global, error */
658 int lx=info->postlist[ln];
659 int hx=info->postlist[hn];
660 int ly=post_Y(fit_valueA,fit_valueB,ln);
661 int hy=post_Y(fit_valueA,fit_valueB,hn);
663 if(ly==-1 || hy==-1){
667 if(inspect_error(lx,hx,ly,hy,logmask,logmdct,info)){
668 /* outside error bounds/begin search area. Split it. */
673 int ret0=fit_line(fits+lsortpos,sortpos-lsortpos,&ly0,&ly1);
674 int ret1=fit_line(fits+sortpos,hsortpos-sortpos,&hy0,&hy1);
689 /* store new edge values */
691 if(ln==0)fit_valueA[ln]=ly0;
695 if(hn==1)fit_valueB[hn]=hy1;
697 if(ly1>=0 || hy0>=0){
698 /* store new neighbor values */
699 for(j=sortpos-1;j>=0;j--)
700 if(hineighbor[j]==hn)
704 for(j=sortpos+1;j<posts;j++)
705 if(loneighbor[j]==ln)
719 output=_vorbis_block_alloc(vb,sizeof(*output)*posts);
721 output[0]=post_Y(fit_valueA,fit_valueB,0);
722 output[1]=post_Y(fit_valueA,fit_valueB,1);
724 /* fill in posts marked as not using a fit; we will zero
725 back out to 'unused' when encoding them so long as curve
726 interpolation doesn't force them into use */
727 for(i=2;i<posts;i++){
728 int ln=look->loneighbor[i-2];
729 int hn=look->hineighbor[i-2];
730 int x0=info->postlist[ln];
731 int x1=info->postlist[hn];
735 int predicted=render_point(x0,x1,y0,y1,info->postlist[i]);
736 int vx=post_Y(fit_valueA,fit_valueB,i);
738 if(vx>=0 && predicted!=vx){
741 output[i]= predicted|0x8000;
750 int *floor1_interpolate_fit(vorbis_block *vb,vorbis_look_floor1 *look,
755 long posts=look->posts;
759 output=_vorbis_block_alloc(vb,sizeof(*output)*posts);
761 /* overly simpleminded--- look again post 1.2 */
762 for(i=0;i<posts;i++){
763 output[i]=((65536-del)*(A[i]&0x7fff)+del*(B[i]&0x7fff)+32768)>>16;
764 if(A[i]&0x8000 && B[i]&0x8000)output[i]|=0x8000;
772 int floor1_encode(oggpack_buffer *opb,vorbis_block *vb,
773 vorbis_look_floor1 *look,
774 int *post,int *ilogmask){
777 vorbis_info_floor1 *info=look->vi;
778 long posts=look->posts;
779 codec_setup_info *ci=vb->vd->vi->codec_setup;
780 int out[VIF_POSIT+2];
781 static_codebook **sbooks=ci->book_param;
782 codebook *books=ci->fullbooks;
784 /* quantize values to multiplier spec */
786 for(i=0;i<posts;i++){
787 int val=post[i]&0x7fff;
789 case 1: /* 1024 -> 256 */
792 case 2: /* 1024 -> 128 */
795 case 3: /* 1024 -> 86 */
798 case 4: /* 1024 -> 64 */
802 post[i]=val | (post[i]&0x8000);
808 /* find prediction values for each post and subtract them */
809 for(i=2;i<posts;i++){
810 int ln=look->loneighbor[i-2];
811 int hn=look->hineighbor[i-2];
812 int x0=info->postlist[ln];
813 int x1=info->postlist[hn];
817 int predicted=render_point(x0,x1,y0,y1,info->postlist[i]);
819 if((post[i]&0x8000) || (predicted==post[i])){
820 post[i]=predicted|0x8000; /* in case there was roundoff jitter
824 int headroom=(look->quant_q-predicted<predicted?
825 look->quant_q-predicted:predicted);
827 int val=post[i]-predicted;
829 /* at this point the 'deviation' value is in the range +/- max
830 range, but the real, unique range can always be mapped to
831 only [0-maxrange). So we want to wrap the deviation into
832 this limited range, but do it in the way that least screws
833 an essentially gaussian probability distribution. */
852 /* we have everything we need. pack it out */
853 /* mark nontrivial floor */
854 oggpack_write(opb,1,1);
856 /* beginning/end post */
858 look->postbits+=ilog(look->quant_q-1)*2;
859 oggpack_write(opb,out[0],ilog(look->quant_q-1));
860 oggpack_write(opb,out[1],ilog(look->quant_q-1));
863 /* partition by partition */
864 for(i=0,j=2;i<info->partitions;i++){
865 int class=info->partitionclass[i];
866 int cdim=info->class_dim[class];
867 int csubbits=info->class_subs[class];
868 int csub=1<<csubbits;
869 int bookas[8]={0,0,0,0,0,0,0,0};
874 /* generate the partition's first stage cascade value */
878 int booknum=info->class_subbook[class][k];
882 maxval[k]=sbooks[info->class_subbook[class][k]]->entries;
893 cval|= bookas[k]<<cshift;
898 vorbis_book_encode(books+info->class_book[class],cval,opb);
904 sprintf(buffer,"line_%dx%ld_class%d.vqd",
905 vb->pcmend/2,posts-2,class);
906 of=fopen(buffer,"a");
907 fprintf(of,"%d\n",cval);
913 /* write post values */
915 int book=info->class_subbook[class][bookas[k]];
917 /* hack to allow training with 'bad' books */
918 if(out[j+k]<(books+book)->entries)
919 look->postbits+=vorbis_book_encode(books+book,
922 fprintf(stderr,"+!");*/
928 sprintf(buffer,"line_%dx%ld_%dsub%d.vqd",
929 vb->pcmend/2,posts-2,class,bookas[k]);
930 of=fopen(buffer,"a");
931 fprintf(of,"%d\n",out[j+k]);
941 /* generate quantized floor equivalent to what we'd unpack in decode */
942 /* render the lines */
945 int ly=post[0]*info->mult;
946 for(j=1;j<look->posts;j++){
947 int current=look->forward_index[j];
948 int hy=post[current]&0x7fff;
949 if(hy==post[current]){
952 hx=info->postlist[current];
954 render_line0(lx,hx,ly,hy,ilogmask);
960 for(j=hx;j<vb->pcmend/2;j++)ilogmask[j]=ly; /* be certain */
964 oggpack_write(opb,0,1);
965 memset(ilogmask,0,vb->pcmend/2*sizeof(*ilogmask));
970 static void *floor1_inverse1(vorbis_block *vb,vorbis_look_floor *in){
971 vorbis_look_floor1 *look=(vorbis_look_floor1 *)in;
972 vorbis_info_floor1 *info=look->vi;
973 codec_setup_info *ci=vb->vd->vi->codec_setup;
976 codebook *books=ci->fullbooks;
978 /* unpack wrapped/predicted values from stream */
979 if(oggpack_read(&vb->opb,1)==1){
980 int *fit_value=_vorbis_block_alloc(vb,(look->posts)*sizeof(*fit_value));
982 fit_value[0]=oggpack_read(&vb->opb,ilog(look->quant_q-1));
983 fit_value[1]=oggpack_read(&vb->opb,ilog(look->quant_q-1));
985 /* partition by partition */
986 for(i=0,j=2;i<info->partitions;i++){
987 int class=info->partitionclass[i];
988 int cdim=info->class_dim[class];
989 int csubbits=info->class_subs[class];
990 int csub=1<<csubbits;
993 /* decode the partition's first stage cascade value */
995 cval=vorbis_book_decode(books+info->class_book[class],&vb->opb);
997 if(cval==-1)goto eop;
1000 for(k=0;k<cdim;k++){
1001 int book=info->class_subbook[class][cval&(csub-1)];
1004 if((fit_value[j+k]=vorbis_book_decode(books+book,&vb->opb))==-1)
1013 /* unwrap positive values and reconsitute via linear interpolation */
1014 for(i=2;i<look->posts;i++){
1015 int predicted=render_point(info->postlist[look->loneighbor[i-2]],
1016 info->postlist[look->hineighbor[i-2]],
1017 fit_value[look->loneighbor[i-2]],
1018 fit_value[look->hineighbor[i-2]],
1020 int hiroom=look->quant_q-predicted;
1021 int loroom=predicted;
1022 int room=(hiroom<loroom?hiroom:loroom)<<1;
1023 int val=fit_value[i];
1030 val = -1-(val-hiroom);
1040 fit_value[i]=val+predicted;
1041 fit_value[look->loneighbor[i-2]]&=0x7fff;
1042 fit_value[look->hineighbor[i-2]]&=0x7fff;
1045 fit_value[i]=predicted|0x8000;
1056 static int floor1_inverse2(vorbis_block *vb,vorbis_look_floor *in,void *memo,
1058 vorbis_look_floor1 *look=(vorbis_look_floor1 *)in;
1059 vorbis_info_floor1 *info=look->vi;
1061 codec_setup_info *ci=vb->vd->vi->codec_setup;
1062 int n=ci->blocksizes[vb->W]/2;
1066 /* render the lines */
1067 int *fit_value=(int *)memo;
1070 int ly=fit_value[0]*info->mult;
1071 for(j=1;j<look->posts;j++){
1072 int current=look->forward_index[j];
1073 int hy=fit_value[current]&0x7fff;
1074 if(hy==fit_value[current]){
1077 hx=info->postlist[current];
1079 render_line(n,lx,hx,ly,hy,out);
1085 for(j=hx;j<n;j++)out[j]*=FLOOR1_fromdB_LOOKUP[ly]; /* be certain */
1088 memset(out,0,sizeof(*out)*n);
1093 const vorbis_func_floor floor1_exportbundle={
1094 &floor1_pack,&floor1_unpack,&floor1_look,&floor1_free_info,
1095 &floor1_free_look,&floor1_inverse1,&floor1_inverse2