/********************************************************************
* *
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
- * USE, DISTRIBUTION AND REPRODUCTION OF THIS SOURCE IS GOVERNED BY *
- * THE GNU LESSER/LIBRARY PUBLIC LICENSE, WHICH IS INCLUDED WITH *
- * THIS SOURCE. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
+ * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
+ * 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-2000 *
- * by Monty <monty@xiph.org> and the XIPHOPHORUS Company *
- * http://www.xiph.org/ *
+ * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2001 *
+ * by the Xiph.Org Foundation http://www.xiph.org/ *
* *
********************************************************************
function: utility main for setting entropy encoding parameters
for lattice codebooks
- last mod: $Id: latticetune.c,v 1.4 2000/11/06 00:07:26 xiphmont Exp $
+ last mod: $Id$
********************************************************************/
#include <math.h>
#include <string.h>
#include <errno.h>
-#include "vorbis/codebook.h"
-#include "../lib/sharedbook.h"
#include "bookutil.h"
+static int strrcmp_i(char *s,char *cmp){
+ return(strncmp(s+strlen(s)-strlen(cmp),cmp,strlen(cmp)));
+}
+
/* This util takes a training-collected file listing codewords used in
LSP fitting, then generates new codeword lengths for maximally
efficient integer-bits entropy encoding.
exit(1);
}
- if(!strcmp(argv[0],"latticetune")){
+ if(!strrcmp_i(argv[0],"latticetune")){
long lines=0;
line=setup_line(in);
while(line){
if(!(lines&0xfff))spinnit("codewords so far...",lines);
if(sscanf(line,"%ld",&code)==1)
- hits[code]++;
+ hits[code]++;
line=setup_line(in);
}
}
- if(!strcmp(argv[0],"restune")){
- long step;
- long lines=0;
- long cols=-1;
- float *vec;
+ /* now we simply count already collated by-entry data */
+ if(!strrcmp_i(argv[0],"res0tune") || !strrcmp_i(argv[0],"res1tune")){
+
line=setup_line(in);
while(line){
- int code;
- if(!(lines&0xfff))spinnit("codewords so far...",lines);
- if(cols==-1){
- char *temp=line;
- while(*temp==' ')temp++;
- for(cols=0;*temp;cols++){
- while(*temp>32)temp++;
- while(*temp==' ')temp++;
- }
- vec=alloca(sizeof(float)*cols);
- step=cols/dim;
- }
-
- for(j=0;j<cols;j++)
- if(get_line_value(in,vec+j)){
- fprintf(stderr,"Too few columns on line %ld in data file\n",lines);
- exit(1);
- }
-
- for(j=0;j<step;j++){
- lines++;
- code=_best(b,vec+j,step);
- hits[code]++;
+ /* code:hits\n */
+ /* likely to have multiple listing for each code entry; must
+ accumulate */
+
+ char *pos=strchr(line,':');
+ if(pos){
+ long code=atol(line);
+ long val=atol(pos+1);
+ hits[code]+=val;
}
line=setup_line(in);
c->lengthlist=lengths;
write_codebook(stdout,name,c);
+
+ {
+ long bins=_book_maptype1_quantvals(c);
+ long i,k,base=c->lengthlist[0];
+ for(i=0;i<entries;i++)
+ if(c->lengthlist[i]>base)base=c->lengthlist[i];
+
+ for(j=0;j<entries;j++){
+ if(c->lengthlist[j]){
+ int indexdiv=1;
+ fprintf(stderr,"%4ld: ",j);
+ for(k=0;k<c->dim;k++){
+ int index= (j/indexdiv)%bins;
+ fprintf(stderr,"%+3.1f,", c->quantlist[index]*_float32_unpack(c->q_delta)+
+ _float32_unpack(c->q_min));
+ indexdiv*=bins;
+ }
+ fprintf(stderr,"\t|");
+ for(k=0;k<base-c->lengthlist[j];k++)fprintf(stderr,"*");
+ fprintf(stderr,"\n");
+ }
+ }
+ }
fprintf(stderr,"\r "
- "\nDone.\n");
+ "\nDone.\n");
exit(0);
}