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 setting entropy encoding parameters cannam@86: for lattice codebooks cannam@86: last mod: $Id: latticetune.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: static int strrcmp_i(char *s,char *cmp){ cannam@86: return(strncmp(s+strlen(s)-strlen(cmp),cmp,strlen(cmp))); cannam@86: } cannam@86: cannam@86: /* This util takes a training-collected file listing codewords used in cannam@86: LSP fitting, then generates new codeword lengths for maximally cannam@86: efficient integer-bits entropy encoding. cannam@86: cannam@86: command line: cannam@86: latticetune book.vqh input.vqd [unused_entriesp] cannam@86: cannam@86: latticetune produces book.vqh on stdout */ cannam@86: cannam@86: int main(int argc,char *argv[]){ cannam@86: codebook *b; cannam@86: static_codebook *c; cannam@86: long *lengths; cannam@86: long *hits; cannam@86: cannam@86: int entries=-1,dim=-1,guard=1; cannam@86: FILE *in=NULL; cannam@86: char *line,*name; cannam@86: long j; cannam@86: cannam@86: if(argv[1]==NULL){ cannam@86: fprintf(stderr,"Need a lattice codebook on the command line.\n"); cannam@86: exit(1); cannam@86: } cannam@86: if(argv[2]==NULL){ cannam@86: fprintf(stderr,"Need a codeword data file on the command line.\n"); cannam@86: exit(1); cannam@86: } cannam@86: if(argv[3]!=NULL)guard=0; cannam@86: cannam@86: { cannam@86: char *ptr; cannam@86: char *filename=strdup(argv[1]); cannam@86: cannam@86: b=codebook_load(filename); cannam@86: c=(static_codebook *)(b->c); 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: if(c->maptype!=1){ cannam@86: fprintf(stderr,"Provided book is not a latticebook.\n"); cannam@86: exit(1); cannam@86: } cannam@86: cannam@86: entries=b->entries; cannam@86: dim=b->dim; cannam@86: cannam@86: hits=_ogg_malloc(entries*sizeof(long)); cannam@86: lengths=_ogg_calloc(entries,sizeof(long)); cannam@86: for(j=0;jlengthlist=lengths; cannam@86: write_codebook(stdout,name,c); cannam@86: cannam@86: { cannam@86: long bins=_book_maptype1_quantvals(c); cannam@86: long i,k,base=c->lengthlist[0]; cannam@86: for(i=0;ilengthlist[i]>base)base=c->lengthlist[i]; cannam@86: cannam@86: for(j=0;jlengthlist[j]){ cannam@86: int indexdiv=1; cannam@86: fprintf(stderr,"%4ld: ",j); cannam@86: for(k=0;kdim;k++){ cannam@86: int index= (j/indexdiv)%bins; cannam@86: fprintf(stderr,"%+3.1f,", c->quantlist[index]*_float32_unpack(c->q_delta)+ cannam@86: _float32_unpack(c->q_min)); cannam@86: indexdiv*=bins; cannam@86: } cannam@86: fprintf(stderr,"\t|"); cannam@86: for(k=0;klengthlist[j];k++)fprintf(stderr,"*"); cannam@86: fprintf(stderr,"\n"); cannam@86: } cannam@86: } cannam@86: } cannam@86: cannam@86: fprintf(stderr,"\r " cannam@86: "\nDone.\n"); cannam@86: exit(0); cannam@86: }