/*
 ** 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:		adj_thr_data.h

	Content:	Threshold compensation parameter

*******************************************************************************/

#ifndef __ADJ_THR_DATA_H
#define __ADJ_THR_DATA_H

#include "typedef.h"
#include "psy_const.h"
#include "line_pe.h"

typedef struct {
   Word16 clipSaveLow, clipSaveHigh;
   Word16 minBitSave, maxBitSave;
   Word16 clipSpendLow, clipSpendHigh;
   Word16 minBitSpend, maxBitSpend;
} BRES_PARAM;

typedef struct {
   UWord8 modifyMinSnr;
   Word16 startSfbL, startSfbS;
} AH_PARAM;

typedef struct {
  Word32 maxRed;
  Word32 startRatio, maxRatio;
  Word32 redRatioFac;
  Word32 redOffs;
} MINSNR_ADAPT_PARAM;

typedef struct {
  /* parameters for bitreservoir control */
  Word16 peMin, peMax;
  /* constant offset to pe               */
  Word16  peOffset;
  /* avoid hole parameters               */
  AH_PARAM ahParam;
  /* paramters for adaptation of minSnr */
  MINSNR_ADAPT_PARAM minSnrAdaptParam;
  /* values for correction of pe */
  Word16 peLast;
  Word16 dynBitsLast;
  Word16 peCorrectionFactor;
} ATS_ELEMENT;

typedef struct {
  BRES_PARAM   bresParamLong, bresParamShort; /* Word16 size: 2*8 */
  ATS_ELEMENT  adjThrStateElem;               /* Word16 size: 19 */
} ADJ_THR_STATE;

#endif
