dec_amr.cpp revision ab4412a1992ce7ec0965cdbf616d64d821b67183
14f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/* ------------------------------------------------------------------
24f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * Copyright (C) 1998-2009 PacketVideo
34f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *
44f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
54f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * you may not use this file except in compliance with the License.
64f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * You may obtain a copy of the License at
74f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *
84f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
94f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *
104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * Unless required by applicable law or agreed to in writing, software
114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * express or implied.
144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * See the License for the specific language governing permissions
154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * and limitations under the License.
164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * -------------------------------------------------------------------
174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber */
184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/****************************************************************************************
194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas HuberPortions of this file are derived from the following 3GPP standard:
204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    3GPP TS 26.073
224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Available from http://www.3gpp.org
244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas HuberPermission to distribute, modify and use this file under the standard license
274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberterms listed above has been obtained from the copyright holder.
284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber****************************************************************************************/
294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*
304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Pathname: ./audio/gsm-amr/c/src/dec_amr.c
334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Funtions: Decoder_amr_init
344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           Decoder_amr_reset
354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           Decoder_amr
364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber MODULE DESCRIPTION
394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber This file contains the function used to decode one speech frame using a given
414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber codec mode. The functions used to initialize, reset, and exit are also
424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber included in this file.
434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber*/
464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*----------------------------------------------------------------------------
484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber; INCLUDES
494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber----------------------------------------------------------------------------*/
504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include <string.h>
514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "dec_amr.h"
534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "typedef.h"
544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "cnst.h"
554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "copy.h"
564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "set_zero.h"
574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "syn_filt.h"
584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "d_plsf.h"
594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "agc.h"
604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "int_lpc.h"
614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "dec_gain.h"
624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "dec_lag3.h"
634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "dec_lag6.h"
644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "d2_9pf.h"
654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "d2_11pf.h"
664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "d3_14pf.h"
674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "d4_17pf.h"
684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "d8_31pf.h"
694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "d1035pf.h"
704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "pred_lt.h"
714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "d_gain_p.h"
724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "d_gain_c.h"
734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "dec_gain.h"
744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "ec_gains.h"
754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "ph_disp.h"
764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "c_g_aver.h"
774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "int_lsf.h"
784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "lsp_lsf.h"
794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "lsp_avg.h"
804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "bgnscd.h"
814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "ex_ctrl.h"
824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "sqrt_l.h"
834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "frame.h"
844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "bitno_tab.h"
854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "b_cn_cod.h"
864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "basic_op.h"
874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*----------------------------------------------------------------------------
894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber; MACROS
904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber; Define module specific macros here
914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber----------------------------------------------------------------------------*/
924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*----------------------------------------------------------------------------
944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber; DEFINES
954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber; Include all pre-processor statements here. Include conditional
964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber; compile variables also.
974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber----------------------------------------------------------------------------*/
984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*----------------------------------------------------------------------------
1004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber; LOCAL FUNCTION DEFINITIONS
1014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber; Function Prototype declaration
1024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber----------------------------------------------------------------------------*/
1034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*----------------------------------------------------------------------------
1054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber; LOCAL VARIABLE DEFINITIONS
1064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber; Variable declaration - defined here and used outside this module
1074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber----------------------------------------------------------------------------*/
1084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*
1114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
1124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION NAME: Decoder_amr_init
1134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
1144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber INPUT AND OUTPUT DEFINITIONS
1154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Inputs:
1174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    state = pointer to a pointer to structures of type Decoder_amrState
1184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Outputs:
1204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    structure pointed to by the pointer which is pointed to by state is
1214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      initialized to each field's initial values
1224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    state pointer points to the address of the memory allocated by
1244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      Decoder_amr_init function
1254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Returns:
1274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    return_value = 0, if the initialization was successful; -1, otherwise (int)
1284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Global Variables Used:
1304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
1314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Local Variables Needed:
1334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
1344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
1364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION DESCRIPTION
1374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber This function allocates and initializes state memory used by the Decoder_amr
1394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber function. It stores the pointer to the filter status structure in state. This
1404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber pointer has to be passed to Decoder_amr in each call. The function returns
1414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 0, if initialization was successful and -1, otherwise.
1424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
1444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REQUIREMENTS
1454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber None
1474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
1494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REFERENCES
1504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber dec_amr.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
1524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
1544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber PSEUDO-CODE
1554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberint Decoder_amr_init (Decoder_amrState **state)
1574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{
1584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  Decoder_amrState* s;
1594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  Word16 i;
1604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  if (state == (Decoder_amrState **) NULL){
1624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      fprintf(stderr, "Decoder_amr_init: invalid parameter\n");
1634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      return -1;
1644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  }
1654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  *state = NULL;
1664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  // allocate memory
1684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  if ((s= (Decoder_amrState *) malloc(sizeof(Decoder_amrState))) == NULL){
1694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      fprintf(stderr, "Decoder_amr_init: can not malloc state structure\n");
1704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      return -1;
1714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  }
1724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  s->T0_lagBuff = 40;
1744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  s->inBackgroundNoise = 0;
1754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  s->voicedHangover = 0;
1764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  for (i = 0; i < 9; i++)
1774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     s->ltpGainHistory[i] = 0;
1784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  s->lsfState = NULL;
1804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  s->ec_gain_p_st = NULL;
1814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  s->ec_gain_c_st = NULL;
1824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  s->pred_state = NULL;
1834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  s->ph_disp_st = NULL;
1844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  s->dtxDecoderState = NULL;
1854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  if (D_plsf_init(&s->lsfState) ||
1874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      ec_gain_pitch_init(&s->ec_gain_p_st) ||
1884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      ec_gain_code_init(&s->ec_gain_c_st) ||
1894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      gc_pred_init(&s->pred_state) ||
1904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      Cb_gain_average_init(&s->Cb_gain_averState) ||
1914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      lsp_avg_init(&s->lsp_avg_st) ||
1924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      Bgn_scd_init(&s->background_state) ||
1934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      ph_disp_init(&s->ph_disp_st) ||
1944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      dtx_dec_init(&s->dtxDecoderState)) {
1954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      Decoder_amr_exit(&s);
1964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      return -1;
1974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  }
1984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  Decoder_amr_reset(s, (enum Mode)0);
2004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  *state = s;
2014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  return 0;
2034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber}
2044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
2064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber RESOURCES USED [optional]
2074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber When the code is written for a specific target processor the
2094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber the resources used should be documented below.
2104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber HEAP MEMORY USED: x bytes
2124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber STACK MEMORY USED: x bytes
2144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
2164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                used to represent cycle count for each subroutine
2174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                called)
2184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
2194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                     name]
2204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
2224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CAUTION [optional]
2234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber [State any special notes, constraints or cautions for users of this function]
2244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
2264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber*/
2274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas HuberWord16 Decoder_amr_init(Decoder_amrState *s)
2294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{
2304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 i;
2314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (s == (Decoder_amrState *) NULL)
2334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
2344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* fprint(stderr, "Decoder_amr_init: invalid parameter\n");  */
2354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        return(-1);
2364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
2374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    s->T0_lagBuff = 40;
2394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    s->inBackgroundNoise = 0;
2404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    s->voicedHangover = 0;
2414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* Initialize overflow Flag */
2434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    s->overflow = 0;
2454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    for (i = 0; i < LTP_GAIN_HISTORY_LEN; i++)
2474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
2484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        s->ltpGainHistory[i] = 0;
2494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
2504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    D_plsf_reset(&s->lsfState);
2524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    ec_gain_pitch_reset(&s->ec_gain_p_st);
2534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    ec_gain_code_reset(&s->ec_gain_c_st);
2544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Cb_gain_average_reset(&s->Cb_gain_averState);
2554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    lsp_avg_reset(&s->lsp_avg_st);
2564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Bgn_scd_reset(&s->background_state);
2574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    ph_disp_reset(&s->ph_disp_st);
2584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    dtx_dec_reset(&s->dtxDecoderState);
2594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    gc_pred_reset(&s->pred_state);
2604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Decoder_amr_reset(s, MR475);
2624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    return(0);
2644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber}
2654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/****************************************************************************/
2674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*
2694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
2704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION NAME: Decoder_amr_reset
2714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
2724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber INPUT AND OUTPUT DEFINITIONS
2734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Inputs:
2754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    state = pointer to a structure of type Decoder_amrState
2764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    mode = codec mode (enum Mode)
2774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Outputs:
2794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    structure pointed to by state is initialized to its reset value
2804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Returns:
2824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    return_value = 0, if reset was successful; -1, otherwise (int)
2834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Global Variables Used:
2854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
2864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Local Variables Needed:
2884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
2894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
2914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION DESCRIPTION
2924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber This function resets the state memory used by the Decoder_amr function. It
2944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber returns a 0, if reset was successful and -1, otherwise.
2954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
2974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REQUIREMENTS
2984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber None
3004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
3024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REFERENCES
3034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber dec_amr.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
3054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
3074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber PSEUDO-CODE
3084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberint Decoder_amr_reset (Decoder_amrState *state, enum Mode mode)
3104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{
3114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  Word16 i;
3124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  if (state == (Decoder_amrState *) NULL){
3144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      fprintf(stderr, "Decoder_amr_reset: invalid parameter\n");
3154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      return -1;
3164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  }
3174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  // Initialize static pointer
3194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  state->exc = state->old_exc + PIT_MAX + L_INTERPOL;
3204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  // Static vectors to zero
3224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  Set_zero (state->old_exc, PIT_MAX + L_INTERPOL);
3234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  if (mode != MRDTX)
3254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     Set_zero (state->mem_syn, M);
3264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  // initialize pitch sharpening
3284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  state->sharp = SHARPMIN;
3294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  state->old_T0 = 40;
3304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  // Initialize state->lsp_old []
3324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  if (mode != MRDTX) {
3344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      Copy(lsp_init_data, &state->lsp_old[0], M);
3354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  }
3364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  // Initialize memories of bad frame handling
3384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  state->prev_bf = 0;
3394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  state->prev_pdf = 0;
3404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  state->state = 0;
3414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  state->T0_lagBuff = 40;
3434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  state->inBackgroundNoise = 0;
3444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  state->voicedHangover = 0;
3454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  if (mode != MRDTX) {
3464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      for (i=0;i<9;i++)
3474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          state->excEnergyHist[i] = 0;
3484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  }
3494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  for (i = 0; i < 9; i++)
3514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     state->ltpGainHistory[i] = 0;
3524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  Cb_gain_average_reset(state->Cb_gain_averState);
3544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  if (mode != MRDTX)
3554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     lsp_avg_reset(state->lsp_avg_st);
3564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  D_plsf_reset(state->lsfState);
3574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  ec_gain_pitch_reset(state->ec_gain_p_st);
3584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  ec_gain_code_reset(state->ec_gain_c_st);
3594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  if (mode != MRDTX)
3614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     gc_pred_reset(state->pred_state);
3624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  Bgn_scd_reset(state->background_state);
3644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  state->nodataSeed = 21845;
3654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  ph_disp_reset(state->ph_disp_st);
3664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  if (mode != MRDTX)
3674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     dtx_dec_reset(state->dtxDecoderState);
3684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber  return 0;
3704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber}
3714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
3734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber RESOURCES USED [optional]
3744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber When the code is written for a specific target processor the
3764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber the resources used should be documented below.
3774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber HEAP MEMORY USED: x bytes
3794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber STACK MEMORY USED: x bytes
3814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
3834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                used to represent cycle count for each subroutine
3844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                called)
3854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
3864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                     name]
3874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
3894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CAUTION [optional]
3904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber [State any special notes, constraints or cautions for users of this function]
3914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
3934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber*/
3944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas HuberWord16 Decoder_amr_reset(Decoder_amrState *state, enum Mode mode)
3964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{
3974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 i;
3984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (state == (Decoder_amrState *) NULL)
4004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
4014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* fprint(stderr, "Decoder_amr_reset: invalid parameter\n");  */
4024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        return(-1);
4034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
4044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* Initialize static pointer */
4064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    state->exc = state->old_exc + PIT_MAX + L_INTERPOL;
4074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* Static vectors to zero */
4094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    memset(state->old_exc, 0, sizeof(Word16)*(PIT_MAX + L_INTERPOL));
4104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (mode != MRDTX)
4124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
4134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        memset(state->mem_syn, 0, sizeof(Word16)*M);
4144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
4154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* initialize pitch sharpening */
4164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    state->sharp = SHARPMIN;
4174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    state->old_T0 = 40;
4184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* Initialize overflow Flag */
4204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    state->overflow = 0;
4224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* Initialize state->lsp_old [] */
4244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (mode != MRDTX)
4264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
4274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        state->lsp_old[0] = 30000;
4284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        state->lsp_old[1] = 26000;
4294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        state->lsp_old[2] = 21000;
4304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        state->lsp_old[3] = 15000;
4314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        state->lsp_old[4] = 8000;
4324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        state->lsp_old[5] = 0;
4334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        state->lsp_old[6] = -8000;
4344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        state->lsp_old[7] = -15000;
4354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        state->lsp_old[8] = -21000;
4364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        state->lsp_old[9] = -26000;
4374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
4384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* Initialize memories of bad frame handling */
4404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    state->prev_bf = 0;
4414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    state->prev_pdf = 0;
4424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    state->state = 0;
4434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    state->T0_lagBuff = 40;
4454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    state->inBackgroundNoise = 0;
4464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    state->voicedHangover = 0;
4474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (mode != MRDTX)
4484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
4494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        for (i = 0; i < EXC_ENERGY_HIST_LEN; i++)
4504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
4514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            state->excEnergyHist[i] = 0;
4524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
4534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
4544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    for (i = 0; i < LTP_GAIN_HISTORY_LEN; i++)
4564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
4574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        state->ltpGainHistory[i] = 0;
4584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
4594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Cb_gain_average_reset(&(state->Cb_gain_averState));
4614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (mode != MRDTX)
4624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
4634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        lsp_avg_reset(&(state->lsp_avg_st));
4644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
4654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    D_plsf_reset(&(state->lsfState));
4664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    ec_gain_pitch_reset(&(state->ec_gain_p_st));
4674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    ec_gain_code_reset(&(state->ec_gain_c_st));
4684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (mode != MRDTX)
4704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
4714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        gc_pred_reset(&(state->pred_state));
4724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
4734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Bgn_scd_reset(&(state->background_state));
4754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    state->nodataSeed = 21845;
4764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    ph_disp_reset(&(state->ph_disp_st));
4774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (mode != MRDTX)
4784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
4794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        dtx_dec_reset(&(state->dtxDecoderState));
4804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
4814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    return(0);
4834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber}
4844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/****************************************************************************/
4864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*
4884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
4894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION NAME: Decoder_amr
4904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
4914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber INPUT AND OUTPUT DEFINITIONS
4924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Inputs:
4944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st = pointer to a structure of type Decoder_amrState
4954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    mode = codec mode (enum Mode)
4964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    parm = buffer of synthesis parameters (Word16)
4974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    frame_type = received frame type (enum RXFrameType)
4984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    synth = buffer containing synthetic speech (Word16)
4994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    A_t = buffer containing decoded LP filter in 4 subframes (Word16)
5004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Outputs:
5024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    structure pointed to by st contains the newly calculated decoder
5034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      parameters
5044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    synth buffer contains the decoded speech samples
5054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    A_t buffer contains the decoded LP filter parameters
5064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Returns:
5084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    return_value = 0 (int)
5094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Global Variables Used:
5114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
5124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Local Variables Needed:
5144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
5154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
5174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION DESCRIPTION
5184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber This function performs the decoding of one speech frame for a given codec
5204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber mode.
5214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
5234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REQUIREMENTS
5244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber None
5264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
5284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REFERENCES
5294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber dec_amr.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
5314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
5334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber PSEUDO-CODE
5344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberint Decoder_amr (
5364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Decoder_amrState *st,      // i/o : State variables
5374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    enum Mode mode,            // i   : AMR mode
5384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 parm[],             // i   : vector of synthesis parameters
5394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                        (PRM_SIZE)
5404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    enum RXFrameType frame_type, // i   : received frame type
5414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 synth[],            // o   : synthesis speech (L_FRAME)
5424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 A_t[]               // o   : decoded LP filter in 4 subframes
5434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                        (AZ_SIZE)
5444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber)
5454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{
5464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    // LPC coefficients
5474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 *Az;                // Pointer on A_t
5494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    // LSPs
5514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 lsp_new[M];
5534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 lsp_mid[M];
5544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    // LSFs
5564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 prev_lsf[M];
5584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 lsf_i[M];
5594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    // Algebraic codevector
5614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 code[L_SUBFR];
5634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    // excitation
5654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 excp[L_SUBFR];
5674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 exc_enhanced[L_SUBFR];
5684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    // Scalars
5704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 i, i_subfr;
5724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 T0, T0_frac, index, index_mr475 = 0;
5734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 gain_pit, gain_code, gain_code_mix, pit_sharp, pit_flag, pitch_fac;
5744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 t0_min, t0_max;
5754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 delta_frc_low, delta_frc_range;
5764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 tmp_shift;
5774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 temp;
5784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word32 L_temp;
5794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 flag4;
5804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 carefulFlag;
5814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 excEnergy;
5824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 subfrNr;
5834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 evenSubfr = 0;
5844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 bfi = 0;   // bad frame indication flag
5864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 pdfi = 0;  // potential degraded bad frame flag
5874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    enum DTXStateType newDTXState;  // SPEECH , DTX, DTX_MUTE
5894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    // find the new  DTX state  SPEECH OR DTX
5914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    newDTXState = rx_dtx_handler(st->dtxDecoderState, frame_type);
5924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    // DTX actions
5944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (sub(newDTXState, SPEECH) != 0 )
5954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
5964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       Decoder_amr_reset (st, MRDTX);
5974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       dtx_dec(st->dtxDecoderState,
5994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber               st->mem_syn,
6004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber               st->lsfState,
6014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber               st->pred_state,
6024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber               st->Cb_gain_averState,
6034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber               newDTXState,
6044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber               mode,
6054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber               parm, synth, A_t);
6064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       // update average lsp
6074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       Lsf_lsp(st->lsfState->past_lsf_q, st->lsp_old, M);
6094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       lsp_avg(st->lsp_avg_st, st->lsfState->past_lsf_q);
6104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       goto the_end;
6114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
6124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    // SPEECH action state machine
6144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if ((sub(frame_type, RX_SPEECH_BAD) == 0) ||
6154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        (sub(frame_type, RX_NO_DATA) == 0) ||
6164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        (sub(frame_type, RX_ONSET) == 0))
6174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
6184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       bfi = 1;
6194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       if ((sub(frame_type, RX_NO_DATA) == 0) ||
6204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           (sub(frame_type, RX_ONSET) == 0))
6214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       {
6224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      build_CN_param(&st->nodataSeed,
6234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             prmno[mode],
6244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             bitno[mode],
6254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             parm);
6264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       }
6274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
6284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    else if (sub(frame_type, RX_SPEECH_DEGRADED) == 0)
6294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
6304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       pdfi = 1;
6314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
6324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (bfi != 0)
6344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
6354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->state = add (st->state, 1);
6364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
6374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    else if (sub (st->state, 6) == 0)
6384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
6404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->state = 5;
6414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
6424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    else
6434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
6444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->state = 0;
6454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
6464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (sub (st->state, 6) > 0)
6484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
6494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->state = 6;
6504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
6514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    // If this frame is the first speech frame after CNI period,
6534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    // set the BFH state machine to an appropriate state depending
6544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    // on whether there was DTX muting before start of speech or not
6554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    // If there was DTX muting, the first speech frame is muted.
6564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    // If there was no DTX muting, the first speech frame is not
6574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    // muted. The BFH state machine starts from state 5, however, to
6584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    // keep the audible noise resulting from a SID frame which is
6594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    // erroneously interpreted as a good speech frame as small as
6604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    // possible (the decoder output in this case is quickly muted)
6614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (sub(st->dtxDecoderState->dtxGlobalState, DTX) == 0)
6634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
6644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       st->state = 5;
6654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       st->prev_bf = 0;
6664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
6674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    else if (sub(st->dtxDecoderState->dtxGlobalState, DTX_MUTE) == 0)
6684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
6694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       st->state = 5;
6704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       st->prev_bf = 1;
6714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
6724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    // save old LSFs for CB gain smoothing
6744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Copy (st->lsfState->past_lsf_q, prev_lsf, M);
6754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    // decode LSF parameters and generate interpolated lpc coefficients
6774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       for the 4 subframes
6784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (sub (mode, MR122) != 0)
6794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
6804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       D_plsf_3(st->lsfState, mode, bfi, parm, lsp_new);
6814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       // Advance synthesis parameters pointer
6834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       parm += 3;
6844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       Int_lpc_1to3(st->lsp_old, lsp_new, A_t);
6864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
6874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    else
6884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
6894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       D_plsf_5 (st->lsfState, bfi, parm, lsp_mid, lsp_new);
6904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       // Advance synthesis parameters pointer
6924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       parm += 5;
6934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       Int_lpc_1and3 (st->lsp_old, lsp_mid, lsp_new, A_t);
6954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
6964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    // update the LSPs for the next frame
6984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    for (i = 0; i < M; i++)
6994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
7004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       st->lsp_old[i] = lsp_new[i];
7014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
7024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    *------------------------------------------------------------------------*
7044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    *          Loop for every subframe in the analysis frame                 *
7054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    *------------------------------------------------------------------------*
7064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    * The subframe size is L_SUBFR and the loop is repeated L_FRAME/L_SUBFR  *
7074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    *  times                                                                 *
7084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    *     - decode the pitch delay                                           *
7094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    *     - decode algebraic code                                            *
7104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    *     - decode pitch and codebook gains                                  *
7114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    *     - find the excitation and compute synthesis speech                 *
7124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    *------------------------------------------------------------------------*
7134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    // pointer to interpolated LPC parameters
7154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Az = A_t;
7164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    evenSubfr = 0;
7184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    subfrNr = -1;
7194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)
7204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
7214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       subfrNr = add(subfrNr, 1);
7224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       evenSubfr = sub(1, evenSubfr);
7234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       // flag for first and 3th subframe
7254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       pit_flag = i_subfr;
7264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       if (sub (i_subfr, L_FRAME_BY2) == 0)
7284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       {
7294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          if (sub(mode, MR475) != 0 && sub(mode, MR515) != 0)
7304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          {
7314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             pit_flag = 0;
7324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          }
7334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       }
7344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       // pitch index
7364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       index = *parm++;
7374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        *-------------------------------------------------------*
7394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        * - decode pitch lag and find adaptive codebook vector. *
7404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        *-------------------------------------------------------*
7414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       if (sub(mode, MR122) != 0)
7434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       {
7444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          // flag4 indicates encoding with 4 bit resolution;
7454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          // this is needed for mode MR475, MR515, MR59 and MR67
7464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          flag4 = 0;
7484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          if ((sub (mode, MR475) == 0) ||
7494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              (sub (mode, MR515) == 0) ||
7504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              (sub (mode, MR59) == 0) ||
7514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              (sub (mode, MR67) == 0) ) {
7524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             flag4 = 1;
7534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          }
7544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           *-------------------------------------------------------*
7564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           * - get ranges for the t0_min and t0_max                *
7574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           * - only needed in delta decoding                       *
7584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           *-------------------------------------------------------*
7594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          delta_frc_low = 5;
7614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          delta_frc_range = 9;
7624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          if ( sub(mode, MR795) == 0 )
7644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          {
7654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             delta_frc_low = 10;
7664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             delta_frc_range = 19;
7674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          }
7684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          t0_min = sub(st->old_T0, delta_frc_low);
7704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          if (sub(t0_min, PIT_MIN) < 0)
7714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          {
7724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             t0_min = PIT_MIN;
7734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          }
7744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          t0_max = add(t0_min, delta_frc_range);
7754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          if (sub(t0_max, PIT_MAX) > 0)
7764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          {
7774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             t0_max = PIT_MAX;
7784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             t0_min = sub(t0_max, delta_frc_range);
7794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          }
7804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          Dec_lag3 (index, t0_min, t0_max, pit_flag, st->old_T0,
7824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    &T0, &T0_frac, flag4);
7834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          st->T0_lagBuff = T0;
7854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          if (bfi != 0)
7874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          {
7884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             if (sub (st->old_T0, PIT_MAX) < 0)
7894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             {                                      // Graceful pitch
7904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                st->old_T0 = add(st->old_T0, 1);    // degradation
7914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             }
7924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             T0 = st->old_T0;
7934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             T0_frac = 0;
7944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             if ( st->inBackgroundNoise != 0 &&
7964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                  sub(st->voicedHangover, 4) > 0 &&
7974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                  ((sub(mode, MR475) == 0 ) ||
7984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                   (sub(mode, MR515) == 0 ) ||
7994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                   (sub(mode, MR59) == 0) )
8004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                  )
8014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             {
8024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                T0 = st->T0_lagBuff;
8034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             }
8044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          }
8054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          Pred_lt_3or6 (st->exc, T0, T0_frac, L_SUBFR, 1);
8074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       }
8084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       else
8094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       {
8104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          Dec_lag6 (index, PIT_MIN_MR122,
8114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    PIT_MAX, pit_flag, &T0, &T0_frac);
8124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          if ( bfi == 0 && (pit_flag == 0 || sub (index, 61) < 0))
8144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          {
8154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          }
8164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          else
8174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          {
8184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             st->T0_lagBuff = T0;
8194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             T0 = st->old_T0;
8204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             T0_frac = 0;
8214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          }
8224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          Pred_lt_3or6 (st->exc, T0, T0_frac, L_SUBFR, 0);
8244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       }
8254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        *-------------------------------------------------------*
8274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        * - (MR122 only: Decode pitch gain.)                    *
8284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        * - Decode innovative codebook.                         *
8294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        * - set pitch sharpening factor                         *
8304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        *-------------------------------------------------------*
8314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (sub (mode, MR475) == 0 || sub (mode, MR515) == 0)
8334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {   // MR475, MR515
8344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           index = *parm++;        // index of position
8354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           i = *parm++;            // signs
8364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           decode_2i40_9bits (subfrNr, i, index, code);
8384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           pit_sharp = shl (st->sharp, 1);
8404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
8414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        else if (sub (mode, MR59) == 0)
8424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {   // MR59
8434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           index = *parm++;        // index of position
8444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           i = *parm++;            // signs
8454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           decode_2i40_11bits (i, index, code);
8474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           pit_sharp = shl (st->sharp, 1);
8494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
8504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        else if (sub (mode, MR67) == 0)
8514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {   // MR67
8524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           index = *parm++;        // index of position
8534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           i = *parm++;            // signs
8544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           decode_3i40_14bits (i, index, code);
8564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           pit_sharp = shl (st->sharp, 1);
8584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
8594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        else if (sub (mode, MR795) <= 0)
8604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {   // MR74, MR795
8614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           index = *parm++;        // index of position
8624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           i = *parm++;            // signs
8634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           decode_4i40_17bits (i, index, code);
8654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           pit_sharp = shl (st->sharp, 1);
8674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
8684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        else if (sub (mode, MR102) == 0)
8694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {  // MR102
8704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           dec_8i40_31bits (parm, code);
8714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           parm += 7;
8724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           pit_sharp = shl (st->sharp, 1);
8744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
8754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        else
8764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {  // MR122
8774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           index = *parm++;
8784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           if (bfi != 0)
8794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           {
8804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              ec_gain_pitch (st->ec_gain_p_st, st->state, &gain_pit);
8814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           }
8824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           else
8834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           {
8844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              gain_pit = d_gain_pitch (mode, index);
8854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           }
8864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           ec_gain_pitch_update (st->ec_gain_p_st, bfi, st->prev_bf,
8874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                 &gain_pit);
8884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           dec_10i40_35bits (parm, code);
8904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           parm += 10;
8914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           // pit_sharp = gain_pit;
8934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           // if (pit_sharp > 1.0) pit_sharp = 1.0;
8944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           pit_sharp = shl (gain_pit, 1);
8964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
8974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         *-------------------------------------------------------*
8994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         * - Add the pitch contribution to code[].               *
9004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         *-------------------------------------------------------*
9014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        for (i = T0; i < L_SUBFR; i++)
9024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
9034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           temp = mult (code[i - T0], pit_sharp);
9044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           code[i] = add (code[i], temp);
9054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
9064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         *------------------------------------------------------------*
9084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         * - Decode codebook gain (MR122) or both pitch               *
9094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         *   gain and codebook gain (all others)                      *
9104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         * - Update pitch sharpening "sharp" with quantized gain_pit  *
9114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         *------------------------------------------------------------*
9124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (sub (mode, MR475) == 0)
9144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
9154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           // read and decode pitch and code gain
9164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           if (evenSubfr != 0)
9174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           {
9184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              index_mr475 = *parm++; // index of gain(s)
9194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           }
9204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           if (bfi == 0)
9224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           {
9234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              Dec_gain(st->pred_state, mode, index_mr475, code,
9244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                       evenSubfr, &gain_pit, &gain_code);
9254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           }
9264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           else
9274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           {
9284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              ec_gain_pitch (st->ec_gain_p_st, st->state, &gain_pit);
9294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              ec_gain_code (st->ec_gain_c_st, st->pred_state, st->state,
9304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                            &gain_code);
9314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           }
9324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           ec_gain_pitch_update (st->ec_gain_p_st, bfi, st->prev_bf,
9334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                 &gain_pit);
9344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           ec_gain_code_update (st->ec_gain_c_st, bfi, st->prev_bf,
9354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                &gain_code);
9364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           pit_sharp = gain_pit;
9384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           if (sub (pit_sharp, SHARPMAX) > 0)
9394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           {
9404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber               pit_sharp = SHARPMAX;
9414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           }
9424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
9444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        else if ((sub (mode, MR74) <= 0) ||
9454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                 (sub (mode, MR102) == 0))
9464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
9474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            // read and decode pitch and code gain
9484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            index = *parm++; // index of gain(s)
9494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if (bfi == 0)
9514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
9524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber               Dec_gain(st->pred_state, mode, index, code,
9534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                        evenSubfr, &gain_pit, &gain_code);
9544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
9554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            else
9564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
9574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber               ec_gain_pitch (st->ec_gain_p_st, st->state, &gain_pit);
9584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber               ec_gain_code (st->ec_gain_c_st, st->pred_state, st->state,
9594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                             &gain_code);
9604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
9614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            ec_gain_pitch_update (st->ec_gain_p_st, bfi, st->prev_bf,
9624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                  &gain_pit);
9634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            ec_gain_code_update (st->ec_gain_c_st, bfi, st->prev_bf,
9644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                 &gain_code);
9654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            pit_sharp = gain_pit;
9674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if (sub (pit_sharp, SHARPMAX) > 0)
9684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
9694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber               pit_sharp = SHARPMAX;
9704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
9714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if (sub (mode, MR102) == 0)
9734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
9744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber               if (sub (st->old_T0, add(L_SUBFR, 5)) > 0)
9754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber               {
9764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                  pit_sharp = shr(pit_sharp, 2);
9774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber               }
9784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
9794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
9804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        else
9814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
9824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           // read and decode pitch gain
9834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           index = *parm++; // index of gain(s)
9844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           if (sub (mode, MR795) == 0)
9864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           {
9874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              // decode pitch gain
9884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              if (bfi != 0)
9894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              {
9904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                 ec_gain_pitch (st->ec_gain_p_st, st->state, &gain_pit);
9914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              }
9924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              else
9934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              {
9944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                 gain_pit = d_gain_pitch (mode, index);
9954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              }
9964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              ec_gain_pitch_update (st->ec_gain_p_st, bfi, st->prev_bf,
9974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                    &gain_pit);
9984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              // read and decode code gain
10004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              index = *parm++;
10014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              if (bfi == 0)
10024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              {
10034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                 d_gain_code (st->pred_state, mode, index, code, &gain_code);
10044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              }
10054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              else
10064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              {
10074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                 ec_gain_code (st->ec_gain_c_st, st->pred_state, st->state,
10084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                               &gain_code);
10094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              }
10104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              ec_gain_code_update (st->ec_gain_c_st, bfi, st->prev_bf,
10114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                   &gain_code);
10124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              pit_sharp = gain_pit;
10144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              if (sub (pit_sharp, SHARPMAX) > 0)
10154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              {
10164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                 pit_sharp = SHARPMAX;
10174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              }
10184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           }
10194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           else
10204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           { // MR122
10214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              if (bfi == 0)
10224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              {
10234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                 d_gain_code (st->pred_state, mode, index, code, &gain_code);
10244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              }
10254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              else
10264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              {
10274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                 ec_gain_code (st->ec_gain_c_st, st->pred_state, st->state,
10284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                               &gain_code);
10294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              }
10304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              ec_gain_code_update (st->ec_gain_c_st, bfi, st->prev_bf,
10314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                   &gain_code);
10324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              pit_sharp = gain_pit;
10344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           }
10354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
10364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        // store pitch sharpening for next subframe
10384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        // (for modes which use the previous pitch gain for
10394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        // pitch sharpening in the search phase)
10404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        // do not update sharpening in even subframes for MR475
10414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (sub(mode, MR475) != 0 || evenSubfr == 0)
10424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
10434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            st->sharp = gain_pit;
10444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if (sub (st->sharp, SHARPMAX) > 0)
10454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
10464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                st->sharp = SHARPMAX;
10474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
10484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
10494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        pit_sharp = shl (pit_sharp, 1);
10514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (sub (pit_sharp, 16384) > 0)
10524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
10534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           for (i = 0; i < L_SUBFR; i++)
10544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
10554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber               temp = mult (st->exc[i], pit_sharp);
10564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber               L_temp = L_mult (temp, gain_pit);
10574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber               if (sub(mode, MR122)==0)
10584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber               {
10594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                  L_temp = L_shr (L_temp, 1);
10604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber               }
10614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber               excp[i] = pv_round (L_temp);
10624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
10634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
10644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         *-------------------------------------------------------*
10664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         * - Store list of LTP gains needed in the source        *
10674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         *   characteristic detector (SCD)                       *
10684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         *-------------------------------------------------------*
10694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if ( bfi == 0 )
10704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
10714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           for (i = 0; i < 8; i++)
10724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           {
10734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              st->ltpGainHistory[i] = st->ltpGainHistory[i+1];
10744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           }
10754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           st->ltpGainHistory[8] = gain_pit;
10764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
10774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         *-------------------------------------------------------*
10794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         * - Limit gain_pit if in background noise and BFI       *
10804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         *   for MR475, MR515, MR59                              *
10814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         *-------------------------------------------------------*
10824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if ( (st->prev_bf != 0 || bfi != 0) && st->inBackgroundNoise != 0 &&
10844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             ((sub(mode, MR475) == 0) ||
10854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              (sub(mode, MR515) == 0) ||
10864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              (sub(mode, MR59) == 0))
10874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             )
10884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
10894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           if ( sub (gain_pit, 12288) > 0)    // if (gain_pit > 0.75) in Q14
10904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              gain_pit = add( shr( sub(gain_pit, 12288), 1 ), 12288 );
10914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              // gain_pit = (gain_pit-0.75)/2.0 + 0.75;
10924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           if ( sub (gain_pit, 14745) > 0)    // if (gain_pit > 0.90) in Q14
10944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           {
10954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              gain_pit = 14745;
10964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           }
10974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
10984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         *-------------------------------------------------------*
11004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         *  Calculate CB mixed gain                              *
11014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         *-------------------------------------------------------*
11024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        Int_lsf(prev_lsf, st->lsfState->past_lsf_q, i_subfr, lsf_i);
11034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        gain_code_mix = Cb_gain_average(
11044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            st->Cb_gain_averState, mode, gain_code,
11054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            lsf_i, st->lsp_avg_st->lsp_meanSave, bfi,
11064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            st->prev_bf, pdfi, st->prev_pdf,
11074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            st->inBackgroundNoise, st->voicedHangover);
11084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        // make sure that MR74, MR795, MR122 have original code_gain
11104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if ((sub(mode, MR67) > 0) && (sub(mode, MR102) != 0) )
11114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           // MR74, MR795, MR122
11124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
11134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           gain_code_mix = gain_code;
11144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
11154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         *-------------------------------------------------------*
11174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         * - Find the total excitation.                          *
11184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         * - Find synthesis speech corresponding to st->exc[].   *
11194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         *-------------------------------------------------------*
11204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (sub(mode, MR102) <= 0) // MR475, MR515, MR59, MR67, MR74, MR795, MR102
11214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
11224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           pitch_fac = gain_pit;
11234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           tmp_shift = 1;
11244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
11254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        else       // MR122
11264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
11274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           pitch_fac = shr (gain_pit, 1);
11284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           tmp_shift = 2;
11294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
11304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        // copy unscaled LTP excitation to exc_enhanced (used in phase
11324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         * dispersion below) and compute total excitation for LTP feedback
11334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        for (i = 0; i < L_SUBFR; i++)
11354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
11364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           exc_enhanced[i] = st->exc[i];
11374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           // st->exc[i] = gain_pit*st->exc[i] + gain_code*code[i];
11394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           L_temp = L_mult (st->exc[i], pitch_fac);
11404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                                      // 12.2: Q0 * Q13
11414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                                      //  7.4: Q0 * Q14
11424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           L_temp = L_mac (L_temp, code[i], gain_code);
11434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                                      // 12.2: Q12 * Q1
11444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                                      //  7.4: Q13 * Q1
11454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           L_temp = L_shl (L_temp, tmp_shift);                   // Q16
11464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           st->exc[i] = pv_round (L_temp);
11474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
11484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         *-------------------------------------------------------*
11504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         * - Adaptive phase dispersion                           *
11514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         *-------------------------------------------------------*
11524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        ph_disp_release(st->ph_disp_st); // free phase dispersion adaption
11534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if ( ((sub(mode, MR475) == 0) ||
11554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              (sub(mode, MR515) == 0) ||
11564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              (sub(mode, MR59) == 0))   &&
11574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             sub(st->voicedHangover, 3) > 0 &&
11584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             st->inBackgroundNoise != 0 &&
11594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             bfi != 0 )
11604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
11614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           ph_disp_lock(st->ph_disp_st); // Always Use full Phase Disp.
11624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }                                // if error in bg noise
11634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        // apply phase dispersion to innovation (if enabled) and
11654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           compute total excitation for synthesis part
11664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        ph_disp(st->ph_disp_st, mode,
11674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                exc_enhanced, gain_code_mix, gain_pit, code,
11684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                pitch_fac, tmp_shift);
11694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         *-------------------------------------------------------*
11714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         * - The Excitation control module are active during BFI.*
11724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         * - Conceal drops in signal energy if in bg noise.      *
11734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         *-------------------------------------------------------*
11744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        L_temp = 0;
11764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        for (i = 0; i < L_SUBFR; i++)
11774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
11784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            L_temp = L_mac (L_temp, exc_enhanced[i], exc_enhanced[i] );
11794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
11804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        L_temp = L_shr (L_temp, 1);     // excEnergy = sqrt(L_temp) in Q0
11824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        L_temp = sqrt_l_exp(L_temp, &temp); // function result
11834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        L_temp = L_shr(L_temp, add( shr(temp, 1), 15));
11844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        L_temp = L_shr(L_temp, 2);       // To cope with 16-bit and
11854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        excEnergy = extract_l(L_temp);   // scaling in ex_ctrl()
11864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if ( ((sub (mode, MR475) == 0) ||
11884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              (sub (mode, MR515) == 0) ||
11894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              (sub (mode, MR59) == 0))  &&
11904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             sub(st->voicedHangover, 5) > 0 &&
11914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             st->inBackgroundNoise != 0 &&
11924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             sub(st->state, 4) < 0 &&
11934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             ( (pdfi != 0 && st->prev_pdf != 0) ||
11944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                bfi != 0 ||
11954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                st->prev_bf != 0) )
11964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
11974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           carefulFlag = 0;
11984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           if ( pdfi != 0 && bfi == 0 )
11994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           {
12004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              carefulFlag = 1;
12014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           }
12024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           Ex_ctrl(exc_enhanced,
12044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                   excEnergy,
12054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                   st->excEnergyHist,
12064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                   st->voicedHangover,
12074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                   st->prev_bf,
12084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                   carefulFlag);
12094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
12104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if ( st->inBackgroundNoise != 0 &&
12124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             ( bfi != 0 || st->prev_bf != 0 ) &&
12134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             sub(st->state, 4) < 0 )
12144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
12154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           ; // do nothing!
12164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
12174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        else
12184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
12194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           // Update energy history for all modes
12204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           for (i = 0; i < 8; i++)
12214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           {
12224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              st->excEnergyHist[i] = st->excEnergyHist[i+1];
12234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           }
12244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           st->excEnergyHist[8] = excEnergy;
12254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
12264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         *-------------------------------------------------------*
12274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         * Excitation control module end.                        *
12284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         *-------------------------------------------------------*
12294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (sub (pit_sharp, 16384) > 0)
12314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
12324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           for (i = 0; i < L_SUBFR; i++)
12334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           {
12344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              excp[i] = add (excp[i], exc_enhanced[i]);
12354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           }
12364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           agc2 (exc_enhanced, excp, L_SUBFR);
12374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           Overflow = 0;
12384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           Syn_filt (Az, excp, &synth[i_subfr], L_SUBFR,
12394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                     st->mem_syn, 0);
12404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
12414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        else
12424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
12434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           Overflow = 0;
12444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           Syn_filt (Az, exc_enhanced, &synth[i_subfr], L_SUBFR,
12454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                     st->mem_syn, 0);
12464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
12474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (Overflow != 0)    // Test for overflow
12494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
12504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           for (i = 0; i < PIT_MAX + L_INTERPOL + L_SUBFR; i++)
12514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           {
12524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              st->old_exc[i] = shr(st->old_exc[i], 2);
12534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           }
12544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           for (i = 0; i < L_SUBFR; i++)
12554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           {
12564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              exc_enhanced[i] = shr(exc_enhanced[i], 2);
12574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           }
12584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           Syn_filt(Az, exc_enhanced, &synth[i_subfr], L_SUBFR, st->mem_syn, 1);
12594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
12604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        else
12614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
12624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           Copy(&synth[i_subfr+L_SUBFR-M], st->mem_syn, M);
12634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
12644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         *--------------------------------------------------*
12664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         * Update signal for next frame.                    *
12674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         * -> shift to the left by L_SUBFR  st->exc[]       *
12684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         *--------------------------------------------------*
12694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        Copy (&st->old_exc[L_SUBFR], &st->old_exc[0], PIT_MAX + L_INTERPOL);
12714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        // interpolated LPC parameters for next subframe
12734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        Az += MP1;
12744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        // store T0 for next subframe
12764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->old_T0 = T0;
12774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
12784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     *-------------------------------------------------------*
12804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * Call the Source Characteristic Detector which updates *
12814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * st->inBackgroundNoise and st->voicedHangover.         *
12824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     *-------------------------------------------------------*
12834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->inBackgroundNoise = Bgn_scd(st->background_state,
12854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                    &(st->ltpGainHistory[0]),
12864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                    &(synth[0]),
12874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                    &(st->voicedHangover) );
12884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    dtx_dec_activity_update(st->dtxDecoderState,
12904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                            st->lsfState->past_lsf_q,
12914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                            synth);
12924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    // store bfi for next subframe
12944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->prev_bf = bfi;
12954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->prev_pdf = pdfi;
12964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     *--------------------------------------------------*
12984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * Calculate the LSF averages on the eight          *
12994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * previous frames                                  *
13004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     *--------------------------------------------------*
13014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    lsp_avg(st->lsp_avg_st, st->lsfState->past_lsf_q);
13034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberthe_end:
13054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->dtxDecoderState->dtxGlobalState = newDTXState;
13064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    return 0;
13084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber}
13094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
13114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber RESOURCES USED [optional]
13124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber When the code is written for a specific target processor the
13144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber the resources used should be documented below.
13154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber HEAP MEMORY USED: x bytes
13174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber STACK MEMORY USED: x bytes
13194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
13214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                used to represent cycle count for each subroutine
13224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                called)
13234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
13244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                     name]
13254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
13274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CAUTION [optional]
13284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber [State any special notes, constraints or cautions for users of this function]
13294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
13314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber*/
13324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Hubervoid Decoder_amr(
13344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Decoder_amrState *st,      /* i/o : State variables                   */
13354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    enum Mode mode,            /* i   : AMR mode                          */
13364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 parm[],             /* i   : vector of synthesis parameters
13374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                        (PRM_SIZE)                        */
13384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    enum RXFrameType frame_type, /* i   : received frame type             */
13394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 synth[],            /* o   : synthesis speech (L_FRAME)        */
13404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 A_t[]               /* o   : decoded LP filter in 4 subframes
13414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                        (AZ_SIZE)                         */
13424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber)
13434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{
13444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* LPC coefficients */
13454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 *Az;                /* Pointer on A_t */
13474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* LSPs */
13494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 lsp_new[M];
13514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 lsp_mid[M];
13524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* LSFs */
13544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 prev_lsf[M];
13564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 lsf_i[M];
13574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* Algebraic codevector */
13594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 code[L_SUBFR];
13614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* excitation */
13634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 excp[L_SUBFR];
13654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 exc_enhanced[L_SUBFR];
13664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* Scalars */
13684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 i;
13704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 i_subfr;
13714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 T0;
13724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 T0_frac;
13734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 index;
13744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 index_mr475 = 0;
13754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 gain_pit;
13764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 gain_code;
13774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 gain_code_mix;
13784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 pit_sharp;
13794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 pit_flag;
13804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 pitch_fac;
13814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 t0_min;
13824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 t0_max;
13834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 delta_frc_low;
13844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 delta_frc_range;
13854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 tmp_shift;
13864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 temp;
13874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word32 L_temp;
13884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 flag4;
13894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 carefulFlag;
13904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 excEnergy;
13914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 subfrNr;
13924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 evenSubfr = 0;
13934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 bfi = 0;   /* bad frame indication flag                          */
13954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 pdfi = 0;  /* potential degraded bad frame flag                  */
13964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
13974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    enum DTXStateType newDTXState;  /* SPEECH , DTX, DTX_MUTE */
13984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Flag   *pOverflow = &(st->overflow);     /* Overflow flag            */
13994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* find the new  DTX state  SPEECH OR DTX */
14024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    newDTXState = rx_dtx_handler(&(st->dtxDecoderState), frame_type, pOverflow);
14034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* DTX actions */
14054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (newDTXState != SPEECH)
14074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
14084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        Decoder_amr_reset(st, MRDTX);
14094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        dtx_dec(&(st->dtxDecoderState),
14114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                st->mem_syn,
14124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                &(st->lsfState),
14134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                &(st->pred_state),
14144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                &(st->Cb_gain_averState),
14154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                newDTXState,
14164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                mode,
14174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                parm, synth, A_t, pOverflow);
14184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* update average lsp */
14204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        Lsf_lsp(
14214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            st->lsfState.past_lsf_q,
14224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            st->lsp_old,
14234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            M,
14244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            pOverflow);
14254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        lsp_avg(
14274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            &(st->lsp_avg_st),
14284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            st->lsfState.past_lsf_q,
14294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            pOverflow);
14304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        goto the_end;
14324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
14334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* SPEECH action state machine  */
14354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if ((frame_type == RX_SPEECH_BAD) || (frame_type == RX_NO_DATA) ||
14364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            (frame_type == RX_ONSET))
14374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
14384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        bfi = 1;
14394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if ((frame_type == RX_NO_DATA) || (frame_type == RX_ONSET))
14414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
14424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            build_CN_param(&st->nodataSeed,
14434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                           prmno[mode],
14444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                           bitno[mode],
14454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                           parm,
14464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                           pOverflow);
14474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
14484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
14494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    else if (frame_type == RX_SPEECH_DEGRADED)
14504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
14514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        pdfi = 1;
14524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
14534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (bfi != 0)
14554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
14564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->state += 1;
14574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
14584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    else if (st->state == 6)
14594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
14614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->state = 5;
14624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
14634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    else
14644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
14654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->state = 0;
14664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
14674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (st->state > 6)
14704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
14714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->state = 6;
14724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
14734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* If this frame is the first speech frame after CNI period,     */
14754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* set the BFH state machine to an appropriate state depending   */
14764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* on whether there was DTX muting before start of speech or not */
14774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* If there was DTX muting, the first speech frame is muted.     */
14784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* If there was no DTX muting, the first speech frame is not     */
14794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* muted. The BFH state machine starts from state 5, however, to */
14804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* keep the audible noise resulting from a SID frame which is    */
14814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* erroneously interpreted as a good speech frame as small as    */
14824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* possible (the decoder output in this case is quickly muted)   */
14834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (st->dtxDecoderState.dtxGlobalState == DTX)
14854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
14864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->state = 5;
14874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->prev_bf = 0;
14884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
14894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    else if (st->dtxDecoderState.dtxGlobalState == DTX_MUTE)
14904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
14914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->state = 5;
14924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->prev_bf = 1;
14934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
14944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* save old LSFs for CB gain smoothing */
14964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Copy(st->lsfState.past_lsf_q, prev_lsf, M);
14974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
14984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* decode LSF parameters and generate interpolated lpc coefficients
14994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       for the 4 subframes */
15004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (mode != MR122)
15024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
15034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        D_plsf_3(
15044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            &(st->lsfState),
15054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            mode,
15064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            bfi,
15074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            parm,
15084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            lsp_new,
15094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            pOverflow);
15104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* Advance synthesis parameters pointer */
15124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        parm += 3;
15134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        Int_lpc_1to3(
15154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            st->lsp_old,
15164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            lsp_new,
15174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            A_t,
15184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            pOverflow);
15194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
15204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    else
15214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
15224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        D_plsf_5(
15234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            &(st->lsfState),
15244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            bfi,
15254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            parm,
15264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            lsp_mid,
15274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            lsp_new,
15284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            pOverflow);
15294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* Advance synthesis parameters pointer */
15314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        parm += 5;
15324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        Int_lpc_1and3(
15344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            st->lsp_old,
15354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            lsp_mid,
15364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            lsp_new,
15374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            A_t,
15384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            pOverflow);
15394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
15404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* update the LSPs for the next frame */
15424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    for (i = 0; i < M; i++)
15434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
15444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->lsp_old[i] = lsp_new[i];
15454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
15464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /*------------------------------------------------------------------------*
15484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     *          Loop for every subframe in the analysis frame                 *
15494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     *------------------------------------------------------------------------*
15504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * The subframe size is L_SUBFR and the loop is repeated L_FRAME/L_SUBFR  *
15514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     *  times                                                                 *
15524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     *     - decode the pitch delay                                           *
15534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     *     - decode algebraic code                                            *
15544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     *     - decode pitch and codebook gains                                  *
15554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     *     - find the excitation and compute synthesis speech                 *
15564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     *------------------------------------------------------------------------*/
15574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* pointer to interpolated LPC parameters */
15594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Az = A_t;
15604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    evenSubfr = 0;
15624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    subfrNr = -1;
15634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)
15644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
15654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        subfrNr += 1;
15664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        evenSubfr = 1 - evenSubfr;
15674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* flag for first and 3th subframe */
15694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        pit_flag = i_subfr;
15704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (i_subfr == L_FRAME_BY2)
15734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
15744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if ((mode != MR475) && (mode != MR515))
15754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
15764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                pit_flag = 0;
15774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
15784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
15794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* pitch index */
15814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        index = *parm++;
15824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /*-------------------------------------------------------*
15844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        * - decode pitch lag and find adaptive codebook vector. *
15854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        *-------------------------------------------------------*/
15864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (mode != MR122)
15884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
15894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            /* flag4 indicates encoding with 4 bit resolution;     */
15904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            /* this is needed for mode MR475, MR515, MR59 and MR67 */
15914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            flag4 = 0;
15934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
15944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if ((mode == MR475) || (mode == MR515) || (mode == MR59) ||
15954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    (mode == MR67))
15964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
15974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                flag4 = 1;
15984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
15994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            /*-------------------------------------------------------*
16014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            * - get ranges for the t0_min and t0_max                *
16024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            * - only needed in delta decoding                       *
16034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            *-------------------------------------------------------*/
16044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            delta_frc_low = 5;
16064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            delta_frc_range = 9;
16074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if (mode == MR795)
16094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
16104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                delta_frc_low = 10;
16114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                delta_frc_range = 19;
16124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
16134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            t0_min = sub(st->old_T0, delta_frc_low, pOverflow);
16154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if (t0_min < PIT_MIN)
16174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
16184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                t0_min = PIT_MIN;
16194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
16204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            t0_max = add(t0_min, delta_frc_range, pOverflow);
16214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if (t0_max > PIT_MAX)
16234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
16244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                t0_max = PIT_MAX;
16254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                t0_min = t0_max - delta_frc_range;
16264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
16274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            Dec_lag3(index, t0_min, t0_max, pit_flag, st->old_T0,
16294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                     &T0, &T0_frac, flag4, pOverflow);
16304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            st->T0_lagBuff = T0;
16324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if (bfi != 0)
16344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
16354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                if (st->old_T0 < PIT_MAX)
16364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                {                               /* Graceful pitch */
1637ab4412a1992ce7ec0965cdbf616d64d821b67183Dave Sparks                    st->old_T0 += 0;            /* degradation    */
16384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                }
16394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                T0 = st->old_T0;
16404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                T0_frac = 0;
16414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                if ((st->inBackgroundNoise != 0) && (st->voicedHangover > 4) &&
16434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                        ((mode == MR475) || (mode == MR515) || (mode == MR59)))
16444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                {
16454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    T0 = st->T0_lagBuff;
16464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                }
16474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
16484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            Pred_lt_3or6(st->exc, T0, T0_frac, L_SUBFR, 1, pOverflow);
16504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
16514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        else
16524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
16534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            Dec_lag6(index, PIT_MIN_MR122,
16544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                     PIT_MAX, pit_flag, &T0, &T0_frac, pOverflow);
16554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if (!(bfi == 0 && (pit_flag == 0 || index < 61)))
16584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
16594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                st->T0_lagBuff = T0;
16604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                T0 = st->old_T0;
16614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                T0_frac = 0;
16624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
16634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            Pred_lt_3or6(st->exc, T0, T0_frac, L_SUBFR, 0, pOverflow);
16654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
16664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /*-------------------------------------------------------*
16684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         * - (MR122 only: Decode pitch gain.)                    *
16694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         * - Decode innovative codebook.                         *
16704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         * - set pitch sharpening factor                         *
16714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         *-------------------------------------------------------*/
16724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if ((mode == MR475) || (mode == MR515))
16734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {   /* MR475, MR515 */
16744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            index = *parm++;        /* index of position */
16754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            i = *parm++;            /* signs             */
16764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            decode_2i40_9bits(subfrNr, i, index, code, pOverflow);
16784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            L_temp = (Word32)st->sharp << 1;
16804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if (L_temp != (Word32)((Word16) L_temp))
16814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
16824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                pit_sharp = (st->sharp > 0) ? MAX_16 : MIN_16;
16834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
16844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            else
16854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
16864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                pit_sharp = (Word16) L_temp;
16874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
16884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
16894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        else if (mode == MR59)
16904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {   /* MR59 */
16914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            index = *parm++;        /* index of position */
16924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            i = *parm++;            /* signs             */
16934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            decode_2i40_11bits(i, index, code);
16954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
16964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            L_temp = (Word32)st->sharp << 1;
16974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if (L_temp != (Word32)((Word16) L_temp))
16984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
16994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                pit_sharp = (st->sharp > 0) ? MAX_16 : MIN_16;
17004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
17014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            else
17024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
17034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                pit_sharp = (Word16) L_temp;
17044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
17054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
17064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        else if (mode == MR67)
17074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {   /* MR67 */
17084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            index = *parm++;        /* index of position */
17094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            i = *parm++;            /* signs             */
17104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            decode_3i40_14bits(i, index, code);
17124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            L_temp = (Word32)st->sharp << 1;
17144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if (L_temp != (Word32)((Word16) L_temp))
17154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
17164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                pit_sharp = (st->sharp > 0) ? MAX_16 : MIN_16;
17174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
17184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            else
17194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
17204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                pit_sharp = (Word16) L_temp;
17214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
17224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
17234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        else if (mode <= MR795)
17244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {   /* MR74, MR795 */
17254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            index = *parm++;        /* index of position */
17264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            i = *parm++;            /* signs             */
17274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            decode_4i40_17bits(i, index, code);
17294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            L_temp = (Word32)st->sharp << 1;
17314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if (L_temp != (Word32)((Word16) L_temp))
17324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
17334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                pit_sharp = (st->sharp > 0) ? MAX_16 : MIN_16;
17344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
17354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            else
17364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
17374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                pit_sharp = (Word16) L_temp;
17384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
17394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
17404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        else if (mode == MR102)
17414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {  /* MR102 */
17424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            dec_8i40_31bits(parm, code, pOverflow);
17434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            parm += 7;
17444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            L_temp = (Word32)st->sharp << 1;
17464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if (L_temp != (Word32)((Word16) L_temp))
17474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
17484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                pit_sharp = (st->sharp > 0) ? MAX_16 : MIN_16;
17494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
17504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            else
17514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
17524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                pit_sharp = (Word16) L_temp;
17534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
17544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
17554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        else
17564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {  /* MR122 */
17574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            index = *parm++;
17584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if (bfi != 0)
17604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
17614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                ec_gain_pitch(
17624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    &(st->ec_gain_p_st),
17634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    st->state,
17644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    &gain_pit,
17654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    pOverflow);
17664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
17674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            else
17684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
17694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                gain_pit = d_gain_pitch(mode, index);
17704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
17714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            ec_gain_pitch_update(
17724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                &(st->ec_gain_p_st),
17734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                bfi,
17744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                st->prev_bf,
17754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                &gain_pit,
17764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                pOverflow);
17774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            dec_10i40_35bits(parm, code);
17804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            parm += 10;
17814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            /* pit_sharp = gain_pit;                   */
17834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            /* if (pit_sharp > 1.0) pit_sharp = 1.0;   */
17844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
17854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            L_temp = (Word32)gain_pit << 1;
17864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if (L_temp != (Word32)((Word16) L_temp))
17874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
17884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                pit_sharp = (gain_pit > 0) ? MAX_16 : MIN_16;
17894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
17904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            else
17914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
17924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                pit_sharp = (Word16) L_temp;
17934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
17944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
17954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /*-------------------------------------------------------*
17964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         * - Add the pitch contribution to code[].               *
17974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         *-------------------------------------------------------*/
17984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        for (i = T0; i < L_SUBFR; i++)
17994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
18004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            temp = mult(*(code + i - T0), pit_sharp, pOverflow);
18014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            *(code + i) = add(*(code + i), temp, pOverflow);
18024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
18044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /*------------------------------------------------------------*
18064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         * - Decode codebook gain (MR122) or both pitch               *
18074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         *   gain and codebook gain (all others)                      *
18084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         * - Update pitch sharpening "sharp" with quantized gain_pit  *
18094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         *------------------------------------------------------------*/
18104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (mode == MR475)
18114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
18124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            /* read and decode pitch and code gain */
18134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if (evenSubfr != 0)
18154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
18164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                index_mr475 = *parm++;         /* index of gain(s) */
18174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
18184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if (bfi == 0)
18204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
18214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                Dec_gain(
18224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    &(st->pred_state),
18234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    mode,
18244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    index_mr475,
18254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    code,
18264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    evenSubfr,
18274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    &gain_pit,
18284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    &gain_code,
18294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    pOverflow);
18304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
18314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            else
18324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
18334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                ec_gain_pitch(
18344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    &(st->ec_gain_p_st),
18354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    st->state,
18364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    &gain_pit,
18374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    pOverflow);
18384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                ec_gain_code(
18404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    &(st->ec_gain_c_st),
18414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    &(st->pred_state),
18424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    st->state,
18434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    &gain_code,
18444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    pOverflow);
18454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
18464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            ec_gain_pitch_update(
18474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                &st->ec_gain_p_st,
18484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                bfi,
18494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                st->prev_bf,
18504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                &gain_pit,
18514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                pOverflow);
18524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            ec_gain_code_update(
18544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                &st->ec_gain_c_st,
18554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                bfi,
18564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                st->prev_bf,
18574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                &gain_code,
18584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                pOverflow);
18594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            pit_sharp = gain_pit;
18614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if (pit_sharp > SHARPMAX)
18634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
18644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                pit_sharp = SHARPMAX;
18654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
18664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
18684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        else if ((mode <= MR74) || (mode == MR102))
18694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
18704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            /* read and decode pitch and code gain */
18714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            index = *parm++;                 /* index of gain(s) */
18724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if (bfi == 0)
18744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
18754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                Dec_gain(
18764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    &(st->pred_state),
18774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    mode,
18784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    index,
18794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    code,
18804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    evenSubfr,
18814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    &gain_pit,
18824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    &gain_code,
18834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    pOverflow);
18844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
18854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            else
18864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
18874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                ec_gain_pitch(
18884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    &(st->ec_gain_p_st),
18894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    st->state,
18904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    &gain_pit,
18914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    pOverflow);
18924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
18934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                ec_gain_code(
18944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    &(st->ec_gain_c_st),
18954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    &(st->pred_state),
18964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    st->state,
18974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    &gain_code,
18984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    pOverflow);
18994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
19004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            ec_gain_pitch_update(
19024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                &(st->ec_gain_p_st),
19034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                bfi,
19044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                st->prev_bf,
19054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                &gain_pit,
19064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                pOverflow);
19074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            ec_gain_code_update(
19094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                &(st->ec_gain_c_st),
19104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                bfi,
19114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                st->prev_bf,
19124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                &gain_code,
19134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                pOverflow);
19144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            pit_sharp = gain_pit;
19164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if (pit_sharp > SHARPMAX)
19184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
19194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                pit_sharp = SHARPMAX;
19204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
19214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if (mode == MR102)
19234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
19244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                if (st->old_T0 > (L_SUBFR + 5))
19254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                {
19264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    if (pit_sharp < 0)
19274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    {
19284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                        pit_sharp = ~((~pit_sharp) >> 2);
19294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    }
19304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    else
19314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    {
19324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                        pit_sharp = pit_sharp >> 2;
19334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    }
19344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                }
19354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
19364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
19374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        else
19384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
19394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            /* read and decode pitch gain */
19404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            index = *parm++;                 /* index of gain(s) */
19414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if (mode == MR795)
19434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
19444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                /* decode pitch gain */
19454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                if (bfi != 0)
19464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                {
19474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    ec_gain_pitch(
19484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                        &(st->ec_gain_p_st),
19494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                        st->state,
19504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                        &gain_pit,
19514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                        pOverflow);
19524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                }
19534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                else
19544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                {
19554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    gain_pit = d_gain_pitch(mode, index);
19564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                }
19574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                ec_gain_pitch_update(
19584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    &(st->ec_gain_p_st),
19594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    bfi,
19604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    st->prev_bf,
19614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    &gain_pit,
19624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    pOverflow);
19634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                /* read and decode code gain */
19654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                index = *parm++;
19664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                if (bfi == 0)
19684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                {
19694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    d_gain_code(
19704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                        &(st->pred_state),
19714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                        mode,
19724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                        index,
19734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                        code,
19744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                        &gain_code,
19754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                        pOverflow);
19764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                }
19774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                else
19784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                {
19794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    ec_gain_code(
19804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                        &(st->ec_gain_c_st),
19814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                        &(st->pred_state),
19824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                        st->state,
19834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                        &gain_code,
19844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                        pOverflow);
19854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                }
19864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                ec_gain_code_update(
19884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    &(st->ec_gain_c_st),
19894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    bfi,
19904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    st->prev_bf,
19914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    &gain_code,
19924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    pOverflow);
19934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                pit_sharp = gain_pit;
19954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
19964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                if (pit_sharp > SHARPMAX)
19974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                {
19984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    pit_sharp = SHARPMAX;
19994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                }
20004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
20014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            else
20024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            { /* MR122 */
20034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
20044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                if (bfi == 0)
20054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                {
20064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    d_gain_code(
20074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                        &(st->pred_state),
20084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                        mode,
20094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                        index,
20104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                        code,
20114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                        &gain_code,
20124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                        pOverflow);
20134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                }
20144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                else
20154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                {
20164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    ec_gain_code(
20174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                        &(st->ec_gain_c_st),
20184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                        &(st->pred_state),
20194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                        st->state,
20204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                        &gain_code,
20214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                        pOverflow);
20224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                }
20234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
20244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                ec_gain_code_update(
20254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    &(st->ec_gain_c_st),
20264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    bfi,
20274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    st->prev_bf,
20284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    &gain_code,
20294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    pOverflow);
20304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
20314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                pit_sharp = gain_pit;
20324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
20334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
20344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
20354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* store pitch sharpening for next subframe             */
20364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* (for modes which use the previous pitch gain for     */
20374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* pitch sharpening in the search phase)                */
20384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* do not update sharpening in even subframes for MR475 */
20394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if ((mode != MR475) || (evenSubfr == 0))
20404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
20414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            st->sharp = gain_pit;
20424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
20434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if (st->sharp > SHARPMAX)
20444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
20454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                st->sharp = SHARPMAX;
20464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
20474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
20484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
20494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        pit_sharp = shl(pit_sharp, 1, pOverflow);
20504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
20514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (pit_sharp > 16384)
20524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
20534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            for (i = 0; i < L_SUBFR; i++)
20544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
20554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                temp = mult(st->exc[i], pit_sharp, pOverflow);
20564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                L_temp = L_mult(temp, gain_pit, pOverflow);
20574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
20584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                if (mode == MR122)
20594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                {
20604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    if (L_temp < 0)
20614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    {
20624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                        L_temp = ~((~L_temp) >> 1);
20634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    }
20644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    else
20654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    {
20664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                        L_temp = L_temp >> 1;
20674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    }
20684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                }
20694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                *(excp + i) = pv_round(L_temp, pOverflow);
20704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
20714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
20724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
20734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /*-------------------------------------------------------*
20744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         * - Store list of LTP gains needed in the source        *
20754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         *   characteristic detector (SCD)                       *
20764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         *-------------------------------------------------------*/
20774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
20784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (bfi == 0)
20794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
20804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            for (i = 0; i < 8; i++)
20814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
20824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                st->ltpGainHistory[i] = st->ltpGainHistory[i+1];
20834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
20844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            st->ltpGainHistory[8] = gain_pit;
20854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
20864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
20874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /*-------------------------------------------------------*
20884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        * - Limit gain_pit if in background noise and BFI       *
20894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        *   for MR475, MR515, MR59                              *
20904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        *-------------------------------------------------------*/
20914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
20924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
20934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if ((st->prev_bf != 0 || bfi != 0) && st->inBackgroundNoise != 0 &&
20944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                ((mode == MR475) || (mode == MR515) || (mode == MR59)))
20954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
20964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
20974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if (gain_pit > 12288)    /* if (gain_pit > 0.75) in Q14*/
20984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
20994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                gain_pit = ((gain_pit - 12288) >> 1) + 12288;
21004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                /* gain_pit = (gain_pit-0.75)/2.0 + 0.75; */
21014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
21024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
21034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if (gain_pit > 14745)    /* if (gain_pit > 0.90) in Q14*/
21044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
21054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                gain_pit = 14745;
21064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
21074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
21084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
21094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /*-------------------------------------------------------*
21104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         *  Calculate CB mixed gain                              *
21114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         *-------------------------------------------------------*/
21124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        Int_lsf(
21134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            prev_lsf,
21144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            st->lsfState.past_lsf_q,
21154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            i_subfr,
21164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            lsf_i,
21174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            pOverflow);
21184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
21194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        gain_code_mix =
21204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            Cb_gain_average(
21214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                &(st->Cb_gain_averState),
21224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                mode,
21234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                gain_code,
21244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                lsf_i,
21254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                st->lsp_avg_st.lsp_meanSave,
21264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                bfi,
21274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                st->prev_bf,
21284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                pdfi,
21294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                st->prev_pdf,
21304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                st->inBackgroundNoise,
21314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                st->voicedHangover,
21324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                pOverflow);
21334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
21344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* make sure that MR74, MR795, MR122 have original code_gain*/
21354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if ((mode > MR67) && (mode != MR102))
21364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            /* MR74, MR795, MR122 */
21374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
21384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            gain_code_mix = gain_code;
21394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
21404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
21414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /*-------------------------------------------------------*
21424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         * - Find the total excitation.                          *
21434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         * - Find synthesis speech corresponding to st->exc[].   *
21444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         *-------------------------------------------------------*/
21454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (mode <= MR102) /* MR475, MR515, MR59, MR67, MR74, MR795, MR102*/
21464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
21474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            pitch_fac = gain_pit;
21484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            tmp_shift = 1;
21494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
21504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        else       /* MR122 */
21514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
21524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if (gain_pit < 0)
21534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
21544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                pitch_fac = ~((~gain_pit) >> 1);
21554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
21564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            else
21574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
21584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                pitch_fac = gain_pit >> 1;
21594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
21604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            tmp_shift = 2;
21614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
21624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
21634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* copy unscaled LTP excitation to exc_enhanced (used in phase
21644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         * dispersion below) and compute total excitation for LTP feedback
21654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         */
21664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        for (i = 0; i < L_SUBFR; i++)
21674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
21684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            exc_enhanced[i] = st->exc[i];
21694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
21704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            /* st->exc[i] = gain_pit*st->exc[i] + gain_code*code[i]; */
21714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            L_temp = L_mult(st->exc[i], pitch_fac, pOverflow);
21724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            /* 12.2: Q0 * Q13 */
21734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            /*  7.4: Q0 * Q14 */
21744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            L_temp = L_mac(L_temp, code[i], gain_code, pOverflow);
21754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            /* 12.2: Q12 * Q1 */
21764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            /*  7.4: Q13 * Q1 */
21774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            L_temp = L_shl(L_temp, tmp_shift, pOverflow);     /* Q16 */
21784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            st->exc[i] = pv_round(L_temp, pOverflow);
21794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
21804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
21814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /*-------------------------------------------------------*
21824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         * - Adaptive phase dispersion                           *
21834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         *-------------------------------------------------------*/
21844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        ph_disp_release(&(st->ph_disp_st)); /* free phase dispersion adaption */
21854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
21864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
21874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (((mode == MR475) || (mode == MR515) || (mode == MR59)) &&
21884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                (st->voicedHangover > 3) && (st->inBackgroundNoise != 0) &&
21894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                (bfi != 0))
21904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
21914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            ph_disp_lock(&(st->ph_disp_st)); /* Always Use full Phase Disp. */
21924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }                                 /* if error in bg noise       */
21934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
21944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* apply phase dispersion to innovation (if enabled) and
21954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           compute total excitation for synthesis part           */
21964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        ph_disp(
21974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            &(st->ph_disp_st),
21984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            mode,
21994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            exc_enhanced,
22004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            gain_code_mix,
22014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            gain_pit,
22024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            code,
22034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            pitch_fac,
22044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            tmp_shift,
22054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            pOverflow);
22064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
22074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /*-------------------------------------------------------*
22084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         * - The Excitation control module are active during BFI.*
22094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         * - Conceal drops in signal energy if in bg noise.      *
22104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         *-------------------------------------------------------*/
22114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        L_temp = 0;
22124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        for (i = 0; i < L_SUBFR; i++)
22134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
22144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            L_temp = L_mac(L_temp, *(exc_enhanced + i), *(exc_enhanced + i), pOverflow);
22154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
22164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
22174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* excEnergy = sqrt(L_temp) in Q0 */
22184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (L_temp < 0)
22194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
22204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            L_temp = ~((~L_temp) >> 1);
22214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
22224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        else
22234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
22244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            L_temp = L_temp >> 1;
22254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
22264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
22274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        L_temp = sqrt_l_exp(L_temp, &temp, pOverflow);
22284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* To cope with 16-bit and scaling in ex_ctrl() */
22294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        L_temp = L_shr(L_temp, (Word16)((temp >> 1) + 15), pOverflow);
22304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (L_temp < 0)
22314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
22324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            excEnergy = (Word16)(~((~L_temp) >> 2));
22334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
22344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        else
22354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
22364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            excEnergy = (Word16)(L_temp >> 2);
22374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
22384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
22394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (((mode == MR475) || (mode == MR515) || (mode == MR59))  &&
22404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                (st->voicedHangover > 5) && (st->inBackgroundNoise != 0) &&
22414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                (st->state < 4) &&
22424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                ((pdfi != 0 && st->prev_pdf != 0) || bfi != 0 || st->prev_bf != 0))
22434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
22444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            carefulFlag = 0;
22454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
22464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if (pdfi != 0 && bfi == 0)
22474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
22484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                carefulFlag = 1;
22494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
22504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
22514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            Ex_ctrl(exc_enhanced,
22524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    excEnergy,
22534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    st->excEnergyHist,
22544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    st->voicedHangover,
22554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    st->prev_bf,
22564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    carefulFlag, pOverflow);
22574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
22584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
22594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (!((st->inBackgroundNoise != 0) && (bfi != 0 || st->prev_bf != 0) &&
22604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                (st->state < 4)))
22614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
22624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            /* Update energy history for all modes */
22634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            for (i = 0; i < 8; i++)
22644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
22654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                st->excEnergyHist[i] = st->excEnergyHist[i+1];
22664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
22674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            st->excEnergyHist[8] = excEnergy;
22684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
22694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /*-------------------------------------------------------*
22704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         * Excitation control module end.                        *
22714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         *-------------------------------------------------------*/
22724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (pit_sharp > 16384)
22734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
22744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            for (i = 0; i < L_SUBFR; i++)
22754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
22764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                *(excp + i) = add(*(excp + i), *(exc_enhanced + i), pOverflow);
22774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
22784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
22794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            agc2(exc_enhanced, excp, L_SUBFR, pOverflow);
22804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            *pOverflow = 0;
22814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            Syn_filt(Az, excp, &synth[i_subfr], L_SUBFR,
22824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                     st->mem_syn, 0);
22834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
22844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        else
22854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
22864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            *pOverflow = 0;
22874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            Syn_filt(Az, exc_enhanced, &synth[i_subfr], L_SUBFR,
22884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                     st->mem_syn, 0);
22894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
22904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
22914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (*pOverflow != 0)    /* Test for overflow */
22924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
22934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            for (i = PIT_MAX + L_INTERPOL + L_SUBFR - 1; i >= 0; i--)
22944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
22954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                if (st->old_exc[i] < 0)
22964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                {
22974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    st->old_exc[i] = ~((~st->old_exc[i]) >> 2);
22984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                }
22994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                else
23004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                {
23014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    st->old_exc[i] = st->old_exc[i] >> 2;
23024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                }
23034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
23044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
23054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
23064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            for (i = L_SUBFR - 1; i >= 0; i--)
23074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
23084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                if (*(exc_enhanced + i) < 0)
23094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                {
23104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    *(exc_enhanced + i) = ~((~(*(exc_enhanced + i))) >> 2);
23114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                }
23124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                else
23134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                {
23144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    *(exc_enhanced + i) = *(exc_enhanced + i) >> 2;
23154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                }
23164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }
23174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            Syn_filt(Az, exc_enhanced, &synth[i_subfr], L_SUBFR, st->mem_syn, 1);
23184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
23194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        else
23204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
23214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            Copy(&synth[i_subfr+L_SUBFR-M], st->mem_syn, M);
23224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
23234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
23244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /*--------------------------------------------------*
23254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         * Update signal for next frame.                    *
23264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         * -> shift to the left by L_SUBFR  st->exc[]       *
23274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber         *--------------------------------------------------*/
23284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
23294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        Copy(&st->old_exc[L_SUBFR], &st->old_exc[0], PIT_MAX + L_INTERPOL);
23304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
23314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* interpolated LPC parameters for next subframe */
23324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        Az += MP1;
23334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
23344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* store T0 for next subframe */
23354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->old_T0 = T0;
23364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
23374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
23384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /*-------------------------------------------------------*
23394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * Call the Source Characteristic Detector which updates *
23404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * st->inBackgroundNoise and st->voicedHangover.         *
23414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     *-------------------------------------------------------*/
23424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
23434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->inBackgroundNoise =
23444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        Bgn_scd(
23454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            &(st->background_state),
23464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            &(st->ltpGainHistory[0]),
23474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            &(synth[0]),
23484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            &(st->voicedHangover),
23494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            pOverflow);
23504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
23514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    dtx_dec_activity_update(
23524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        &(st->dtxDecoderState),
23534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->lsfState.past_lsf_q,
23544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        synth,
23554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        pOverflow);
23564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
23574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* store bfi for next subframe */
23584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->prev_bf = bfi;
23594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->prev_pdf = pdfi;
23604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
23614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /*--------------------------------------------------*
23624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * Calculate the LSF averages on the eight          *
23634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * previous frames                                  *
23644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     *--------------------------------------------------*/
23654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    lsp_avg(
23664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        &(st->lsp_avg_st),
23674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->lsfState.past_lsf_q,
23684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        pOverflow);
23694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
23704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberthe_end:
23714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st->dtxDecoderState.dtxGlobalState = newDTXState;
23724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
23734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber//    return(0);
23744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber}
2375