vx32

Local 9vx git repository for patches.
git clone git://r-36.net/vx32
Log | Files | Refs

res0.c (23187B)


      1 /********************************************************************
      2  *                                                                  *
      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.       *
      7  *                                                                  *
      8  * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002             *
      9  * by the XIPHOPHORUS Company http://www.xiph.org/                  *
     10  *                                                                  *
     11  ********************************************************************
     12 
     13  function: residue backend 0, 1 and 2 implementation
     14  last mod: $Id: res0.c 1919 2005-07-24 14:18:04Z baford $
     15 
     16  ********************************************************************/
     17 
     18 /* Slow, slow, slow, simpleminded and did I mention it was slow?  The
     19    encode/decode loops are coded for clarity and performance is not
     20    yet even a nagging little idea lurking in the shadows.  Oh and BTW,
     21    it's slow. */
     22 
     23 #include <stdlib.h>
     24 #include <string.h>
     25 #include <math.h>
     26 #include <ogg/ogg.h>
     27 #include "vorbis/codec.h"
     28 #include "codec_internal.h"
     29 #include "registry.h"
     30 #include "codebook.h"
     31 #include "misc.h"
     32 #include "os.h"
     33 
     34 #ifdef TRAIN_RES
     35 #include <stdio.h>
     36 #endif 
     37 
     38 typedef struct {
     39   vorbis_info_residue0 *info;
     40   
     41   int         parts;
     42   int         stages;
     43   codebook   *fullbooks;
     44   codebook   *phrasebook;
     45   codebook ***partbooks;
     46 
     47   int         partvals;
     48   int       **decodemap;
     49 
     50   long      postbits;
     51   long      phrasebits;
     52   long      frames;
     53 
     54 #ifdef TRAIN_RES
     55   int        train_seq;
     56   long      *training_data[8][64];
     57   float      training_max[8][64];
     58   float      training_min[8][64];
     59   float     tmin;
     60   float     tmax;
     61 #endif
     62 
     63 } vorbis_look_residue0;
     64 
     65 void res0_free_info(vorbis_info_residue *i){
     66   vorbis_info_residue0 *info=(vorbis_info_residue0 *)i;
     67   if(info){
     68     memset(info,0,sizeof(*info));
     69     _ogg_free(info);
     70   }
     71 }
     72 
     73 void res0_free_look(vorbis_look_residue *i){
     74   int j;
     75   if(i){
     76 
     77     vorbis_look_residue0 *look=(vorbis_look_residue0 *)i;
     78 
     79 #ifdef TRAIN_RES
     80     {
     81       int j,k,l;
     82       for(j=0;j<look->parts;j++){
     83 	/*fprintf(stderr,"partition %d: ",j);*/
     84 	for(k=0;k<8;k++)
     85 	  if(look->training_data[k][j]){
     86 	    char buffer[80];
     87 	    FILE *of;
     88 	    codebook *statebook=look->partbooks[j][k];
     89 	    
     90 	    /* long and short into the same bucket by current convention */
     91 	    sprintf(buffer,"res_part%d_pass%d.vqd",j,k);
     92 	    of=fopen(buffer,"a");
     93 
     94 	    for(l=0;l<statebook->entries;l++)
     95 	      fprintf(of,"%d:%ld\n",l,look->training_data[k][j][l]);
     96 	    
     97 	    fclose(of);
     98 	    
     99 	    /*fprintf(stderr,"%d(%.2f|%.2f) ",k,
    100 	      look->training_min[k][j],look->training_max[k][j]);*/
    101 
    102 	    _ogg_free(look->training_data[k][j]);
    103 	  }
    104 	/*fprintf(stderr,"\n");*/
    105       }
    106     }
    107     fprintf(stderr,"min/max residue: %g::%g\n",look->tmin,look->tmax);
    108 
    109     /*fprintf(stderr,"residue bit usage %f:%f (%f total)\n",
    110 	    (float)look->phrasebits/look->frames,
    111 	    (float)look->postbits/look->frames,
    112 	    (float)(look->postbits+look->phrasebits)/look->frames);*/
    113 #endif
    114 
    115 
    116     /*vorbis_info_residue0 *info=look->info;
    117 
    118     fprintf(stderr,
    119 	    "%ld frames encoded in %ld phrasebits and %ld residue bits "
    120 	    "(%g/frame) \n",look->frames,look->phrasebits,
    121 	    look->resbitsflat,
    122 	    (look->phrasebits+look->resbitsflat)/(float)look->frames);
    123     
    124     for(j=0;j<look->parts;j++){
    125       long acc=0;
    126       fprintf(stderr,"\t[%d] == ",j);
    127       for(k=0;k<look->stages;k++)
    128 	if((info->secondstages[j]>>k)&1){
    129 	  fprintf(stderr,"%ld,",look->resbits[j][k]);
    130 	  acc+=look->resbits[j][k];
    131 	}
    132 
    133       fprintf(stderr,":: (%ld vals) %1.2fbits/sample\n",look->resvals[j],
    134 	      acc?(float)acc/(look->resvals[j]*info->grouping):0);
    135     }
    136     fprintf(stderr,"\n");*/
    137 
    138     for(j=0;j<look->parts;j++)
    139       if(look->partbooks[j])_ogg_free(look->partbooks[j]);
    140     _ogg_free(look->partbooks);
    141     for(j=0;j<look->partvals;j++)
    142       _ogg_free(look->decodemap[j]);
    143     _ogg_free(look->decodemap);
    144 
    145     memset(look,0,sizeof(*look));
    146     _ogg_free(look);
    147   }
    148 }
    149 
    150 static int ilog(unsigned int v){
    151   int ret=0;
    152   while(v){
    153     ret++;
    154     v>>=1;
    155   }
    156   return(ret);
    157 }
    158 
    159 static int icount(unsigned int v){
    160   int ret=0;
    161   while(v){
    162     ret+=v&1;
    163     v>>=1;
    164   }
    165   return(ret);
    166 }
    167 
    168 
    169 void res0_pack(vorbis_info_residue *vr,oggpack_buffer *opb){
    170   vorbis_info_residue0 *info=(vorbis_info_residue0 *)vr;
    171   int j,acc=0;
    172   oggpack_write(opb,info->begin,24);
    173   oggpack_write(opb,info->end,24);
    174 
    175   oggpack_write(opb,info->grouping-1,24);  /* residue vectors to group and 
    176 					     code with a partitioned book */
    177   oggpack_write(opb,info->partitions-1,6); /* possible partition choices */
    178   oggpack_write(opb,info->groupbook,8);  /* group huffman book */
    179 
    180   /* secondstages is a bitmask; as encoding progresses pass by pass, a
    181      bitmask of one indicates this partition class has bits to write
    182      this pass */
    183   for(j=0;j<info->partitions;j++){
    184     if(ilog(info->secondstages[j])>3){
    185       /* yes, this is a minor hack due to not thinking ahead */
    186       oggpack_write(opb,info->secondstages[j],3); 
    187       oggpack_write(opb,1,1);
    188       oggpack_write(opb,info->secondstages[j]>>3,5); 
    189     }else
    190       oggpack_write(opb,info->secondstages[j],4); /* trailing zero */
    191     acc+=icount(info->secondstages[j]);
    192   }
    193   for(j=0;j<acc;j++)
    194     oggpack_write(opb,info->booklist[j],8);
    195 
    196 }
    197 
    198 /* vorbis_info is for range checking */
    199 vorbis_info_residue *res0_unpack(vorbis_info *vi,oggpack_buffer *opb){
    200   int j,acc=0;
    201   vorbis_info_residue0 *info=_ogg_calloc(1,sizeof(*info));
    202   codec_setup_info     *ci=vi->codec_setup;
    203 
    204   info->begin=oggpack_read(opb,24);
    205   info->end=oggpack_read(opb,24);
    206   info->grouping=oggpack_read(opb,24)+1;
    207   info->partitions=oggpack_read(opb,6)+1;
    208   info->groupbook=oggpack_read(opb,8);
    209 
    210   for(j=0;j<info->partitions;j++){
    211     int cascade=oggpack_read(opb,3);
    212     if(oggpack_read(opb,1))
    213       cascade|=(oggpack_read(opb,5)<<3);
    214     info->secondstages[j]=cascade;
    215 
    216     acc+=icount(cascade);
    217   }
    218   for(j=0;j<acc;j++)
    219     info->booklist[j]=oggpack_read(opb,8);
    220 
    221   if(info->groupbook>=ci->books)goto errout;
    222   for(j=0;j<acc;j++)
    223     if(info->booklist[j]>=ci->books)goto errout;
    224 
    225   return(info);
    226  errout:
    227   res0_free_info(info);
    228   return(NULL);
    229 }
    230 
    231 vorbis_look_residue *res0_look(vorbis_dsp_state *vd,
    232 			       vorbis_info_residue *vr){
    233   vorbis_info_residue0 *info=(vorbis_info_residue0 *)vr;
    234   vorbis_look_residue0 *look=_ogg_calloc(1,sizeof(*look));
    235   codec_setup_info     *ci=vd->vi->codec_setup;
    236 
    237   int j,k,acc=0;
    238   int dim;
    239   int maxstage=0;
    240   look->info=info;
    241 
    242   look->parts=info->partitions;
    243   look->fullbooks=ci->fullbooks;
    244   look->phrasebook=ci->fullbooks+info->groupbook;
    245   dim=look->phrasebook->dim;
    246 
    247   look->partbooks=_ogg_calloc(look->parts,sizeof(*look->partbooks));
    248 
    249   for(j=0;j<look->parts;j++){
    250     int stages=ilog(info->secondstages[j]);
    251     if(stages){
    252       if(stages>maxstage)maxstage=stages;
    253       look->partbooks[j]=_ogg_calloc(stages,sizeof(*look->partbooks[j]));
    254       for(k=0;k<stages;k++)
    255 	if(info->secondstages[j]&(1<<k)){
    256 	  look->partbooks[j][k]=ci->fullbooks+info->booklist[acc++];
    257 #ifdef TRAIN_RES
    258 	  look->training_data[k][j]=calloc(look->partbooks[j][k]->entries,
    259 					   sizeof(***look->training_data));
    260 #endif
    261 	}
    262     }
    263   }
    264 
    265   look->partvals=rint(pow((float)look->parts,(float)dim));
    266   look->stages=maxstage;
    267   look->decodemap=_ogg_malloc(look->partvals*sizeof(*look->decodemap));
    268   for(j=0;j<look->partvals;j++){
    269     long val=j;
    270     long mult=look->partvals/look->parts;
    271     look->decodemap[j]=_ogg_malloc(dim*sizeof(*look->decodemap[j]));
    272     for(k=0;k<dim;k++){
    273       long deco=val/mult;
    274       val-=deco*mult;
    275       mult/=look->parts;
    276       look->decodemap[j][k]=deco;
    277     }
    278   }
    279 #ifdef TRAIN_RES
    280   {
    281     static int train_seq=0;
    282     look->train_seq=train_seq++;
    283   }
    284 #endif
    285   return(look);
    286 }
    287 
    288 /* break an abstraction and copy some code for performance purposes */
    289 static int local_book_besterror(codebook *book,float *a){
    290   int dim=book->dim,i,k,o;
    291   int best=0;
    292   encode_aux_threshmatch *tt=book->c->thresh_tree;
    293 
    294   /* find the quant val of each scalar */
    295   for(k=0,o=dim;k<dim;++k){
    296     float val=a[--o];
    297     i=tt->threshvals>>1;
    298 
    299     if(val<tt->quantthresh[i]){      
    300       if(val<tt->quantthresh[i-1]){
    301 	for(--i;i>0;--i)
    302 	  if(val>=tt->quantthresh[i-1])
    303 	    break;
    304       }
    305     }else{
    306       
    307       for(++i;i<tt->threshvals-1;++i)
    308 	if(val<tt->quantthresh[i])break;
    309       
    310     }
    311     
    312     best=(best*tt->quantvals)+tt->quantmap[i];
    313   }
    314   /* regular lattices are easy :-) */
    315   
    316   if(book->c->lengthlist[best]<=0){
    317     const static_codebook *c=book->c;
    318     int i,j;
    319     float bestf=0.f;
    320     float *e=book->valuelist;
    321     best=-1;
    322     for(i=0;i<book->entries;i++){
    323       if(c->lengthlist[i]>0){
    324 	float this=0.f;
    325 	for(j=0;j<dim;j++){
    326 	  float val=(e[j]-a[j]);
    327 	  this+=val*val;
    328 	}
    329 	if(best==-1 || this<bestf){
    330 	  bestf=this;
    331 	  best=i;
    332 	}
    333       }
    334       e+=dim;
    335     }
    336   }
    337 
    338   {
    339     float *ptr=book->valuelist+best*dim;
    340     for(i=0;i<dim;i++)
    341       *a++ -= *ptr++;
    342   }
    343 
    344   return(best);
    345 }
    346 
    347 static int _encodepart(oggpack_buffer *opb,float *vec, int n,
    348 		       codebook *book,long *acc){
    349   int i,bits=0;
    350   int dim=book->dim;
    351   int step=n/dim;
    352 
    353   for(i=0;i<step;i++){
    354     int entry=local_book_besterror(book,vec+i*dim);
    355 
    356 #ifdef TRAIN_RES
    357     acc[entry]++;
    358 #endif
    359 
    360     bits+=vorbis_book_encode(book,entry,opb);
    361   }
    362 
    363   return(bits);
    364 }
    365 
    366 static long **_01class(vorbis_block *vb,vorbis_look_residue *vl,
    367 		       float **in,int ch){
    368   long i,j,k;
    369   vorbis_look_residue0 *look=(vorbis_look_residue0 *)vl;
    370   vorbis_info_residue0 *info=look->info;
    371   vorbis_info           *vi=vb->vd->vi;
    372   codec_setup_info      *ci=vi->codec_setup;
    373 
    374   /* move all this setup out later */
    375   int samples_per_partition=info->grouping;
    376   int possible_partitions=info->partitions;
    377   int n=info->end-info->begin;
    378   
    379   int partvals=n/samples_per_partition;
    380   long **partword=_vorbis_block_alloc(vb,ch*sizeof(*partword));
    381   float scale=100./samples_per_partition;
    382 
    383   /* we find the partition type for each partition of each
    384      channel.  We'll go back and do the interleaved encoding in a
    385      bit.  For now, clarity */
    386  
    387   for(i=0;i<ch;i++){
    388     partword[i]=_vorbis_block_alloc(vb,n/samples_per_partition*sizeof(*partword[i]));
    389     memset(partword[i],0,n/samples_per_partition*sizeof(*partword[i]));
    390   }
    391   
    392   for(i=0;i<partvals;i++){
    393     int offset=i*samples_per_partition+info->begin;
    394     for(j=0;j<ch;j++){
    395       float max=0.;
    396       float ent=0.;
    397       for(k=0;k<samples_per_partition;k++){
    398 	if(fabs(in[j][offset+k])>max)max=fabs(in[j][offset+k]);
    399 	ent+=fabs(rint(in[j][offset+k]));
    400       }
    401       ent*=scale;
    402       
    403       for(k=0;k<possible_partitions-1;k++)
    404 	if(max<=info->classmetric1[k] &&
    405 	   (info->classmetric2[k]<0 || (int)ent<info->classmetric2[k]))
    406 	  break;
    407       
    408       partword[j][i]=k;  
    409     }
    410   }
    411 
    412 #ifdef TRAIN_RESAUX
    413   {
    414     FILE *of;
    415     char buffer[80];
    416   
    417     for(i=0;i<ch;i++){
    418       sprintf(buffer,"resaux_%d.vqd",look->train_seq);
    419       of=fopen(buffer,"a");
    420       for(j=0;j<partvals;j++)
    421 	fprintf(of,"%ld, ",partword[i][j]);
    422       fprintf(of,"\n");
    423       fclose(of);
    424     }
    425   }
    426 #endif
    427   look->frames++;
    428 
    429   return(partword);
    430 }
    431 
    432 /* designed for stereo or other modes where the partition size is an
    433    integer multiple of the number of channels encoded in the current
    434    submap */
    435 static long **_2class(vorbis_block *vb,vorbis_look_residue *vl,float **in,
    436 		      int ch){
    437   long i,j,k,l;
    438   vorbis_look_residue0 *look=(vorbis_look_residue0 *)vl;
    439   vorbis_info_residue0 *info=look->info;
    440 
    441   /* move all this setup out later */
    442   int samples_per_partition=info->grouping;
    443   int possible_partitions=info->partitions;
    444   int n=info->end-info->begin;
    445 
    446   int partvals=n/samples_per_partition;
    447   long **partword=_vorbis_block_alloc(vb,sizeof(*partword));
    448 
    449 #ifdef TRAIN_RES
    450   FILE *of;
    451   char buffer[80];
    452 #endif
    453   
    454   partword[0]=_vorbis_block_alloc(vb,n*ch/samples_per_partition*sizeof(*partword[0]));
    455   memset(partword[0],0,n*ch/samples_per_partition*sizeof(*partword[0]));
    456 
    457   for(i=0,l=info->begin/ch;i<partvals;i++){
    458     float magmax=0.f;
    459     float angmax=0.f;
    460     for(j=0;j<samples_per_partition;j+=ch){
    461       if(fabs(in[0][l])>magmax)magmax=fabs(in[0][l]);
    462       for(k=1;k<ch;k++)
    463 	if(fabs(in[k][l])>angmax)angmax=fabs(in[k][l]);
    464       l++;
    465     }
    466 
    467     for(j=0;j<possible_partitions-1;j++)
    468       if(magmax<=info->classmetric1[j] &&
    469 	 angmax<=info->classmetric2[j])
    470 	break;
    471 
    472     partword[0][i]=j;
    473 
    474   }  
    475   
    476 #ifdef TRAIN_RESAUX
    477   sprintf(buffer,"resaux_%d.vqd",look->train_seq);
    478   of=fopen(buffer,"a");
    479   for(i=0;i<partvals;i++)
    480     fprintf(of,"%ld, ",partword[0][i]);
    481   fprintf(of,"\n");
    482   fclose(of);
    483 #endif
    484 
    485   look->frames++;
    486 
    487   return(partword);
    488 }
    489 
    490 static int _01forward(vorbis_block *vb,vorbis_look_residue *vl,
    491 		      float **in,int ch,
    492 		      long **partword,
    493 		      int (*encode)(oggpack_buffer *,float *,int,
    494 				    codebook *,long *)){
    495   long i,j,k,s;
    496   vorbis_look_residue0 *look=(vorbis_look_residue0 *)vl;
    497   vorbis_info_residue0 *info=look->info;
    498 
    499   vorbis_dsp_state      *vd=vb->vd;
    500 
    501   /* move all this setup out later */
    502   int samples_per_partition=info->grouping;
    503   int possible_partitions=info->partitions;
    504   int partitions_per_word=look->phrasebook->dim;
    505   int n=info->end-info->begin;
    506 
    507   int partvals=n/samples_per_partition;
    508   long resbits[128];
    509   long resvals[128];
    510 
    511 #ifdef TRAIN_RES
    512   for(i=0;i<ch;i++)
    513     for(j=info->begin;j<info->end;j++){
    514       if(in[i][j]>look->tmax)look->tmax=in[i][j];
    515       if(in[i][j]<look->tmin)look->tmin=in[i][j];
    516     }
    517 #endif
    518 
    519   memset(resbits,0,sizeof(resbits));
    520   memset(resvals,0,sizeof(resvals));
    521   
    522   /* we code the partition words for each channel, then the residual
    523      words for a partition per channel until we've written all the
    524      residual words for that partition word.  Then write the next
    525      partition channel words... */
    526 
    527   for(s=0;s<look->stages;s++){
    528 
    529     for(i=0;i<partvals;){
    530 
    531       /* first we encode a partition codeword for each channel */
    532       if(s==0){
    533 	for(j=0;j<ch;j++){
    534 	  long val=partword[j][i];
    535 	  for(k=1;k<partitions_per_word;k++){
    536 	    val*=possible_partitions;
    537 	    if(i+k<partvals)
    538 	      val+=partword[j][i+k];
    539 	  }	
    540 
    541 	  /* training hack */
    542 	  if(val<look->phrasebook->entries)
    543 	    look->phrasebits+=vorbis_book_encode(look->phrasebook,val,&vb->opb);
    544 #if 0 /*def TRAIN_RES*/
    545 	  else
    546 	    fprintf(stderr,"!");
    547 #endif
    548 	
    549 	}
    550       }
    551       
    552       /* now we encode interleaved residual values for the partitions */
    553       for(k=0;k<partitions_per_word && i<partvals;k++,i++){
    554 	long offset=i*samples_per_partition+info->begin;
    555 	
    556 	for(j=0;j<ch;j++){
    557 	  if(s==0)resvals[partword[j][i]]+=samples_per_partition;
    558 	  if(info->secondstages[partword[j][i]]&(1<<s)){
    559 	    codebook *statebook=look->partbooks[partword[j][i]][s];
    560 	    if(statebook){
    561 	      int ret;
    562 	      long *accumulator=NULL;
    563 
    564 #ifdef TRAIN_RES
    565 	      accumulator=look->training_data[s][partword[j][i]];
    566 	      {
    567 		int l;
    568 		float *samples=in[j]+offset;
    569 		for(l=0;l<samples_per_partition;l++){
    570 		  if(samples[l]<look->training_min[s][partword[j][i]])
    571 		    look->training_min[s][partword[j][i]]=samples[l];
    572 		  if(samples[l]>look->training_max[s][partword[j][i]])
    573 		    look->training_max[s][partword[j][i]]=samples[l];
    574 		}
    575 	      }
    576 #endif
    577 	      
    578 	      ret=encode(&vb->opb,in[j]+offset,samples_per_partition,
    579 			 statebook,accumulator);
    580 
    581 	      look->postbits+=ret;
    582 	      resbits[partword[j][i]]+=ret;
    583 	    }
    584 	  }
    585 	}
    586       }
    587     }
    588   }
    589 
    590   /*{
    591     long total=0;
    592     long totalbits=0;
    593     fprintf(stderr,"%d :: ",vb->mode);
    594     for(k=0;k<possible_partitions;k++){
    595       fprintf(stderr,"%ld/%1.2g, ",resvals[k],(float)resbits[k]/resvals[k]);
    596       total+=resvals[k];
    597       totalbits+=resbits[k];
    598       }
    599     
    600     fprintf(stderr,":: %ld:%1.2g\n",total,(double)totalbits/total);
    601     }*/
    602   return(0);
    603 }
    604 
    605 /* a truncated packet here just means 'stop working'; it's not an error */
    606 static int _01inverse(vorbis_block *vb,vorbis_look_residue *vl,
    607 		      float **in,int ch,
    608 		      long (*decodepart)(codebook *, float *, 
    609 					 oggpack_buffer *,int)){
    610 
    611   long i,j,k,l,s;
    612   vorbis_look_residue0 *look=(vorbis_look_residue0 *)vl;
    613   vorbis_info_residue0 *info=look->info;
    614 
    615   /* move all this setup out later */
    616   int samples_per_partition=info->grouping;
    617   int partitions_per_word=look->phrasebook->dim;
    618   int n=info->end-info->begin;
    619   
    620   int partvals=n/samples_per_partition;
    621   int partwords=(partvals+partitions_per_word-1)/partitions_per_word;
    622   int ***partword=alloca(ch*sizeof(*partword));
    623 
    624   for(j=0;j<ch;j++)
    625     partword[j]=_vorbis_block_alloc(vb,partwords*sizeof(*partword[j]));
    626 
    627   for(s=0;s<look->stages;s++){
    628 
    629     /* each loop decodes on partition codeword containing 
    630        partitions_pre_word partitions */
    631     for(i=0,l=0;i<partvals;l++){
    632       if(s==0){
    633 	/* fetch the partition word for each channel */
    634 	for(j=0;j<ch;j++){
    635 	  int temp=vorbis_book_decode(look->phrasebook,&vb->opb);
    636 	  if(temp==-1)goto eopbreak;
    637 	  partword[j][l]=look->decodemap[temp];
    638 	  if(partword[j][l]==NULL)goto errout;
    639 	}
    640       }
    641       
    642       /* now we decode residual values for the partitions */
    643       for(k=0;k<partitions_per_word && i<partvals;k++,i++)
    644 	for(j=0;j<ch;j++){
    645 	  long offset=info->begin+i*samples_per_partition;
    646 	  if(info->secondstages[partword[j][l][k]]&(1<<s)){
    647 	    codebook *stagebook=look->partbooks[partword[j][l][k]][s];
    648 	    if(stagebook){
    649 	      if(decodepart(stagebook,in[j]+offset,&vb->opb,
    650 			    samples_per_partition)==-1)goto eopbreak;
    651 	    }
    652 	  }
    653 	}
    654     } 
    655   }
    656   
    657  errout:
    658  eopbreak:
    659   return(0);
    660 }
    661 
    662 #if 0
    663 /* residue 0 and 1 are just slight variants of one another. 0 is
    664    interleaved, 1 is not */
    665 long **res0_class(vorbis_block *vb,vorbis_look_residue *vl,
    666 		  float **in,int *nonzero,int ch){
    667   /* we encode only the nonzero parts of a bundle */
    668   int i,used=0;
    669   for(i=0;i<ch;i++)
    670     if(nonzero[i])
    671       in[used++]=in[i];
    672   if(used)
    673     /*return(_01class(vb,vl,in,used,_interleaved_testhack));*/
    674     return(_01class(vb,vl,in,used));
    675   else
    676     return(0);
    677 }
    678 
    679 int res0_forward(vorbis_block *vb,vorbis_look_residue *vl,
    680 		 float **in,float **out,int *nonzero,int ch,
    681 		 long **partword){
    682   /* we encode only the nonzero parts of a bundle */
    683   int i,j,used=0,n=vb->pcmend/2;
    684   for(i=0;i<ch;i++)
    685     if(nonzero[i]){
    686       if(out)
    687 	for(j=0;j<n;j++)
    688 	  out[i][j]+=in[i][j];
    689       in[used++]=in[i];
    690     }
    691   if(used){
    692     int ret=_01forward(vb,vl,in,used,partword,
    693 		      _interleaved_encodepart);
    694     if(out){
    695       used=0;
    696       for(i=0;i<ch;i++)
    697 	if(nonzero[i]){
    698 	  for(j=0;j<n;j++)
    699 	    out[i][j]-=in[used][j];
    700 	  used++;
    701 	}
    702     }
    703     return(ret);
    704   }else{
    705     return(0);
    706   }
    707 }
    708 #endif
    709 
    710 int res0_inverse(vorbis_block *vb,vorbis_look_residue *vl,
    711 		 float **in,int *nonzero,int ch){
    712   int i,used=0;
    713   for(i=0;i<ch;i++)
    714     if(nonzero[i])
    715       in[used++]=in[i];
    716   if(used)
    717     return(_01inverse(vb,vl,in,used,vorbis_book_decodevs_add));
    718   else
    719     return(0);
    720 }
    721 
    722 int res1_forward(vorbis_block *vb,vorbis_look_residue *vl,
    723 		 float **in,float **out,int *nonzero,int ch,
    724 		 long **partword){
    725   int i,j,used=0,n=vb->pcmend/2;
    726   for(i=0;i<ch;i++)
    727     if(nonzero[i]){
    728       if(out)
    729 	for(j=0;j<n;j++)
    730 	  out[i][j]+=in[i][j];
    731       in[used++]=in[i];
    732     }
    733 
    734   if(used){
    735     int ret=_01forward(vb,vl,in,used,partword,_encodepart);
    736     if(out){
    737       used=0;
    738       for(i=0;i<ch;i++)
    739 	if(nonzero[i]){
    740 	  for(j=0;j<n;j++)
    741 	    out[i][j]-=in[used][j];
    742 	  used++;
    743 	}
    744     }
    745     return(ret);
    746   }else{
    747     return(0);
    748   }
    749 }
    750 
    751 long **res1_class(vorbis_block *vb,vorbis_look_residue *vl,
    752 		  float **in,int *nonzero,int ch){
    753   int i,used=0;
    754   for(i=0;i<ch;i++)
    755     if(nonzero[i])
    756       in[used++]=in[i];
    757   if(used)
    758     return(_01class(vb,vl,in,used));
    759   else
    760     return(0);
    761 }
    762 
    763 int res1_inverse(vorbis_block *vb,vorbis_look_residue *vl,
    764 		 float **in,int *nonzero,int ch){
    765   int i,used=0;
    766   for(i=0;i<ch;i++)
    767     if(nonzero[i])
    768       in[used++]=in[i];
    769   if(used)
    770     return(_01inverse(vb,vl,in,used,vorbis_book_decodev_add));
    771   else
    772     return(0);
    773 }
    774 
    775 long **res2_class(vorbis_block *vb,vorbis_look_residue *vl,
    776 		  float **in,int *nonzero,int ch){
    777   int i,used=0;
    778   for(i=0;i<ch;i++)
    779     if(nonzero[i])used++;
    780   if(used)
    781     return(_2class(vb,vl,in,ch));
    782   else
    783     return(0);
    784 }
    785 
    786 /* res2 is slightly more different; all the channels are interleaved
    787    into a single vector and encoded. */
    788 
    789 int res2_forward(vorbis_block *vb,vorbis_look_residue *vl,
    790 		 float **in,float **out,int *nonzero,int ch,
    791 		 long **partword){
    792   long i,j,k,n=vb->pcmend/2,used=0;
    793 
    794   /* don't duplicate the code; use a working vector hack for now and
    795      reshape ourselves into a single channel res1 */
    796   /* ugly; reallocs for each coupling pass :-( */
    797   float *work=_vorbis_block_alloc(vb,ch*n*sizeof(*work));
    798   for(i=0;i<ch;i++){
    799     float *pcm=in[i];
    800     if(nonzero[i])used++;
    801     for(j=0,k=i;j<n;j++,k+=ch)
    802       work[k]=pcm[j];
    803   }
    804   
    805   if(used){
    806     int ret=_01forward(vb,vl,&work,1,partword,_encodepart);
    807     /* update the sofar vector */
    808     if(out){
    809       for(i=0;i<ch;i++){
    810 	float *pcm=in[i];
    811 	float *sofar=out[i];
    812 	for(j=0,k=i;j<n;j++,k+=ch)
    813 	  sofar[j]+=pcm[j]-work[k];
    814 	
    815       }
    816     }
    817     return(ret);
    818   }else{
    819     return(0);
    820   }
    821 }
    822 
    823 /* duplicate code here as speed is somewhat more important */
    824 int res2_inverse(vorbis_block *vb,vorbis_look_residue *vl,
    825 		 float **in,int *nonzero,int ch){
    826   long i,k,l,s;
    827   vorbis_look_residue0 *look=(vorbis_look_residue0 *)vl;
    828   vorbis_info_residue0 *info=look->info;
    829 
    830   /* move all this setup out later */
    831   int samples_per_partition=info->grouping;
    832   int partitions_per_word=look->phrasebook->dim;
    833   int n=info->end-info->begin;
    834 
    835   int partvals=n/samples_per_partition;
    836   int partwords=(partvals+partitions_per_word-1)/partitions_per_word;
    837   int **partword=_vorbis_block_alloc(vb,partwords*sizeof(*partword));
    838 
    839   for(i=0;i<ch;i++)if(nonzero[i])break;
    840   if(i==ch)return(0); /* no nonzero vectors */
    841 
    842   for(s=0;s<look->stages;s++){
    843     for(i=0,l=0;i<partvals;l++){
    844 
    845       if(s==0){
    846 	/* fetch the partition word */
    847 	int temp=vorbis_book_decode(look->phrasebook,&vb->opb);
    848 	if(temp==-1)goto eopbreak;
    849 	partword[l]=look->decodemap[temp];
    850 	if(partword[l]==NULL)goto errout;
    851       }
    852 
    853       /* now we decode residual values for the partitions */
    854       for(k=0;k<partitions_per_word && i<partvals;k++,i++)
    855 	if(info->secondstages[partword[l][k]]&(1<<s)){
    856 	  codebook *stagebook=look->partbooks[partword[l][k]][s];
    857 	  
    858 	  if(stagebook){
    859 	    if(vorbis_book_decodevv_add(stagebook,in,
    860 					i*samples_per_partition+info->begin,ch,
    861 					&vb->opb,samples_per_partition)==-1)
    862 	      goto eopbreak;
    863 	  }
    864 	}
    865     } 
    866   }
    867   
    868  errout:
    869  eopbreak:
    870   return(0);
    871 }
    872 
    873 
    874 vorbis_func_residue residue0_exportbundle={
    875   NULL,
    876   &res0_unpack,
    877   &res0_look,
    878   &res0_free_info,
    879   &res0_free_look,
    880   NULL,
    881   NULL,
    882   &res0_inverse
    883 };
    884 
    885 vorbis_func_residue residue1_exportbundle={
    886   &res0_pack,
    887   &res0_unpack,
    888   &res0_look,
    889   &res0_free_info,
    890   &res0_free_look,
    891   &res1_class,
    892   &res1_forward,
    893   &res1_inverse
    894 };
    895 
    896 vorbis_func_residue residue2_exportbundle={
    897   &res0_pack,
    898   &res0_unpack,
    899   &res0_look,
    900   &res0_free_info,
    901   &res0_free_look,
    902   &res2_class,
    903   &res2_forward,
    904   &res2_inverse
    905 };
    906