From 7a88cb2ce0b8589b8bab37e27454411a89520247 Mon Sep 17 00:00:00 2001 From: Monty Date: Fri, 15 Jun 2001 22:07:06 +0000 Subject: Restore the correct version; the default: bugfix commit and then partial rollback had removed a month's worth of changes. Monty svn path=/trunk/vorbis/; revision=1480 --- lib/floor1.c | 104 ++++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 70 insertions(+), 34 deletions(-) diff --git a/lib/floor1.c b/lib/floor1.c index fa274af0..241cb82a 100644 --- a/lib/floor1.c +++ b/lib/floor1.c @@ -11,7 +11,7 @@ ******************************************************************** function: floor backend 1 implementation - last mod: $Id: floor1.c,v 1.7 2001/06/15 21:15:39 xiphmont Exp $ + last mod: $Id: floor1.c,v 1.8 2001/06/15 22:07:06 xiphmont Exp $ ********************************************************************/ @@ -86,10 +86,10 @@ static void floor1_free_info(vorbis_info_floor *i){ static void floor1_free_look(vorbis_look_floor *i){ vorbis_look_floor1 *look=(vorbis_look_floor1 *)i; if(i){ - /*fprintf(stderr,"floor 1 bit usage: %ld:%ld:%ld (%ld/frame), mse:%gdB\n", + fprintf(stderr,"floor 1 bit usage: %ld:%ld:%ld (%ld/frame), mse:%gdB\n", look->postbits/look->seq,look->classbits/look->seq,look->subbits/look->seq, (look->postbits+look->subbits+look->classbits)/look->seq, - sqrt(look->mse/look->seq));*/ + sqrt(look->mse/look->seq)); memset(look,0,sizeof(vorbis_look_floor1)); free(i); @@ -382,6 +382,31 @@ static void render_line(int x0,int x1,int y0,int y1,float *d){ ady-=abs(base*adx); + d[x]*=FLOOR_fromdB_LOOKUP[y]; + while(++x=adx){ + err-=adx; + y+=sy; + }else{ + y+=base; + } + d[x]*=FLOOR_fromdB_LOOKUP[y]; + } +} + +static void render_line0(int x0,int x1,int y0,int y1,float *d){ + int dy=y1-y0; + int adx=x1-x0; + int ady=abs(dy); + int base=dy/adx; + int sy=(dy<0?base-1:base+1); + int x=x0; + int y=y0; + int err=0; + + ady-=abs(base*adx); + d[x]=FLOOR_fromdB_LOOKUP[y]; while(++xmult; + for(j=1;jforward_index[j]; if(!(fit_valueA[current]&0x8000)){ int hy=(fit_valueA[current]&0x7fff)*info->mult; hx=info->postlist[current]; - render_line(lx,hx,ly,hy,codedflr); + render_line0(lx,hx,ly,hy,codedflr); lx=hx; ly=hy; @@ -996,19 +1021,18 @@ static int floor1_forward(vorbis_block *vb,vorbis_look_floor *in, return(nonzero); } -static int floor1_inverse(vorbis_block *vb,vorbis_look_floor *in,float *out){ +static void *floor1_inverse1(vorbis_block *vb,vorbis_look_floor *in){ vorbis_look_floor1 *look=(vorbis_look_floor1 *)in; vorbis_info_floor1 *info=look->vi; - + codec_setup_info *ci=vb->vd->vi->codec_setup; - int n=ci->blocksizes[vb->mode]/2; int i,j,k; codebook *books=((backend_lookup_state *)(vb->vd->backend_state))-> fullbooks; /* unpack wrapped/predicted values from stream */ if(oggpack_read(&vb->opb,1)==1){ - int fit_value[VIF_POSIT+2]; + int *fit_value=_vorbis_block_alloc(vb,(look->posts)*sizeof(int)); fit_value[0]=oggpack_read(&vb->opb,ilog(look->quant_q-1)); fit_value[1]=oggpack_read(&vb->opb,ilog(look->quant_q-1)); @@ -1079,32 +1103,44 @@ static int floor1_inverse(vorbis_block *vb,vorbis_look_floor *in,float *out){ } - /* render the lines */ - { - int hx; - int lx=0; - int ly=fit_value[0]*info->mult; - for(j=1;jposts;j++){ - int current=look->forward_index[j]; - int hy=fit_value[current]&0x7fff; - if(hy==fit_value[current]){ + return(fit_value); + } + eop: + return(NULL); +} - hy*=info->mult; - hx=info->postlist[current]; - - render_line(lx,hx,ly,hy,out); - - lx=hx; - ly=hy; - } +static int floor1_inverse2(vorbis_block *vb,vorbis_look_floor *in,void *memo, + float *out){ + vorbis_look_floor1 *look=(vorbis_look_floor1 *)in; + vorbis_info_floor1 *info=look->vi; + + codec_setup_info *ci=vb->vd->vi->codec_setup; + int n=ci->blocksizes[vb->mode]/2; + int j; + + if(memo){ + /* render the lines */ + int *fit_value=(int *)memo; + int hx; + int lx=0; + int ly=fit_value[0]*info->mult; + for(j=1;jposts;j++){ + int current=look->forward_index[j]; + int hy=fit_value[current]&0x7fff; + if(hy==fit_value[current]){ + + hy*=info->mult; + hx=info->postlist[current]; + + render_line(lx,hx,ly,hy,out); + + lx=hx; + ly=hy; } - for(j=hx;j