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