[xiph-commits] r13167 - trunk/vorbis/lib
xiphmont at svn.xiph.org
xiphmont at svn.xiph.org
Thu Jun 21 17:58:15 PDT 2007
Author: xiphmont
Date: 2007-06-21 17:58:15 -0700 (Thu, 21 Jun 2007)
New Revision: 13167
Modified:
trunk/vorbis/lib/res0.c
Log:
Don't forget to test all changes in a code cleanup-- residue type 2 encoding was broken by last night's round of fixes.
Tested fixed.
Modified: trunk/vorbis/lib/res0.c
===================================================================
--- trunk/vorbis/lib/res0.c 2007-06-21 23:37:15 UTC (rev 13166)
+++ trunk/vorbis/lib/res0.c 2007-06-22 00:58:15 UTC (rev 13167)
@@ -375,63 +375,59 @@
/* move all this setup out later */
int samples_per_partition=info->grouping;
int possible_partitions=info->partitions;
- int end=(info->end<vb->pcmend/2?info->end:vb->pcmend/2);
- int n=end-info->begin;
+ int n=info->end-info->begin;
- if(n>0){
- 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;i<ch;i++){
- partword[i]=_vorbis_block_alloc(vb,n/samples_per_partition*sizeof(*partword[i]));
- memset(partword[i],0,n/samples_per_partition*sizeof(*partword[i]));
- }
-
- for(i=0;i<partvals;i++){
- int offset=i*samples_per_partition+info->begin;
- for(j=0;j<ch;j++){
- float max=0.;
- float ent=0.;
- for(k=0;k<samples_per_partition;k++){
- if(fabs(in[j][offset+k])>max)max=fabs(in[j][offset+k]);
- ent+=fabs(rint(in[j][offset+k]));
- }
- ent*=scale;
-
- for(k=0;k<possible_partitions-1;k++)
- if(max<=info->classmetric1[k] &&
- (info->classmetric2[k]<0 || (int)ent<info->classmetric2[k]))
- break;
-
- partword[j][i]=k;
+ 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;i<ch;i++){
+ partword[i]=_vorbis_block_alloc(vb,n/samples_per_partition*sizeof(*partword[i]));
+ memset(partword[i],0,n/samples_per_partition*sizeof(*partword[i]));
+ }
+
+ for(i=0;i<partvals;i++){
+ int offset=i*samples_per_partition+info->begin;
+ for(j=0;j<ch;j++){
+ float max=0.;
+ float ent=0.;
+ for(k=0;k<samples_per_partition;k++){
+ if(fabs(in[j][offset+k])>max)max=fabs(in[j][offset+k]);
+ ent+=fabs(rint(in[j][offset+k]));
}
+ ent*=scale;
+
+ for(k=0;k<possible_partitions-1;k++)
+ if(max<=info->classmetric1[k] &&
+ (info->classmetric2[k]<0 || (int)ent<info->classmetric2[k]))
+ break;
+
+ partword[j][i]=k;
}
-
+ }
+
#ifdef TRAIN_RESAUX
- {
- FILE *of;
- char buffer[80];
-
- for(i=0;i<ch;i++){
- sprintf(buffer,"resaux_%d.vqd",look->train_seq);
- of=fopen(buffer,"a");
- for(j=0;j<partvals;j++)
- fprintf(of,"%ld, ",partword[i][j]);
- fprintf(of,"\n");
- fclose(of);
- }
+ {
+ FILE *of;
+ char buffer[80];
+
+ for(i=0;i<ch;i++){
+ sprintf(buffer,"resaux_%d.vqd",look->train_seq);
+ of=fopen(buffer,"a");
+ for(j=0;j<partvals;j++)
+ fprintf(of,"%ld, ",partword[i][j]);
+ fprintf(of,"\n");
+ fclose(of);
}
+ }
#endif
- look->frames++;
-
- return(partword);
- }else
- return(0);
+ look->frames++;
+
+ return(partword);
}
/* designed for stereo or other modes where the partition size is an
@@ -446,54 +442,50 @@
/* move all this setup out later */
int samples_per_partition=info->grouping;
int possible_partitions=info->partitions;
- int end=(info->end<vb->pcmend/2?info->end:vb->pcmend/2);
- int n=end-info->begin;
+ int n=info->end-info->begin;
- if(n>0){
- int partvals=n/samples_per_partition;
- long **partword=_vorbis_block_alloc(vb,sizeof(*partword));
-
+ 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];
+ 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]));
+
+ for(i=0,l=info->begin/ch;i<partvals;i++){
+ float magmax=0.f;
+ float angmax=0.f;
+ for(j=0;j<samples_per_partition;j+=ch){
+ if(fabs(in[0][l])>magmax)magmax=fabs(in[0][l]);
+ for(k=1;k<ch;k++)
+ if(fabs(in[k][l])>angmax)angmax=fabs(in[k][l]);
+ l++;
+ }
- 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]));
+ for(j=0;j<possible_partitions-1;j++)
+ if(magmax<=info->classmetric1[j] &&
+ angmax<=info->classmetric2[j])
+ break;
- for(i=0,l=info->begin/ch;i<partvals;i++){
- float magmax=0.f;
- float angmax=0.f;
- for(j=0;j<samples_per_partition;j+=ch){
- if(fabs(in[0][l])>magmax)magmax=fabs(in[0][l]);
- for(k=1;k<ch;k++)
- if(fabs(in[k][l])>angmax)angmax=fabs(in[k][l]);
- l++;
- }
-
- for(j=0;j<possible_partitions-1;j++)
- if(magmax<=info->classmetric1[j] &&
- angmax<=info->classmetric2[j])
- break;
-
- partword[0][i]=j;
-
- }
+ partword[0][i]=j;
+ }
+
#ifdef TRAIN_RESAUX
- sprintf(buffer,"resaux_%d.vqd",look->train_seq);
- of=fopen(buffer,"a");
- for(i=0;i<partvals;i++)
- fprintf(of,"%ld, ",partword[0][i]);
- fprintf(of,"\n");
- fclose(of);
+ sprintf(buffer,"resaux_%d.vqd",look->train_seq);
+ of=fopen(buffer,"a");
+ for(i=0;i<partvals;i++)
+ fprintf(of,"%ld, ",partword[0][i]);
+ fprintf(of,"\n");
+ fclose(of);
#endif
-
- look->frames++;
-
- return(partword);
- }else
- return(0);
+
+ look->frames++;
+
+ return(partword);
}
static int _01forward(oggpack_buffer *opb,
@@ -512,93 +504,91 @@
int samples_per_partition=info->grouping;
int possible_partitions=info->partitions;
int partitions_per_word=look->phrasebook->dim;
- int end=(info->end<vb->pcmend/2?info->end:vb->pcmend/2);
- int n=end-info->begin;
+ int n=info->end-info->begin;
- if(n>0){
- int partvals=n/samples_per_partition;
- long resbits[128];
- long resvals[128];
-
+ int partvals=n/samples_per_partition;
+ long resbits[128];
+ long resvals[128];
+
#ifdef TRAIN_RES
- for(i=0;i<ch;i++)
- for(j=info->begin;j<end;j++){
- if(in[i][j]>look->tmax)look->tmax=in[i][j];
- if(in[i][j]<look->tmin)look->tmin=in[i][j];
- }
+ for(i=0;i<ch;i++)
+ for(j=info->begin;j<end;j++){
+ if(in[i][j]>look->tmax)look->tmax=in[i][j];
+ if(in[i][j]<look->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;s<look->stages;s++){
- 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;s<look->stages;s++){
+ for(i=0;i<partvals;){
- for(i=0;i<partvals;){
-
- /* first we encode a partition codeword for each channel */
- if(s==0){
- for(j=0;j<ch;j++){
- long val=partword[j][i];
- for(k=1;k<partitions_per_word;k++){
- val*=possible_partitions;
- if(i+k<partvals)
- val+=partword[j][i+k];
- }
-
- /* training hack */
- if(val<look->phrasebook->entries)
- look->phrasebits+=vorbis_book_encode(look->phrasebook,val,opb);
+ /* first we encode a partition codeword for each channel */
+ if(s==0){
+ for(j=0;j<ch;j++){
+ long val=partword[j][i];
+ for(k=1;k<partitions_per_word;k++){
+ val*=possible_partitions;
+ if(i+k<partvals)
+ val+=partword[j][i+k];
+ }
+
+ /* training hack */
+ if(val<look->phrasebook->entries)
+ look->phrasebits+=vorbis_book_encode(look->phrasebook,val,opb);
#if 0 /*def TRAIN_RES*/
- else
- fprintf(stderr,"!");
+ else
+ fprintf(stderr,"!");
#endif
-
- }
+
}
-
- /* now we encode interleaved residual values for the partitions */
- for(k=0;k<partitions_per_word && i<partvals;k++,i++){
- long offset=i*samples_per_partition+info->begin;
+ }
+
+ /* now we encode interleaved residual values for the partitions */
+ for(k=0;k<partitions_per_word && i<partvals;k++,i++){
+ long offset=i*samples_per_partition+info->begin;
- for(j=0;j<ch;j++){
- if(s==0)resvals[partword[j][i]]+=samples_per_partition;
- if(info->secondstages[partword[j][i]]&(1<<s)){
- codebook *statebook=look->partbooks[partword[j][i]][s];
- if(statebook){
- int ret;
- long *accumulator=NULL;
-
+ for(j=0;j<ch;j++){
+ if(s==0)resvals[partword[j][i]]+=samples_per_partition;
+ if(info->secondstages[partword[j][i]]&(1<<s)){
+ codebook *statebook=look->partbooks[partword[j][i]][s];
+ if(statebook){
+ int ret;
+ long *accumulator=NULL;
+
#ifdef TRAIN_RES
- accumulator=look->training_data[s][partword[j][i]];
- {
- int l;
- float *samples=in[j]+offset;
- for(l=0;l<samples_per_partition;l++){
- if(samples[l]<look->training_min[s][partword[j][i]])
- look->training_min[s][partword[j][i]]=samples[l];
- if(samples[l]>look->training_max[s][partword[j][i]])
- look->training_max[s][partword[j][i]]=samples[l];
- }
+ accumulator=look->training_data[s][partword[j][i]];
+ {
+ int l;
+ float *samples=in[j]+offset;
+ for(l=0;l<samples_per_partition;l++){
+ if(samples[l]<look->training_min[s][partword[j][i]])
+ look->training_min[s][partword[j][i]]=samples[l];
+ if(samples[l]>look->training_max[s][partword[j][i]])
+ look->training_max[s][partword[j][i]]=samples[l];
}
-#endif
-
- ret=encode(opb,in[j]+offset,samples_per_partition,
- statebook,accumulator);
-
- look->postbits+=ret;
- resbits[partword[j][i]]+=ret;
}
+#endif
+
+ ret=encode(opb,in[j]+offset,samples_per_partition,
+ statebook,accumulator);
+
+ look->postbits+=ret;
+ resbits[partword[j][i]]+=ret;
}
}
}
}
}
-
+ }
+
/*{
long total=0;
long totalbits=0;
@@ -611,7 +601,7 @@
fprintf(stderr,":: %ld:%1.2g\n",total,(double)totalbits/total);
}*/
- }
+
return(0);
}
@@ -628,7 +618,8 @@
/* move all this setup out later */
int samples_per_partition=info->grouping;
int partitions_per_word=look->phrasebook->dim;
- int end=(info->end<vb->pcmend/2?info->end:vb->pcmend/2);
+ int max=vb->pcmend>>1;
+ int end=(info->end<max?info->end:max);
int n=end-info->begin;
if(n>0){
More information about the commits
mailing list