1a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/* ------------------------------------------------------------------
2a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Copyright (C) 1998-2009 PacketVideo
3a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *
4a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * you may not use this file except in compliance with the License.
6a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * You may obtain a copy of the License at
7a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *
8a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *
10a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Unless required by applicable law or agreed to in writing, software
11a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * express or implied.
14a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * See the License for the specific language governing permissions
15a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * and limitations under the License.
16a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * -------------------------------------------------------------------
17a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber */
18a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/****************************************************************************************
19a30d40083856cb4edd225faf8b488fab156e5976Andreas HuberPortions of this file are derived from the following 3GPP standard:
20a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
21a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    3GPP TS 26.073
22a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
23a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Available from http://www.3gpp.org
24a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
25a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
26a30d40083856cb4edd225faf8b488fab156e5976Andreas HuberPermission to distribute, modify and use this file under the standard license
27a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberterms listed above has been obtained from the copyright holder.
28a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber****************************************************************************************/
29a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*
30a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
31a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
32a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Pathname: ./audio/gsm-amr/c/src/dec_amr.c
33a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Funtions: Decoder_amr_init
34a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           Decoder_amr_reset
35a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           Decoder_amr
36a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
37a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
38a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber MODULE DESCRIPTION
39a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
40a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber This file contains the function used to decode one speech frame using a given
41a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber codec mode. The functions used to initialize, reset, and exit are also
42a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber included in this file.
43a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
44a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
45a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/
46a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
47a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*----------------------------------------------------------------------------
48a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; INCLUDES
49a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/
50a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include <string.h>
51a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
52a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "dec_amr.h"
53a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "typedef.h"
54a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "cnst.h"
55a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "copy.h"
56a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "set_zero.h"
57a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "syn_filt.h"
58a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "d_plsf.h"
59a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "agc.h"
60a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "int_lpc.h"
61a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "dec_gain.h"
62a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "dec_lag3.h"
63a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "dec_lag6.h"
64a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "d2_9pf.h"
65a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "d2_11pf.h"
66a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "d3_14pf.h"
67a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "d4_17pf.h"
68a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "d8_31pf.h"
69a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "d1035pf.h"
70a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "pred_lt.h"
71a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "d_gain_p.h"
72a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "d_gain_c.h"
73a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "dec_gain.h"
74a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "ec_gains.h"
75a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "ph_disp.h"
76a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "c_g_aver.h"
77a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "int_lsf.h"
78a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "lsp_lsf.h"
79a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "lsp_avg.h"
80a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "bgnscd.h"
81a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "ex_ctrl.h"
82a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "sqrt_l.h"
83a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "frame.h"
84a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "bitno_tab.h"
85a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "b_cn_cod.h"
86a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "basic_op.h"
87a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
88a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*----------------------------------------------------------------------------
89a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; MACROS
90a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; Define module specific macros here
91a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/
92a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
93a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*----------------------------------------------------------------------------
94a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; DEFINES
95a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; Include all pre-processor statements here. Include conditional
96a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; compile variables also.
97a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/
98a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
99a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*----------------------------------------------------------------------------
100a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; LOCAL FUNCTION DEFINITIONS
101a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; Function Prototype declaration
102a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/
103a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
104a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*----------------------------------------------------------------------------
105a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; LOCAL VARIABLE DEFINITIONS
106a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; Variable declaration - defined here and used outside this module
107a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/
108a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
109a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
110a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*
111a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
112a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION NAME: Decoder_amr_init
113a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
114a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber INPUT AND OUTPUT DEFINITIONS
115a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
116a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs:
117a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    state = pointer to a pointer to structures of type Decoder_amrState
118a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
119a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs:
120a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    structure pointed to by the pointer which is pointed to by state is
121a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      initialized to each field's initial values
122a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
123a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    state pointer points to the address of the memory allocated by
124a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      Decoder_amr_init function
125a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
126a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Returns:
127a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    return_value = 0, if the initialization was successful; -1, otherwise (int)
128a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
129a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Global Variables Used:
130a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
131a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
132a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Local Variables Needed:
133a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
134a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
135a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
136a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION DESCRIPTION
137a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
138a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber This function allocates and initializes state memory used by the Decoder_amr
139a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber function. It stores the pointer to the filter status structure in state. This
140a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber pointer has to be passed to Decoder_amr in each call. The function returns
141a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 0, if initialization was successful and -1, otherwise.
142a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
143a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
144a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REQUIREMENTS
145a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
146a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None
147a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
148a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
149a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REFERENCES
150a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
151a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber dec_amr.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
152a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
153a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
154a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PSEUDO-CODE
155a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
156a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberint Decoder_amr_init (Decoder_amrState **state)
157a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
158a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  Decoder_amrState* s;
159a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  Word16 i;
160a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
161a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  if (state == (Decoder_amrState **) NULL){
162a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      fprintf(stderr, "Decoder_amr_init: invalid parameter\n");
163a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      return -1;
164a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  }
165a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  *state = NULL;
166a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
167a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  // allocate memory
168a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  if ((s= (Decoder_amrState *) malloc(sizeof(Decoder_amrState))) == NULL){
169a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      fprintf(stderr, "Decoder_amr_init: can not malloc state structure\n");
170a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      return -1;
171a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  }
172a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
173a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  s->T0_lagBuff = 40;
174a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  s->inBackgroundNoise = 0;
175a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  s->voicedHangover = 0;
176a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  for (i = 0; i < 9; i++)
177a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     s->ltpGainHistory[i] = 0;
178a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
179a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  s->lsfState = NULL;
180a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  s->ec_gain_p_st = NULL;
181a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  s->ec_gain_c_st = NULL;
182a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  s->pred_state = NULL;
183a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  s->ph_disp_st = NULL;
184a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  s->dtxDecoderState = NULL;
185a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
186a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  if (D_plsf_init(&s->lsfState) ||
187a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      ec_gain_pitch_init(&s->ec_gain_p_st) ||
188a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      ec_gain_code_init(&s->ec_gain_c_st) ||
189a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      gc_pred_init(&s->pred_state) ||
190a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      Cb_gain_average_init(&s->Cb_gain_averState) ||
191a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      lsp_avg_init(&s->lsp_avg_st) ||
192a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      Bgn_scd_init(&s->background_state) ||
193a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      ph_disp_init(&s->ph_disp_st) ||
194a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      dtx_dec_init(&s->dtxDecoderState)) {
195a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      Decoder_amr_exit(&s);
196a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      return -1;
197a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  }
198a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
199a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  Decoder_amr_reset(s, (enum Mode)0);
200a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  *state = s;
201a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
202a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  return 0;
203a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
204a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
205a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
206a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber RESOURCES USED [optional]
207a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
208a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber When the code is written for a specific target processor the
209a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber the resources used should be documented below.
210a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
211a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber HEAP MEMORY USED: x bytes
212a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
213a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber STACK MEMORY USED: x bytes
214a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
215a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
216a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                used to represent cycle count for each subroutine
217a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                called)
218a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
219a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                     name]
220a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
221a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
222a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CAUTION [optional]
223a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber [State any special notes, constraints or cautions for users of this function]
224a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
225a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
226a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/
227a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
228a30d40083856cb4edd225faf8b488fab156e5976Andreas HuberWord16 Decoder_amr_init(Decoder_amrState *s)
229a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
230a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 i;
231a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
232a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (s == (Decoder_amrState *) NULL)
233a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
234a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /* fprint(stderr, "Decoder_amr_init: invalid parameter\n");  */
235a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        return(-1);
236a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
237a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
238a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    s->T0_lagBuff = 40;
239a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    s->inBackgroundNoise = 0;
240a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    s->voicedHangover = 0;
241a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
242a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* Initialize overflow Flag */
243a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
244a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    s->overflow = 0;
245a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
246a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    for (i = 0; i < LTP_GAIN_HISTORY_LEN; i++)
247a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
248a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        s->ltpGainHistory[i] = 0;
249a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
250a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
251a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    D_plsf_reset(&s->lsfState);
252a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ec_gain_pitch_reset(&s->ec_gain_p_st);
253a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ec_gain_code_reset(&s->ec_gain_c_st);
254a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Cb_gain_average_reset(&s->Cb_gain_averState);
255a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    lsp_avg_reset(&s->lsp_avg_st);
256a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Bgn_scd_reset(&s->background_state);
257a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ph_disp_reset(&s->ph_disp_st);
258a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    dtx_dec_reset(&s->dtxDecoderState);
259a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    gc_pred_reset(&s->pred_state);
260a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
261a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Decoder_amr_reset(s, MR475);
262a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
263a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    return(0);
264a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
265a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
266a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/****************************************************************************/
267a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
268a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*
269a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
270a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION NAME: Decoder_amr_reset
271a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
272a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber INPUT AND OUTPUT DEFINITIONS
273a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
274a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs:
275a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    state = pointer to a structure of type Decoder_amrState
276a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    mode = codec mode (enum Mode)
277a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
278a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs:
279a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    structure pointed to by state is initialized to its reset value
280a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
281a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Returns:
282a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    return_value = 0, if reset was successful; -1, otherwise (int)
283a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
284a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Global Variables Used:
285a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
286a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
287a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Local Variables Needed:
288a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
289a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
290a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
291a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION DESCRIPTION
292a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
293a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber This function resets the state memory used by the Decoder_amr function. It
294a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber returns a 0, if reset was successful and -1, otherwise.
295a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
296a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
297a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REQUIREMENTS
298a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
299a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None
300a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
301a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
302a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REFERENCES
303a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
304a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber dec_amr.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
305a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
306a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
307a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PSEUDO-CODE
308a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
309a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberint Decoder_amr_reset (Decoder_amrState *state, enum Mode mode)
310a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
311a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  Word16 i;
312a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
313a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  if (state == (Decoder_amrState *) NULL){
314a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      fprintf(stderr, "Decoder_amr_reset: invalid parameter\n");
315a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      return -1;
316a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  }
317a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
318a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  // Initialize static pointer
319a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  state->exc = state->old_exc + PIT_MAX + L_INTERPOL;
320a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
321a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  // Static vectors to zero
322a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  Set_zero (state->old_exc, PIT_MAX + L_INTERPOL);
323a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
324a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  if (mode != MRDTX)
325a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     Set_zero (state->mem_syn, M);
326a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
327a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  // initialize pitch sharpening
328a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  state->sharp = SHARPMIN;
329a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  state->old_T0 = 40;
330a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
331a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  // Initialize state->lsp_old []
332a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
333a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  if (mode != MRDTX) {
334a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      Copy(lsp_init_data, &state->lsp_old[0], M);
335a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  }
336a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
337a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  // Initialize memories of bad frame handling
338a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  state->prev_bf = 0;
339a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  state->prev_pdf = 0;
340a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  state->state = 0;
341a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
342a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  state->T0_lagBuff = 40;
343a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  state->inBackgroundNoise = 0;
344a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  state->voicedHangover = 0;
345a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  if (mode != MRDTX) {
346a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      for (i=0;i<9;i++)
347a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          state->excEnergyHist[i] = 0;
348a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  }
349a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
350a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  for (i = 0; i < 9; i++)
351a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     state->ltpGainHistory[i] = 0;
352a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
353a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  Cb_gain_average_reset(state->Cb_gain_averState);
354a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  if (mode != MRDTX)
355a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     lsp_avg_reset(state->lsp_avg_st);
356a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  D_plsf_reset(state->lsfState);
357a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  ec_gain_pitch_reset(state->ec_gain_p_st);
358a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  ec_gain_code_reset(state->ec_gain_c_st);
359a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
360a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  if (mode != MRDTX)
361a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     gc_pred_reset(state->pred_state);
362a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
363a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  Bgn_scd_reset(state->background_state);
364a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  state->nodataSeed = 21845;
365a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  ph_disp_reset(state->ph_disp_st);
366a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  if (mode != MRDTX)
367a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     dtx_dec_reset(state->dtxDecoderState);
368a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
369a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  return 0;
370a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
371a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
372a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
373a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber RESOURCES USED [optional]
374a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
375a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber When the code is written for a specific target processor the
376a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber the resources used should be documented below.
377a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
378a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber HEAP MEMORY USED: x bytes
379a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
380a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber STACK MEMORY USED: x bytes
381a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
382a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
383a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                used to represent cycle count for each subroutine
384a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                called)
385a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
386a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                     name]
387a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
388a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
389a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CAUTION [optional]
390a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber [State any special notes, constraints or cautions for users of this function]
391a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
392a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
393a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/
394a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
395a30d40083856cb4edd225faf8b488fab156e5976Andreas HuberWord16 Decoder_amr_reset(Decoder_amrState *state, enum Mode mode)
396a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
397a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 i;
398a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
399a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (state == (Decoder_amrState *) NULL)
400a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
401a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /* fprint(stderr, "Decoder_amr_reset: invalid parameter\n");  */
402a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        return(-1);
403a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
404a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
405a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* Initialize static pointer */
406a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    state->exc = state->old_exc + PIT_MAX + L_INTERPOL;
407a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
408a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* Static vectors to zero */
409a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    memset(state->old_exc, 0, sizeof(Word16)*(PIT_MAX + L_INTERPOL));
410a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
411a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (mode != MRDTX)
412a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
413a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        memset(state->mem_syn, 0, sizeof(Word16)*M);
414a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
415a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* initialize pitch sharpening */
416a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    state->sharp = SHARPMIN;
417a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    state->old_T0 = 40;
418a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
419a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* Initialize overflow Flag */
420a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
421a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    state->overflow = 0;
422a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
423a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* Initialize state->lsp_old [] */
424a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
425a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (mode != MRDTX)
426a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
427a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        state->lsp_old[0] = 30000;
428a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        state->lsp_old[1] = 26000;
429a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        state->lsp_old[2] = 21000;
430a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        state->lsp_old[3] = 15000;
431a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        state->lsp_old[4] = 8000;
432a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        state->lsp_old[5] = 0;
433a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        state->lsp_old[6] = -8000;
434a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        state->lsp_old[7] = -15000;
435a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        state->lsp_old[8] = -21000;
436a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        state->lsp_old[9] = -26000;
437a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
438a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
439a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* Initialize memories of bad frame handling */
440a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    state->prev_bf = 0;
441a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    state->prev_pdf = 0;
442a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    state->state = 0;
443a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
444a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    state->T0_lagBuff = 40;
445a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    state->inBackgroundNoise = 0;
446a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    state->voicedHangover = 0;
447a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (mode != MRDTX)
448a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
449a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        for (i = 0; i < EXC_ENERGY_HIST_LEN; i++)
450a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
451a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            state->excEnergyHist[i] = 0;
452a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
453a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
454a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
455a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    for (i = 0; i < LTP_GAIN_HISTORY_LEN; i++)
456a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
457a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        state->ltpGainHistory[i] = 0;
458a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
459a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
460a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Cb_gain_average_reset(&(state->Cb_gain_averState));
461a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (mode != MRDTX)
462a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
463a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        lsp_avg_reset(&(state->lsp_avg_st));
464a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
465a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    D_plsf_reset(&(state->lsfState));
466a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ec_gain_pitch_reset(&(state->ec_gain_p_st));
467a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ec_gain_code_reset(&(state->ec_gain_c_st));
468a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
469a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (mode != MRDTX)
470a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
471a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        gc_pred_reset(&(state->pred_state));
472a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
473a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
474a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Bgn_scd_reset(&(state->background_state));
475a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    state->nodataSeed = 21845;
476a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ph_disp_reset(&(state->ph_disp_st));
477a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (mode != MRDTX)
478a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
479a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        dtx_dec_reset(&(state->dtxDecoderState));
480a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
481a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
482a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    return(0);
483a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
484a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
485a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/****************************************************************************/
486a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
487a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*
488a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
489a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION NAME: Decoder_amr
490a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
491a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber INPUT AND OUTPUT DEFINITIONS
492a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
493a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs:
494a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    st = pointer to a structure of type Decoder_amrState
495a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    mode = codec mode (enum Mode)
496a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    parm = buffer of synthesis parameters (Word16)
497a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    frame_type = received frame type (enum RXFrameType)
498a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    synth = buffer containing synthetic speech (Word16)
499a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    A_t = buffer containing decoded LP filter in 4 subframes (Word16)
500a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
501a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs:
502a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    structure pointed to by st contains the newly calculated decoder
503a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      parameters
504a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    synth buffer contains the decoded speech samples
505a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    A_t buffer contains the decoded LP filter parameters
506a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
507a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Returns:
508a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    return_value = 0 (int)
509a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
510a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Global Variables Used:
511a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
512a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
513a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Local Variables Needed:
514a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
515a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
516a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
517a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION DESCRIPTION
518a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
519a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber This function performs the decoding of one speech frame for a given codec
520a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber mode.
521a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
522a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
523a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REQUIREMENTS
524a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
525a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None
526a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
527a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
528a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REFERENCES
529a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
530a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber dec_amr.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
531a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
532a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
533a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PSEUDO-CODE
534a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
535a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberint Decoder_amr (
536a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Decoder_amrState *st,      // i/o : State variables
537a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    enum Mode mode,            // i   : AMR mode
538a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 parm[],             // i   : vector of synthesis parameters
539a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                        (PRM_SIZE)
540a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    enum RXFrameType frame_type, // i   : received frame type
541a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 synth[],            // o   : synthesis speech (L_FRAME)
542a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 A_t[]               // o   : decoded LP filter in 4 subframes
543a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                        (AZ_SIZE)
544a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber)
545a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
546a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    // LPC coefficients
547a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
548a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 *Az;                // Pointer on A_t
549a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
550a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    // LSPs
551a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
552a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 lsp_new[M];
553a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 lsp_mid[M];
554a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
555a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    // LSFs
556a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
557a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 prev_lsf[M];
558a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 lsf_i[M];
559a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
560a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    // Algebraic codevector
561a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
562a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 code[L_SUBFR];
563a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
564a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    // excitation
565a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
566a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 excp[L_SUBFR];
567a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 exc_enhanced[L_SUBFR];
568a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
569a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    // Scalars
570a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
571a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 i, i_subfr;
572a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 T0, T0_frac, index, index_mr475 = 0;
573a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 gain_pit, gain_code, gain_code_mix, pit_sharp, pit_flag, pitch_fac;
574a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 t0_min, t0_max;
575a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 delta_frc_low, delta_frc_range;
576a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 tmp_shift;
577a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 temp;
578a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word32 L_temp;
579a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 flag4;
580a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 carefulFlag;
581a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 excEnergy;
582a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 subfrNr;
583a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 evenSubfr = 0;
584a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
585a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 bfi = 0;   // bad frame indication flag
586a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 pdfi = 0;  // potential degraded bad frame flag
587a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
588a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    enum DTXStateType newDTXState;  // SPEECH , DTX, DTX_MUTE
589a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
590a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    // find the new  DTX state  SPEECH OR DTX
591a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    newDTXState = rx_dtx_handler(st->dtxDecoderState, frame_type);
592a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
593a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    // DTX actions
594a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (sub(newDTXState, SPEECH) != 0 )
595a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
596a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       Decoder_amr_reset (st, MRDTX);
597a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
598a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       dtx_dec(st->dtxDecoderState,
599a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               st->mem_syn,
600a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               st->lsfState,
601a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               st->pred_state,
602a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               st->Cb_gain_averState,
603a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               newDTXState,
604a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               mode,
605a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               parm, synth, A_t);
606a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       // update average lsp
607a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
608a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       Lsf_lsp(st->lsfState->past_lsf_q, st->lsp_old, M);
609a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       lsp_avg(st->lsp_avg_st, st->lsfState->past_lsf_q);
610a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       goto the_end;
611a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
612a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
613a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    // SPEECH action state machine
614a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if ((sub(frame_type, RX_SPEECH_BAD) == 0) ||
615a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        (sub(frame_type, RX_NO_DATA) == 0) ||
616a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        (sub(frame_type, RX_ONSET) == 0))
617a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
618a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       bfi = 1;
619a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       if ((sub(frame_type, RX_NO_DATA) == 0) ||
620a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           (sub(frame_type, RX_ONSET) == 0))
621a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       {
622a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      build_CN_param(&st->nodataSeed,
623a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             prmno[mode],
624a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             bitno[mode],
625a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             parm);
626a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       }
627a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
628a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    else if (sub(frame_type, RX_SPEECH_DEGRADED) == 0)
629a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
630a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       pdfi = 1;
631a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
632a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
633a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (bfi != 0)
634a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
635a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        st->state = add (st->state, 1);
636a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
637a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    else if (sub (st->state, 6) == 0)
638a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
639a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
640a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        st->state = 5;
641a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
642a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    else
643a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
644a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        st->state = 0;
645a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
646a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
647a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (sub (st->state, 6) > 0)
648a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
649a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        st->state = 6;
650a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
651a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
652a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    // If this frame is the first speech frame after CNI period,
653a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    // set the BFH state machine to an appropriate state depending
654a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    // on whether there was DTX muting before start of speech or not
655a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    // If there was DTX muting, the first speech frame is muted.
656a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    // If there was no DTX muting, the first speech frame is not
657a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    // muted. The BFH state machine starts from state 5, however, to
658a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    // keep the audible noise resulting from a SID frame which is
659a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    // erroneously interpreted as a good speech frame as small as
660a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    // possible (the decoder output in this case is quickly muted)
661a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
662a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (sub(st->dtxDecoderState->dtxGlobalState, DTX) == 0)
663a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
664a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       st->state = 5;
665a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       st->prev_bf = 0;
666a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
667a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    else if (sub(st->dtxDecoderState->dtxGlobalState, DTX_MUTE) == 0)
668a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
669a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       st->state = 5;
670a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       st->prev_bf = 1;
671a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
672a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
673a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    // save old LSFs for CB gain smoothing
674a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Copy (st->lsfState->past_lsf_q, prev_lsf, M);
675a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
676a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    // decode LSF parameters and generate interpolated lpc coefficients
677a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       for the 4 subframes
678a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (sub (mode, MR122) != 0)
679a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
680a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       D_plsf_3(st->lsfState, mode, bfi, parm, lsp_new);
681a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
682a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       // Advance synthesis parameters pointer
683a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       parm += 3;
684a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
685a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       Int_lpc_1to3(st->lsp_old, lsp_new, A_t);
686a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
687a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    else
688a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
689a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       D_plsf_5 (st->lsfState, bfi, parm, lsp_mid, lsp_new);
690a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
691a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       // Advance synthesis parameters pointer
692a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       parm += 5;
693a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
694a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       Int_lpc_1and3 (st->lsp_old, lsp_mid, lsp_new, A_t);
695a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
696a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
697a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    // update the LSPs for the next frame
698a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    for (i = 0; i < M; i++)
699a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
700a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       st->lsp_old[i] = lsp_new[i];
701a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
702a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
703a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    *------------------------------------------------------------------------*
704a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    *          Loop for every subframe in the analysis frame                 *
705a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    *------------------------------------------------------------------------*
706a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    * The subframe size is L_SUBFR and the loop is repeated L_FRAME/L_SUBFR  *
707a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    *  times                                                                 *
708a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    *     - decode the pitch delay                                           *
709a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    *     - decode algebraic code                                            *
710a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    *     - decode pitch and codebook gains                                  *
711a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    *     - find the excitation and compute synthesis speech                 *
712a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    *------------------------------------------------------------------------*
713a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
714a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    // pointer to interpolated LPC parameters
715a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Az = A_t;
716a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
717a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    evenSubfr = 0;
718a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    subfrNr = -1;
719a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)
720a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
721a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       subfrNr = add(subfrNr, 1);
722a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       evenSubfr = sub(1, evenSubfr);
723a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
724a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       // flag for first and 3th subframe
725a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       pit_flag = i_subfr;
726a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
727a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       if (sub (i_subfr, L_FRAME_BY2) == 0)
728a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       {
729a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          if (sub(mode, MR475) != 0 && sub(mode, MR515) != 0)
730a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          {
731a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             pit_flag = 0;
732a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          }
733a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       }
734a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
735a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       // pitch index
736a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       index = *parm++;
737a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
738a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        *-------------------------------------------------------*
739a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        * - decode pitch lag and find adaptive codebook vector. *
740a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        *-------------------------------------------------------*
741a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
742a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       if (sub(mode, MR122) != 0)
743a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       {
744a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          // flag4 indicates encoding with 4 bit resolution;
745a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          // this is needed for mode MR475, MR515, MR59 and MR67
746a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
747a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          flag4 = 0;
748a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          if ((sub (mode, MR475) == 0) ||
749a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              (sub (mode, MR515) == 0) ||
750a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              (sub (mode, MR59) == 0) ||
751a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              (sub (mode, MR67) == 0) ) {
752a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             flag4 = 1;
753a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          }
754a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
755a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           *-------------------------------------------------------*
756a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           * - get ranges for the t0_min and t0_max                *
757a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           * - only needed in delta decoding                       *
758a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           *-------------------------------------------------------*
759a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
760a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          delta_frc_low = 5;
761a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          delta_frc_range = 9;
762a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
763a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          if ( sub(mode, MR795) == 0 )
764a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          {
765a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             delta_frc_low = 10;
766a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             delta_frc_range = 19;
767a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          }
768a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
769a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          t0_min = sub(st->old_T0, delta_frc_low);
770a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          if (sub(t0_min, PIT_MIN) < 0)
771a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          {
772a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             t0_min = PIT_MIN;
773a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          }
774a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          t0_max = add(t0_min, delta_frc_range);
775a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          if (sub(t0_max, PIT_MAX) > 0)
776a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          {
777a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             t0_max = PIT_MAX;
778a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             t0_min = sub(t0_max, delta_frc_range);
779a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          }
780a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
781a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          Dec_lag3 (index, t0_min, t0_max, pit_flag, st->old_T0,
782a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    &T0, &T0_frac, flag4);
783a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
784a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          st->T0_lagBuff = T0;
785a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
786a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          if (bfi != 0)
787a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          {
788a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             if (sub (st->old_T0, PIT_MAX) < 0)
789a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             {                                      // Graceful pitch
790a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                st->old_T0 = add(st->old_T0, 1);    // degradation
791a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             }
792a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             T0 = st->old_T0;
793a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             T0_frac = 0;
794a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
795a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             if ( st->inBackgroundNoise != 0 &&
796a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                  sub(st->voicedHangover, 4) > 0 &&
797a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                  ((sub(mode, MR475) == 0 ) ||
798a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                   (sub(mode, MR515) == 0 ) ||
799a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                   (sub(mode, MR59) == 0) )
800a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                  )
801a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             {
802a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                T0 = st->T0_lagBuff;
803a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             }
804a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          }
805a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
806a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          Pred_lt_3or6 (st->exc, T0, T0_frac, L_SUBFR, 1);
807a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       }
808a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       else
809a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       {
810a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          Dec_lag6 (index, PIT_MIN_MR122,
811a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    PIT_MAX, pit_flag, &T0, &T0_frac);
812a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
813a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          if ( bfi == 0 && (pit_flag == 0 || sub (index, 61) < 0))
814a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          {
815a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          }
816a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          else
817a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          {
818a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             st->T0_lagBuff = T0;
819a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             T0 = st->old_T0;
820a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             T0_frac = 0;
821a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          }
822a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
823a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          Pred_lt_3or6 (st->exc, T0, T0_frac, L_SUBFR, 0);
824a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       }
825a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
826a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        *-------------------------------------------------------*
827a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        * - (MR122 only: Decode pitch gain.)                    *
828a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        * - Decode innovative codebook.                         *
829a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        * - set pitch sharpening factor                         *
830a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        *-------------------------------------------------------*
831a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
832a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if (sub (mode, MR475) == 0 || sub (mode, MR515) == 0)
833a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {   // MR475, MR515
834a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           index = *parm++;        // index of position
835a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           i = *parm++;            // signs
836a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
837a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           decode_2i40_9bits (subfrNr, i, index, code);
838a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
839a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           pit_sharp = shl (st->sharp, 1);
840a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
841a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        else if (sub (mode, MR59) == 0)
842a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {   // MR59
843a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           index = *parm++;        // index of position
844a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           i = *parm++;            // signs
845a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
846a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           decode_2i40_11bits (i, index, code);
847a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
848a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           pit_sharp = shl (st->sharp, 1);
849a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
850a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        else if (sub (mode, MR67) == 0)
851a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {   // MR67
852a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           index = *parm++;        // index of position
853a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           i = *parm++;            // signs
854a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
855a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           decode_3i40_14bits (i, index, code);
856a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
857a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           pit_sharp = shl (st->sharp, 1);
858a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
859a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        else if (sub (mode, MR795) <= 0)
860a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {   // MR74, MR795
861a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           index = *parm++;        // index of position
862a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           i = *parm++;            // signs
863a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
864a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           decode_4i40_17bits (i, index, code);
865a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
866a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           pit_sharp = shl (st->sharp, 1);
867a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
868a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        else if (sub (mode, MR102) == 0)
869a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {  // MR102
870a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           dec_8i40_31bits (parm, code);
871a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           parm += 7;
872a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
873a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           pit_sharp = shl (st->sharp, 1);
874a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
875a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        else
876a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {  // MR122
877a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           index = *parm++;
878a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           if (bfi != 0)
879a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           {
880a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              ec_gain_pitch (st->ec_gain_p_st, st->state, &gain_pit);
881a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           }
882a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           else
883a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           {
884a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              gain_pit = d_gain_pitch (mode, index);
885a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           }
886a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           ec_gain_pitch_update (st->ec_gain_p_st, bfi, st->prev_bf,
887a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                 &gain_pit);
888a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
889a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           dec_10i40_35bits (parm, code);
890a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           parm += 10;
891a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
892a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           // pit_sharp = gain_pit;
893a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           // if (pit_sharp > 1.0) pit_sharp = 1.0;
894a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
895a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           pit_sharp = shl (gain_pit, 1);
896a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
897a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
898a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         *-------------------------------------------------------*
899a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         * - Add the pitch contribution to code[].               *
900a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         *-------------------------------------------------------*
901a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        for (i = T0; i < L_SUBFR; i++)
902a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
903a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           temp = mult (code[i - T0], pit_sharp);
904a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           code[i] = add (code[i], temp);
905a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
906a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
907a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         *------------------------------------------------------------*
908a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         * - Decode codebook gain (MR122) or both pitch               *
909a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         *   gain and codebook gain (all others)                      *
910a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         * - Update pitch sharpening "sharp" with quantized gain_pit  *
911a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         *------------------------------------------------------------*
912a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
913a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if (sub (mode, MR475) == 0)
914a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
915a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           // read and decode pitch and code gain
916a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           if (evenSubfr != 0)
917a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           {
918a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              index_mr475 = *parm++; // index of gain(s)
919a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           }
920a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
921a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           if (bfi == 0)
922a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           {
923a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              Dec_gain(st->pred_state, mode, index_mr475, code,
924a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                       evenSubfr, &gain_pit, &gain_code);
925a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           }
926a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           else
927a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           {
928a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              ec_gain_pitch (st->ec_gain_p_st, st->state, &gain_pit);
929a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              ec_gain_code (st->ec_gain_c_st, st->pred_state, st->state,
930a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                            &gain_code);
931a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           }
932a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           ec_gain_pitch_update (st->ec_gain_p_st, bfi, st->prev_bf,
933a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                 &gain_pit);
934a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           ec_gain_code_update (st->ec_gain_c_st, bfi, st->prev_bf,
935a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                &gain_code);
936a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
937a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           pit_sharp = gain_pit;
938a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           if (sub (pit_sharp, SHARPMAX) > 0)
939a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           {
940a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               pit_sharp = SHARPMAX;
941a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           }
942a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
943a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
944a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        else if ((sub (mode, MR74) <= 0) ||
945a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                 (sub (mode, MR102) == 0))
946a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
947a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            // read and decode pitch and code gain
948a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            index = *parm++; // index of gain(s)
949a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
950a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            if (bfi == 0)
951a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
952a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               Dec_gain(st->pred_state, mode, index, code,
953a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                        evenSubfr, &gain_pit, &gain_code);
954a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
955a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            else
956a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
957a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               ec_gain_pitch (st->ec_gain_p_st, st->state, &gain_pit);
958a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               ec_gain_code (st->ec_gain_c_st, st->pred_state, st->state,
959a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                             &gain_code);
960a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
961a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            ec_gain_pitch_update (st->ec_gain_p_st, bfi, st->prev_bf,
962a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                  &gain_pit);
963a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            ec_gain_code_update (st->ec_gain_c_st, bfi, st->prev_bf,
964a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                 &gain_code);
965a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
966a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            pit_sharp = gain_pit;
967a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            if (sub (pit_sharp, SHARPMAX) > 0)
968a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
969a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               pit_sharp = SHARPMAX;
970a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
971a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
972a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            if (sub (mode, MR102) == 0)
973a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
974a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               if (sub (st->old_T0, add(L_SUBFR, 5)) > 0)
975a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               {
976a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                  pit_sharp = shr(pit_sharp, 2);
977a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               }
978a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
979a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
980a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        else
981a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
982a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           // read and decode pitch gain
983a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           index = *parm++; // index of gain(s)
984a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
985a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           if (sub (mode, MR795) == 0)
986a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           {
987a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              // decode pitch gain
988a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              if (bfi != 0)
989a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              {
990a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                 ec_gain_pitch (st->ec_gain_p_st, st->state, &gain_pit);
991a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              }
992a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              else
993a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              {
994a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                 gain_pit = d_gain_pitch (mode, index);
995a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              }
996a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              ec_gain_pitch_update (st->ec_gain_p_st, bfi, st->prev_bf,
997a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                    &gain_pit);
998a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
999a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              // read and decode code gain
1000a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              index = *parm++;
1001a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              if (bfi == 0)
1002a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              {
1003a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                 d_gain_code (st->pred_state, mode, index, code, &gain_code);
1004a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              }
1005a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              else
1006a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              {
1007a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                 ec_gain_code (st->ec_gain_c_st, st->pred_state, st->state,
1008a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                               &gain_code);
1009a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              }
1010a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              ec_gain_code_update (st->ec_gain_c_st, bfi, st->prev_bf,
1011a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                   &gain_code);
1012a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1013a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              pit_sharp = gain_pit;
1014a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              if (sub (pit_sharp, SHARPMAX) > 0)
1015a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              {
1016a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                 pit_sharp = SHARPMAX;
1017a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              }
1018a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           }
1019a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           else
1020a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           { // MR122
1021a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              if (bfi == 0)
1022a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              {
1023a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                 d_gain_code (st->pred_state, mode, index, code, &gain_code);
1024a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              }
1025a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              else
1026a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              {
1027a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                 ec_gain_code (st->ec_gain_c_st, st->pred_state, st->state,
1028a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                               &gain_code);
1029a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              }
1030a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              ec_gain_code_update (st->ec_gain_c_st, bfi, st->prev_bf,
1031a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                   &gain_code);
1032a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1033a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              pit_sharp = gain_pit;
1034a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           }
1035a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
1036a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1037a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        // store pitch sharpening for next subframe
1038a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        // (for modes which use the previous pitch gain for
1039a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        // pitch sharpening in the search phase)
1040a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        // do not update sharpening in even subframes for MR475
1041a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if (sub(mode, MR475) != 0 || evenSubfr == 0)
1042a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
1043a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            st->sharp = gain_pit;
1044a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            if (sub (st->sharp, SHARPMAX) > 0)
1045a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
1046a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                st->sharp = SHARPMAX;
1047a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
1048a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
1049a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1050a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        pit_sharp = shl (pit_sharp, 1);
1051a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if (sub (pit_sharp, 16384) > 0)
1052a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
1053a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           for (i = 0; i < L_SUBFR; i++)
1054a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
1055a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               temp = mult (st->exc[i], pit_sharp);
1056a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               L_temp = L_mult (temp, gain_pit);
1057a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               if (sub(mode, MR122)==0)
1058a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               {
1059a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                  L_temp = L_shr (L_temp, 1);
1060a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               }
1061a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               excp[i] = pv_round (L_temp);
1062a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
1063a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
1064a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1065a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         *-------------------------------------------------------*
1066a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         * - Store list of LTP gains needed in the source        *
1067a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         *   characteristic detector (SCD)                       *
1068a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         *-------------------------------------------------------*
1069a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if ( bfi == 0 )
1070a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
1071a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           for (i = 0; i < 8; i++)
1072a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           {
1073a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              st->ltpGainHistory[i] = st->ltpGainHistory[i+1];
1074a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           }
1075a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           st->ltpGainHistory[8] = gain_pit;
1076a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
1077a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1078a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         *-------------------------------------------------------*
1079a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         * - Limit gain_pit if in background noise and BFI       *
1080a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         *   for MR475, MR515, MR59                              *
1081a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         *-------------------------------------------------------*
1082a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1083a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if ( (st->prev_bf != 0 || bfi != 0) && st->inBackgroundNoise != 0 &&
1084a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             ((sub(mode, MR475) == 0) ||
1085a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              (sub(mode, MR515) == 0) ||
1086a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              (sub(mode, MR59) == 0))
1087a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             )
1088a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
1089a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           if ( sub (gain_pit, 12288) > 0)    // if (gain_pit > 0.75) in Q14
1090a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              gain_pit = add( shr( sub(gain_pit, 12288), 1 ), 12288 );
1091a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              // gain_pit = (gain_pit-0.75)/2.0 + 0.75;
1092a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1093a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           if ( sub (gain_pit, 14745) > 0)    // if (gain_pit > 0.90) in Q14
1094a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           {
1095a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              gain_pit = 14745;
1096a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           }
1097a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
1098a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1099a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         *-------------------------------------------------------*
1100a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         *  Calculate CB mixed gain                              *
1101a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         *-------------------------------------------------------*
1102a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        Int_lsf(prev_lsf, st->lsfState->past_lsf_q, i_subfr, lsf_i);
1103a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        gain_code_mix = Cb_gain_average(
1104a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            st->Cb_gain_averState, mode, gain_code,
1105a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            lsf_i, st->lsp_avg_st->lsp_meanSave, bfi,
1106a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            st->prev_bf, pdfi, st->prev_pdf,
1107a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            st->inBackgroundNoise, st->voicedHangover);
1108a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1109a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        // make sure that MR74, MR795, MR122 have original code_gain
1110a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if ((sub(mode, MR67) > 0) && (sub(mode, MR102) != 0) )
1111a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           // MR74, MR795, MR122
1112a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
1113a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           gain_code_mix = gain_code;
1114a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
1115a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1116a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         *-------------------------------------------------------*
1117a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         * - Find the total excitation.                          *
1118a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         * - Find synthesis speech corresponding to st->exc[].   *
1119a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         *-------------------------------------------------------*
1120a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if (sub(mode, MR102) <= 0) // MR475, MR515, MR59, MR67, MR74, MR795, MR102
1121a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
1122a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           pitch_fac = gain_pit;
1123a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           tmp_shift = 1;
1124a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
1125a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        else       // MR122
1126a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
1127a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           pitch_fac = shr (gain_pit, 1);
1128a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           tmp_shift = 2;
1129a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
1130a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1131a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        // copy unscaled LTP excitation to exc_enhanced (used in phase
1132a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         * dispersion below) and compute total excitation for LTP feedback
1133a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1134a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        for (i = 0; i < L_SUBFR; i++)
1135a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
1136a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           exc_enhanced[i] = st->exc[i];
1137a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1138a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           // st->exc[i] = gain_pit*st->exc[i] + gain_code*code[i];
1139a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           L_temp = L_mult (st->exc[i], pitch_fac);
1140a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                                      // 12.2: Q0 * Q13
1141a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                                      //  7.4: Q0 * Q14
1142a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           L_temp = L_mac (L_temp, code[i], gain_code);
1143a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                                      // 12.2: Q12 * Q1
1144a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                                      //  7.4: Q13 * Q1
1145a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           L_temp = L_shl (L_temp, tmp_shift);                   // Q16
1146a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           st->exc[i] = pv_round (L_temp);
1147a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
1148a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1149a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         *-------------------------------------------------------*
1150a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         * - Adaptive phase dispersion                           *
1151a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         *-------------------------------------------------------*
1152a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        ph_disp_release(st->ph_disp_st); // free phase dispersion adaption
1153a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1154a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if ( ((sub(mode, MR475) == 0) ||
1155a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              (sub(mode, MR515) == 0) ||
1156a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              (sub(mode, MR59) == 0))   &&
1157a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             sub(st->voicedHangover, 3) > 0 &&
1158a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             st->inBackgroundNoise != 0 &&
1159a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             bfi != 0 )
1160a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
1161a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           ph_disp_lock(st->ph_disp_st); // Always Use full Phase Disp.
1162a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }                                // if error in bg noise
1163a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1164a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        // apply phase dispersion to innovation (if enabled) and
1165a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           compute total excitation for synthesis part
1166a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        ph_disp(st->ph_disp_st, mode,
1167a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                exc_enhanced, gain_code_mix, gain_pit, code,
1168a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                pitch_fac, tmp_shift);
1169a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1170a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         *-------------------------------------------------------*
1171a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         * - The Excitation control module are active during BFI.*
1172a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         * - Conceal drops in signal energy if in bg noise.      *
1173a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         *-------------------------------------------------------*
1174a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1175a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        L_temp = 0;
1176a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        for (i = 0; i < L_SUBFR; i++)
1177a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
1178a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            L_temp = L_mac (L_temp, exc_enhanced[i], exc_enhanced[i] );
1179a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
1180a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1181a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        L_temp = L_shr (L_temp, 1);     // excEnergy = sqrt(L_temp) in Q0
1182a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        L_temp = sqrt_l_exp(L_temp, &temp); // function result
1183a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        L_temp = L_shr(L_temp, add( shr(temp, 1), 15));
1184a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        L_temp = L_shr(L_temp, 2);       // To cope with 16-bit and
1185a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        excEnergy = extract_l(L_temp);   // scaling in ex_ctrl()
1186a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1187a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if ( ((sub (mode, MR475) == 0) ||
1188a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              (sub (mode, MR515) == 0) ||
1189a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              (sub (mode, MR59) == 0))  &&
1190a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             sub(st->voicedHangover, 5) > 0 &&
1191a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             st->inBackgroundNoise != 0 &&
1192a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             sub(st->state, 4) < 0 &&
1193a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             ( (pdfi != 0 && st->prev_pdf != 0) ||
1194a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                bfi != 0 ||
1195a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                st->prev_bf != 0) )
1196a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
1197a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           carefulFlag = 0;
1198a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           if ( pdfi != 0 && bfi == 0 )
1199a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           {
1200a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              carefulFlag = 1;
1201a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           }
1202a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1203a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           Ex_ctrl(exc_enhanced,
1204a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                   excEnergy,
1205a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                   st->excEnergyHist,
1206a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                   st->voicedHangover,
1207a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                   st->prev_bf,
1208a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                   carefulFlag);
1209a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
1210a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1211a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if ( st->inBackgroundNoise != 0 &&
1212a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             ( bfi != 0 || st->prev_bf != 0 ) &&
1213a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             sub(st->state, 4) < 0 )
1214a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
1215a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           ; // do nothing!
1216a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
1217a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        else
1218a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
1219a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           // Update energy history for all modes
1220a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           for (i = 0; i < 8; i++)
1221a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           {
1222a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              st->excEnergyHist[i] = st->excEnergyHist[i+1];
1223a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           }
1224a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           st->excEnergyHist[8] = excEnergy;
1225a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
1226a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         *-------------------------------------------------------*
1227a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         * Excitation control module end.                        *
1228a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         *-------------------------------------------------------*
1229a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1230a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if (sub (pit_sharp, 16384) > 0)
1231a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
1232a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           for (i = 0; i < L_SUBFR; i++)
1233a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           {
1234a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              excp[i] = add (excp[i], exc_enhanced[i]);
1235a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           }
1236a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           agc2 (exc_enhanced, excp, L_SUBFR);
1237a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           Overflow = 0;
1238a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           Syn_filt (Az, excp, &synth[i_subfr], L_SUBFR,
1239a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                     st->mem_syn, 0);
1240a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
1241a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        else
1242a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
1243a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           Overflow = 0;
1244a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           Syn_filt (Az, exc_enhanced, &synth[i_subfr], L_SUBFR,
1245a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                     st->mem_syn, 0);
1246a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
1247a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1248a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if (Overflow != 0)    // Test for overflow
1249a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
1250a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           for (i = 0; i < PIT_MAX + L_INTERPOL + L_SUBFR; i++)
1251a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           {
1252a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              st->old_exc[i] = shr(st->old_exc[i], 2);
1253a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           }
1254a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           for (i = 0; i < L_SUBFR; i++)
1255a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           {
1256a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              exc_enhanced[i] = shr(exc_enhanced[i], 2);
1257a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           }
1258a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           Syn_filt(Az, exc_enhanced, &synth[i_subfr], L_SUBFR, st->mem_syn, 1);
1259a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
1260a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        else
1261a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
1262a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           Copy(&synth[i_subfr+L_SUBFR-M], st->mem_syn, M);
1263a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
1264a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1265a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         *--------------------------------------------------*
1266a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         * Update signal for next frame.                    *
1267a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         * -> shift to the left by L_SUBFR  st->exc[]       *
1268a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         *--------------------------------------------------*
1269a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1270a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        Copy (&st->old_exc[L_SUBFR], &st->old_exc[0], PIT_MAX + L_INTERPOL);
1271a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1272a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        // interpolated LPC parameters for next subframe
1273a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        Az += MP1;
1274a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1275a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        // store T0 for next subframe
1276a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        st->old_T0 = T0;
1277a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
1278a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1279a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     *-------------------------------------------------------*
1280a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     * Call the Source Characteristic Detector which updates *
1281a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     * st->inBackgroundNoise and st->voicedHangover.         *
1282a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     *-------------------------------------------------------*
1283a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1284a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    st->inBackgroundNoise = Bgn_scd(st->background_state,
1285a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                    &(st->ltpGainHistory[0]),
1286a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                    &(synth[0]),
1287a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                    &(st->voicedHangover) );
1288a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1289a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    dtx_dec_activity_update(st->dtxDecoderState,
1290a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                            st->lsfState->past_lsf_q,
1291a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                            synth);
1292a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1293a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    // store bfi for next subframe
1294a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    st->prev_bf = bfi;
1295a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    st->prev_pdf = pdfi;
1296a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1297a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     *--------------------------------------------------*
1298a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     * Calculate the LSF averages on the eight          *
1299a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     * previous frames                                  *
1300a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     *--------------------------------------------------*
1301a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1302a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    lsp_avg(st->lsp_avg_st, st->lsfState->past_lsf_q);
1303a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1304a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberthe_end:
1305a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    st->dtxDecoderState->dtxGlobalState = newDTXState;
1306a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1307a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    return 0;
1308a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
1309a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1310a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1311a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber RESOURCES USED [optional]
1312a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1313a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber When the code is written for a specific target processor the
1314a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber the resources used should be documented below.
1315a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1316a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber HEAP MEMORY USED: x bytes
1317a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1318a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber STACK MEMORY USED: x bytes
1319a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1320a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
1321a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                used to represent cycle count for each subroutine
1322a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                called)
1323a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
1324a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                     name]
1325a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1326a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1327a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CAUTION [optional]
1328a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber [State any special notes, constraints or cautions for users of this function]
1329a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1330a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1331a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/
1332a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1333a30d40083856cb4edd225faf8b488fab156e5976Andreas Hubervoid Decoder_amr(
1334a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Decoder_amrState *st,      /* i/o : State variables                   */
1335a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    enum Mode mode,            /* i   : AMR mode                          */
1336a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 parm[],             /* i   : vector of synthesis parameters
1337a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                        (PRM_SIZE)                        */
1338a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    enum RXFrameType frame_type, /* i   : received frame type             */
1339a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 synth[],            /* o   : synthesis speech (L_FRAME)        */
1340a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 A_t[]               /* o   : decoded LP filter in 4 subframes
1341a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                        (AZ_SIZE)                         */
1342a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber)
1343a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
1344a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* LPC coefficients */
1345a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1346a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 *Az;                /* Pointer on A_t */
1347a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1348a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* LSPs */
1349a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1350a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 lsp_new[M];
1351a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 lsp_mid[M];
1352a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1353a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* LSFs */
1354a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1355a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 prev_lsf[M];
1356a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 lsf_i[M];
1357a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1358a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* Algebraic codevector */
1359a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1360a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 code[L_SUBFR];
1361a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1362a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* excitation */
1363a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1364a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 excp[L_SUBFR];
1365a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 exc_enhanced[L_SUBFR];
1366a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1367a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* Scalars */
1368a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1369a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 i;
1370a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 i_subfr;
1371a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 T0;
1372a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 T0_frac;
1373a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 index;
1374a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 index_mr475 = 0;
1375a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 gain_pit;
1376a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 gain_code;
1377a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 gain_code_mix;
1378a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 pit_sharp;
1379a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 pit_flag;
1380a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 pitch_fac;
1381a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 t0_min;
1382a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 t0_max;
1383a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 delta_frc_low;
1384a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 delta_frc_range;
1385a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 tmp_shift;
1386a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 temp;
1387a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word32 L_temp;
1388a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 flag4;
1389a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 carefulFlag;
1390a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 excEnergy;
1391a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 subfrNr;
1392a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 evenSubfr = 0;
1393a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1394a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 bfi = 0;   /* bad frame indication flag                          */
1395a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 pdfi = 0;  /* potential degraded bad frame flag                  */
1396a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1397a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    enum DTXStateType newDTXState;  /* SPEECH , DTX, DTX_MUTE */
1398a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Flag   *pOverflow = &(st->overflow);     /* Overflow flag            */
1399a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1400a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1401a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* find the new  DTX state  SPEECH OR DTX */
1402a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    newDTXState = rx_dtx_handler(&(st->dtxDecoderState), frame_type, pOverflow);
1403a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1404a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* DTX actions */
1405a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1406a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (newDTXState != SPEECH)
1407a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
1408a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        Decoder_amr_reset(st, MRDTX);
1409a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1410a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        dtx_dec(&(st->dtxDecoderState),
1411a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                st->mem_syn,
1412a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                &(st->lsfState),
1413a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                &(st->pred_state),
1414a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                &(st->Cb_gain_averState),
1415a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                newDTXState,
1416a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                mode,
1417a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                parm, synth, A_t, pOverflow);
1418a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1419a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /* update average lsp */
1420a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        Lsf_lsp(
1421a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            st->lsfState.past_lsf_q,
1422a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            st->lsp_old,
1423a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            M,
1424a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            pOverflow);
1425a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1426a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        lsp_avg(
1427a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            &(st->lsp_avg_st),
1428a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            st->lsfState.past_lsf_q,
1429a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            pOverflow);
1430a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1431a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        goto the_end;
1432a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
1433a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1434a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* SPEECH action state machine  */
1435a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if ((frame_type == RX_SPEECH_BAD) || (frame_type == RX_NO_DATA) ||
1436a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            (frame_type == RX_ONSET))
1437a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
1438a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        bfi = 1;
1439a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1440a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if ((frame_type == RX_NO_DATA) || (frame_type == RX_ONSET))
1441a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
1442a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            build_CN_param(&st->nodataSeed,
1443a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                           prmno[mode],
1444a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                           bitno[mode],
1445a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                           parm,
1446a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                           pOverflow);
1447a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
1448a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
1449a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    else if (frame_type == RX_SPEECH_DEGRADED)
1450a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
1451a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        pdfi = 1;
1452a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
1453a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1454a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (bfi != 0)
1455a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
1456a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        st->state += 1;
1457a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
1458a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    else if (st->state == 6)
1459a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1460a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
1461a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        st->state = 5;
1462a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
1463a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    else
1464a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
1465a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        st->state = 0;
1466a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
1467a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1468a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1469a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (st->state > 6)
1470a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
1471a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        st->state = 6;
1472a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
1473a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1474a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* If this frame is the first speech frame after CNI period,     */
1475a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* set the BFH state machine to an appropriate state depending   */
1476a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* on whether there was DTX muting before start of speech or not */
1477a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* If there was DTX muting, the first speech frame is muted.     */
1478a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* If there was no DTX muting, the first speech frame is not     */
1479a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* muted. The BFH state machine starts from state 5, however, to */
1480a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* keep the audible noise resulting from a SID frame which is    */
1481a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* erroneously interpreted as a good speech frame as small as    */
1482a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* possible (the decoder output in this case is quickly muted)   */
1483a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1484a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (st->dtxDecoderState.dtxGlobalState == DTX)
1485a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
1486a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        st->state = 5;
1487a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        st->prev_bf = 0;
1488a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
1489a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    else if (st->dtxDecoderState.dtxGlobalState == DTX_MUTE)
1490a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
1491a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        st->state = 5;
1492a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        st->prev_bf = 1;
1493a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
1494a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1495a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* save old LSFs for CB gain smoothing */
1496a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Copy(st->lsfState.past_lsf_q, prev_lsf, M);
1497a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1498a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* decode LSF parameters and generate interpolated lpc coefficients
1499a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       for the 4 subframes */
1500a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1501a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (mode != MR122)
1502a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
1503a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        D_plsf_3(
1504a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            &(st->lsfState),
1505a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            mode,
1506a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            bfi,
1507a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            parm,
1508a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            lsp_new,
1509a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            pOverflow);
1510a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1511a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /* Advance synthesis parameters pointer */
1512a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        parm += 3;
1513a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1514a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        Int_lpc_1to3(
1515a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            st->lsp_old,
1516a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            lsp_new,
1517a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            A_t,
1518a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            pOverflow);
1519a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
1520a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    else
1521a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
1522a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        D_plsf_5(
1523a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            &(st->lsfState),
1524a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            bfi,
1525a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            parm,
1526a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            lsp_mid,
1527a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            lsp_new,
1528a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            pOverflow);
1529a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1530a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /* Advance synthesis parameters pointer */
1531a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        parm += 5;
1532a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1533a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        Int_lpc_1and3(
1534a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            st->lsp_old,
1535a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            lsp_mid,
1536a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            lsp_new,
1537a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            A_t,
1538a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            pOverflow);
1539a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
1540a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1541a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* update the LSPs for the next frame */
1542a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    for (i = 0; i < M; i++)
1543a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
1544a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        st->lsp_old[i] = lsp_new[i];
1545a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
1546a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1547a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /*------------------------------------------------------------------------*
1548a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     *          Loop for every subframe in the analysis frame                 *
1549a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     *------------------------------------------------------------------------*
1550a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     * The subframe size is L_SUBFR and the loop is repeated L_FRAME/L_SUBFR  *
1551a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     *  times                                                                 *
1552a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     *     - decode the pitch delay                                           *
1553a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     *     - decode algebraic code                                            *
1554a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     *     - decode pitch and codebook gains                                  *
1555a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     *     - find the excitation and compute synthesis speech                 *
1556a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     *------------------------------------------------------------------------*/
1557a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1558a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* pointer to interpolated LPC parameters */
1559a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Az = A_t;
1560a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1561a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    evenSubfr = 0;
1562a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    subfrNr = -1;
1563a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)
1564a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
1565a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        subfrNr += 1;
1566a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        evenSubfr = 1 - evenSubfr;
1567a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1568a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /* flag for first and 3th subframe */
1569a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        pit_flag = i_subfr;
1570a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1571a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1572a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if (i_subfr == L_FRAME_BY2)
1573a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
1574a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            if ((mode != MR475) && (mode != MR515))
1575a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
1576a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                pit_flag = 0;
1577a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
1578a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
1579a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1580a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /* pitch index */
1581a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        index = *parm++;
1582a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1583a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /*-------------------------------------------------------*
1584a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        * - decode pitch lag and find adaptive codebook vector. *
1585a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        *-------------------------------------------------------*/
1586a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1587a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if (mode != MR122)
1588a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
1589a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            /* flag4 indicates encoding with 4 bit resolution;     */
1590a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            /* this is needed for mode MR475, MR515, MR59 and MR67 */
1591a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1592a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            flag4 = 0;
1593a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1594a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            if ((mode == MR475) || (mode == MR515) || (mode == MR59) ||
1595a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    (mode == MR67))
1596a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
1597a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                flag4 = 1;
1598a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
1599a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1600a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            /*-------------------------------------------------------*
1601a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            * - get ranges for the t0_min and t0_max                *
1602a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            * - only needed in delta decoding                       *
1603a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            *-------------------------------------------------------*/
1604a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1605a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            delta_frc_low = 5;
1606a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            delta_frc_range = 9;
1607a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1608a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            if (mode == MR795)
1609a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
1610a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                delta_frc_low = 10;
1611a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                delta_frc_range = 19;
1612a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
1613a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1614a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            t0_min = sub(st->old_T0, delta_frc_low, pOverflow);
1615a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1616a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            if (t0_min < PIT_MIN)
1617a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
1618a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                t0_min = PIT_MIN;
1619a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
1620a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            t0_max = add(t0_min, delta_frc_range, pOverflow);
1621a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1622a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            if (t0_max > PIT_MAX)
1623a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
1624a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                t0_max = PIT_MAX;
1625a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                t0_min = t0_max - delta_frc_range;
1626a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
1627a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1628a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            Dec_lag3(index, t0_min, t0_max, pit_flag, st->old_T0,
1629a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                     &T0, &T0_frac, flag4, pOverflow);
1630a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1631a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            st->T0_lagBuff = T0;
1632a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1633a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            if (bfi != 0)
1634a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
1635a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                if (st->old_T0 < PIT_MAX)
1636a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                {                               /* Graceful pitch */
163749e5a4c5be2e8ba114efff8d0634a34867cb2c26Dave Sparks                    st->old_T0 += 0;            /* degradation    */
1638a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                }
1639a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                T0 = st->old_T0;
1640a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                T0_frac = 0;
1641a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1642a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                if ((st->inBackgroundNoise != 0) && (st->voicedHangover > 4) &&
1643a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                        ((mode == MR475) || (mode == MR515) || (mode == MR59)))
1644a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                {
1645a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    T0 = st->T0_lagBuff;
1646a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                }
1647a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
1648a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1649a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            Pred_lt_3or6(st->exc, T0, T0_frac, L_SUBFR, 1, pOverflow);
1650a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
1651a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        else
1652a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
1653a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            Dec_lag6(index, PIT_MIN_MR122,
1654a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                     PIT_MAX, pit_flag, &T0, &T0_frac, pOverflow);
1655a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1656a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1657a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            if (!(bfi == 0 && (pit_flag == 0 || index < 61)))
1658a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
1659a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                st->T0_lagBuff = T0;
1660a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                T0 = st->old_T0;
1661a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                T0_frac = 0;
1662a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
1663a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1664a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            Pred_lt_3or6(st->exc, T0, T0_frac, L_SUBFR, 0, pOverflow);
1665a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
1666a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1667a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /*-------------------------------------------------------*
1668a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         * - (MR122 only: Decode pitch gain.)                    *
1669a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         * - Decode innovative codebook.                         *
1670a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         * - set pitch sharpening factor                         *
1671a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         *-------------------------------------------------------*/
1672a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if ((mode == MR475) || (mode == MR515))
1673a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {   /* MR475, MR515 */
1674a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            index = *parm++;        /* index of position */
1675a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            i = *parm++;            /* signs             */
1676a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1677a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            decode_2i40_9bits(subfrNr, i, index, code, pOverflow);
1678a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1679a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            L_temp = (Word32)st->sharp << 1;
1680a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            if (L_temp != (Word32)((Word16) L_temp))
1681a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
1682a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                pit_sharp = (st->sharp > 0) ? MAX_16 : MIN_16;
1683a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
1684a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            else
1685a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
1686a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                pit_sharp = (Word16) L_temp;
1687a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
1688a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
1689a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        else if (mode == MR59)
1690a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {   /* MR59 */
1691a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            index = *parm++;        /* index of position */
1692a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            i = *parm++;            /* signs             */
1693a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1694a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            decode_2i40_11bits(i, index, code);
1695a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1696a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            L_temp = (Word32)st->sharp << 1;
1697a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            if (L_temp != (Word32)((Word16) L_temp))
1698a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
1699a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                pit_sharp = (st->sharp > 0) ? MAX_16 : MIN_16;
1700a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
1701a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            else
1702a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
1703a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                pit_sharp = (Word16) L_temp;
1704a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
1705a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
1706a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        else if (mode == MR67)
1707a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {   /* MR67 */
1708a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            index = *parm++;        /* index of position */
1709a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            i = *parm++;            /* signs             */
1710a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1711a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            decode_3i40_14bits(i, index, code);
1712a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1713a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            L_temp = (Word32)st->sharp << 1;
1714a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            if (L_temp != (Word32)((Word16) L_temp))
1715a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
1716a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                pit_sharp = (st->sharp > 0) ? MAX_16 : MIN_16;
1717a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
1718a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            else
1719a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
1720a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                pit_sharp = (Word16) L_temp;
1721a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
1722a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
1723a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        else if (mode <= MR795)
1724a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {   /* MR74, MR795 */
1725a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            index = *parm++;        /* index of position */
1726a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            i = *parm++;            /* signs             */
1727a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1728a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            decode_4i40_17bits(i, index, code);
1729a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1730a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            L_temp = (Word32)st->sharp << 1;
1731a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            if (L_temp != (Word32)((Word16) L_temp))
1732a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
1733a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                pit_sharp = (st->sharp > 0) ? MAX_16 : MIN_16;
1734a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
1735a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            else
1736a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
1737a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                pit_sharp = (Word16) L_temp;
1738a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
1739a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
1740a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        else if (mode == MR102)
1741a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {  /* MR102 */
1742a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            dec_8i40_31bits(parm, code, pOverflow);
1743a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            parm += 7;
1744a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1745a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            L_temp = (Word32)st->sharp << 1;
1746a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            if (L_temp != (Word32)((Word16) L_temp))
1747a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
1748a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                pit_sharp = (st->sharp > 0) ? MAX_16 : MIN_16;
1749a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
1750a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            else
1751a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
1752a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                pit_sharp = (Word16) L_temp;
1753a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
1754a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
1755a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        else
1756a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {  /* MR122 */
1757a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            index = *parm++;
1758a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1759a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            if (bfi != 0)
1760a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
1761a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                ec_gain_pitch(
1762a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    &(st->ec_gain_p_st),
1763a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    st->state,
1764a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    &gain_pit,
1765a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    pOverflow);
1766a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
1767a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            else
1768a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
1769a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                gain_pit = d_gain_pitch(mode, index);
1770a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
1771a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            ec_gain_pitch_update(
1772a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                &(st->ec_gain_p_st),
1773a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                bfi,
1774a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                st->prev_bf,
1775a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                &gain_pit,
1776a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                pOverflow);
1777a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1778a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1779a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            dec_10i40_35bits(parm, code);
1780a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            parm += 10;
1781a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1782a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            /* pit_sharp = gain_pit;                   */
1783a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            /* if (pit_sharp > 1.0) pit_sharp = 1.0;   */
1784a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1785a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            L_temp = (Word32)gain_pit << 1;
1786a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            if (L_temp != (Word32)((Word16) L_temp))
1787a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
1788a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                pit_sharp = (gain_pit > 0) ? MAX_16 : MIN_16;
1789a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
1790a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            else
1791a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
1792a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                pit_sharp = (Word16) L_temp;
1793a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
1794a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
1795a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /*-------------------------------------------------------*
1796a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         * - Add the pitch contribution to code[].               *
1797a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         *-------------------------------------------------------*/
1798a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        for (i = T0; i < L_SUBFR; i++)
1799a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
1800a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            temp = mult(*(code + i - T0), pit_sharp, pOverflow);
1801a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            *(code + i) = add(*(code + i), temp, pOverflow);
1802a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1803a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
1804a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1805a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /*------------------------------------------------------------*
1806a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         * - Decode codebook gain (MR122) or both pitch               *
1807a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         *   gain and codebook gain (all others)                      *
1808a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         * - Update pitch sharpening "sharp" with quantized gain_pit  *
1809a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         *------------------------------------------------------------*/
1810a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if (mode == MR475)
1811a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
1812a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            /* read and decode pitch and code gain */
1813a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1814a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            if (evenSubfr != 0)
1815a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
1816a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                index_mr475 = *parm++;         /* index of gain(s) */
1817a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
1818a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1819a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            if (bfi == 0)
1820a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
1821a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                Dec_gain(
1822a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    &(st->pred_state),
1823a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    mode,
1824a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    index_mr475,
1825a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    code,
1826a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    evenSubfr,
1827a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    &gain_pit,
1828a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    &gain_code,
1829a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    pOverflow);
1830a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
1831a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            else
1832a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
1833a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                ec_gain_pitch(
1834a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    &(st->ec_gain_p_st),
1835a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    st->state,
1836a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    &gain_pit,
1837a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    pOverflow);
1838a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1839a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                ec_gain_code(
1840a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    &(st->ec_gain_c_st),
1841a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    &(st->pred_state),
1842a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    st->state,
1843a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    &gain_code,
1844a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    pOverflow);
1845a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
1846a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            ec_gain_pitch_update(
1847a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                &st->ec_gain_p_st,
1848a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                bfi,
1849a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                st->prev_bf,
1850a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                &gain_pit,
1851a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                pOverflow);
1852a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1853a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            ec_gain_code_update(
1854a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                &st->ec_gain_c_st,
1855a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                bfi,
1856a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                st->prev_bf,
1857a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                &gain_code,
1858a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                pOverflow);
1859a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1860a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            pit_sharp = gain_pit;
1861a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1862a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            if (pit_sharp > SHARPMAX)
1863a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
1864a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                pit_sharp = SHARPMAX;
1865a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
1866a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1867a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
1868a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        else if ((mode <= MR74) || (mode == MR102))
1869a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
1870a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            /* read and decode pitch and code gain */
1871a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            index = *parm++;                 /* index of gain(s) */
1872a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1873a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            if (bfi == 0)
1874a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
1875a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                Dec_gain(
1876a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    &(st->pred_state),
1877a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    mode,
1878a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    index,
1879a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    code,
1880a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    evenSubfr,
1881a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    &gain_pit,
1882a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    &gain_code,
1883a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    pOverflow);
1884a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
1885a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            else
1886a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
1887a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                ec_gain_pitch(
1888a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    &(st->ec_gain_p_st),
1889a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    st->state,
1890a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    &gain_pit,
1891a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    pOverflow);
1892a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1893a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                ec_gain_code(
1894a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    &(st->ec_gain_c_st),
1895a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    &(st->pred_state),
1896a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    st->state,
1897a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    &gain_code,
1898a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    pOverflow);
1899a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
1900a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1901a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            ec_gain_pitch_update(
1902a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                &(st->ec_gain_p_st),
1903a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                bfi,
1904a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                st->prev_bf,
1905a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                &gain_pit,
1906a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                pOverflow);
1907a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1908a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            ec_gain_code_update(
1909a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                &(st->ec_gain_c_st),
1910a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                bfi,
1911a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                st->prev_bf,
1912a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                &gain_code,
1913a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                pOverflow);
1914a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1915a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            pit_sharp = gain_pit;
1916a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1917a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            if (pit_sharp > SHARPMAX)
1918a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
1919a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                pit_sharp = SHARPMAX;
1920a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
1921a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1922a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            if (mode == MR102)
1923a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
1924a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                if (st->old_T0 > (L_SUBFR + 5))
1925a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                {
1926a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    if (pit_sharp < 0)
1927a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    {
1928a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                        pit_sharp = ~((~pit_sharp) >> 2);
1929a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    }
1930a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    else
1931a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    {
1932a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                        pit_sharp = pit_sharp >> 2;
1933a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    }
1934a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                }
1935a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
1936a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
1937a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        else
1938a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
1939a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            /* read and decode pitch gain */
1940a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            index = *parm++;                 /* index of gain(s) */
1941a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1942a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            if (mode == MR795)
1943a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
1944a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                /* decode pitch gain */
1945a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                if (bfi != 0)
1946a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                {
1947a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    ec_gain_pitch(
1948a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                        &(st->ec_gain_p_st),
1949a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                        st->state,
1950a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                        &gain_pit,
1951a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                        pOverflow);
1952a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                }
1953a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                else
1954a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                {
1955a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    gain_pit = d_gain_pitch(mode, index);
1956a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                }
1957a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                ec_gain_pitch_update(
1958a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    &(st->ec_gain_p_st),
1959a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    bfi,
1960a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    st->prev_bf,
1961a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    &gain_pit,
1962a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    pOverflow);
1963a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1964a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                /* read and decode code gain */
1965a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                index = *parm++;
1966a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1967a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                if (bfi == 0)
1968a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                {
1969a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    d_gain_code(
1970a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                        &(st->pred_state),
1971a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                        mode,
1972a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                        index,
1973a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                        code,
1974a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                        &gain_code,
1975a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                        pOverflow);
1976a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                }
1977a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                else
1978a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                {
1979a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    ec_gain_code(
1980a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                        &(st->ec_gain_c_st),
1981a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                        &(st->pred_state),
1982a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                        st->state,
1983a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                        &gain_code,
1984a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                        pOverflow);
1985a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                }
1986a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1987a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                ec_gain_code_update(
1988a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    &(st->ec_gain_c_st),
1989a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    bfi,
1990a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    st->prev_bf,
1991a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    &gain_code,
1992a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    pOverflow);
1993a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1994a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                pit_sharp = gain_pit;
1995a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1996a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                if (pit_sharp > SHARPMAX)
1997a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                {
1998a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    pit_sharp = SHARPMAX;
1999a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                }
2000a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
2001a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            else
2002a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            { /* MR122 */
2003a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2004a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                if (bfi == 0)
2005a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                {
2006a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    d_gain_code(
2007a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                        &(st->pred_state),
2008a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                        mode,
2009a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                        index,
2010a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                        code,
2011a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                        &gain_code,
2012a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                        pOverflow);
2013a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                }
2014a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                else
2015a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                {
2016a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    ec_gain_code(
2017a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                        &(st->ec_gain_c_st),
2018a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                        &(st->pred_state),
2019a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                        st->state,
2020a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                        &gain_code,
2021a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                        pOverflow);
2022a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                }
2023a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2024a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                ec_gain_code_update(
2025a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    &(st->ec_gain_c_st),
2026a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    bfi,
2027a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    st->prev_bf,
2028a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    &gain_code,
2029a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    pOverflow);
2030a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2031a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                pit_sharp = gain_pit;
2032a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
2033a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
2034a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2035a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /* store pitch sharpening for next subframe             */
2036a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /* (for modes which use the previous pitch gain for     */
2037a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /* pitch sharpening in the search phase)                */
2038a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /* do not update sharpening in even subframes for MR475 */
2039a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if ((mode != MR475) || (evenSubfr == 0))
2040a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
2041a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            st->sharp = gain_pit;
2042a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2043a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            if (st->sharp > SHARPMAX)
2044a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
2045a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                st->sharp = SHARPMAX;
2046a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
2047a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
2048a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2049a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        pit_sharp = shl(pit_sharp, 1, pOverflow);
2050a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2051a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if (pit_sharp > 16384)
2052a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
2053a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            for (i = 0; i < L_SUBFR; i++)
2054a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
2055a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                temp = mult(st->exc[i], pit_sharp, pOverflow);
2056a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                L_temp = L_mult(temp, gain_pit, pOverflow);
2057a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2058a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                if (mode == MR122)
2059a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                {
2060a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    if (L_temp < 0)
2061a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    {
2062a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                        L_temp = ~((~L_temp) >> 1);
2063a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    }
2064a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    else
2065a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    {
2066a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                        L_temp = L_temp >> 1;
2067a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    }
2068a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                }
2069a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                *(excp + i) = pv_round(L_temp, pOverflow);
2070a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
2071a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
2072a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2073a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /*-------------------------------------------------------*
2074a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         * - Store list of LTP gains needed in the source        *
2075a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         *   characteristic detector (SCD)                       *
2076a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         *-------------------------------------------------------*/
2077a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2078a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if (bfi == 0)
2079a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
2080a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            for (i = 0; i < 8; i++)
2081a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
2082a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                st->ltpGainHistory[i] = st->ltpGainHistory[i+1];
2083a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
2084a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            st->ltpGainHistory[8] = gain_pit;
2085a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
2086a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2087a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /*-------------------------------------------------------*
2088a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        * - Limit gain_pit if in background noise and BFI       *
2089a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        *   for MR475, MR515, MR59                              *
2090a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        *-------------------------------------------------------*/
2091a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2092a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2093a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if ((st->prev_bf != 0 || bfi != 0) && st->inBackgroundNoise != 0 &&
2094a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                ((mode == MR475) || (mode == MR515) || (mode == MR59)))
2095a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
2096a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2097a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            if (gain_pit > 12288)    /* if (gain_pit > 0.75) in Q14*/
2098a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
2099a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                gain_pit = ((gain_pit - 12288) >> 1) + 12288;
2100a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                /* gain_pit = (gain_pit-0.75)/2.0 + 0.75; */
2101a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
2102a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2103a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            if (gain_pit > 14745)    /* if (gain_pit > 0.90) in Q14*/
2104a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
2105a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                gain_pit = 14745;
2106a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
2107a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
2108a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2109a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /*-------------------------------------------------------*
2110a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         *  Calculate CB mixed gain                              *
2111a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         *-------------------------------------------------------*/
2112a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        Int_lsf(
2113a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            prev_lsf,
2114a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            st->lsfState.past_lsf_q,
2115a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            i_subfr,
2116a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            lsf_i,
2117a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            pOverflow);
2118a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2119a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        gain_code_mix =
2120a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            Cb_gain_average(
2121a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                &(st->Cb_gain_averState),
2122a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                mode,
2123a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                gain_code,
2124a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                lsf_i,
2125a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                st->lsp_avg_st.lsp_meanSave,
2126a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                bfi,
2127a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                st->prev_bf,
2128a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                pdfi,
2129a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                st->prev_pdf,
2130a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                st->inBackgroundNoise,
2131a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                st->voicedHangover,
2132a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                pOverflow);
2133a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2134a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /* make sure that MR74, MR795, MR122 have original code_gain*/
2135a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if ((mode > MR67) && (mode != MR102))
2136a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            /* MR74, MR795, MR122 */
2137a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
2138a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            gain_code_mix = gain_code;
2139a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
2140a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2141a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /*-------------------------------------------------------*
2142a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         * - Find the total excitation.                          *
2143a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         * - Find synthesis speech corresponding to st->exc[].   *
2144a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         *-------------------------------------------------------*/
2145a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if (mode <= MR102) /* MR475, MR515, MR59, MR67, MR74, MR795, MR102*/
2146a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
2147a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            pitch_fac = gain_pit;
2148a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            tmp_shift = 1;
2149a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
2150a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        else       /* MR122 */
2151a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
2152a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            if (gain_pit < 0)
2153a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
2154a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                pitch_fac = ~((~gain_pit) >> 1);
2155a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
2156a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            else
2157a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
2158a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                pitch_fac = gain_pit >> 1;
2159a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
2160a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            tmp_shift = 2;
2161a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
2162a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2163a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /* copy unscaled LTP excitation to exc_enhanced (used in phase
2164a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         * dispersion below) and compute total excitation for LTP feedback
2165a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         */
2166a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        for (i = 0; i < L_SUBFR; i++)
2167a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
2168a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            exc_enhanced[i] = st->exc[i];
2169a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2170a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            /* st->exc[i] = gain_pit*st->exc[i] + gain_code*code[i]; */
2171a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            L_temp = L_mult(st->exc[i], pitch_fac, pOverflow);
2172a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            /* 12.2: Q0 * Q13 */
2173a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            /*  7.4: Q0 * Q14 */
2174a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            L_temp = L_mac(L_temp, code[i], gain_code, pOverflow);
2175a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            /* 12.2: Q12 * Q1 */
2176a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            /*  7.4: Q13 * Q1 */
2177a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            L_temp = L_shl(L_temp, tmp_shift, pOverflow);     /* Q16 */
2178a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            st->exc[i] = pv_round(L_temp, pOverflow);
2179a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
2180a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2181a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /*-------------------------------------------------------*
2182a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         * - Adaptive phase dispersion                           *
2183a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         *-------------------------------------------------------*/
2184a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        ph_disp_release(&(st->ph_disp_st)); /* free phase dispersion adaption */
2185a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2186a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2187a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if (((mode == MR475) || (mode == MR515) || (mode == MR59)) &&
2188a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                (st->voicedHangover > 3) && (st->inBackgroundNoise != 0) &&
2189a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                (bfi != 0))
2190a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
2191a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            ph_disp_lock(&(st->ph_disp_st)); /* Always Use full Phase Disp. */
2192a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }                                 /* if error in bg noise       */
2193a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2194a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /* apply phase dispersion to innovation (if enabled) and
2195a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           compute total excitation for synthesis part           */
2196a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        ph_disp(
2197a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            &(st->ph_disp_st),
2198a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            mode,
2199a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            exc_enhanced,
2200a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            gain_code_mix,
2201a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            gain_pit,
2202a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            code,
2203a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            pitch_fac,
2204a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            tmp_shift,
2205a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            pOverflow);
2206a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2207a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /*-------------------------------------------------------*
2208a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         * - The Excitation control module are active during BFI.*
2209a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         * - Conceal drops in signal energy if in bg noise.      *
2210a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         *-------------------------------------------------------*/
2211a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        L_temp = 0;
2212a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        for (i = 0; i < L_SUBFR; i++)
2213a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
2214a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            L_temp = L_mac(L_temp, *(exc_enhanced + i), *(exc_enhanced + i), pOverflow);
2215a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
2216a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2217a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /* excEnergy = sqrt(L_temp) in Q0 */
2218a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if (L_temp < 0)
2219a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
2220a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            L_temp = ~((~L_temp) >> 1);
2221a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
2222a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        else
2223a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
2224a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            L_temp = L_temp >> 1;
2225a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
2226a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2227a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        L_temp = sqrt_l_exp(L_temp, &temp, pOverflow);
2228a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /* To cope with 16-bit and scaling in ex_ctrl() */
2229a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        L_temp = L_shr(L_temp, (Word16)((temp >> 1) + 15), pOverflow);
2230a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if (L_temp < 0)
2231a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
2232a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            excEnergy = (Word16)(~((~L_temp) >> 2));
2233a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
2234a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        else
2235a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
2236a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            excEnergy = (Word16)(L_temp >> 2);
2237a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
2238a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2239a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if (((mode == MR475) || (mode == MR515) || (mode == MR59))  &&
2240a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                (st->voicedHangover > 5) && (st->inBackgroundNoise != 0) &&
2241a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                (st->state < 4) &&
2242a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                ((pdfi != 0 && st->prev_pdf != 0) || bfi != 0 || st->prev_bf != 0))
2243a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
2244a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            carefulFlag = 0;
2245a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2246a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            if (pdfi != 0 && bfi == 0)
2247a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
2248a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                carefulFlag = 1;
2249a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
2250a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2251a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            Ex_ctrl(exc_enhanced,
2252a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    excEnergy,
2253a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    st->excEnergyHist,
2254a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    st->voicedHangover,
2255a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    st->prev_bf,
2256a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    carefulFlag, pOverflow);
2257a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
2258a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2259a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if (!((st->inBackgroundNoise != 0) && (bfi != 0 || st->prev_bf != 0) &&
2260a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                (st->state < 4)))
2261a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
2262a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            /* Update energy history for all modes */
2263a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            for (i = 0; i < 8; i++)
2264a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
2265a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                st->excEnergyHist[i] = st->excEnergyHist[i+1];
2266a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
2267a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            st->excEnergyHist[8] = excEnergy;
2268a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
2269a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /*-------------------------------------------------------*
2270a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         * Excitation control module end.                        *
2271a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         *-------------------------------------------------------*/
2272a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if (pit_sharp > 16384)
2273a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
2274a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            for (i = 0; i < L_SUBFR; i++)
2275a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
2276a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                *(excp + i) = add(*(excp + i), *(exc_enhanced + i), pOverflow);
2277a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2278a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
2279a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            agc2(exc_enhanced, excp, L_SUBFR, pOverflow);
2280a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            *pOverflow = 0;
2281a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            Syn_filt(Az, excp, &synth[i_subfr], L_SUBFR,
2282a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                     st->mem_syn, 0);
2283a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
2284a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        else
2285a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
2286a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            *pOverflow = 0;
2287a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            Syn_filt(Az, exc_enhanced, &synth[i_subfr], L_SUBFR,
2288a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                     st->mem_syn, 0);
2289a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
2290a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2291a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if (*pOverflow != 0)    /* Test for overflow */
2292a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
2293a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            for (i = PIT_MAX + L_INTERPOL + L_SUBFR - 1; i >= 0; i--)
2294a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
2295a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                if (st->old_exc[i] < 0)
2296a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                {
2297a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    st->old_exc[i] = ~((~st->old_exc[i]) >> 2);
2298a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                }
2299a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                else
2300a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                {
2301a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    st->old_exc[i] = st->old_exc[i] >> 2;
2302a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                }
2303a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2304a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
2305a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2306a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            for (i = L_SUBFR - 1; i >= 0; i--)
2307a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
2308a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                if (*(exc_enhanced + i) < 0)
2309a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                {
2310a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    *(exc_enhanced + i) = ~((~(*(exc_enhanced + i))) >> 2);
2311a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                }
2312a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                else
2313a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                {
2314a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    *(exc_enhanced + i) = *(exc_enhanced + i) >> 2;
2315a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                }
2316a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
2317a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            Syn_filt(Az, exc_enhanced, &synth[i_subfr], L_SUBFR, st->mem_syn, 1);
2318a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
2319a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        else
2320a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
2321a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            Copy(&synth[i_subfr+L_SUBFR-M], st->mem_syn, M);
2322a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
2323a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2324a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /*--------------------------------------------------*
2325a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         * Update signal for next frame.                    *
2326a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         * -> shift to the left by L_SUBFR  st->exc[]       *
2327a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         *--------------------------------------------------*/
2328a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2329a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        Copy(&st->old_exc[L_SUBFR], &st->old_exc[0], PIT_MAX + L_INTERPOL);
2330a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2331a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /* interpolated LPC parameters for next subframe */
2332a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        Az += MP1;
2333a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2334a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /* store T0 for next subframe */
2335a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        st->old_T0 = T0;
2336a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
2337a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2338a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /*-------------------------------------------------------*
2339a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     * Call the Source Characteristic Detector which updates *
2340a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     * st->inBackgroundNoise and st->voicedHangover.         *
2341a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     *-------------------------------------------------------*/
2342a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2343a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    st->inBackgroundNoise =
2344a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        Bgn_scd(
2345a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            &(st->background_state),
2346a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            &(st->ltpGainHistory[0]),
2347a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            &(synth[0]),
2348a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            &(st->voicedHangover),
2349a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            pOverflow);
2350a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2351a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    dtx_dec_activity_update(
2352a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        &(st->dtxDecoderState),
2353a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        st->lsfState.past_lsf_q,
2354a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        synth,
2355a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        pOverflow);
2356a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2357a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* store bfi for next subframe */
2358a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    st->prev_bf = bfi;
2359a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    st->prev_pdf = pdfi;
2360a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2361a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /*--------------------------------------------------*
2362a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     * Calculate the LSF averages on the eight          *
2363a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     * previous frames                                  *
2364a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     *--------------------------------------------------*/
2365a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    lsp_avg(
2366a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        &(st->lsp_avg_st),
2367a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        st->lsfState.past_lsf_q,
2368a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        pOverflow);
2369a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2370a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberthe_end:
2371a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    st->dtxDecoderState.dtxGlobalState = newDTXState;
2372a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
2373a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber//    return(0);
2374a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
2375