Blame vq/latticetune.c

Packit 06404a
/********************************************************************
Packit 06404a
 *                                                                  *
Packit 06404a
 * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE.   *
Packit 06404a
 * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     *
Packit 06404a
 * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
Packit 06404a
 * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING.       *
Packit 06404a
 *                                                                  *
Packit 06404a
 * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2001             *
Packit 06404a
 * by the Xiph.Org Foundation http://www.xiph.org/                  *
Packit 06404a
 *                                                                  *
Packit 06404a
 ********************************************************************
Packit 06404a
Packit 06404a
 function: utility main for setting entropy encoding parameters
Packit 06404a
           for lattice codebooks
Packit 06404a
 last mod: $Id: latticetune.c 16037 2009-05-26 21:10:58Z xiphmont $
Packit 06404a
Packit 06404a
 ********************************************************************/
Packit 06404a
Packit 06404a
#include <stdlib.h>
Packit 06404a
#include <stdio.h>
Packit 06404a
#include <math.h>
Packit 06404a
#include <string.h>
Packit 06404a
#include <errno.h>
Packit 06404a
#include "bookutil.h"
Packit 06404a
Packit 06404a
static int strrcmp_i(char *s,char *cmp){
Packit 06404a
  return(strncmp(s+strlen(s)-strlen(cmp),cmp,strlen(cmp)));
Packit 06404a
}
Packit 06404a
Packit 06404a
/* This util takes a training-collected file listing codewords used in
Packit 06404a
   LSP fitting, then generates new codeword lengths for maximally
Packit 06404a
   efficient integer-bits entropy encoding.
Packit 06404a
Packit 06404a
   command line:
Packit 06404a
   latticetune book.vqh input.vqd [unused_entriesp]
Packit 06404a
Packit 06404a
   latticetune produces book.vqh on stdout */
Packit 06404a
Packit 06404a
int main(int argc,char *argv[]){
Packit 06404a
  codebook *b;
Packit 06404a
  static_codebook *c;
Packit 06404a
  long *lengths;
Packit 06404a
  long *hits;
Packit 06404a
Packit 06404a
  int entries=-1,dim=-1,guard=1;
Packit 06404a
  FILE *in=NULL;
Packit 06404a
  char *line,*name;
Packit 06404a
  long j;
Packit 06404a
Packit 06404a
  if(argv[1]==NULL){
Packit 06404a
    fprintf(stderr,"Need a lattice codebook on the command line.\n");
Packit 06404a
    exit(1);
Packit 06404a
  }
Packit 06404a
  if(argv[2]==NULL){
Packit 06404a
    fprintf(stderr,"Need a codeword data file on the command line.\n");
Packit 06404a
    exit(1);
Packit 06404a
  }
Packit 06404a
  if(argv[3]!=NULL)guard=0;
Packit 06404a
Packit 06404a
  {
Packit 06404a
    char *ptr;
Packit 06404a
    char *filename=strdup(argv[1]);
Packit 06404a
Packit 06404a
    b=codebook_load(filename);
Packit 06404a
    c=(static_codebook *)(b->c);
Packit 06404a
    
Packit 06404a
    ptr=strrchr(filename,'.');
Packit 06404a
    if(ptr){
Packit 06404a
      *ptr='\0';
Packit 06404a
      name=strdup(filename);
Packit 06404a
    }else{
Packit 06404a
      name=strdup(filename);
Packit 06404a
    }
Packit 06404a
  }
Packit 06404a
Packit 06404a
  if(c->maptype!=1){
Packit 06404a
    fprintf(stderr,"Provided book is not a latticebook.\n");
Packit 06404a
    exit(1);
Packit 06404a
  }
Packit 06404a
Packit 06404a
  entries=b->entries;
Packit 06404a
  dim=b->dim;
Packit 06404a
Packit 06404a
  hits=_ogg_malloc(entries*sizeof(long));
Packit 06404a
  lengths=_ogg_calloc(entries,sizeof(long));
Packit 06404a
  for(j=0;j
Packit 06404a
Packit 06404a
  in=fopen(argv[2],"r");
Packit 06404a
  if(!in){
Packit 06404a
    fprintf(stderr,"Could not open input file %s\n",argv[2]);
Packit 06404a
    exit(1);
Packit 06404a
  }
Packit 06404a
Packit 06404a
  if(!strrcmp_i(argv[0],"latticetune")){
Packit 06404a
    long lines=0;
Packit 06404a
    line=setup_line(in);
Packit 06404a
    while(line){      
Packit 06404a
      long code;
Packit 06404a
      lines++;
Packit 06404a
      if(!(lines&0xfff))spinnit("codewords so far...",lines);
Packit 06404a
      
Packit 06404a
      if(sscanf(line,"%ld",&code)==1)
Packit 06404a
        hits[code]++;
Packit 06404a
Packit 06404a
      line=setup_line(in);
Packit 06404a
    }
Packit 06404a
  }
Packit 06404a
Packit 06404a
  /* now we simply count already collated by-entry data */
Packit 06404a
  if(!strrcmp_i(argv[0],"res0tune") || !strrcmp_i(argv[0],"res1tune")){
Packit 06404a
Packit 06404a
    line=setup_line(in);
Packit 06404a
    while(line){
Packit 06404a
Packit 06404a
      /* code:hits\n */
Packit 06404a
      /* likely to have multiple listing for each code entry; must
Packit 06404a
         accumulate */
Packit 06404a
Packit 06404a
      char *pos=strchr(line,':');
Packit 06404a
      if(pos){
Packit 06404a
        long code=atol(line);
Packit 06404a
        long val=atol(pos+1); 
Packit 06404a
        hits[code]+=val;
Packit 06404a
      }
Packit 06404a
Packit 06404a
      line=setup_line(in);
Packit 06404a
    }
Packit 06404a
  }
Packit 06404a
Packit 06404a
  fclose(in);
Packit 06404a
Packit 06404a
  /* build the codeword lengths */
Packit 06404a
  build_tree_from_lengths0(entries,hits,lengths);
Packit 06404a
Packit 06404a
  c->lengthlist=lengths;
Packit 06404a
  write_codebook(stdout,name,c); 
Packit 06404a
Packit 06404a
  {
Packit 06404a
    long bins=_book_maptype1_quantvals(c);
Packit 06404a
    long i,k,base=c->lengthlist[0];
Packit 06404a
    for(i=0;i
Packit 06404a
      if(c->lengthlist[i]>base)base=c->lengthlist[i];
Packit 06404a
    
Packit 06404a
    for(j=0;j
Packit 06404a
      if(c->lengthlist[j]){
Packit 06404a
        int indexdiv=1;
Packit 06404a
        fprintf(stderr,"%4ld: ",j);
Packit 06404a
        for(k=0;k<c->dim;k++){      
Packit 06404a
          int index= (j/indexdiv)%bins;
Packit 06404a
          fprintf(stderr,"%+3.1f,", c->quantlist[index]*_float32_unpack(c->q_delta)+
Packit 06404a
                 _float32_unpack(c->q_min));
Packit 06404a
          indexdiv*=bins;
Packit 06404a
        }
Packit 06404a
        fprintf(stderr,"\t|");
Packit 06404a
        for(k=0;k<base-c->lengthlist[j];k++)fprintf(stderr,"*");
Packit 06404a
        fprintf(stderr,"\n");
Packit 06404a
      }
Packit 06404a
    }
Packit 06404a
  }
Packit 06404a
  
Packit 06404a
  fprintf(stderr,"\r                                                     "
Packit 06404a
          "\nDone.\n");
Packit 06404a
  exit(0);
Packit 06404a
}