annotate src/libvorbis-1.3.3/vq/latticebuild.c @ 84:08ae793730bd

Add null config files
author Chris Cannam
date Mon, 02 Mar 2020 14:03:47 +0000
parents 05aa0afa9217
children
rev   line source
Chris@1 1 /********************************************************************
Chris@1 2 * *
Chris@1 3 * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
Chris@1 4 * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
Chris@1 5 * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
Chris@1 6 * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
Chris@1 7 * *
Chris@1 8 * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2001 *
Chris@1 9 * by the Xiph.Org Foundation http://www.xiph.org/ *
Chris@1 10 * *
Chris@1 11 ********************************************************************
Chris@1 12
Chris@1 13 function: utility main for building codebooks from lattice descriptions
Chris@1 14 last mod: $Id: latticebuild.c 16037 2009-05-26 21:10:58Z xiphmont $
Chris@1 15
Chris@1 16 ********************************************************************/
Chris@1 17
Chris@1 18 #include <stdlib.h>
Chris@1 19 #include <stdio.h>
Chris@1 20 #include <math.h>
Chris@1 21 #include <string.h>
Chris@1 22 #include <errno.h>
Chris@1 23 #include "bookutil.h"
Chris@1 24
Chris@1 25 /* The purpose of this util is just to finish packaging the
Chris@1 26 description into a static codebook. It used to count hits for a
Chris@1 27 histogram, but I've divorced that out to add some flexibility (it
Chris@1 28 currently generates an equal probability codebook)
Chris@1 29
Chris@1 30 command line:
Chris@1 31 latticebuild description.vql
Chris@1 32
Chris@1 33 the lattice description file contains two lines:
Chris@1 34
Chris@1 35 <n> <dim> <multiplicitavep> <sequentialp>
Chris@1 36 <value_0> <value_1> <value_2> ... <value_n-1>
Chris@1 37
Chris@1 38 a threshmap (or pigeonmap) struct is generated by latticehint;
Chris@1 39 there are fun tricks one can do with the threshmap and cascades,
Chris@1 40 but the utils don't know them...
Chris@1 41
Chris@1 42 entropy encoding is done by feeding an entry list collected from a
Chris@1 43 training set and feeding it to latticetune along with the book.
Chris@1 44
Chris@1 45 latticebuild produces a codebook on stdout */
Chris@1 46
Chris@1 47 static int ilog(unsigned int v){
Chris@1 48 int ret=0;
Chris@1 49 while(v){
Chris@1 50 ret++;
Chris@1 51 v>>=1;
Chris@1 52 }
Chris@1 53 return(ret);
Chris@1 54 }
Chris@1 55
Chris@1 56 int main(int argc,char *argv[]){
Chris@1 57 codebook b;
Chris@1 58 static_codebook c;
Chris@1 59 double *quantlist;
Chris@1 60 long *hits;
Chris@1 61
Chris@1 62 int entries=-1,dim=-1,quantvals=-1,addmul=-1,sequencep=0;
Chris@1 63 FILE *in=NULL;
Chris@1 64 char *line,*name;
Chris@1 65 long i,j;
Chris@1 66
Chris@1 67 memset(&b,0,sizeof(b));
Chris@1 68 memset(&c,0,sizeof(c));
Chris@1 69
Chris@1 70 if(argv[1]==NULL){
Chris@1 71 fprintf(stderr,"Need a lattice description file on the command line.\n");
Chris@1 72 exit(1);
Chris@1 73 }
Chris@1 74
Chris@1 75 {
Chris@1 76 char *ptr;
Chris@1 77 char *filename=_ogg_calloc(strlen(argv[1])+4,1);
Chris@1 78
Chris@1 79 strcpy(filename,argv[1]);
Chris@1 80 in=fopen(filename,"r");
Chris@1 81 if(!in){
Chris@1 82 fprintf(stderr,"Could not open input file %s\n",filename);
Chris@1 83 exit(1);
Chris@1 84 }
Chris@1 85
Chris@1 86 ptr=strrchr(filename,'.');
Chris@1 87 if(ptr){
Chris@1 88 *ptr='\0';
Chris@1 89 name=strdup(filename);
Chris@1 90 }else{
Chris@1 91 name=strdup(filename);
Chris@1 92 }
Chris@1 93
Chris@1 94 }
Chris@1 95
Chris@1 96 /* read the description */
Chris@1 97 line=get_line(in);
Chris@1 98 if(sscanf(line,"%d %d %d %d",&quantvals,&dim,&addmul,&sequencep)!=4){
Chris@1 99 if(sscanf(line,"%d %d %d",&quantvals,&dim,&addmul)!=3){
Chris@1 100 fprintf(stderr,"Syntax error reading description file (line 1)\n");
Chris@1 101 exit(1);
Chris@1 102 }
Chris@1 103 }
Chris@1 104 entries=pow(quantvals,dim);
Chris@1 105 c.dim=dim;
Chris@1 106 c.entries=entries;
Chris@1 107 c.lengthlist=_ogg_malloc(entries*sizeof(long));
Chris@1 108 c.maptype=1;
Chris@1 109 c.q_sequencep=sequencep;
Chris@1 110 c.quantlist=_ogg_calloc(quantvals,sizeof(long));
Chris@1 111
Chris@1 112 quantlist=_ogg_malloc(sizeof(double)*c.dim*c.entries);
Chris@1 113 hits=_ogg_malloc(c.entries*sizeof(long));
Chris@1 114 for(j=0;j<entries;j++)hits[j]=1;
Chris@1 115 for(j=0;j<entries;j++)c.lengthlist[j]=1;
Chris@1 116
Chris@1 117 reset_next_value();
Chris@1 118 line=setup_line(in);
Chris@1 119 for(j=0;j<quantvals;j++){
Chris@1 120 char *temp;
Chris@1 121 if(!line || sscanf(line,"%lf",quantlist+j)!=1){
Chris@1 122 fprintf(stderr,"Ran out of data on line 2 of description file\n");
Chris@1 123 exit(1);
Chris@1 124 }
Chris@1 125 temp=strchr(line,',');
Chris@1 126 if(!temp)temp=strchr(line,' ');
Chris@1 127 if(temp)temp++;
Chris@1 128 line=temp;
Chris@1 129 }
Chris@1 130
Chris@1 131 /* gen a real quant list from the more easily human-grokked input */
Chris@1 132 {
Chris@1 133 double min=quantlist[0];
Chris@1 134 double mindel=-1;
Chris@1 135 int fac=1;
Chris@1 136 for(j=1;j<quantvals;j++)if(quantlist[j]<min)min=quantlist[j];
Chris@1 137 for(j=0;j<quantvals;j++)
Chris@1 138 for(i=j+1;i<quantvals;i++)
Chris@1 139 if(mindel==-1 || fabs(quantlist[j]-quantlist[i])<mindel)
Chris@1 140 mindel=fabs(quantlist[j]-quantlist[i]);
Chris@1 141
Chris@1 142 j=0;
Chris@1 143 while(j<quantvals){
Chris@1 144 for(j=0;j<quantvals;j++){
Chris@1 145 double test=fac*(quantlist[j]-min)/mindel;
Chris@1 146 if( fabs(rint(test)-test)>.00001f) break;
Chris@1 147 }
Chris@1 148 if(fac>100)break;
Chris@1 149 if(j<quantvals)fac++;
Chris@1 150 }
Chris@1 151
Chris@1 152 mindel/=fac;
Chris@1 153 fprintf(stderr,"min=%g mindel=%g\n",min,mindel);
Chris@1 154
Chris@1 155 c.q_min=_float32_pack(min);
Chris@1 156 c.q_delta=_float32_pack(mindel);
Chris@1 157 c.q_quant=0;
Chris@1 158
Chris@1 159 min=_float32_unpack(c.q_min);
Chris@1 160 mindel=_float32_unpack(c.q_delta);
Chris@1 161 for(j=0;j<quantvals;j++){
Chris@1 162 c.quantlist[j]=rint((quantlist[j]-min)/mindel);
Chris@1 163 if(ilog(c.quantlist[j])>c.q_quant)c.q_quant=ilog(c.quantlist[j]);
Chris@1 164 }
Chris@1 165 }
Chris@1 166
Chris@1 167 /* build the [default] codeword lengths */
Chris@1 168 memset(c.lengthlist,0,sizeof(long)*entries);
Chris@1 169 for(i=0;i<entries;i++)hits[i]=1;
Chris@1 170 build_tree_from_lengths(entries,hits,c.lengthlist);
Chris@1 171
Chris@1 172 /* save the book in C header form */
Chris@1 173 write_codebook(stdout,name,&c);
Chris@1 174 fprintf(stderr,"\r "
Chris@1 175 "\nDone.\n");
Chris@1 176 exit(0);
Chris@1 177 }