• psy.h
  • /********************************************************************
     *                                                                  *
     * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE.   *
     * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     *
     * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
     * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING.       *
     *                                                                  *
     * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009             *
     * by the Xiph.Org Foundation https://xiph.org/                     *
     *                                                                  *
     ********************************************************************
    
     function: random psychoacoustics (not including preecho)
    
     ********************************************************************/
    
    #ifndef _V_PSY_H_
    #define _V_PSY_H_
    #include "smallft.h"
    
    #include "backends.h"
    #include "envelope.h"
    
    #ifndef EHMER_MAX
    #define EHMER_MAX 56
    #endif
    
    /* psychoacoustic setup ********************************************/
    #define P_BANDS 17      /* 62Hz to 16kHz */
    #define P_LEVELS 8      /* 30dB to 100dB */
    #define P_LEVEL_0 30.    /* 30 dB */
    #define P_NOISECURVES 3
    
    #define NOISE_COMPAND_LEVELS 40
    typedef struct vorbis_info_psy{
      int   blockflag;
    
      float ath_adjatt;
      float ath_maxatt;
    
      float tone_masteratt[P_NOISECURVES];
      float tone_centerboost;
      float tone_decay;
      float tone_abs_limit;
      float toneatt[P_BANDS];
    
      int noisemaskp;
      float noisemaxsupp;
      float noisewindowlo;
      float noisewindowhi;
      int   noisewindowlomin;
      int   noisewindowhimin;
      int   noisewindowfixed;
      float noiseoff[P_NOISECURVES][P_BANDS];
      float noisecompand[NOISE_COMPAND_LEVELS];
    
      float max_curve_dB;
    
      int normal_p;
      int normal_start;
      int normal_partition;
      double normal_thresh;
    } vorbis_info_psy;
    
    typedef struct{
      int   eighth_octave_lines;
    
      /* for block long/short tuning; encode only */
      float preecho_thresh[VE_BANDS];
      float postecho_thresh[VE_BANDS];
      float stretch_penalty;
      float preecho_minenergy;
    
      float ampmax_att_per_sec;
    
      /* channel coupling config */
      int   coupling_pkHz[PACKETBLOBS];
      int   coupling_pointlimit[2][PACKETBLOBS];
      int   coupling_prepointamp[PACKETBLOBS];
      int   coupling_postpointamp[PACKETBLOBS];
      int   sliding_lowpass[2][PACKETBLOBS];
    
    } vorbis_info_psy_global;
    
    typedef struct {
      float ampmax;
      int   channels;
    
      vorbis_info_psy_global *gi;
      int   coupling_pointlimit[2][P_NOISECURVES];
    } vorbis_look_psy_global;
    
    
    typedef struct {
      int n;
      struct vorbis_info_psy *vi;
    
      float ***tonecurves;
      float **noiseoffset;
    
      float *ath;
      long  *octave;             /* in n.ocshift format */
      long  *bark;
    
      long  firstoc;
      long  shiftoc;
      int   eighth_octave_lines; /* power of two, please */
      int   total_octave_lines;
      long  rate; /* cache it */
    
      float m_val; /* Masking compensation value */
    
    } vorbis_look_psy;
    
    extern void   _vp_psy_init(vorbis_look_psy *p,vorbis_info_psy *vi,
                               vorbis_info_psy_global *gi,int n,long rate);
    extern void   _vp_psy_clear(vorbis_look_psy *p);
    extern void  *_vi_psy_dup(void *source);
    
    extern void   _vi_psy_free(vorbis_info_psy *i);
    extern vorbis_info_psy *_vi_psy_copy(vorbis_info_psy *i);
    
    extern void _vp_noisemask(vorbis_look_psy *p,
                              float *logmdct,
                              float *logmask);
    
    extern void _vp_tonemask(vorbis_look_psy *p,
                             float *logfft,
                             float *logmask,
                             float global_specmax,
                             float local_specmax);
    
    extern void _vp_offset_and_mix(vorbis_look_psy *p,
                                   float *noise,
                                   float *tone,
                                   int offset_select,
                                   float *logmask,
                                   float *mdct,
                                   float *logmdct);
    
    extern float _vp_ampmax_decay(float amp,vorbis_dsp_state *vd);
    
    extern void _vp_couple_quantize_normalize(int blobno,
                                              vorbis_info_psy_global *g,
                                              vorbis_look_psy *p,
                                              vorbis_info_mapping0 *vi,
                                              float **mdct,
                                              int   **iwork,
                                              int    *nonzero,
                                              int     sliding_lowpass,
                                              int     ch);
    
    #endif