cannam@86: /******************************************************************** cannam@86: * * cannam@86: * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * cannam@86: * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * cannam@86: * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * cannam@86: * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * cannam@86: * * cannam@86: * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2001 * cannam@86: * by the Xiph.Org Foundation http://www.xiph.org/ * cannam@86: * * cannam@86: ******************************************************************** cannam@86: cannam@86: function: utility main for building codebooks from lattice descriptions cannam@86: last mod: $Id: latticebuild.c 16037 2009-05-26 21:10:58Z xiphmont $ cannam@86: cannam@86: ********************************************************************/ cannam@86: cannam@86: #include cannam@86: #include cannam@86: #include cannam@86: #include cannam@86: #include cannam@86: #include "bookutil.h" cannam@86: cannam@86: /* The purpose of this util is just to finish packaging the cannam@86: description into a static codebook. It used to count hits for a cannam@86: histogram, but I've divorced that out to add some flexibility (it cannam@86: currently generates an equal probability codebook) cannam@86: cannam@86: command line: cannam@86: latticebuild description.vql cannam@86: cannam@86: the lattice description file contains two lines: cannam@86: cannam@86: cannam@86: ... cannam@86: cannam@86: a threshmap (or pigeonmap) struct is generated by latticehint; cannam@86: there are fun tricks one can do with the threshmap and cascades, cannam@86: but the utils don't know them... cannam@86: cannam@86: entropy encoding is done by feeding an entry list collected from a cannam@86: training set and feeding it to latticetune along with the book. cannam@86: cannam@86: latticebuild produces a codebook on stdout */ cannam@86: cannam@86: static int ilog(unsigned int v){ cannam@86: int ret=0; cannam@86: while(v){ cannam@86: ret++; cannam@86: v>>=1; cannam@86: } cannam@86: return(ret); cannam@86: } cannam@86: cannam@86: int main(int argc,char *argv[]){ cannam@86: codebook b; cannam@86: static_codebook c; cannam@86: double *quantlist; cannam@86: long *hits; cannam@86: cannam@86: int entries=-1,dim=-1,quantvals=-1,addmul=-1,sequencep=0; cannam@86: FILE *in=NULL; cannam@86: char *line,*name; cannam@86: long i,j; cannam@86: cannam@86: memset(&b,0,sizeof(b)); cannam@86: memset(&c,0,sizeof(c)); cannam@86: cannam@86: if(argv[1]==NULL){ cannam@86: fprintf(stderr,"Need a lattice description file on the command line.\n"); cannam@86: exit(1); cannam@86: } cannam@86: cannam@86: { cannam@86: char *ptr; cannam@86: char *filename=_ogg_calloc(strlen(argv[1])+4,1); cannam@86: cannam@86: strcpy(filename,argv[1]); cannam@86: in=fopen(filename,"r"); cannam@86: if(!in){ cannam@86: fprintf(stderr,"Could not open input file %s\n",filename); cannam@86: exit(1); cannam@86: } cannam@86: cannam@86: ptr=strrchr(filename,'.'); cannam@86: if(ptr){ cannam@86: *ptr='\0'; cannam@86: name=strdup(filename); cannam@86: }else{ cannam@86: name=strdup(filename); cannam@86: } cannam@86: cannam@86: } cannam@86: cannam@86: /* read the description */ cannam@86: line=get_line(in); cannam@86: if(sscanf(line,"%d %d %d %d",&quantvals,&dim,&addmul,&sequencep)!=4){ cannam@86: if(sscanf(line,"%d %d %d",&quantvals,&dim,&addmul)!=3){ cannam@86: fprintf(stderr,"Syntax error reading description file (line 1)\n"); cannam@86: exit(1); cannam@86: } cannam@86: } cannam@86: entries=pow(quantvals,dim); cannam@86: c.dim=dim; cannam@86: c.entries=entries; cannam@86: c.lengthlist=_ogg_malloc(entries*sizeof(long)); cannam@86: c.maptype=1; cannam@86: c.q_sequencep=sequencep; cannam@86: c.quantlist=_ogg_calloc(quantvals,sizeof(long)); cannam@86: cannam@86: quantlist=_ogg_malloc(sizeof(double)*c.dim*c.entries); cannam@86: hits=_ogg_malloc(c.entries*sizeof(long)); cannam@86: for(j=0;j.00001f) break; cannam@86: } cannam@86: if(fac>100)break; cannam@86: if(jc.q_quant)c.q_quant=ilog(c.quantlist[j]); cannam@86: } cannam@86: } cannam@86: cannam@86: /* build the [default] codeword lengths */ cannam@86: memset(c.lengthlist,0,sizeof(long)*entries); cannam@86: for(i=0;i