123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 |
- /********************************************************************
- * *
- * THIS FILE IS PART OF THE Ogg Vorbis SOFTWARE CODEC SOURCE CODE. *
- * USE, DISTRIBUTION AND REPRODUCTION OF THIS SOURCE IS GOVERNED BY *
- * THE GNU PUBLIC LICENSE 2, WHICH IS INCLUDED WITH THIS SOURCE. *
- * PLEASE READ THESE TERMS DISTRIBUTING. *
- * *
- * THE OggSQUISH SOURCE CODE IS (C) COPYRIGHT 1994-2000 *
- * by Monty <monty@xiph.org> and The XIPHOPHORUS Company *
- * http://www.xiph.org/ *
- * *
- ********************************************************************
- function: utility main for building codebooks from training sets
- last mod: $Id: build.c,v 1.12.4.6 2000/05/04 23:08:10 xiphmont Exp $
- ********************************************************************/
- #include <stdlib.h>
- #include <stdio.h>
- #include <math.h>
- #include <string.h>
- #include <errno.h>
- #include "vorbis/codebook.h"
- #include "../lib/sharedbook.h"
- #include "bookutil.h"
- #include "vqgen.h"
- #include "vqsplit.h"
- static char *linebuffer=NULL;
- static int lbufsize=0;
- static char *rline(FILE *in,FILE *out){
- long sofar=0;
- if(feof(in))return NULL;
- while(1){
- int gotline=0;
- while(!gotline){
- if(sofar>=lbufsize){
- if(!lbufsize){
- lbufsize=1024;
- linebuffer=malloc(lbufsize);
- }else{
- lbufsize*=2;
- linebuffer=realloc(linebuffer,lbufsize);
- }
- }
- {
- long c=fgetc(in);
- switch(c){
- case '\n':
- case EOF:
- gotline=1;
- break;
- default:
- linebuffer[sofar++]=c;
- linebuffer[sofar]='\0';
- break;
- }
- }
- }
-
- if(linebuffer[0]=='#'){
- sofar=0;
- }else{
- return(linebuffer);
- }
- }
- }
- /* command line:
- buildvq file
- */
- int main(int argc,char *argv[]){
- vqgen v;
- static_codebook c;
- codebook b;
- quant_meta q;
- long *quantlist=NULL;
- int entries=-1,dim=-1,aux=-1;
- FILE *out=NULL;
- FILE *in=NULL;
- char *line,*name;
- long i,j,k;
- b.c=&c;
- if(argv[1]==NULL){
- fprintf(stderr,"Need a trained data set on the command line.\n");
- exit(1);
- }
- {
- char *ptr;
- char *filename=strdup(argv[1]);
- in=fopen(filename,"r");
- if(!in){
- fprintf(stderr,"Could not open input file %s\n",filename);
- exit(1);
- }
-
- ptr=strrchr(filename,'-');
- if(ptr){
- *ptr='\0';
- name=strdup(filename);
- sprintf(ptr,".vqh");
- }else{
- name=strdup(filename);
- strcat(filename,".vqh");
- }
- out=fopen(filename,"w");
- if(out==NULL){
- fprintf(stderr,"Unable to open %s for writing\n",filename);
- exit(1);
- }
- }
- /* suck in the trained book */
- /* read book type, but it doesn't matter */
- line=rline(in,out);
-
- line=rline(in,out);
- if(sscanf(line,"%d %d %d",&entries,&dim,&aux)!=3){
- fprintf(stderr,"Syntax error reading book file\n");
- exit(1);
- }
-
- /* just use it to allocate mem */
- vqgen_init(&v,dim,0,entries,0.,NULL,NULL);
-
- /* quant */
- line=rline(in,out);
- if(sscanf(line,"%ld %ld %d %d",&q.min,&q.delta,
- &q.quant,&q.sequencep)!=4){
- fprintf(stderr,"Syntax error reading book file\n");
- exit(1);
- }
-
- /* quantized entries */
- /* save quant data; we don't want to requantize later as our method
- is currently imperfect wrt repeated application */
- i=0;
- quantlist=malloc(sizeof(long)*v.elements*v.entries);
- for(j=0;j<entries;j++){
- double a;
- for(k=0;k<dim;k++){
- line=rline(in,out);
- sscanf(line,"%lf",&a);
- v.entrylist[i]=a;
- quantlist[i++]=rint(a);
- }
- }
-
- /* ignore bias */
- for(j=0;j<entries;j++)line=rline(in,out);
- free(v.bias);
- v.bias=NULL;
-
- /* training points */
- {
- double *b=alloca(sizeof(double)*(dim+aux));
- i=0;
- v.entries=0; /* hack to avoid reseeding */
- while(1){
- for(k=0;k<dim+aux;k++){
- line=rline(in,out);
- if(!line)break;
- sscanf(line,"%lf",b+k);
- }
- if(feof(in))break;
- vqgen_addpoint(&v,b,NULL);
- }
- v.entries=entries;
- }
-
- fclose(in);
- vqgen_unquantize(&v,&q);
- /* build the book */
- vqsp_book(&v,&b,quantlist);
- c.q_min=q.min;
- c.q_delta=q.delta;
- c.q_quant=q.quant;
- c.q_sequencep=q.sequencep;
- /* save the book in C header form */
- write_codebook(out,name,b.c);
- fclose(out);
- exit(0);
- }
|