/*
 ** Copyright 2003-2010, VisualOn, Inc.
 **
 ** Licensed under the Apache License, Version 2.0 (the "License");
 ** you may not use this file except in compliance with the License.
 ** You may obtain a copy of the License at
 **
 **     http://www.apache.org/licenses/LICENSE-2.0
 **
 ** Unless required by applicable law or agreed to in writing, software
 ** distributed under the License is distributed on an "AS IS" BASIS,
 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 ** See the License for the specific language governing permissions and
 ** limitations under the License.
 */
/*******************************************************************************
	File:		psy_configuration.h

	Content:	Psychoaccoustic configuration structure and functions

*******************************************************************************/

#ifndef _PSY_CONFIGURATION_H
#define _PSY_CONFIGURATION_H

#include "typedefs.h"
#include "psy_const.h"
#include "tns.h"

typedef struct{

  Word16 sfbCnt;
  Word16 sfbActive;   /* number of sf bands containing energy after lowpass */
  Word16 *sfbOffset;

  Word32 sfbThresholdQuiet[MAX_SFB_LONG];

  Word16 maxAllowedIncreaseFactor;   /* preecho control */
  Word16 minRemainingThresholdFactor;

  Word16 lowpassLine;
  Word16 sampRateIdx;
  Word32 clipEnergy;                 /* for level dependend tmn */

  Word16 ratio;
  Word16 sfbMaskLowFactor[MAX_SFB_LONG];
  Word16 sfbMaskHighFactor[MAX_SFB_LONG];

  Word16 sfbMaskLowFactorSprEn[MAX_SFB_LONG];
  Word16 sfbMaskHighFactorSprEn[MAX_SFB_LONG];


  Word16 sfbMinSnr[MAX_SFB_LONG];       /* minimum snr (formerly known as bmax) */

  TNS_CONFIG tnsConf;

}PSY_CONFIGURATION_LONG; /*Word16 size: 8 + 52 + 102 + 51 + 51 + 51 + 51 + 47 = 515 */


typedef struct{

  Word16 sfbCnt;
  Word16 sfbActive;   /* number of sf bands containing energy after lowpass */
  Word16 *sfbOffset;

  Word32 sfbThresholdQuiet[MAX_SFB_SHORT];

  Word16 maxAllowedIncreaseFactor;   /* preecho control */
  Word16 minRemainingThresholdFactor;

  Word16 lowpassLine;
  Word16 sampRateIdx;
  Word32 clipEnergy;                 /* for level dependend tmn */

  Word16 ratio;
  Word16 sfbMaskLowFactor[MAX_SFB_SHORT];
  Word16 sfbMaskHighFactor[MAX_SFB_SHORT];

  Word16 sfbMaskLowFactorSprEn[MAX_SFB_SHORT];
  Word16 sfbMaskHighFactorSprEn[MAX_SFB_SHORT];


  Word16 sfbMinSnr[MAX_SFB_SHORT];       /* minimum snr (formerly known as bmax) */

  TNS_CONFIG tnsConf;

}PSY_CONFIGURATION_SHORT; /*Word16 size: 8 + 16 + 16 + 16 + 16 + 16 + 16 + 16 + 47 = 167 */


/* Returns the sample rate index */
Word32 GetSRIndex(Word32 sampleRate);


Word16 InitPsyConfigurationLong(Word32 bitrate,
                                Word32 samplerate,
                                Word16 bandwidth,
                                PSY_CONFIGURATION_LONG *psyConf);

Word16 InitPsyConfigurationShort(Word32 bitrate,
                                 Word32 samplerate,
                                 Word16 bandwidth,
                                 PSY_CONFIGURATION_SHORT *psyConf);

#endif /* _PSY_CONFIGURATION_H */



