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