annotate src/libvorbis-1.3.3/vq/latticebuild.c @ 148:b4bfdf10c4b3

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