"L. Spiro Engine"

F:/My Projects/LSEngine/Modules/LSSoundLib/Src/Ogg/LSSVorbisPsy.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: random psychoacoustics (not including preecho)
00014  last mod: $Id: psy.h 16946 2010-03-03 16:12:40Z xiphmont $
00015 
00016  ********************************************************************/
00017 
00018 
00019 #ifndef __LSS_VORBISPSY_H__
00020 #define __LSS_VORBISPSY_H__
00021 
00022 #include "../LSSSoundLib.h"
00023 #include "LSSVorbisCodec.h"
00024 #include "LSSVorbisConstants.h"
00025 #include "LSSVorbisMasking.h"
00026 #include "LSSVorbisStructs.h"
00027 
00028 namespace lss {
00029 
00036         class CVorbisPsy {
00037         public :
00038                 // == Types.
00042                 typedef struct vorbis_info_psy {
00043                         LSINT32                                         blockflag;
00044 
00045                         LSFLOAT                                         ath_adjatt;
00046                         LSFLOAT                                         ath_maxatt;
00047 
00048                         LSFLOAT                                         tone_masteratt[P_NOISECURVES];
00049                         LSFLOAT                                         tone_centerboost;
00050                         LSFLOAT                                         tone_decay;
00051                         LSFLOAT                                         tone_abs_limit;
00052                         LSFLOAT                                         toneatt[P_BANDS];
00053 
00054                         LSINT32                                         noisemaskp;
00055                         LSFLOAT                                         noisemaxsupp;
00056                         LSFLOAT                                         noisewindowlo;
00057                         LSFLOAT                                         noisewindowhi;
00058                         LSINT32                                         noisewindowlomin;
00059                         LSINT32                                         noisewindowhimin;
00060                         LSINT32                                         noisewindowfixed;
00061                         LSFLOAT                                         noiseoff[P_NOISECURVES][P_BANDS];
00062                         LSFLOAT                                         noisecompand[NOISE_COMPAND_LEVELS];
00063 
00064                         LSFLOAT                                         max_curve_dB;
00065 
00066                         LSINT32                                         normal_p;
00067                         LSINT32                                         normal_start;
00068                         LSINT32                                         normal_partition;
00069                         LSDOUBLE                                        normal_thresh;
00070                 } * LPvorbis_info_psy, * const LPCvorbis_info_psy;
00071 
00075                 typedef struct vorbis_info_psy_global {
00076                         LSINT32                                         eighth_octave_lines;
00077 
00078                         // For block LSINT32/short tuning; encode only.
00079                         LSFLOAT                                         preecho_thresh[VE_BANDS];
00080                         LSFLOAT                                         postecho_thresh[VE_BANDS];
00081                         LSFLOAT                                         stretch_penalty;
00082                         LSFLOAT                                         preecho_minenergy;
00083 
00084                         LSFLOAT                                         ampmax_att_per_sec;
00085 
00086                         // Channel coupling config.
00087                         LSINT32                                         coupling_pkHz[PACKETBLOBS];
00088                         LSINT32                                         coupling_pointlimit[2][PACKETBLOBS];
00089                         LSINT32                                         coupling_prepointamp[PACKETBLOBS];
00090                         LSINT32                                         coupling_postpointamp[PACKETBLOBS];
00091                         LSINT32                                         sliding_lowpass[2][PACKETBLOBS];
00092 
00093                 } * LPvorbis_info_psy_global, * const LPCvorbis_info_psy_global;
00094 
00098                 typedef struct vorbis_look_psy_global {
00099                         LSFLOAT                                         ampmax;
00100                         LSINT32                                         channels;
00101 
00102                         vorbis_info_psy_global *        gi;
00103                         LSINT32                                         coupling_pointlimit[2][P_NOISECURVES];
00104                 } * LPvorbis_look_psy_global, * const LPCvorbis_look_psy_global;
00105 
00109                 typedef struct vorbis_look_psy {
00110                         LSINT32                                         n;
00111                         vorbis_info_psy *                       vi;
00112 
00113                         LSFLOAT ***                                     tonecurves;
00114                         LSFLOAT **                                      noiseoffset;
00115 
00116                         LSFLOAT *                                       ath;
00117                         LSINT32 *                                       octave;                                 // In n.ocshift format.
00118                         LSINT32 *                                       bark;
00119 
00120                         LSINT32                                         firstoc;
00121                         LSINT32                                         shiftoc;
00122                         LSINT32                                         eighth_octave_lines;    // Power of two, please.
00123                         LSINT32                                         total_octave_lines;
00124                         LSINT32                                         rate;                                   // Cache it.
00125 
00126                         LSFLOAT                                         m_val;                                  // Masking compensation value.
00127 
00128                 } * LPvorbis_look_psy, * LPCvorbis_look_psy;
00129 
00130 
00131                 // == Functions.
00141                 static LSVOID                                   _vp_psy_init( vorbis_look_psy * _plpP, vorbis_info_psy * _pipVi, 
00142                         vorbis_info_psy_global * _pipgGi, LSINT32 _i32N, LSINT32 _i32Rate );
00143 
00149                 static LSVOID                                   _vp_psy_clear( vorbis_look_psy * _plpP );
00150 
00157                 //static LSVOID *                               _vi_psy_dup( LSVOID * _pvSource );
00158 
00164                 static LSVOID                                   _vi_psy_free( vorbis_info_psy * _pipI );
00165 
00172                 //static vorbis_info_psy *              _vi_psy_copy( vorbis_info_psy * _pipI );
00173 
00181                 static LSVOID                                   _vp_noisemask( vorbis_look_psy * _plpP, 
00182                         LSFLOAT * _pfLogMdct, 
00183                         LSFLOAT * _pfLogMask );
00184 
00194                 static LSVOID                                   _vp_tonemask( vorbis_look_psy * _plpP, 
00195                         LSFLOAT * _pfLogFft, 
00196                         LSFLOAT * _pfLogMask, 
00197                         LSFLOAT _fGlobalSpecMax, 
00198                         LSFLOAT _fLocalSpecMax );
00199 
00211                 static LSVOID                                   _vp_offset_and_mix( vorbis_look_psy * _plpP, 
00212                         LSFLOAT * _pfNoise, 
00213                         LSFLOAT * _pfTone, 
00214                         LSINT32 _i32OffsetSelect, 
00215                         LSFLOAT * _pfLogMask, 
00216                         LSFLOAT * _pfMdct, 
00217                         LSFLOAT * _pfLogMdct );
00218 
00226                 static LSFLOAT                                  _vp_ampmax_decay( LSFLOAT _fAmp, CVorbisCodec::vorbis_dsp_state * _pdsVd );
00227 
00241                 static LSVOID                                   _vp_couple_quantize_normalize( LSINT32 _i32BlobNo, 
00242                         vorbis_info_psy_global * _pipgG, 
00243                         vorbis_look_psy * _plpP, 
00244                         CVorbisStructs::vorbis_info_mapping0 * _pipVi, 
00245                         LSFLOAT ** _pfMdct, 
00246                         LSINT32 ** _ppi32Work, 
00247                         LSINT32 * _pi32NonZero, 
00248                         LSINT32 _i32SlidingLowPass, 
00249                         LSINT32 _i32Ch );
00250 
00251 
00252                 protected :
00253                         // == Functions.
00264                         static LSFLOAT ***                      setup_tone_curves( LSFLOAT _fCurveAttDb[P_BANDS], LSFLOAT _fBinHz, LSINT32 _i32N,
00265                                 LSFLOAT _fCenterBoost, LSFLOAT _fCenterDecayRate );
00266 
00273                         static LSVOID                           min_curve( LSFLOAT * _pfC, LSFLOAT * _pfC2 );
00274 
00281                         static LSVOID                           max_curve( LSFLOAT * _pfC, LSFLOAT * _pfC2 );
00282 
00289                         static LSVOID                           attenuate_curve( LSFLOAT * _pfC, LSFLOAT _fAtt );
00290 
00301                         static LSVOID                           bark_noise_hybridmp( LSINT32 _i32N, const LSINT32 * _pi32B, 
00302                                 const LSFLOAT * _pfF, 
00303                                 LSFLOAT * _pfNoise, 
00304                                 const LSFLOAT _fOffset, 
00305                                 const LSINT32 _i32Fixed );
00306 
00317                         static LSVOID                           seed_loop( vorbis_look_psy * _plpP,
00318                                 const LSFLOAT *** _pppfCurves,
00319                                 const LSFLOAT * _pfF,
00320                                 const LSFLOAT * _pfFlr,
00321                                 LSFLOAT * _pfSeed,
00322                                 LSFLOAT _fSpecMax );
00323 
00331                         static LSVOID                           max_seeds( vorbis_look_psy * _plpP,
00332                                 LSFLOAT * _pfSeed,
00333                                 LSFLOAT * _pfFlr );
00334 
00346                         static LSVOID                           seed_curve( LSFLOAT * _pfSeed,
00347                                 const LSFLOAT ** _pppfCurves,
00348                                 LSFLOAT _fAmp,
00349                                 LSINT32 _i32Oc, LSINT32 _i32N,
00350                                 LSINT32 _i32LinesPer,
00351                                 LSFLOAT _fDbOffset );
00352 
00360                         static LSVOID                           seed_chase( LSFLOAT * _pfSeeds, LSINT32 _i32LinesPer, LSINT32 _i32N );
00361 
00374                         static LSVOID                           flag_lossless( LSINT32 _i32Limit, LSFLOAT _fPrePoint, LSFLOAT _fPostPoint, LSFLOAT * _pfMdct,
00375                                 LSFLOAT * _pfFloor, LSINT32 * _pi32Flag, LSINT32 _i32I, LSINT32 _i32Jn );
00376 
00392                         static LSFLOAT                          noise_normalize( vorbis_look_psy * _plpP, LSINT32 _i32Limit, LSFLOAT * _pfR, LSFLOAT * _pfQ, LSFLOAT * _pfF, LSINT32 * _pi32Flags, LSFLOAT _pfAcc, LSINT32 _i32I, LSINT32 _i32N, LSINT32 * _pi32Out );
00393 
00402                         static LSINT32 LSE_CCALL        apsort( LSVOID * _pvContext, const LSVOID * _pvA, const LSVOID * _pvB );
00403         };
00404 
00405 }       // namespace lss
00406 
00407 #endif  // __LSS_VORBISPSY_H__
00408 
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator