1 /********************************************************************
3 * THIS FILE IS PART OF THE Ogg Vorbis SOFTWARE CODEC SOURCE CODE. *
4 * USE, DISTRIBUTION AND REPRODUCTION OF THIS SOURCE IS GOVERNED BY *
5 * THE GNU PUBLIC LICENSE 2, WHICH IS INCLUDED WITH THIS SOURCE. *
6 * PLEASE READ THESE TERMS DISTRIBUTING. *
8 * THE OggSQUISH SOURCE CODE IS (C) COPYRIGHT 1994-2000 *
9 * by Monty <monty@xiph.org> and The XIPHOPHORUS Company *
10 * http://www.xiph.org/ *
12 ********************************************************************
14 function: hufftree builder
15 last mod: $Id: huffbuild.c,v 1.4 2000/07/12 09:36:17 xiphmont Exp $
17 ********************************************************************/
23 #include "../vq/bookutil.h"
26 static int getval(FILE *in,int begin,int n,int group,int max){
31 if(nsofar>=n || get_line_value(in,&v)){
34 if(get_next_value(in,&v))
37 get_line_value(in,&v);
43 for(i=1;i<group;i++,nsofar++)
44 if(nsofar>=n || get_line_value(in,&v))
45 return(getval(in,begin,n,group,max));
54 "huffbuild <input>.vqd <begin,n,group> [noguard]\n"
55 " where begin,n,group is first scalar, \n"
56 " number of scalars of each in line,\n"
57 " number of scalars in a group\n"
58 "eg: huffbuild reslongaux.vqd 0,1024,4\n"
59 "produces reslongaux.vqh\n\n");
63 int main(int argc, char *argv[]){
66 int i,j,k,begin,n,subn,guard=1;
73 infile=strdup(argv[1]);
76 strrchr(base,'.')[0]='\0';
79 char *pos=strchr(argv[2],',');
85 pos=strchr(pos+1,',');
91 fprintf(stderr,"n must be divisible by group\n");
96 /* scan the file for maximum value */
97 file=fopen(infile,"r");
99 fprintf(stderr,"Could not open file %s\n",infile);
105 if(get_next_ivalue(file,&v))break;
106 if(v>maxval)maxval=v;
108 if(!(i++&0xff))spinnit("loading... ",i);
114 long vals=pow(maxval,subn);
115 long *hist=malloc(vals*sizeof(long));
116 long *lengths=malloc(vals*sizeof(long));
118 for(j=0;j<vals;j++)hist[j]=guard;
123 long val=getval(file,begin,n,subn,maxval);
126 if(!(i--&0xff))spinnit("loading... ",i*subn);
130 /* we have the probabilities, build the tree */
131 fprintf(stderr,"Building tree for %ld entries\n",vals);
132 build_tree_from_lengths0(vals,hist,lengths);
136 char *buffer=alloca(strlen(base)+5);
138 strcat(buffer,".vqh");
139 file=fopen(buffer,"w");
141 fprintf(stderr,"Could not open file %s\n",buffer);
147 "/********************************************************************\n"
149 " * THIS FILE IS PART OF THE Ogg Vorbis SOFTWARE CODEC SOURCE CODE. *\n"
150 " * USE, DISTRIBUTION AND REPRODUCTION OF THIS SOURCE IS GOVERNED BY *\n"
151 " * THE GNU PUBLIC LICENSE 2, WHICH IS INCLUDED WITH THIS SOURCE. *\n"
152 " * PLEASE READ THESE TERMS DISTRIBUTING. *\n"
154 " * THE OggSQUISH SOURCE CODE IS (C) COPYRIGHT 1994-1999 *\n"
155 " * by 1999 Monty <monty@xiph.org> and The XIPHOPHORUS Company *\n"
156 " * http://www.xiph.org/ *\n"
158 " ********************************************************************\n"
160 " function: static codebook autogenerated by huff/huffbuld\n"
162 " ********************************************************************/\n\n");
164 fprintf(file,"#ifndef _V_%s_VQH_\n#define _V_%s_VQH_\n",base,base);
165 fprintf(file,"#include \"vorbis/codebook.h\"\n\n");
167 /* first, the static vectors, then the book structure to tie it together. */
169 fprintf(file,"static long _huff_lengthlist_%s[] = {\n",base);
172 for(k=0;k<16 && j<vals;k++,j++)
173 fprintf(file,"%2ld,",lengths[j]);
176 fprintf(file,"};\n\n");
178 /* the toplevel book */
179 fprintf(file,"static static_codebook _huff_book_%s = {\n",base);
180 fprintf(file,"\t%d, %ld,\n",subn,vals);
181 fprintf(file,"\t_huff_lengthlist_%s,\n",base);
182 fprintf(file,"\t0, 0, 0, 0, 0,\n");
183 fprintf(file,"\tNULL,\n");
184 fprintf(file,"\tNULL,\n");
185 fprintf(file,"\tNULL,\n");
186 fprintf(file,"};\n\n");
188 fprintf(file,"\n#endif\n");
190 fprintf(stderr,"Done. \n\n");