18e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels/******************************************************************** 28e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * * 38e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * 48e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * 58e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * 68e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * 78e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * * 88e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * 98e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * by the Xiph.Org Foundation http://www.xiph.org/ * 108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * * 118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ******************************************************************** 128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels function: random psychoacoustics (not including preecho) 148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels last mod: $Id: psy.h 16946 2010-03-03 16:12:40Z xiphmont $ 158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ********************************************************************/ 178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#ifndef _V_PSY_H_ 198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#define _V_PSY_H_ 208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include "smallft.h" 218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include "backends.h" 238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include "envelope.h" 248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#ifndef EHMER_MAX 268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#define EHMER_MAX 56 278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#endif 288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels/* psychoacoustic setup ********************************************/ 308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#define P_BANDS 17 /* 62Hz to 16kHz */ 318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#define P_LEVELS 8 /* 30dB to 100dB */ 328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#define P_LEVEL_0 30. /* 30 dB */ 338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#define P_NOISECURVES 3 348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#define NOISE_COMPAND_LEVELS 40 368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelstypedef struct vorbis_info_psy{ 378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int blockflag; 388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float ath_adjatt; 408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float ath_maxatt; 418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float tone_masteratt[P_NOISECURVES]; 438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float tone_centerboost; 448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float tone_decay; 458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float tone_abs_limit; 468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float toneatt[P_BANDS]; 478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int noisemaskp; 498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float noisemaxsupp; 508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float noisewindowlo; 518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float noisewindowhi; 528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int noisewindowlomin; 538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int noisewindowhimin; 548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int noisewindowfixed; 558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float noiseoff[P_NOISECURVES][P_BANDS]; 568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float noisecompand[NOISE_COMPAND_LEVELS]; 578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float max_curve_dB; 598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int normal_p; 618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int normal_start; 628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int normal_partition; 638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels double normal_thresh; 648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels} vorbis_info_psy; 658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelstypedef struct{ 678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int eighth_octave_lines; 688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels /* for block long/short tuning; encode only */ 708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float preecho_thresh[VE_BANDS]; 718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float postecho_thresh[VE_BANDS]; 728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float stretch_penalty; 738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float preecho_minenergy; 748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float ampmax_att_per_sec; 768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels /* channel coupling config */ 788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int coupling_pkHz[PACKETBLOBS]; 798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int coupling_pointlimit[2][PACKETBLOBS]; 808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int coupling_prepointamp[PACKETBLOBS]; 818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int coupling_postpointamp[PACKETBLOBS]; 828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int sliding_lowpass[2][PACKETBLOBS]; 838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels} vorbis_info_psy_global; 858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelstypedef struct { 878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float ampmax; 888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int channels; 898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vorbis_info_psy_global *gi; 918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int coupling_pointlimit[2][P_NOISECURVES]; 928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels} vorbis_look_psy_global; 938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelstypedef struct { 968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int n; 978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels struct vorbis_info_psy *vi; 988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float ***tonecurves; 1008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float **noiseoffset; 1018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float *ath; 1038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels long *octave; /* in n.ocshift format */ 1048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels long *bark; 1058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels long firstoc; 1078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels long shiftoc; 1088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int eighth_octave_lines; /* power of two, please */ 1098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int total_octave_lines; 1108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels long rate; /* cache it */ 1118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float m_val; /* Masking compensation value */ 1138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels} vorbis_look_psy; 1158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsextern void _vp_psy_init(vorbis_look_psy *p,vorbis_info_psy *vi, 1178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vorbis_info_psy_global *gi,int n,long rate); 1188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsextern void _vp_psy_clear(vorbis_look_psy *p); 1198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsextern void *_vi_psy_dup(void *source); 1208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsextern void _vi_psy_free(vorbis_info_psy *i); 1228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsextern vorbis_info_psy *_vi_psy_copy(vorbis_info_psy *i); 1238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsextern void _vp_noisemask(vorbis_look_psy *p, 1258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float *logmdct, 1268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float *logmask); 1278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsextern void _vp_tonemask(vorbis_look_psy *p, 1298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float *logfft, 1308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float *logmask, 1318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float global_specmax, 1328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float local_specmax); 1338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsextern void _vp_offset_and_mix(vorbis_look_psy *p, 1358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float *noise, 1368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float *tone, 1378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int offset_select, 1388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float *logmask, 1398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float *mdct, 1408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float *logmdct); 1418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsextern float _vp_ampmax_decay(float amp,vorbis_dsp_state *vd); 1438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsextern void _vp_couple_quantize_normalize(int blobno, 1458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vorbis_info_psy_global *g, 1468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vorbis_look_psy *p, 1478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels vorbis_info_mapping0 *vi, 1488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float **mdct, 1498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int **iwork, 1508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int *nonzero, 1518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int sliding_lowpass, 1528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int ch); 1538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#endif 155