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