"L. Spiro Engine"

F:/My Projects/LSEngine/Modules/LSSoundLib/Src/Ogg/LSSVorbisCodeBook.h

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 
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator