cannam@86: /******************************************************************** cannam@86: * * cannam@86: * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * cannam@86: * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * cannam@86: * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * cannam@86: * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * cannam@86: * * cannam@86: * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2001 * cannam@86: * by the Xiph.Org Foundation http://www.xiph.org/ * cannam@86: * * cannam@86: ******************************************************************** cannam@86: cannam@86: function: build a VQ codebook cannam@86: last mod: $Id: vqgen.h 16037 2009-05-26 21:10:58Z xiphmont $ cannam@86: cannam@86: ********************************************************************/ cannam@86: cannam@86: #ifndef _VQGEN_H_ cannam@86: #define _VQGEN_H_ cannam@86: cannam@86: typedef struct vqgen{ cannam@86: int seeded; cannam@86: int sorted; cannam@86: cannam@86: int it; cannam@86: int elements; cannam@86: cannam@86: int aux; cannam@86: float mindist; cannam@86: int centroid; cannam@86: cannam@86: /* point cache */ cannam@86: float *pointlist; cannam@86: long points; cannam@86: long allocated; cannam@86: cannam@86: /* entries */ cannam@86: float *entrylist; cannam@86: long *assigned; cannam@86: float *bias; cannam@86: long entries; cannam@86: float *max; cannam@86: cannam@86: float (*metric_func) (struct vqgen *v,float *entry,float *point); cannam@86: float *(*weight_func) (struct vqgen *v,float *point); cannam@86: cannam@86: FILE *asciipoints; cannam@86: } vqgen; cannam@86: cannam@86: typedef struct { cannam@86: long min; /* packed 24 bit float */ cannam@86: long delta; /* packed 24 bit float */ cannam@86: int quant; /* 0 < quant <= 16 */ cannam@86: int sequencep; /* bitflag */ cannam@86: } quant_meta; cannam@86: cannam@86: static inline float *_point(vqgen *v,long ptr){ cannam@86: return v->pointlist+((v->elements+v->aux)*ptr); cannam@86: } cannam@86: cannam@86: static inline float *_aux(vqgen *v,long ptr){ cannam@86: return _point(v,ptr)+v->aux; cannam@86: } cannam@86: cannam@86: static inline float *_now(vqgen *v,long ptr){ cannam@86: return v->entrylist+(v->elements*ptr); cannam@86: } cannam@86: cannam@86: extern void vqgen_init(vqgen *v, cannam@86: int elements,int aux,int entries,float mindist, cannam@86: float (*metric)(vqgen *,float *, float *), cannam@86: float *(*weight)(vqgen *,float *),int centroid); cannam@86: extern void vqgen_addpoint(vqgen *v, float *p,float *aux); cannam@86: cannam@86: extern float vqgen_iterate(vqgen *v,int biasp); cannam@86: extern void vqgen_unquantize(vqgen *v,quant_meta *q); cannam@86: extern void vqgen_quantize(vqgen *v,quant_meta *q); cannam@86: extern void vqgen_cellmetric(vqgen *v); cannam@86: cannam@86: #endif cannam@86: cannam@86: cannam@86: cannam@86: cannam@86: