1 /********************************************************************
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. *
8 * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 *
9 * by the Xiph.Org Foundation http://www.xiph.org/ *
11 ********************************************************************
13 function: basic shared codebook operations
14 last mod: $Id: codebook.h 13293 2007-07-24 00:09:47Z xiphmont $
16 ********************************************************************/
18 #ifndef _V_CODEBOOK_H_
19 #define _V_CODEBOOK_H_
23 /* This structure encapsulates huffman and VQ style encoding books; it
24 doesn't do anything specific to either.
26 valuelist/quantlist are nonNULL (and q_* significant) only if
27 there's entry->value mapping to be done.
29 If encode-side mapping must be done (and thus the entry needs to be
30 hunted), the auxiliary encode pointer will point to a decision
31 tree. This is true of both VQ and huffman, but is mostly useful
36 typedef struct static_codebook
{
37 long dim
; /* codebook dimensions (elements per vector) */
38 long entries
; /* codebook entries */
39 long *lengthlist
; /* codeword lengths in bits */
41 /* mapping ***************************************************************/
42 int maptype
; /* 0=none
43 1=implicitly populated values from map column
44 2=listed arbitrary values */
46 /* The below does a linear, single monotonic sequence mapping. */
47 long q_min
; /* packed 32 bit float; quant value 0 maps to minval */
48 long q_delta
; /* packed 32 bit float; val 1 - val 0 == delta */
49 int q_quant
; /* bits: 0 < quant <= 16 */
50 int q_sequencep
; /* bitflag */
52 long *quantlist
; /* map == 1: (int)(entries^(1/dim)) element column map
53 map == 2: list of dim*entries quantized entry vals
56 /* encode helpers ********************************************************/
57 struct encode_aux_nearestmatch
*nearest_tree
;
58 struct encode_aux_threshmatch
*thresh_tree
;
59 struct encode_aux_pigeonhole
*pigeon_tree
;
64 /* this structures an arbitrary trained book to quickly find the
66 typedef struct encode_aux_nearestmatch
{
67 /* pre-calculated partitioning tree */
71 long *p
; /* decision points (each is an entry) */
72 long *q
; /* decision points (each is an entry) */
73 long aux
; /* number of tree entries */
75 } encode_aux_nearestmatch
;
77 /* assumes a maptype of 1; encode side only, so that's OK */
78 typedef struct encode_aux_threshmatch
{
83 } encode_aux_threshmatch
;
85 typedef struct encode_aux_pigeonhole
{
97 } encode_aux_pigeonhole
;
99 typedef struct codebook
{
100 long dim
; /* codebook dimensions (elements per vector) */
101 long entries
; /* codebook entries */
102 long used_entries
; /* populated codebook entries */
103 const static_codebook
*c
;
105 /* for encode, the below are entry-ordered, fully populated */
106 /* for decode, the below are ordered by bitreversed codeword and only
107 used entries are populated */
108 float *valuelist
; /* list of dim*entries actual entry values */
109 ogg_uint32_t
*codelist
; /* list of bitstream codewords for each entry */
111 int *dec_index
; /* only used if sparseness collapsed */
112 char *dec_codelengths
;
113 ogg_uint32_t
*dec_firsttable
;
119 extern void vorbis_staticbook_clear(static_codebook
*b
);
120 extern void vorbis_staticbook_destroy(static_codebook
*b
);
121 extern int vorbis_book_init_encode(codebook
*dest
,const static_codebook
*source
);
122 extern int vorbis_book_init_decode(codebook
*dest
,const static_codebook
*source
);
123 extern void vorbis_book_clear(codebook
*b
);
125 extern float *_book_unquantize(const static_codebook
*b
,int n
,int *map
);
126 extern float *_book_logdist(const static_codebook
*b
,float *vals
);
127 extern float _float32_unpack(long val
);
128 extern long _float32_pack(float val
);
129 extern int _best(codebook
*book
, float *a
, int step
);
130 extern int _ilog(unsigned int v
);
131 extern long _book_maptype1_quantvals(const static_codebook
*b
);
133 extern int vorbis_book_besterror(codebook
*book
,float *a
,int step
,int addmul
);
134 extern long vorbis_book_codeword(codebook
*book
,int entry
);
135 extern long vorbis_book_codelen(codebook
*book
,int entry
);
139 extern int vorbis_staticbook_pack(const static_codebook
*c
,oggpack_buffer
*b
);
140 extern int vorbis_staticbook_unpack(oggpack_buffer
*b
,static_codebook
*c
);
142 extern int vorbis_book_encode(codebook
*book
, int a
, oggpack_buffer
*b
);
143 extern int vorbis_book_errorv(codebook
*book
, float *a
);
144 extern int vorbis_book_encodev(codebook
*book
, int best
,float *a
,
147 extern long vorbis_book_decode(codebook
*book
, oggpack_buffer
*b
);
148 extern long vorbis_book_decodevs_add(codebook
*book
, float *a
,
149 oggpack_buffer
*b
,int n
);
150 extern long vorbis_book_decodev_set(codebook
*book
, float *a
,
151 oggpack_buffer
*b
,int n
);
152 extern long vorbis_book_decodev_add(codebook
*book
, float *a
,
153 oggpack_buffer
*b
,int n
);
154 extern long vorbis_book_decodevv_add(codebook
*book
, float **a
,
156 oggpack_buffer
*b
,int n
);