Update website link in copyright headers.
[platform/upstream/libvorbis.git] / vq / huffbuild.c
index 757b34e..ba00a2e 100644 (file)
@@ -1,18 +1,16 @@
 /********************************************************************
  *                                                                  *
- * 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.                            *
+ * 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 OggSQUISH SOURCE CODE IS (C) COPYRIGHT 1994-2000             *
- * by Monty <monty@xiph.org> and The XIPHOPHORUS Company            *
- * http://www.xiph.org/                                             *
+ * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2014             *
+ * by the Xiph.Org Foundation https://xiph.org/                     *
  *                                                                  *
  ********************************************************************
 
  function: hufftree builder
- last mod: $Id: huffbuild.c,v 1.2 2000/02/23 09:23:51 xiphmont Exp $
 
  ********************************************************************/
 
 #include <string.h>
 #include <math.h>
 #include <stdio.h>
-#include "../vq/bookutil.h"
+#include "bookutil.h"
 
 static int nsofar=0;
 static int getval(FILE *in,int begin,int n,int group,int max){
-  double v;
+  float v;
   int i;
   long val=0;
 
@@ -50,24 +48,26 @@ static int getval(FILE *in,int begin,int n,int group,int max){
 
 static void usage(){
   fprintf(stderr,
-         "usage:\n" 
-         "huffbuild <input>.vqd <begin,n,group>\n"
-         "   where begin,n,group is first scalar, \n"
-         "                          number of scalars of each in line,\n"
-         "                          number of scalars in a group\n"
-         "eg: huffbuild reslongaux.vqd 0,1024,4\n"
-         "produces reslongaux.vqh\n\n");
+          "usage:\n"
+          "huffbuild <input>.vqd <begin,n,group>|<lorange-hirange> [noguard]\n"
+          "   where begin,n,group is first scalar, \n"
+          "                          number of scalars of each in line,\n"
+          "                          number of scalars in a group\n"
+          "eg: huffbuild reslongaux.vqd 0,1024,4\n"
+          "produces reslongaux.vqh\n\n");
   exit(1);
 }
 
 int main(int argc, char *argv[]){
   char *base;
   char *infile;
-  int i,j,k,begin,n,subn;
+  int i,j,k,begin,n,subn,guard=1;
   FILE *file;
   int maxval=0;
+  int loval=0;
 
   if(argc<3)usage();
+  if(argc==4)guard=0;
 
   infile=strdup(argv[1]);
   base=strdup(infile);
@@ -76,19 +76,27 @@ int main(int argc, char *argv[]){
 
   {
     char *pos=strchr(argv[2],',');
-    begin=atoi(argv[2]);
-    if(!pos)
-      usage();
-    else
-      n=atoi(pos+1);
-    pos=strchr(pos+1,',');
-    if(!pos)
-      usage();
-    else
-      subn=atoi(pos+1);
-    if(n/subn*subn != n){
-      fprintf(stderr,"n must be divisible by group\n");
-      exit(1);
+    char *dpos=strchr(argv[2],'-');
+    if(dpos){
+      loval=atoi(argv[2]);
+      maxval=atoi(dpos+1);
+      subn=1;
+      begin=0;
+    }else{
+      begin=atoi(argv[2]);
+      if(!pos)
+        usage();
+      else
+        n=atoi(pos+1);
+      pos=strchr(pos+1,',');
+      if(!pos)
+        usage();
+      else
+        subn=atoi(pos+1);
+      if(n/subn*subn != n){
+        fprintf(stderr,"n must be divisible by group\n");
+        exit(1);
+      }
     }
   }
 
@@ -96,40 +104,49 @@ int main(int argc, char *argv[]){
   file=fopen(infile,"r");
   if(!file){
     fprintf(stderr,"Could not open file %s\n",infile);
-    exit(1);
+    if(!maxval)
+      exit(1);
+    else
+      fprintf(stderr,"  making untrained books.\n");
+
   }
-  i=0;
-  while(1){
-    long v;
-    if(get_next_ivalue(file,&v))break;
-    if(v>maxval)maxval=v;
 
-    if(!(i++&0xff))spinnit("loading... ",i);
+  if(!maxval){
+    i=0;
+    while(1){
+      long v;
+      if(get_next_ivalue(file,&v))break;
+      if(v>maxval)maxval=v;
+
+      if(!(i++&0xff))spinnit("loading... ",i);
+    }
+    rewind(file);
+    maxval++;
   }
-  rewind(file);
-  maxval++;
 
   {
     long vals=pow(maxval,subn);
-    long *hist=malloc(vals*sizeof(long));
-    long *lengths=malloc(vals*sizeof(long));
-    
-    for(j=0;j<vals;j++)hist[j]=1;
-    
-    reset_next_value();
-    i/=subn;
-    while(!feof(file)){
-      long val=getval(file,begin,n,subn,maxval);
-      if(val==-1)break;
-      hist[val]++;
-      if(!(i--&0xff))spinnit("loading... ",i*subn);
+    long *hist=_ogg_calloc(vals,sizeof(long));
+    long *lengths=_ogg_calloc(vals,sizeof(long));
+
+    for(j=loval;j<vals;j++)hist[j]=guard;
+
+    if(file){
+      reset_next_value();
+      i/=subn;
+      while(!feof(file)){
+        long val=getval(file,begin,n,subn,maxval);
+        if(val==-1 || val>=vals)break;
+        hist[val]++;
+        if(!(i--&0xff))spinnit("loading... ",i*subn);
+      }
+      fclose(file);
     }
-    fclose(file);
+
     /* we have the probabilities, build the tree */
     fprintf(stderr,"Building tree for %ld entries\n",vals);
-    build_tree_from_lengths(vals,hist,lengths);
+    build_tree_from_lengths0(vals,hist,lengths);
+
     /* save the book */
     {
       char *buffer=alloca(strlen(base)+5);
@@ -137,53 +154,31 @@ int main(int argc, char *argv[]){
       strcat(buffer,".vqh");
       file=fopen(buffer,"w");
       if(!file){
-       fprintf(stderr,"Could not open file %s\n",buffer);
-       exit(1);
+        fprintf(stderr,"Could not open file %s\n",buffer);
+        exit(1);
       }
     }
-    
-    fprintf(file,
- "/********************************************************************\n"
- " *                                                                  *\n"
- " * THIS FILE IS PART OF THE Ogg Vorbis SOFTWARE CODEC SOURCE CODE.  *\n"
- " * USE, DISTRIBUTION AND REPRODUCTION OF THIS SOURCE IS GOVERNED BY *\n"
- " * THE GNU PUBLIC LICENSE 2, WHICH IS INCLUDED WITH THIS SOURCE.    *\n"
- " * PLEASE READ THESE TERMS DISTRIBUTING.                            *\n"
- " *                                                                  *\n"
- " * THE OggSQUISH SOURCE CODE IS (C) COPYRIGHT 1994-1999             *\n"
- " * by 1999 Monty <monty@xiph.org> and The XIPHOPHORUS Company       *\n"
- " * http://www.xiph.org/                                             *\n"
- " *                                                                  *\n"
- " ********************************************************************\n"
- "\n"
- " function: static codebook autogenerated by huff/huffbuld\n"
- "\n"
- " ********************************************************************/\n\n");
-
-    fprintf(file,"#ifndef _V_%s_VQH_\n#define _V_%s_VQH_\n",base,base);
-    fprintf(file,"#include \"vorbis/codebook.h\"\n\n");
-    
+
     /* first, the static vectors, then the book structure to tie it together. */
     /* lengthlist */
-    fprintf(file,"static long _huff_lengthlist_%s[] = {\n",base);
+    fprintf(file,"static const char _huff_lengthlist_%s[] = {\n",base);
     for(j=0;j<vals;){
       fprintf(file,"\t");
       for(k=0;k<16 && j<vals;k++,j++)
-       fprintf(file,"%2ld,",lengths[j]);
+        fprintf(file,"%2ld,",lengths[j]);
       fprintf(file,"\n");
     }
     fprintf(file,"};\n\n");
-    
+
     /* the toplevel book */
-    fprintf(file,"static static_codebook _huff_book_%s = {\n",base);
-    fprintf(file,"\t%d, %ld, %d, %d, %d, %d,\n",
-           subn,vals,0,0,0,0);
-    fprintf(file,"\tNULL,\n");
-    fprintf(file,"\t_huff_lengthlist_%s,\n",base);
+    fprintf(file,"static const static_codebook _huff_book_%s = {\n",base);
+    fprintf(file,"\t%d, %ld,\n",subn,vals);
+    fprintf(file,"\t(char *)_huff_lengthlist_%s,\n",base);
+    fprintf(file,"\t0, 0, 0, 0, 0,\n");
     fprintf(file,"\tNULL,\n");
-    fprintf(file,"};\n\n");
-    
-    fprintf(file,"\n#endif\n");
+
+    fprintf(file,"\t0\n};\n\n");
+
     fclose(file);
     fprintf(stderr,"Done.                                \n\n");
   }
@@ -191,3 +186,12 @@ int main(int argc, char *argv[]){
 }
 
 
+
+
+
+
+
+
+
+
+