X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=lib%2Fres0.c;h=6d623d730fbdc673aa8b3f015c5f9525f7e9e971;hb=018ca26dece618457dd13585cad52941193c4a25;hp=48caa27952795d05aeb4b2ea45d2b3be2a8a0474;hpb=2acdd3f5587ef35f5e71f46f8483877472388ef3;p=platform%2Fupstream%2Flibvorbis.git diff --git a/lib/res0.c b/lib/res0.c index 48caa27..6d623d7 100644 --- a/lib/res0.c +++ b/lib/res0.c @@ -5,13 +5,12 @@ * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2010 * * by the Xiph.Org Foundation http://www.xiph.org/ * * * ******************************************************************** function: residue backend 0, 1 and 2 implementation - last mod: $Id$ ********************************************************************/ @@ -31,13 +30,16 @@ #include "misc.h" #include "os.h" +//#define TRAIN_RES 1 +//#define TRAIN_RESAUX 1 + #if defined(TRAIN_RES) || defined (TRAIN_RESAUX) #include -#endif +#endif typedef struct { vorbis_info_residue0 *info; - + int parts; int stages; codebook *fullbooks; @@ -58,6 +60,7 @@ typedef struct { float training_min[8][64]; float tmin; float tmax; + int submap; #endif } vorbis_look_residue0; @@ -86,16 +89,16 @@ void res0_free_look(vorbis_look_residue *i){ char buffer[80]; FILE *of; codebook *statebook=look->partbooks[j][k]; - + /* long and short into the same bucket by current convention */ - sprintf(buffer,"res_part%d_pass%d.vqd",j,k); + sprintf(buffer,"res_sub%d_part%d_pass%d.vqd",look->submap,j,k); of=fopen(buffer,"a"); for(l=0;lentries;l++) fprintf(of,"%d:%ld\n",l,look->training_data[k][j][l]); - + fclose(of); - + /*fprintf(stderr,"%d(%.2f|%.2f) ",k, look->training_min[k][j],look->training_max[k][j]);*/ @@ -121,7 +124,7 @@ void res0_free_look(vorbis_look_residue *i){ "(%g/frame) \n",look->frames,look->phrasebits, look->resbitsflat, (look->phrasebits+look->resbitsflat)/(float)look->frames); - + for(j=0;jparts;j++){ long acc=0; fprintf(stderr,"\t[%d] == ",j); @@ -148,15 +151,6 @@ void res0_free_look(vorbis_look_residue *i){ } } -static int ilog(unsigned int v){ - int ret=0; - while(v){ - ret++; - v>>=1; - } - return(ret); -} - static int icount(unsigned int v){ int ret=0; while(v){ @@ -173,7 +167,7 @@ void res0_pack(vorbis_info_residue *vr,oggpack_buffer *opb){ oggpack_write(opb,info->begin,24); oggpack_write(opb,info->end,24); - oggpack_write(opb,info->grouping-1,24); /* residue vectors to group and + oggpack_write(opb,info->grouping-1,24); /* residue vectors to group and code with a partitioned book */ oggpack_write(opb,info->partitions-1,6); /* possible partition choices */ oggpack_write(opb,info->groupbook,8); /* group huffman book */ @@ -182,11 +176,11 @@ void res0_pack(vorbis_info_residue *vr,oggpack_buffer *opb){ bitmask of one indicates this partition class has bits to write this pass */ for(j=0;jpartitions;j++){ - if(ilog(info->secondstages[j])>3){ + if(ov_ilog(info->secondstages[j])>3){ /* yes, this is a minor hack due to not thinking ahead */ - oggpack_write(opb,info->secondstages[j],3); + oggpack_write(opb,info->secondstages[j],3); oggpack_write(opb,1,1); - oggpack_write(opb,info->secondstages[j]>>3,5); + oggpack_write(opb,info->secondstages[j]>>3,5); }else oggpack_write(opb,info->secondstages[j],4); /* trailing zero */ acc+=icount(info->secondstages[j]); @@ -208,16 +202,27 @@ vorbis_info_residue *res0_unpack(vorbis_info *vi,oggpack_buffer *opb){ info->partitions=oggpack_read(opb,6)+1; info->groupbook=oggpack_read(opb,8); + /* check for premature EOP */ + if(info->groupbook<0)goto errout; + for(j=0;jpartitions;j++){ int cascade=oggpack_read(opb,3); - if(oggpack_read(opb,1)) - cascade|=(oggpack_read(opb,5)<<3); + int cflag=oggpack_read(opb,1); + if(cflag<0) goto errout; + if(cflag){ + int c=oggpack_read(opb,5); + if(c<0) goto errout; + cascade|=(c<<3); + } info->secondstages[j]=cascade; acc+=icount(cascade); } - for(j=0;jbooklist[j]=oggpack_read(opb,8); + for(j=0;jbooklist[j]=book; + } if(info->groupbook>=ci->books)goto errout; for(j=0;jbook_param[info->groupbook]->entries; int dim = ci->book_param[info->groupbook]->dim; int partvals = 1; + if (dim<1) goto errout; while(dim>0){ partvals *= info->partitions; if(partvals > entries) goto errout; dim--; } + info->partvals = partvals; } return(info); @@ -263,7 +274,7 @@ vorbis_look_residue *res0_look(vorbis_dsp_state *vd, look->partbooks=_ogg_calloc(look->parts,sizeof(*look->partbooks)); for(j=0;jparts;j++){ - int stages=ilog(info->secondstages[j]); + int stages=ov_ilog(info->secondstages[j]); if(stages){ if(stages>maxstage)maxstage=stages; look->partbooks[j]=_ogg_calloc(stages,sizeof(*look->partbooks[j])); @@ -305,66 +316,77 @@ vorbis_look_residue *res0_look(vorbis_dsp_state *vd, } /* break an abstraction and copy some code for performance purposes */ -static int local_book_besterror(codebook *book,float *a){ - int dim=book->dim,i,k,o; - int best=0; - encode_aux_threshmatch *tt=book->c->thresh_tree; - - /* find the quant val of each scalar */ - for(k=0,o=dim;kthreshvals>>1; - - if(valquantthresh[i]){ - if(valquantthresh[i-1]){ - for(--i;i>0;--i) - if(val>=tt->quantthresh[i-1]) - break; - } - }else{ - - for(++i;ithreshvals-1;++i) - if(valquantthresh[i])break; - +static int local_book_besterror(codebook *book,int *a){ + int dim=book->dim; + int i,j,o; + int minval=book->minval; + int del=book->delta; + int qv=book->quantvals; + int ze=(qv>>1); + int index=0; + /* assumes integer/centered encoder codebook maptype 1 no more than dim 8 */ + int p[8]={0,0,0,0,0,0,0,0}; + + if(del!=1){ + for(i=0,o=dim;i>1))/del; + int m = (v=qv?qv-1:m)); + p[o]=v*del+minval; + } + }else{ + for(i=0,o=dim;i=qv?qv-1:m)); + p[o]=v*del+minval; } - - best=(best*tt->quantvals)+tt->quantmap[i]; } - /* regular lattices are easy :-) */ - - if(book->c->lengthlist[best]<=0){ + + if(book->c->lengthlist[index]<=0){ const static_codebook *c=book->c; - int i,j; - float bestf=0.f; - float *e=book->valuelist; - best=-1; + int best=-1; + /* assumes integer/centered encoder codebook maptype 1 no more than dim 8 */ + int e[8]={0,0,0,0,0,0,0,0}; + int maxval = book->minval + book->delta*(book->quantvals-1); for(i=0;ientries;i++){ if(c->lengthlist[i]>0){ - float this=0.f; + int this=0; for(j=0;j=maxval) + e[j++]=0; + if(e[j]>=0) + e[j]+=book->delta; + e[j]= -e[j]; } } - if(best>-1){ - float *ptr=book->valuelist+best*dim; + if(index>-1){ for(i=0;idim; int step=n/dim; @@ -373,19 +395,19 @@ static int _encodepart(oggpack_buffer *opb,float *vec, int n, int entry=local_book_besterror(book,vec+i*dim); #ifdef TRAIN_RES - if(entry>0) + if(entry>=0) acc[entry]++; #endif - + bits+=vorbis_book_encode(book,entry,opb); - + } return(bits); } static long **_01class(vorbis_block *vb,vorbis_look_residue *vl, - float **in,int ch){ + int **in,int ch){ long i,j,k; vorbis_look_residue0 *look=(vorbis_look_residue0 *)vl; vorbis_info_residue0 *info=look->info; @@ -394,45 +416,45 @@ static long **_01class(vorbis_block *vb,vorbis_look_residue *vl, int samples_per_partition=info->grouping; int possible_partitions=info->partitions; int n=info->end-info->begin; - + int partvals=n/samples_per_partition; long **partword=_vorbis_block_alloc(vb,ch*sizeof(*partword)); float scale=100./samples_per_partition; - + /* we find the partition type for each partition of each channel. We'll go back and do the interleaved encoding in a bit. For now, clarity */ - + for(i=0;ibegin; for(j=0;jmax)max=fabs(in[j][offset+k]); - ent+=fabs(rint(in[j][offset+k])); + if(abs(in[j][offset+k])>max)max=abs(in[j][offset+k]); + ent+=abs(in[j][offset+k]); } ent*=scale; - + for(k=0;kclassmetric1[k] && - (info->classmetric2[k]<0 || (int)entclassmetric2[k])) + (info->classmetric2[k]<0 || entclassmetric2[k])) break; - - partword[j][i]=k; + + partword[j][i]=k; } } - + #ifdef TRAIN_RESAUX { FILE *of; char buffer[80]; - + for(i=0;itrain_seq); of=fopen(buffer,"a"); @@ -444,14 +466,14 @@ static long **_01class(vorbis_block *vb,vorbis_look_residue *vl, } #endif look->frames++; - + return(partword); } /* designed for stereo or other modes where the partition size is an integer multiple of the number of channels encoded in the current submap */ -static long **_2class(vorbis_block *vb,vorbis_look_residue *vl,float **in, +static long **_2class(vorbis_block *vb,vorbis_look_residue *vl,int **in, int ch){ long i,j,k,l; vorbis_look_residue0 *look=(vorbis_look_residue0 *)vl; @@ -464,34 +486,34 @@ static long **_2class(vorbis_block *vb,vorbis_look_residue *vl,float **in, int partvals=n/samples_per_partition; long **partword=_vorbis_block_alloc(vb,sizeof(*partword)); - + #if defined(TRAIN_RES) || defined (TRAIN_RESAUX) FILE *of; char buffer[80]; #endif - - partword[0]=_vorbis_block_alloc(vb,n*ch/samples_per_partition*sizeof(*partword[0])); - memset(partword[0],0,n*ch/samples_per_partition*sizeof(*partword[0])); - + + partword[0]=_vorbis_block_alloc(vb,partvals*sizeof(*partword[0])); + memset(partword[0],0,partvals*sizeof(*partword[0])); + for(i=0,l=info->begin/ch;imagmax)magmax=fabs(in[0][l]); + if(abs(in[0][l])>magmax)magmax=abs(in[0][l]); for(k=1;kangmax)angmax=fabs(in[k][l]); - l++; + if(abs(in[k][l])>angmax)angmax=abs(in[k][l]); + l++; } - + for(j=0;jclassmetric1[j] && angmax<=info->classmetric2[j]) break; - + partword[0][i]=j; - - } - + + } + #ifdef TRAIN_RESAUX sprintf(buffer,"resaux_%d.vqd",look->train_seq); of=fopen(buffer,"a"); @@ -500,22 +522,33 @@ static long **_2class(vorbis_block *vb,vorbis_look_residue *vl,float **in, fprintf(of,"\n"); fclose(of); #endif - + look->frames++; - + return(partword); } static int _01forward(oggpack_buffer *opb, - vorbis_block *vb,vorbis_look_residue *vl, - float **in,int ch, + vorbis_look_residue *vl, + int **in,int ch, long **partword, - int (*encode)(oggpack_buffer *,float *,int, - codebook *,long *)){ +#ifdef TRAIN_RES + int (*encode)(oggpack_buffer *,int *,int, + codebook *,long *), + int submap +#else + int (*encode)(oggpack_buffer *,int *,int, + codebook *) +#endif +){ long i,j,k,s; vorbis_look_residue0 *look=(vorbis_look_residue0 *)vl; vorbis_info_residue0 *info=look->info; +#ifdef TRAIN_RES + look->submap=submap; +#endif + /* move all this setup out later */ int samples_per_partition=info->grouping; int possible_partitions=info->partitions; @@ -525,27 +558,27 @@ static int _01forward(oggpack_buffer *opb, int partvals=n/samples_per_partition; long resbits[128]; long resvals[128]; - + #ifdef TRAIN_RES for(i=0;ibegin;jbegin;jend;j++){ if(in[i][j]>look->tmax)look->tmax=in[i][j]; if(in[i][j]tmin)look->tmin=in[i][j]; } #endif - + memset(resbits,0,sizeof(resbits)); memset(resvals,0,sizeof(resvals)); - + /* we code the partition words for each channel, then the residual words for a partition per channel until we've written all the residual words for that partition word. Then write the next partition channel words... */ - + for(s=0;sstages;s++){ - + for(i=0;iphrasebook->entries) look->phrasebits+=vorbis_book_encode(look->phrasebook,val,opb); @@ -563,27 +596,26 @@ static int _01forward(oggpack_buffer *opb, else fprintf(stderr,"!"); #endif - + } } - + /* now we encode interleaved residual values for the partitions */ for(k=0;kbegin; - + for(j=0;jsecondstages[partword[j][i]]&(1<partbooks[partword[j][i]][s]; if(statebook){ int ret; - long *accumulator=NULL; - #ifdef TRAIN_RES + long *accumulator=NULL; accumulator=look->training_data[s][partword[j][i]]; { int l; - float *samples=in[j]+offset; + int *samples=in[j]+offset; for(l=0;ltraining_min[s][partword[j][i]]) look->training_min[s][partword[j][i]]=samples[l]; @@ -591,11 +623,13 @@ static int _01forward(oggpack_buffer *opb, look->training_max[s][partword[j][i]]=samples[l]; } } -#endif - ret=encode(opb,in[j]+offset,samples_per_partition, statebook,accumulator); - +#else + ret=encode(opb,in[j]+offset,samples_per_partition, + statebook); +#endif + look->postbits+=ret; resbits[partword[j][i]]+=ret; } @@ -604,19 +638,6 @@ static int _01forward(oggpack_buffer *opb, } } } - - /*{ - long total=0; - long totalbits=0; - fprintf(stderr,"%d :: ",vb->mode); - for(k=0;kpcmend>>1; int end=(info->endend:max); int n=end-info->begin; - + if(n>0){ int partvals=n/samples_per_partition; int partwords=(partvals+partitions_per_word-1)/partitions_per_word; int ***partword=alloca(ch*sizeof(*partword)); - + for(j=0;jstages;s++){ - - /* each loop decodes on partition codeword containing + + /* each loop decodes on partition codeword containing partitions_per_word partitions */ for(i=0,l=0;iphrasebook,&vb->opb); - - if(temp==-1)goto eopbreak; + + if(temp==-1 || temp>=info->partvals)goto eopbreak; partword[j][l]=look->decodemap[temp]; if(partword[j][l]==NULL)goto errout; } } - + /* now we decode residual values for the partitions */ for(k=0;kpcmend/2; - for(i=0;ipcmend/2; + int **in,int *nonzero,int ch, long **partword, int submap){ + int i,used=0; + (void)vb; for(i=0;ipcmend/2,used=0; /* don't duplicate the code; use a working vector hack for now and reshape ourselves into a single channel res1 */ /* ugly; reallocs for each coupling pass :-( */ - float *work=_vorbis_block_alloc(vb,ch*n*sizeof(*work)); + int *work=_vorbis_block_alloc(vb,ch*n*sizeof(*work)); for(i=0;istages;s++){ for(i=0,l=0;iphrasebook,&vb->opb); - if(temp==-1)goto eopbreak; + if(temp==-1 || temp>=info->partvals)goto eopbreak; partword[l]=look->decodemap[temp]; if(partword[l]==NULL)goto errout; } - + /* now we decode residual values for the partitions */ for(k=0;ksecondstages[partword[l][k]]&(1<partbooks[partword[l][k]][s]; - + if(stagebook){ if(vorbis_book_decodevv_add(stagebook,in, i*samples_per_partition+info->begin,ch, @@ -889,7 +846,7 @@ int res2_inverse(vorbis_block *vb,vorbis_look_residue *vl, goto eopbreak; } } - } + } } } errout: @@ -930,4 +887,3 @@ const vorbis_func_residue residue2_exportbundle={ &res2_forward, &res2_inverse }; -