18e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels/********************************************************************
28e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels *                                                                  *
38e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE.   *
48e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     *
58e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
68e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING.       *
78e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels *                                                                  *
88e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2001             *
98e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * by the Xiph.Org Foundation http://www.xiph.org/                  *
108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels *                                                                  *
118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ********************************************************************
128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels function: build a VQ codebook
148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels last mod: $Id: vqgen.h 16037 2009-05-26 21:10:58Z xiphmont $
158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ********************************************************************/
178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#ifndef _VQGEN_H_
198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#define _VQGEN_H_
208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelstypedef struct vqgen{
228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int seeded;
238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int sorted;
248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int it;
268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int elements;
278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int aux;
298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  float mindist;
308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int centroid;
318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  /* point cache */
338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  float *pointlist;
348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  long   points;
358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  long   allocated;
368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  /* entries */
388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  float *entrylist;
398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  long   *assigned;
408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  float *bias;
418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  long   entries;
428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  float *max;
438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  float  (*metric_func) (struct vqgen *v,float *entry,float *point);
458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  float *(*weight_func) (struct vqgen *v,float *point);
468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  FILE *asciipoints;
488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels} vqgen;
498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelstypedef struct {
518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  long   min;       /* packed 24 bit float */
528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  long   delta;     /* packed 24 bit float */
538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int    quant;     /* 0 < quant <= 16 */
548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int    sequencep; /* bitflag */
558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels} quant_meta;
568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsstatic inline float *_point(vqgen *v,long ptr){
588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  return v->pointlist+((v->elements+v->aux)*ptr);
598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels}
608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsstatic inline float *_aux(vqgen *v,long ptr){
628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  return _point(v,ptr)+v->aux;
638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels}
648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsstatic inline float *_now(vqgen *v,long ptr){
668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  return v->entrylist+(v->elements*ptr);
678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels}
688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsextern void vqgen_init(vqgen *v,
708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                       int elements,int aux,int entries,float mindist,
718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                       float  (*metric)(vqgen *,float *, float *),
728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                       float *(*weight)(vqgen *,float *),int centroid);
738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsextern void vqgen_addpoint(vqgen *v, float *p,float *aux);
748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsextern float vqgen_iterate(vqgen *v,int biasp);
768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsextern void vqgen_unquantize(vqgen *v,quant_meta *q);
778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsextern void vqgen_quantize(vqgen *v,quant_meta *q);
788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsextern void vqgen_cellmetric(vqgen *v);
798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#endif
818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
86