Home | History | Annotate | Download | only in vq
      1 /********************************************************************
      2  *                                                                  *
      3  * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE.   *
      4  * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     *
      5  * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
      6  * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING.       *
      7  *                                                                  *
      8  * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2001             *
      9  * by the Xiph.Org Foundation http://www.xiph.org/                  *
     10  *                                                                  *
     11  ********************************************************************
     12 
     13  function: build a VQ codebook
     14  last mod: $Id: vqgen.h 16037 2009-05-26 21:10:58Z xiphmont $
     15 
     16  ********************************************************************/
     17 
     18 #ifndef _VQGEN_H_
     19 #define _VQGEN_H_
     20 
     21 typedef struct vqgen{
     22   int seeded;
     23   int sorted;
     24 
     25   int it;
     26   int elements;
     27 
     28   int aux;
     29   float mindist;
     30   int centroid;
     31 
     32   /* point cache */
     33   float *pointlist;
     34   long   points;
     35   long   allocated;
     36 
     37   /* entries */
     38   float *entrylist;
     39   long   *assigned;
     40   float *bias;
     41   long   entries;
     42   float *max;
     43 
     44   float  (*metric_func) (struct vqgen *v,float *entry,float *point);
     45   float *(*weight_func) (struct vqgen *v,float *point);
     46 
     47   FILE *asciipoints;
     48 } vqgen;
     49 
     50 typedef struct {
     51   long   min;       /* packed 24 bit float */
     52   long   delta;     /* packed 24 bit float */
     53   int    quant;     /* 0 < quant <= 16 */
     54   int    sequencep; /* bitflag */
     55 } quant_meta;
     56 
     57 static inline float *_point(vqgen *v,long ptr){
     58   return v->pointlist+((v->elements+v->aux)*ptr);
     59 }
     60 
     61 static inline float *_aux(vqgen *v,long ptr){
     62   return _point(v,ptr)+v->aux;
     63 }
     64 
     65 static inline float *_now(vqgen *v,long ptr){
     66   return v->entrylist+(v->elements*ptr);
     67 }
     68 
     69 extern void vqgen_init(vqgen *v,
     70                        int elements,int aux,int entries,float mindist,
     71                        float  (*metric)(vqgen *,float *, float *),
     72                        float *(*weight)(vqgen *,float *),int centroid);
     73 extern void vqgen_addpoint(vqgen *v, float *p,float *aux);
     74 
     75 extern float vqgen_iterate(vqgen *v,int biasp);
     76 extern void vqgen_unquantize(vqgen *v,quant_meta *q);
     77 extern void vqgen_quantize(vqgen *v,quant_meta *q);
     78 extern void vqgen_cellmetric(vqgen *v);
     79 
     80 #endif
     81 
     82 
     83 
     84 
     85 
     86