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