"L. Spiro Engine"
|
00001 /******************************************************************** 00002 * * 00003 * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * 00004 * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * 00005 * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * 00006 * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * 00007 * * 00008 * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * 00009 * by the Xiph.Org Foundation http://www.xiph.org/ * 00010 * * 00011 ******************************************************************** 00012 00013 function: basic shared codebook operations 00014 last mod: $Id: codebook.h 17030 2010-03-25 06:52:55Z xiphmont $ 00015 00016 ********************************************************************/ 00017 00018 00019 #ifndef __LSS_VORBISCODEBOOK_H__ 00020 #define __LSS_VORBISCODEBOOK_H__ 00021 00022 #include "../LSSSoundLib.h" 00023 #include "LSSOgg.h" 00024 00025 namespace lss { 00026 00033 class CVorbisCodeBook { 00034 public : 00035 // == Types. 00048 typedef struct static_codebook { 00049 LSINT32 dim; // Codebook dimensions (elements per vector). 00050 LSINT32 entries; // Codebook entries. 00051 LSINT32 * lengthlist; // Codeword lengths in bits. 00052 00053 // Mapping. 00054 LSINT32 maptype; // 0 = none. 00055 // 1 = implicitly populated values from map column. 00056 // 2 = listed arbitrary values. 00057 00058 // The below does a linear, single monotonic sequence mapping. 00059 LSINT32 q_min; // Packed 32 bit LSFLOAT; quant value 0 maps to minval. 00060 LSINT32 q_delta; // Packed 32 bit LSFLOAT; val 1 - val 0 == delta. 00061 LSINT32 q_quant; // Bits: 0 < quant <= 16. 00062 LSINT32 q_sequencep; // Bitflag. 00063 00064 LSINT32 * quantlist; // Map == 1: (LSINT32)(entries^(1/dim)) element column map. 00065 // Map == 2: list of dim*entries quantized entry vals. 00066 LSINT32 allocedp; 00067 } * LPstatic_codebook, * const LPCstatic_codebook; 00068 00069 typedef struct codebook { 00070 LSINT32 dim; // Codebook dimensions (elements per vector). 00071 LSINT32 entries; // Codebook entries. 00072 LSINT32 used_entries; // Populated codebook entries. 00073 const static_codebook * c; 00074 00075 // For encode, the below are entry-ordered, fully populated. 00076 // For decode, the below are ordered by bitreversed codeword and only 00077 // used entries are populated. 00078 LSFLOAT * valuelist; // List of dim*entries actual entry values. 00079 LSUINT32 * codelist; // List of bitstream codewords for each entry. 00080 00081 LSINT32 * dec_index; // Only used if sparseness collapsed. 00082 LSINT8 * dec_codelengths; 00083 LSUINT32 * dec_firsttable; 00084 LSINT32 dec_firsttablen; 00085 LSINT32 dec_maxlength; 00086 00087 // The current encoder uses only centered, integer-only lattice books. 00088 LSINT32 quantvals; 00089 LSINT32 minval; 00090 LSINT32 delta; 00091 } * LPcodebook, * const LPCcodebook; 00092 00093 00094 // == Functions. 00100 static LSVOID vorbis_staticbook_destroy( static_codebook * _pscbB ); 00101 00109 static LSINT32 vorbis_book_init_encode( codebook * _pcbDest, const static_codebook * _pscbSource ); 00110 00118 static LSINT32 vorbis_book_init_decode( codebook * _pcbDest, const static_codebook * _pscbSource ); 00119 00125 static LSVOID vorbis_book_clear( codebook * _pcbB ); 00126 00135 static LSFLOAT * _book_unquantize( const static_codebook * _pscbSource, LSINT32 _i32N, LSINT32 * _pi32Map ); 00136 00144 //static LSFLOAT * _book_logdist( const static_codebook * _pscbB, LSFLOAT * _pfVals ); 00145 00152 static LSFLOAT _float32_unpack( LSINT32 _i32Val ); 00153 00160 static LSINT32 _float32_pack( LSFLOAT _i32Val ); 00161 00170 //static LSINT32 _best( codebook * _pcbBook, LSFLOAT * _pfA, LSINT32 _i32Step ); 00171 00178 static LSINT32 _ilog( LSUINT32 _i32V ); 00179 00186 static LSINT32 _book_maptype1_quantvals( const static_codebook * _pscbB ); 00187 00197 //static LSINT32 vorbis_book_besterror( codebook * _pcbBook, LSFLOAT * _pfA, LSINT32 step, LSINT32 _i32AddMul ); 00198 00206 static LSINT32 vorbis_book_codeword( codebook * _pcbBook, LSINT32 _i32Entry ); 00207 00215 static LSINT32 vorbis_book_codelen( codebook * _pcbBook, LSINT32 _i32Entry ); 00216 00224 static LSINT32 vorbis_staticbook_pack( const static_codebook * _pscbC, COgg::oggpack_buffer * _ppbB ); 00225 00232 static static_codebook * vorbis_staticbook_unpack( COgg::oggpack_buffer * _ppbB ); 00233 00242 static LSINT32 vorbis_book_encode( codebook * _pcbBook, LSINT32 _fA, COgg::oggpack_buffer * _ppbB ); 00243 00251 static LSINT32 vorbis_book_decode( codebook * _pcbBook, COgg::oggpack_buffer * _ppbB ); 00252 00262 static LSINT32 vorbis_book_decodevs_add( codebook * _pcbBook, LSFLOAT * _pfA, COgg::oggpack_buffer * _ppbB, LSINT32 _i32N ); 00263 00273 static LSINT32 vorbis_book_decodev_set( codebook * _pcbBook, LSFLOAT * _pfA, COgg::oggpack_buffer * _ppbB, LSINT32 _i32N ); 00274 00284 static LSINT32 vorbis_book_decodev_add( codebook * _pcbBook, LSFLOAT * _pfA, COgg::oggpack_buffer * _ppbB, LSINT32 _i32N ); 00285 00297 static LSINT32 vorbis_book_decodevv_add( codebook * _pcbBook, LSFLOAT ** _ppfA, LSINT32 _i32Off, LSINT32 _i32Ch, COgg::oggpack_buffer * _ppbB, LSINT32 _i32N ); 00298 00299 00300 protected : 00309 static LSUINT32 * _make_words( LSINT32 * _pi32L, LSINT32 _i32N, LSINT32 _i32SparseCount ); 00310 00317 static LSUINT32 bitreverse( LSUINT32 _ui32X ); 00318 00327 static LSINT32 LSE_CCALL sort32a( LSVOID * _pvContext, const LSVOID * _pvA, const LSVOID * _pvB ); 00328 00336 static LSINT32 decode_packed_entry_number( codebook * _pcbBook, COgg::oggpack_buffer * _ppbB ); 00337 }; 00338 00339 } // namespace lss 00340 00341 #endif // __LSS_VORBISCODEBOOK_H__ 00342