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-2007             *
98e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * by the Xiph.Org Foundation http://www.xiph.org/                  *
108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels *                                                                  *
118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ********************************************************************
128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels function: basic shared codebook operations
148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels last mod: $Id: localcodebook.h 16959 2010-03-10 16:03:11Z xiphmont $
158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ********************************************************************/
178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#ifndef _V_CODEBOOK_H_
198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#define _V_CODEBOOK_H_
208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include <ogg/ogg.h>
228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels/* This structure encapsulates huffman and VQ style encoding books; it
248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels   doesn't do anything specific to either.
258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels   valuelist/quantlist are nonNULL (and q_* significant) only if
278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels   there's entry->value mapping to be done.
288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels   If encode-side mapping must be done (and thus the entry needs to be
308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels   hunted), the auxiliary encode pointer will point to a decision
318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels   tree.  This is true of both VQ and huffman, but is mostly useful
328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels   with VQ.
338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels*/
358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelstypedef struct static_codebook{
378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  long   dim;            /* codebook dimensions (elements per vector) */
388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  long   entries;        /* codebook entries */
398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  long  *lengthlist;     /* codeword lengths in bits */
408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  /* mapping ***************************************************************/
428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int    maptype;        /* 0=none
438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                            1=implicitly populated values from map column
448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                            2=listed arbitrary values */
458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  /* The below does a linear, single monotonic sequence mapping. */
478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  long     q_min;       /* packed 32 bit float; quant value 0 maps to minval */
488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  long     q_delta;     /* packed 32 bit float; val 1 - val 0 == delta */
498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int      q_quant;     /* bits: 0 < quant <= 16 */
508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int      q_sequencep; /* bitflag */
518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  long     *quantlist;  /* map == 1: (int)(entries^(1/dim)) element column map
538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                           map == 2: list of dim*entries quantized entry vals
548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                        */
558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int allocedp;
568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels} static_codebook;
578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelstypedef struct codebook{
598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  long dim;           /* codebook dimensions (elements per vector) */
608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  long entries;       /* codebook entries */
618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  long used_entries;  /* populated codebook entries */
628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  static_codebook *c;
638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  /* for encode, the below are entry-ordered, fully populated */
658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  /* for decode, the below are ordered by bitreversed codeword and only
668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels     used entries are populated */
678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  float        *valuelist;  /* list of dim*entries actual entry values */
688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  ogg_uint32_t *codelist;   /* list of bitstream codewords for each entry */
698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int          *dec_index;  /* only used if sparseness collapsed */
718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  char         *dec_codelengths;
728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  ogg_uint32_t *dec_firsttable;
738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int           dec_firsttablen;
748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int           dec_maxlength;
758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  /* The current encoder uses only centered, integer-only lattice books. */
778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int           quantvals;
788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int           minval;
798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int           delta;
808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels} codebook;
828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsextern void vorbis_staticbook_clear(static_codebook *b);
848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsextern void vorbis_staticbook_destroy(static_codebook *b);
858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsextern int vorbis_book_init_encode(codebook *dest,const static_codebook *source);
868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsextern int vorbis_book_init_decode(codebook *dest,const static_codebook *source);
878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsextern void vorbis_book_clear(codebook *b);
888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsextern float *_book_unquantize(const static_codebook *b,int n,int *map);
908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsextern float *_book_logdist(const static_codebook *b,float *vals);
918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsextern float _float32_unpack(long val);
928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsextern long   _float32_pack(float val);
938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsextern int  _best(codebook *book, float *a, int step);
948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsextern int _ilog(unsigned int v);
958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsextern long _book_maptype1_quantvals(const static_codebook *b);
968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsextern int vorbis_book_besterror(codebook *book,float *a,int step,int addmul);
988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsextern long vorbis_book_codeword(codebook *book,int entry);
998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsextern long vorbis_book_codelen(codebook *book,int entry);
1008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsextern int vorbis_staticbook_pack(const static_codebook *c,oggpack_buffer *b);
1048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsextern int vorbis_staticbook_unpack(oggpack_buffer *b,static_codebook *c);
1058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsextern int vorbis_book_encode(codebook *book, int a, oggpack_buffer *b);
1078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsextern long vorbis_book_decode(codebook *book, oggpack_buffer *b);
1098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsextern long vorbis_book_decodevs_add(codebook *book, float *a,
1108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     oggpack_buffer *b,int n);
1118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsextern long vorbis_book_decodev_set(codebook *book, float *a,
1128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                    oggpack_buffer *b,int n);
1138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsextern long vorbis_book_decodev_add(codebook *book, float *a,
1148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                    oggpack_buffer *b,int n);
1158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsextern long vorbis_book_decodevv_add(codebook *book, float **a,
1168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                     long off,int ch,
1178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                    oggpack_buffer *b,int n);
1188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#endif
122