/********************************************************************1* *2* THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. *3* *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. *7* *8* THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 *9* BY THE Xiph.Org FOUNDATION http://www.xiph.org/ *10* *11********************************************************************1213function: basic shared codebook operations1415********************************************************************/1617#ifndef _V_CODEBOOK_H_18#define _V_CODEBOOK_H_1920#include "ogg.h"2122/* This structure encapsulates huffman and VQ style encoding books; it23doesn't do anything specific to either.2425valuelist/quantlist are nonNULL (and q_* significant) only if26there's entry->value mapping to be done.2728If encode-side mapping must be done (and thus the entry needs to be29hunted), the auxiliary encode pointer will point to a decision30tree. This is true of both VQ and huffman, but is mostly useful31with VQ.3233*/3435typedef struct static_codebook{36long dim; /* codebook dimensions (elements per vector) */37long entries; /* codebook entries */38long *lengthlist; /* codeword lengths in bits */3940/* mapping ***************************************************************/41int maptype; /* 0=none421=implicitly populated values from map column432=listed arbitrary values */4445/* The below does a linear, single monotonic sequence mapping. */46long q_min; /* packed 32 bit float; quant value 0 maps to minval */47long q_delta; /* packed 32 bit float; val 1 - val 0 == delta */48int q_quant; /* bits: 0 < quant <= 16 */49int q_sequencep; /* bitflag */5051long *quantlist; /* map == 1: (int)(entries^(1/dim)) element column map52map == 2: list of dim*entries quantized entry vals53*/54} static_codebook;5556typedef struct codebook{57long dim; /* codebook dimensions (elements per vector) */58long entries; /* codebook entries */59long used_entries; /* populated codebook entries */6061/* the below are ordered by bitreversed codeword and only used62entries are populated */63int binarypoint;64ogg_int32_t *valuelist; /* list of dim*entries actual entry values */65ogg_uint32_t *codelist; /* list of bitstream codewords for each entry */6667int *dec_index;68char *dec_codelengths;69ogg_uint32_t *dec_firsttable;70int dec_firsttablen;71int dec_maxlength;7273long q_min; /* packed 32 bit float; quant value 0 maps to minval */74long q_delta; /* packed 32 bit float; val 1 - val 0 == delta */7576} codebook;7778extern void vorbis_staticbook_clear(static_codebook *b);79extern void vorbis_staticbook_destroy(static_codebook *b);80extern int vorbis_book_init_decode(codebook *dest,const static_codebook *source);8182extern void vorbis_book_clear(codebook *b);83extern long _book_maptype1_quantvals(const static_codebook *b);8485extern int vorbis_staticbook_unpack(oggpack_buffer *b,static_codebook *c);8687extern long vorbis_book_decode(codebook *book, oggpack_buffer *b);88extern long vorbis_book_decodevs_add(codebook *book, ogg_int32_t *a,89oggpack_buffer *b,int n,int point);90extern long vorbis_book_decodev_set(codebook *book, ogg_int32_t *a,91oggpack_buffer *b,int n,int point);92extern long vorbis_book_decodev_add(codebook *book, ogg_int32_t *a,93oggpack_buffer *b,int n,int point);94extern long vorbis_book_decodevv_add(codebook *book, ogg_int32_t **a,95long off,int ch,96oggpack_buffer *b,int n,int point);9798extern int _ilog(unsigned int v);99100101#endif102103104