1e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*
2e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Copyright 2003-2010, VisualOn, Inc.
3e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **
4e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Licensed under the Apache License, Version 2.0 (the "License");
5e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** you may not use this file except in compliance with the License.
6e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** You may obtain a copy of the License at
7e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **
8e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **     http://www.apache.org/licenses/LICENSE-2.0
9e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **
10e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Unless required by applicable law or agreed to in writing, software
11e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** distributed under the License is distributed on an "AS IS" BASIS,
12e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** See the License for the specific language governing permissions and
14e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** limitations under the License.
15e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard */
16e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
17e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/***********************************************************************
18e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*      File: voAMRWBEnc.c                                              *
19e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*                                                                      *
20e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*      Description: Performs the main encoder routine                  *
21e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*                   Fixed-point C simulation of AMR WB ACELP coding    *
22e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*		    algorithm with 20 msspeech frames for              *
23e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*		    wideband speech signals.                           *
24e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*                                                                      *
25e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard************************************************************************/
26e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
27e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include <stdio.h>
28e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include <stdlib.h>
29e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "typedef.h"
30e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "basic_op.h"
31e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "oper_32b.h"
32e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "math_op.h"
33e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "cnst.h"
34e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "acelp.h"
35e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "cod_main.h"
36e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "bits.h"
37e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "main.h"
38e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "voAMRWB.h"
39e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "mem_align.h"
40e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "cmnMemory.h"
41e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
4284333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber#define UNUSED(x) (void)(x)
4384333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber
44e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef __cplusplus
45e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardextern "C" {
46e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
47e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
48e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* LPC interpolation coef {0.45, 0.8, 0.96, 1.0}; in Q15 */
49e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic Word16 interpol_frac[NB_SUBFR] = {14746, 26214, 31457, 32767};
50e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
51e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* isp tables for initialization */
52e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic Word16 isp_init[M] =
53e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
54e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	32138, 30274, 27246, 23170, 18205, 12540, 6393, 0,
55e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	-6393, -12540, -18205, -23170, -27246, -30274, -32138, 1475
56e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard};
57e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
58e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic Word16 isf_init[M] =
59e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
60e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192,
61e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	9216, 10240, 11264, 12288, 13312, 14336, 15360, 3840
62e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard};
63e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
64e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* High Band encoding */
65e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic const Word16 HP_gain[16] =
66e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
67e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	3624, 4673, 5597, 6479, 7425, 8378, 9324, 10264,
68e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	11210, 12206, 13391, 14844, 16770, 19655, 24289, 32728
69e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard};
70e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
71e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Private function declaration */
72e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic Word16 synthesis(
73e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Word16 Aq[],                          /* A(z)  : quantized Az               */
74e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Word16 exc[],                         /* (i)   : excitation at 12kHz        */
75e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Word16 Q_new,                         /* (i)   : scaling performed on exc   */
76e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Word16 synth16k[],                    /* (o)   : 16kHz synthesis signal     */
77e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Coder_State * st                      /* (i/o) : State structure            */
78e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			);
79e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
80e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Codec some parameters initialization */
81e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid Reset_encoder(void *st, Word16 reset_all)
82e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
83e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 i;
84e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Coder_State *cod_state;
85e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	cod_state = (Coder_State *) st;
86e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Set_zero(cod_state->old_exc, PIT_MAX + L_INTERPOL);
87e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Set_zero(cod_state->mem_syn, M);
88e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Set_zero(cod_state->past_isfq, M);
89b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	cod_state->mem_w0 = 0;
90b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	cod_state->tilt_code = 0;
91b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	cod_state->first_frame = 1;
92e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Init_gp_clip(cod_state->gp_clip);
93b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	cod_state->L_gc_thres = 0;
94e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if (reset_all != 0)
95e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
96e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* Static vectors to zero */
97e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Set_zero(cod_state->old_speech, L_TOTAL - L_FRAME);
98e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Set_zero(cod_state->old_wsp, (PIT_MAX / OPL_DECIM));
99e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Set_zero(cod_state->mem_decim2, 3);
100e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* routines initialization */
101e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Init_Decim_12k8(cod_state->mem_decim);
102e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Init_HP50_12k8(cod_state->mem_sig_in);
103e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Init_Levinson(cod_state->mem_levinson);
104e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Init_Q_gain2(cod_state->qua_gain);
105e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Init_Hp_wsp(cod_state->hp_wsp_mem);
106e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* isp initialization */
107e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Copy(isp_init, cod_state->ispold, M);
108e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Copy(isp_init, cod_state->ispold_q, M);
109e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* variable initialization */
110b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		cod_state->mem_preemph = 0;
111b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		cod_state->mem_wsp = 0;
112b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		cod_state->Q_old = 15;
113b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		cod_state->Q_max[0] = 15;
114b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		cod_state->Q_max[1] = 15;
115b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		cod_state->old_wsp_max = 0;
116b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		cod_state->old_wsp_shift = 0;
117e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* pitch ol initialization */
118b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		cod_state->old_T0_med = 40;
119b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		cod_state->ol_gain = 0;
120b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		cod_state->ada_w = 0;
121b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		cod_state->ol_wght_flg = 0;
122e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		for (i = 0; i < 5; i++)
123e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
124b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard			cod_state->old_ol_lag[i] = 40;
125e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
126e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Set_zero(cod_state->old_hp_wsp, (L_FRAME / 2) / OPL_DECIM + (PIT_MAX / OPL_DECIM));
127e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Set_zero(cod_state->mem_syn_hf, M);
128e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Set_zero(cod_state->mem_syn_hi, M);
129e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Set_zero(cod_state->mem_syn_lo, M);
130e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Init_HP50_12k8(cod_state->mem_sig_out);
131e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Init_Filt_6k_7k(cod_state->mem_hf);
132e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Init_HP400_12k8(cod_state->mem_hp400);
133e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Copy(isf_init, cod_state->isfold, M);
134b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		cod_state->mem_deemph = 0;
135b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		cod_state->seed2 = 21845;
136e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Init_Filt_6k_7k(cod_state->mem_hf2);
137b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		cod_state->gain_alpha = 32767;
138e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		cod_state->vad_hist = 0;
139e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		wb_vad_reset(cod_state->vadSt);
140e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		dtx_enc_reset(cod_state->dtx_encSt, isf_init);
141e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
142e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return;
143e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
144e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
145e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*-----------------------------------------------------------------*
146e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*   Funtion  coder                                                *
147e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*            ~~~~~                                                *
148e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*   ->Main coder routine.                                         *
149e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*                                                                 *
150e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*-----------------------------------------------------------------*/
151e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid coder(
152e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Word16 * mode,                        /* input :  used mode                             */
153e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Word16 speech16k[],                   /* input :  320 new speech samples (at 16 kHz)    */
154e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Word16 prms[],                        /* output:  output parameters                     */
155e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Word16 * ser_size,                    /* output:  bit rate of the used mode             */
156e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		void *spe_state,                      /* i/o   :  State structure                       */
157e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Word16 allow_dtx                      /* input :  DTX ON/OFF                            */
158e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	  )
159e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
160e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* Coder states */
161e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Coder_State *st;
162e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* Speech vector */
163e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 old_speech[L_TOTAL];
164e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 *new_speech, *speech, *p_window;
165e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
166e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* Weighted speech vector */
167e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 old_wsp[L_FRAME + (PIT_MAX / OPL_DECIM)];
168e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 *wsp;
169e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
170e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* Excitation vector */
171e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 old_exc[(L_FRAME + 1) + PIT_MAX + L_INTERPOL];
172e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 *exc;
173e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
174e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* LPC coefficients */
175e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 r_h[M + 1], r_l[M + 1];         /* Autocorrelations of windowed speech  */
176e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 rc[M];                          /* Reflection coefficients.             */
177e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 Ap[M + 1];                      /* A(z) with spectral expansion         */
178e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 ispnew[M];                      /* immittance spectral pairs at 4nd sfr */
179e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 ispnew_q[M];                    /* quantized ISPs at 4nd subframe       */
180e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 isf[M];                         /* ISF (frequency domain) at 4nd sfr    */
181e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 *p_A, *p_Aq;                    /* ptr to A(z) for the 4 subframes      */
182e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 A[NB_SUBFR * (M + 1)];          /* A(z) unquantized for the 4 subframes */
183e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 Aq[NB_SUBFR * (M + 1)];         /* A(z)   quantized for the 4 subframes */
184e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
185e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* Other vectors */
186e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 xn[L_SUBFR];                    /* Target vector for pitch search     */
187e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 xn2[L_SUBFR];                   /* Target vector for codebook search  */
188e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 dn[L_SUBFR];                    /* Correlation between xn2 and h1     */
189e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 cn[L_SUBFR];                    /* Target vector in residual domain   */
190e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 h1[L_SUBFR];                    /* Impulse response vector            */
191e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 h2[L_SUBFR];                    /* Impulse response vector            */
192e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 code[L_SUBFR];                  /* Fixed codebook excitation          */
193e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 y1[L_SUBFR];                    /* Filtered adaptive excitation       */
194e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 y2[L_SUBFR];                    /* Filtered adaptive excitation       */
195e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 error[M + L_SUBFR];             /* error of quantization              */
196e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 synth[L_SUBFR];                 /* 12.8kHz synthesis vector           */
197e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 exc2[L_FRAME];                  /* excitation vector                  */
198e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 buf[L_FRAME];                   /* VAD buffer                         */
199e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
200e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* Scalars */
201e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word32 i, j, i_subfr, select, pit_flag, clip_gain, vad_flag;
202e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 codec_mode;
203e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 T_op, T_op2, T0, T0_min, T0_max, T0_frac, index;
204e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 gain_pit, gain_code, g_coeff[4], g_coeff2[4];
205e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 tmp, gain1, gain2, exp, Q_new, mu, shift, max;
206e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 voice_fac;
207e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 indice[8];
208e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word32 L_tmp, L_gain_code, L_max, L_tmp1;
209e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 code2[L_SUBFR];                         /* Fixed codebook excitation  */
210e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 stab_fac, fac, gain_code_lo;
211e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
212e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 corr_gain;
213e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 *vo_p0, *vo_p1, *vo_p2, *vo_p3;
214e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
215e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	st = (Coder_State *) spe_state;
216e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
217b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	*ser_size = nb_of_bits[*mode];
218b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	codec_mode = *mode;
219e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
220e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/*--------------------------------------------------------------------------*
221e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *          Initialize pointers to speech vector.                           *
222e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *                                                                          *
223e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *                                                                          *
224e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *                    |-------|-------|-------|-------|-------|-------|     *
225e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *                     past sp   sf1     sf2     sf3     sf4    L_NEXT      *
226e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *                    <-------  Total speech buffer (L_TOTAL)   ------>     *
227e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *              old_speech                                                  *
228e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *                    <-------  LPC analysis window (L_WINDOW)  ------>     *
229e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *                    |       <-- present frame (L_FRAME) ---->             *
230e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *                   p_window |       <----- new speech (L_FRAME) ---->     *
231e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *                            |       |                                     *
232e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *                          speech    |                                     *
233e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *                                 new_speech                               *
234e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *--------------------------------------------------------------------------*/
235e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
236e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	new_speech = old_speech + L_TOTAL - L_FRAME - L_FILT;         /* New speech     */
237e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	speech = old_speech + L_TOTAL - L_FRAME - L_NEXT;             /* Present frame  */
238b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	p_window = old_speech + L_TOTAL - L_WINDOW;
239e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
240b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	exc = old_exc + PIT_MAX + L_INTERPOL;
241b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	wsp = old_wsp + (PIT_MAX / OPL_DECIM);
242e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
243e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* copy coder memory state into working space */
244e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Copy(st->old_speech, old_speech, L_TOTAL - L_FRAME);
245e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Copy(st->old_wsp, old_wsp, PIT_MAX / OPL_DECIM);
246e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Copy(st->old_exc, old_exc, PIT_MAX + L_INTERPOL);
247e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
248e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/*---------------------------------------------------------------*
249e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 * Down sampling signal from 16kHz to 12.8kHz                    *
250e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 * -> The signal is extended by L_FILT samples (padded to zero)  *
251e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 * to avoid additional delay (L_FILT samples) in the coder.      *
252e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 * The last L_FILT samples are approximated after decimation and *
253e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 * are used (and windowed) only in autocorrelations.             *
254e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *---------------------------------------------------------------*/
255e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
256e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Decim_12k8(speech16k, L_FRAME16k, new_speech, st->mem_decim);
257e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
258e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* last L_FILT samples for autocorrelation window */
259e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Copy(st->mem_decim, code, 2 * L_FILT16k);
260e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Set_zero(error, L_FILT16k);            /* set next sample to zero */
261e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Decim_12k8(error, L_FILT16k, new_speech + L_FRAME, code);
262e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
263e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/*---------------------------------------------------------------*
264e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 * Perform 50Hz HP filtering of input signal.                    *
265e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *---------------------------------------------------------------*/
266e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
267e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	HP50_12k8(new_speech, L_FRAME, st->mem_sig_in);
268e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
269e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* last L_FILT samples for autocorrelation window */
270e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Copy(st->mem_sig_in, code, 6);
271e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	HP50_12k8(new_speech + L_FRAME, L_FILT, code);
272e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
273e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/*---------------------------------------------------------------*
274e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 * Perform fixed preemphasis through 1 - g z^-1                  *
275e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 * Scale signal to get maximum of precision in filtering         *
276e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *---------------------------------------------------------------*/
277e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
278e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	mu = PREEMPH_FAC >> 1;              /* Q15 --> Q14 */
279e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
280e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* get max of new preemphased samples (L_FRAME+L_FILT) */
281e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	L_tmp = new_speech[0] << 15;
282e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	L_tmp -= (st->mem_preemph * mu)<<1;
283e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	L_max = L_abs(L_tmp);
284e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
285e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	for (i = 1; i < L_FRAME + L_FILT; i++)
286e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
287e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		L_tmp = new_speech[i] << 15;
288e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		L_tmp -= (new_speech[i - 1] * mu)<<1;
289e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		L_tmp = L_abs(L_tmp);
290e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if(L_tmp > L_max)
291e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
292b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard			L_max = L_tmp;
293e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
294e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
295e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
296e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* get scaling factor for new and previous samples */
297e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* limit scaling to Q_MAX to keep dynamic for ringing in low signal */
298e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* limit scaling to Q_MAX also to avoid a[0]<1 in syn_filt_32 */
299e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	tmp = extract_h(L_max);
300e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if (tmp == 0)
301e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
302b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		shift = Q_MAX;
303e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	} else
304e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
305e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		shift = norm_s(tmp) - 1;
306e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if (shift < 0)
307e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
308b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard			shift = 0;
309e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
310e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if (shift > Q_MAX)
311e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
312b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard			shift = Q_MAX;
313e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
314e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
315b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	Q_new = shift;
316e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if (Q_new > st->Q_max[0])
317e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
318b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		Q_new = st->Q_max[0];
319e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
320e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if (Q_new > st->Q_max[1])
321e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
322b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		Q_new = st->Q_max[1];
323e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
324e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	exp = (Q_new - st->Q_old);
325b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	st->Q_old = Q_new;
326b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	st->Q_max[1] = st->Q_max[0];
327b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	st->Q_max[0] = shift;
328e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
329e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* preemphasis with scaling (L_FRAME+L_FILT) */
330b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	tmp = new_speech[L_FRAME - 1];
331e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
332e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	for (i = L_FRAME + L_FILT - 1; i > 0; i--)
333e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
334e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		L_tmp = new_speech[i] << 15;
335e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		L_tmp -= (new_speech[i - 1] * mu)<<1;
336e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		L_tmp = (L_tmp << Q_new);
337b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		new_speech[i] = vo_round(L_tmp);
338e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
339e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
340e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	L_tmp = new_speech[0] << 15;
341e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	L_tmp -= (st->mem_preemph * mu)<<1;
342e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	L_tmp = (L_tmp << Q_new);
343b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	new_speech[0] = vo_round(L_tmp);
344e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
345b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	st->mem_preemph = tmp;
346e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
347e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* scale previous samples and memory */
348e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
349e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Scale_sig(old_speech, L_TOTAL - L_FRAME - L_FILT, exp);
350e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Scale_sig(old_exc, PIT_MAX + L_INTERPOL, exp);
351e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Scale_sig(st->mem_syn, M, exp);
352e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Scale_sig(st->mem_decim2, 3, exp);
353e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Scale_sig(&(st->mem_wsp), 1, exp);
354e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Scale_sig(&(st->mem_w0), 1, exp);
355e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
356e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/*------------------------------------------------------------------------*
357e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *  Call VAD                                                              *
358e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *  Preemphesis scale down signal in low frequency and keep dynamic in HF.*
359e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *  Vad work slightly in futur (new_speech = speech + L_NEXT - L_FILT).   *
360e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *------------------------------------------------------------------------*/
361e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Copy(new_speech, buf, L_FRAME);
362e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
363e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef ASM_OPT        /* asm optimization branch */
364e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Scale_sig_opt(buf, L_FRAME, 1 - Q_new);
365e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
366e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Scale_sig(buf, L_FRAME, 1 - Q_new);
367e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
368e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
369b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	vad_flag = wb_vad(st->vadSt, buf);          /* Voice Activity Detection */
370e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if (vad_flag == 0)
371e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
372b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		st->vad_hist = (st->vad_hist + 1);
373e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	} else
374e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
375b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		st->vad_hist = 0;
376e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
377e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
378e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* DTX processing */
379e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if (allow_dtx != 0)
380e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
381e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* Note that mode may change here */
382e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		tx_dtx_handler(st->dtx_encSt, vad_flag, mode);
383b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		*ser_size = nb_of_bits[*mode];
384e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
385e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
386e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(*mode != MRDTX)
387e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
388e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Parm_serial(vad_flag, 1, &prms);
389e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
390e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/*------------------------------------------------------------------------*
391e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *  Perform LPC analysis                                                  *
392e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *  ~~~~~~~~~~~~~~~~~~~~                                                  *
393e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *   - autocorrelation + lag windowing                                    *
394e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *   - Levinson-durbin algorithm to find a[]                              *
395e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *   - convert a[] to isp[]                                               *
396e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *   - convert isp[] to isf[] for quantization                            *
397e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *   - quantize and code the isf[]                                        *
398e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *   - convert isf[] to isp[] for interpolation                           *
399e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *   - find the interpolated ISPs and convert to a[] for the 4 subframes  *
400e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *------------------------------------------------------------------------*/
401e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
402e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* LP analysis centered at 4nd subframe */
403e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Autocorr(p_window, M, r_h, r_l);                        /* Autocorrelations */
404e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Lag_window(r_h, r_l);                                   /* Lag windowing    */
405e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Levinson(r_h, r_l, A, rc, st->mem_levinson);            /* Levinson Durbin  */
406e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Az_isp(A, ispnew, st->ispold);                          /* From A(z) to ISP */
407e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
408e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* Find the interpolated ISPs and convert to a[] for all subframes */
409e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Int_isp(st->ispold, ispnew, interpol_frac, A);
410e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
411e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* update ispold[] for the next frame */
412e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Copy(ispnew, st->ispold, M);
413e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
414e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* Convert ISPs to frequency domain 0..6400 */
415e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Isp_isf(ispnew, isf, M);
416e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
417e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* check resonance for pitch clipping algorithm */
418e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Gp_clip_test_isf(isf, st->gp_clip);
419e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
420e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/*----------------------------------------------------------------------*
421e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *  Perform PITCH_OL analysis                                           *
422e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *  ~~~~~~~~~~~~~~~~~~~~~~~~~                                           *
423e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 * - Find the residual res[] for the whole speech frame                 *
424e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 * - Find the weighted input speech wsp[] for the whole speech frame    *
425e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 * - scale wsp[] to avoid overflow in pitch estimation                  *
426e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 * - Find open loop pitch lag for whole speech frame                    *
427e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *----------------------------------------------------------------------*/
428b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	p_A = A;
429e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)
430e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
431e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* Weighting of LPC coefficients */
432e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Weight_a(p_A, Ap, GAMMA1, M);
433e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
434e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef ASM_OPT                    /* asm optimization branch */
435e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Residu_opt(Ap, &speech[i_subfr], &wsp[i_subfr], L_SUBFR);
436e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
437e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Residu(Ap, &speech[i_subfr], &wsp[i_subfr], L_SUBFR);
438e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
439e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
440b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		p_A += (M + 1);
441e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
442e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
443e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Deemph2(wsp, TILT_FAC, L_FRAME, &(st->mem_wsp));
444e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
445e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* find maximum value on wsp[] for 12 bits scaling */
446b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	max = 0;
447e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	for (i = 0; i < L_FRAME; i++)
448e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
449e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		tmp = abs_s(wsp[i]);
450e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if(tmp > max)
451e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
452b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard			max = tmp;
453e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
454e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
455b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	tmp = st->old_wsp_max;
456e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(max > tmp)
457e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
458e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		tmp = max;                         /* tmp = max(wsp_max, old_wsp_max) */
459e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
460b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	st->old_wsp_max = max;
461e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
462e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	shift = norm_s(tmp) - 3;
463e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if (shift > 0)
464e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
465e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		shift = 0;                         /* shift = 0..-3 */
466e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
467e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* decimation of wsp[] to search pitch in LF and to reduce complexity */
468e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	LP_Decim2(wsp, L_FRAME, st->mem_decim2);
469e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
470e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* scale wsp[] in 12 bits to avoid overflow */
471e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef  ASM_OPT                  /* asm optimization branch */
472e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Scale_sig_opt(wsp, L_FRAME / OPL_DECIM, shift);
473e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
474e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Scale_sig(wsp, L_FRAME / OPL_DECIM, shift);
475e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
476e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* scale old_wsp (warning: exp must be Q_new-Q_old) */
477e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	exp = exp + (shift - st->old_wsp_shift);
478e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	st->old_wsp_shift = shift;
479e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
480e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Scale_sig(old_wsp, PIT_MAX / OPL_DECIM, exp);
481e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Scale_sig(st->old_hp_wsp, PIT_MAX / OPL_DECIM, exp);
482e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
483e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	scale_mem_Hp_wsp(st->hp_wsp_mem, exp);
484e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
485e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* Find open loop pitch lag for whole speech frame */
486e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
487e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(*ser_size == NBBITS_7k)
488e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
489e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* Find open loop pitch lag for whole speech frame */
490e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		T_op = Pitch_med_ol(wsp, st, L_FRAME / OPL_DECIM);
491e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	} else
492e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
493e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* Find open loop pitch lag for first 1/2 frame */
494e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		T_op = Pitch_med_ol(wsp, st, (L_FRAME/2) / OPL_DECIM);
495e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
496e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
497e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(st->ol_gain > 19661)       /* 0.6 in Q15 */
498e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
499b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		st->old_T0_med = Med_olag(T_op, st->old_ol_lag);
500b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		st->ada_w = 32767;
501e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	} else
502e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
503e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		st->ada_w = vo_mult(st->ada_w, 29491);
504e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
505e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
506e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(st->ada_w < 26214)
507e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		st->ol_wght_flg = 0;
508e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	else
509e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		st->ol_wght_flg = 1;
510e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
511e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	wb_vad_tone_detection(st->vadSt, st->ol_gain);
512b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	T_op *= OPL_DECIM;
513e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
514e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(*ser_size != NBBITS_7k)
515e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
516e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* Find open loop pitch lag for second 1/2 frame */
517e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		T_op2 = Pitch_med_ol(wsp + ((L_FRAME / 2) / OPL_DECIM), st, (L_FRAME/2) / OPL_DECIM);
518e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
519e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if(st->ol_gain > 19661)   /* 0.6 in Q15 */
520e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
521b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard			st->old_T0_med = Med_olag(T_op2, st->old_ol_lag);
522b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard			st->ada_w = 32767;
523e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		} else
524e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
525b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard			st->ada_w = mult(st->ada_w, 29491);
526e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
527e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
528e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if(st->ada_w < 26214)
529e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			st->ol_wght_flg = 0;
530e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		else
531e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			st->ol_wght_flg = 1;
532e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
533e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		wb_vad_tone_detection(st->vadSt, st->ol_gain);
534e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
535b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		T_op2 *= OPL_DECIM;
536e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
537e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	} else
538e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
539b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		T_op2 = T_op;
540e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
541e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/*----------------------------------------------------------------------*
542e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *                              DTX-CNG                                 *
543e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *----------------------------------------------------------------------*/
544e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(*mode == MRDTX)            /* CNG mode */
545e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
546e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* Buffer isf's and energy */
547e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef ASM_OPT                   /* asm optimization branch */
548e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Residu_opt(&A[3 * (M + 1)], speech, exc, L_FRAME);
549e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
550e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Residu(&A[3 * (M + 1)], speech, exc, L_FRAME);
551e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
552e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
553e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		for (i = 0; i < L_FRAME; i++)
554e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
555b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard			exc2[i] = shr(exc[i], Q_new);
556e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
557e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
558b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		L_tmp = 0;
559e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		for (i = 0; i < L_FRAME; i++)
560e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			L_tmp += (exc2[i] * exc2[i])<<1;
561e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
562e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		L_tmp >>= 1;
563e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
564e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		dtx_buffer(st->dtx_encSt, isf, L_tmp, codec_mode);
565e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
566e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* Quantize and code the ISFs */
567e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		dtx_enc(st->dtx_encSt, isf, exc2, &prms);
568e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
569e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* Convert ISFs to the cosine domain */
570e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Isf_isp(isf, ispnew_q, M);
571e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Isp_Az(ispnew_q, Aq, M, 0);
572e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
573e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)
574e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
575e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			corr_gain = synthesis(Aq, &exc2[i_subfr], 0, &speech16k[i_subfr * 5 / 4], st);
576e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
577e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Copy(isf, st->isfold, M);
578e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
579e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* reset speech coder memories */
580e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Reset_encoder(st, 0);
581e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
582e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/*--------------------------------------------------*
583e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 * Update signal for next frame.                    *
584e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 * -> save past of speech[] and wsp[].              *
585e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 *--------------------------------------------------*/
586e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
587e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Copy(&old_speech[L_FRAME], st->old_speech, L_TOTAL - L_FRAME);
588e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Copy(&old_wsp[L_FRAME / OPL_DECIM], st->old_wsp, PIT_MAX / OPL_DECIM);
589e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
590e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		return;
591e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
592e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/*----------------------------------------------------------------------*
593e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *                               ACELP                                  *
594e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *----------------------------------------------------------------------*/
595e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
596e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* Quantize and code the ISFs */
597e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
598e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if (*ser_size <= NBBITS_7k)
599e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
600e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Qpisf_2s_36b(isf, isf, st->past_isfq, indice, 4);
601e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
602e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Parm_serial(indice[0], 8, &prms);
603e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Parm_serial(indice[1], 8, &prms);
604e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Parm_serial(indice[2], 7, &prms);
605e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Parm_serial(indice[3], 7, &prms);
606e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Parm_serial(indice[4], 6, &prms);
607e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	} else
608e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
609e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Qpisf_2s_46b(isf, isf, st->past_isfq, indice, 4);
610e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
611e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Parm_serial(indice[0], 8, &prms);
612e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Parm_serial(indice[1], 8, &prms);
613e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Parm_serial(indice[2], 6, &prms);
614e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Parm_serial(indice[3], 7, &prms);
615e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Parm_serial(indice[4], 7, &prms);
616e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Parm_serial(indice[5], 5, &prms);
617e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Parm_serial(indice[6], 5, &prms);
618e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
619e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
620e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* Check stability on isf : distance between old isf and current isf */
621e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
622b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	L_tmp = 0;
623e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	for (i = 0; i < M - 1; i++)
624e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
625e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		tmp = vo_sub(isf[i], st->isfold[i]);
626e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		L_tmp += (tmp * tmp)<<1;
627e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
628e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
629b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	tmp = extract_h(L_shl2(L_tmp, 8));
630e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
631e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	tmp = vo_mult(tmp, 26214);                /* tmp = L_tmp*0.8/256 */
632e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	tmp = vo_sub(20480, tmp);                 /* 1.25 - tmp (in Q14) */
633e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
634b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	stab_fac = shl(tmp, 1);
635e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
636e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if (stab_fac < 0)
637e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
638b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		stab_fac = 0;
639e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
640e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Copy(isf, st->isfold, M);
641e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
642e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* Convert ISFs to the cosine domain */
643e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Isf_isp(isf, ispnew_q, M);
644e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
645e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if (st->first_frame != 0)
646e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
647b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		st->first_frame = 0;
648e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Copy(ispnew_q, st->ispold_q, M);
649e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
650e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* Find the interpolated ISPs and convert to a[] for all subframes */
651e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
652e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Int_isp(st->ispold_q, ispnew_q, interpol_frac, Aq);
653e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
654e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* update ispold[] for the next frame */
655e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Copy(ispnew_q, st->ispold_q, M);
656e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
657e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	p_Aq = Aq;
658e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)
659e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
660e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef ASM_OPT               /* asm optimization branch */
661e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Residu_opt(p_Aq, &speech[i_subfr], &exc[i_subfr], L_SUBFR);
662e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
663e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Residu(p_Aq, &speech[i_subfr], &exc[i_subfr], L_SUBFR);
664e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
665b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		p_Aq += (M + 1);
666e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
667e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
668e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* Buffer isf's and energy for dtx on non-speech frame */
669e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if (vad_flag == 0)
670e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
671e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		for (i = 0; i < L_FRAME; i++)
672e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
673e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			exc2[i] = exc[i] >> Q_new;
674e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
675b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		L_tmp = 0;
676e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		for (i = 0; i < L_FRAME; i++)
677e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			L_tmp += (exc2[i] * exc2[i])<<1;
678e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		L_tmp >>= 1;
679e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
680e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		dtx_buffer(st->dtx_encSt, isf, L_tmp, codec_mode);
681e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
682e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* range for closed loop pitch search in 1st subframe */
683e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
684e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	T0_min = T_op - 8;
685e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if (T0_min < PIT_MIN)
686e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
687b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		T0_min = PIT_MIN;
688e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
689e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	T0_max = (T0_min + 15);
690e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
691e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(T0_max > PIT_MAX)
692e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
693b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		T0_max = PIT_MAX;
694b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		T0_min = T0_max - 15;
695e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
696e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/*------------------------------------------------------------------------*
697e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *          Loop for every subframe in the analysis frame                 *
698e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *------------------------------------------------------------------------*
699e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *  To find the pitch and innovation parameters. The subframe size is     *
700e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *  L_SUBFR and the loop is repeated L_FRAME/L_SUBFR times.               *
701e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *     - compute the target signal for pitch search                       *
702e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *     - compute impulse response of weighted synthesis filter (h1[])     *
703e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *     - find the closed-loop pitch parameters                            *
704e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *     - encode the pitch dealy                                           *
705e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *     - find 2 lt prediction (with / without LP filter for lt pred)      *
706e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *     - find 2 pitch gains and choose the best lt prediction.            *
707e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *     - find target vector for codebook search                           *
708e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *     - update the impulse response h1[] for codebook search             *
709e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *     - correlation between target vector and impulse response           *
710e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *     - codebook search and encoding                                     *
711e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *     - VQ of pitch and codebook gains                                   *
712e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *     - find voicing factor and tilt of code for next subframe.          *
713e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *     - update states of weighting filter                                *
714e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *     - find excitation and synthesis speech                             *
715e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *------------------------------------------------------------------------*/
716b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	p_A = A;
717b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	p_Aq = Aq;
718e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)
719e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
720b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		pit_flag = i_subfr;
721e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if ((i_subfr == 2 * L_SUBFR) && (*ser_size > NBBITS_7k))
722e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
723b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard			pit_flag = 0;
724e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			/* range for closed loop pitch search in 3rd subframe */
725e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			T0_min = (T_op2 - 8);
726e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
727e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			if (T0_min < PIT_MIN)
728e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			{
729b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard				T0_min = PIT_MIN;
730e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			}
731e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			T0_max = (T0_min + 15);
732e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			if (T0_max > PIT_MAX)
733e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			{
734b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard				T0_max = PIT_MAX;
735e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				T0_min = (T0_max - 15);
736e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			}
737e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
738e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/*-----------------------------------------------------------------------*
739e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 *                                                                       *
740e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 *        Find the target vector for pitch search:                       *
741e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 *        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                        *
742e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 *                                                                       *
743e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 *             |------|  res[n]                                          *
744e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 * speech[n]---| A(z) |--------                                          *
745e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 *             |------|       |   |--------| error[n]  |------|          *
746e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 *                   zero -- (-)--| 1/A(z) |-----------| W(z) |-- target *
747e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 *                   exc          |--------|           |------|          *
748e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 *                                                                       *
749e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 * Instead of subtracting the zero-input response of filters from        *
750e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 * the weighted input speech, the above configuration is used to         *
751e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 * compute the target vector.                                            *
752e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 *                                                                       *
753e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 *-----------------------------------------------------------------------*/
754e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
755e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		for (i = 0; i < M; i++)
756e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
757e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			error[i] = vo_sub(speech[i + i_subfr - M], st->mem_syn[i]);
758e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
759e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
760e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef ASM_OPT              /* asm optimization branch */
761e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Residu_opt(p_Aq, &speech[i_subfr], &exc[i_subfr], L_SUBFR);
762e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
763e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Residu(p_Aq, &speech[i_subfr], &exc[i_subfr], L_SUBFR);
764e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
765e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Syn_filt(p_Aq, &exc[i_subfr], error + M, L_SUBFR, error, 0);
766e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Weight_a(p_A, Ap, GAMMA1, M);
767e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
768e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef ASM_OPT             /* asm optimization branch */
769e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Residu_opt(Ap, error + M, xn, L_SUBFR);
770e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
771e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Residu(Ap, error + M, xn, L_SUBFR);
772e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
773e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Deemph2(xn, TILT_FAC, L_SUBFR, &(st->mem_w0));
774e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
775e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/*----------------------------------------------------------------------*
776e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 * Find approx. target in residual domain "cn[]" for inovation search.  *
777e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 *----------------------------------------------------------------------*/
778e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* first half: xn[] --> cn[] */
779e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Set_zero(code, M);
780e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Copy(xn, code + M, L_SUBFR / 2);
781b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		tmp = 0;
782e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Preemph2(code + M, TILT_FAC, L_SUBFR / 2, &tmp);
783e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Weight_a(p_A, Ap, GAMMA1, M);
784e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Syn_filt(Ap,code + M, code + M, L_SUBFR / 2, code, 0);
785e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
786e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef ASM_OPT                /* asm optimization branch */
787e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Residu_opt(p_Aq,code + M, cn, L_SUBFR / 2);
788e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
789e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Residu(p_Aq,code + M, cn, L_SUBFR / 2);
790e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
791e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
792e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* second half: res[] --> cn[] (approximated and faster) */
793e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Copy(&exc[i_subfr + (L_SUBFR / 2)], cn + (L_SUBFR / 2), L_SUBFR / 2);
794e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
795e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/*---------------------------------------------------------------*
796b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		 * Compute impulse response, h1[], of weighted synthesis filter  *
797e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 *---------------------------------------------------------------*/
798e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
799e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Set_zero(error, M + L_SUBFR);
800e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Weight_a(p_A, error + M, GAMMA1, M);
801e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
802e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		vo_p0 = error+M;
803e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		vo_p3 = h1;
804e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		for (i = 0; i < L_SUBFR; i++)
805e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
806e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			L_tmp = *vo_p0 << 14;        /* x4 (Q12 to Q14) */
807e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			vo_p1 = p_Aq + 1;
808e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			vo_p2 = vo_p0-1;
809e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			for (j = 1; j <= M/4; j++)
810e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			{
811e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				L_tmp -= *vo_p1++ * *vo_p2--;
812e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				L_tmp -= *vo_p1++ * *vo_p2--;
813e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				L_tmp -= *vo_p1++ * *vo_p2--;
814e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				L_tmp -= *vo_p1++ * *vo_p2--;
815e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			}
816e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			*vo_p3++ = *vo_p0++ = vo_round((L_tmp <<4));
817e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
818e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* deemph without division by 2 -> Q14 to Q15 */
819b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		tmp = 0;
820e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Deemph2(h1, TILT_FAC, L_SUBFR, &tmp);   /* h1 in Q14 */
821e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
822e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* h2 in Q12 for codebook search */
823e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Copy(h1, h2, L_SUBFR);
824e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
825e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/*---------------------------------------------------------------*
826e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 * scale xn[] and h1[] to avoid overflow in dot_product12()      *
827e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 *---------------------------------------------------------------*/
828e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef  ASM_OPT                  /* asm optimization branch */
829e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Scale_sig_opt(h2, L_SUBFR, -2);
830e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Scale_sig_opt(xn, L_SUBFR, shift);     /* scaling of xn[] to limit dynamic at 12 bits */
831e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Scale_sig_opt(h1, L_SUBFR, 1 + shift);  /* set h1[] in Q15 with scaling for convolution */
832e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
833e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Scale_sig(h2, L_SUBFR, -2);
834e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Scale_sig(xn, L_SUBFR, shift);     /* scaling of xn[] to limit dynamic at 12 bits */
835e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Scale_sig(h1, L_SUBFR, 1 + shift);  /* set h1[] in Q15 with scaling for convolution */
836e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
837e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/*----------------------------------------------------------------------*
838e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 *                 Closed-loop fractional pitch search                  *
839e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 *----------------------------------------------------------------------*/
840e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* find closed loop fractional pitch  lag */
841e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if(*ser_size <= NBBITS_9k)
842e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
843e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			T0 = Pitch_fr4(&exc[i_subfr], xn, h1, T0_min, T0_max, &T0_frac,
844e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					pit_flag, PIT_MIN, PIT_FR1_8b, L_SUBFR);
845e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
846e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			/* encode pitch lag */
847e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			if (pit_flag == 0)             /* if 1st/3rd subframe */
848e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			{
849e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				/*--------------------------------------------------------------*
850e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				 * The pitch range for the 1st/3rd subframe is encoded with     *
851e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				 * 8 bits and is divided as follows:                            *
852e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				 *   PIT_MIN to PIT_FR1-1  resolution 1/2 (frac = 0 or 2)       *
853e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				 *   PIT_FR1 to PIT_MAX    resolution 1   (frac = 0)            *
854e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				 *--------------------------------------------------------------*/
855e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				if (T0 < PIT_FR1_8b)
856e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				{
857e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					index = ((T0 << 1) + (T0_frac >> 1) - (PIT_MIN<<1));
858e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				} else
859e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				{
860e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					index = ((T0 - PIT_FR1_8b) + ((PIT_FR1_8b - PIT_MIN)*2));
861e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				}
862e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
863e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				Parm_serial(index, 8, &prms);
864e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
865e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				/* find T0_min and T0_max for subframe 2 and 4 */
866e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				T0_min = (T0 - 8);
867e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				if (T0_min < PIT_MIN)
868e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				{
869e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					T0_min = PIT_MIN;
870e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				}
871e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				T0_max = T0_min + 15;
872e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				if (T0_max > PIT_MAX)
873e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				{
874e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					T0_max = PIT_MAX;
875e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					T0_min = (T0_max - 15);
876e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				}
877e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			} else
878e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			{                              /* if subframe 2 or 4 */
879e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				/*--------------------------------------------------------------*
880e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				 * The pitch range for subframe 2 or 4 is encoded with 5 bits:  *
881e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				 *   T0_min  to T0_max     resolution 1/2 (frac = 0 or 2)       *
882e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				 *--------------------------------------------------------------*/
883e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				i = (T0 - T0_min);
884e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				index = (i << 1) + (T0_frac >> 1);
885e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
886e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				Parm_serial(index, 5, &prms);
887e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			}
888e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		} else
889e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
890e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			T0 = Pitch_fr4(&exc[i_subfr], xn, h1, T0_min, T0_max, &T0_frac,
891e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					pit_flag, PIT_FR2, PIT_FR1_9b, L_SUBFR);
892e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
893e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			/* encode pitch lag */
894e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			if (pit_flag == 0)             /* if 1st/3rd subframe */
895e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			{
896e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				/*--------------------------------------------------------------*
897e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				 * The pitch range for the 1st/3rd subframe is encoded with     *
898e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				 * 9 bits and is divided as follows:                            *
899e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				 *   PIT_MIN to PIT_FR2-1  resolution 1/4 (frac = 0,1,2 or 3)   *
900e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				 *   PIT_FR2 to PIT_FR1-1  resolution 1/2 (frac = 0 or 1)       *
901e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				 *   PIT_FR1 to PIT_MAX    resolution 1   (frac = 0)            *
902e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				 *--------------------------------------------------------------*/
903e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
904e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				if (T0 < PIT_FR2)
905e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				{
906e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					index = ((T0 << 2) + T0_frac) - (PIT_MIN << 2);
907e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				} else if(T0 < PIT_FR1_9b)
908e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				{
909e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					index = ((((T0 << 1) + (T0_frac >> 1)) - (PIT_FR2<<1)) + ((PIT_FR2 - PIT_MIN)<<2));
910e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				} else
911e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				{
912e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					index = (((T0 - PIT_FR1_9b) + ((PIT_FR2 - PIT_MIN)<<2)) + ((PIT_FR1_9b - PIT_FR2)<<1));
913e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				}
914e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
915e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				Parm_serial(index, 9, &prms);
916e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
917e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				/* find T0_min and T0_max for subframe 2 and 4 */
918e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
919e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				T0_min = (T0 - 8);
920e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				if (T0_min < PIT_MIN)
921e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				{
922b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard					T0_min = PIT_MIN;
923e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				}
924e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				T0_max = T0_min + 15;
925e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
926e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				if (T0_max > PIT_MAX)
927e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				{
928e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					T0_max = PIT_MAX;
929e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					T0_min = (T0_max - 15);
930e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				}
931e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			} else
932e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			{                              /* if subframe 2 or 4 */
933e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				/*--------------------------------------------------------------*
934e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				 * The pitch range for subframe 2 or 4 is encoded with 6 bits:  *
935e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				 *   T0_min  to T0_max     resolution 1/4 (frac = 0,1,2 or 3)   *
936e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				 *--------------------------------------------------------------*/
937e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				i = (T0 - T0_min);
938e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				index = (i << 2) + T0_frac;
939e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				Parm_serial(index, 6, &prms);
940e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			}
941e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
942e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
943e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/*-----------------------------------------------------------------*
944e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 * Gain clipping test to avoid unstable synthesis on frame erasure *
945e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 *-----------------------------------------------------------------*/
946e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
947e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		clip_gain = 0;
948e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if((st->gp_clip[0] < 154) && (st->gp_clip[1] > 14746))
949e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			clip_gain = 1;
950e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
951e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/*-----------------------------------------------------------------*
952e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 * - find unity gain pitch excitation (adaptive codebook entry)    *
953e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 *   with fractional interpolation.                                *
954e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 * - find filtered pitch exc. y1[]=exc[] convolved with h1[])      *
955e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 * - compute pitch gain1                                           *
956e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 *-----------------------------------------------------------------*/
957e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* find pitch exitation */
958e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef ASM_OPT                  /* asm optimization branch */
959e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		pred_lt4_asm(&exc[i_subfr], T0, T0_frac, L_SUBFR + 1);
960e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
961e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Pred_lt4(&exc[i_subfr], T0, T0_frac, L_SUBFR + 1);
962e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
963e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if (*ser_size > NBBITS_9k)
964e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
965e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef ASM_OPT                   /* asm optimization branch */
966e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Convolve_asm(&exc[i_subfr], h1, y1, L_SUBFR);
967e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
968e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Convolve(&exc[i_subfr], h1, y1, L_SUBFR);
969b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard#endif
970e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			gain1 = G_pitch(xn, y1, g_coeff, L_SUBFR);
971e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			/* clip gain if necessary to avoid problem at decoder */
972e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			if ((clip_gain != 0) && (gain1 > GP_CLIP))
973e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			{
974b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard				gain1 = GP_CLIP;
975e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			}
976e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			/* find energy of new target xn2[] */
977e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Updt_tar(xn, dn, y1, gain1, L_SUBFR);       /* dn used temporary */
978e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		} else
979e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
980b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard			gain1 = 0;
981e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
982e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/*-----------------------------------------------------------------*
983e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 * - find pitch excitation filtered by 1st order LP filter.        *
984e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 * - find filtered pitch exc. y2[]=exc[] convolved with h1[])      *
985e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 * - compute pitch gain2                                           *
986e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 *-----------------------------------------------------------------*/
987e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* find pitch excitation with lp filter */
988e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		vo_p0 = exc + i_subfr-1;
989e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		vo_p1 = code;
990e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* find pitch excitation with lp filter */
991e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		for (i = 0; i < L_SUBFR/2; i++)
992e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
993e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			L_tmp = 5898 * *vo_p0++;
994e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			L_tmp1 = 5898 * *vo_p0;
995e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			L_tmp += 20972 * *vo_p0++;
996e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			L_tmp1 += 20972 * *vo_p0++;
997e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			L_tmp1 += 5898 * *vo_p0--;
998e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			L_tmp += 5898 * *vo_p0;
999e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			*vo_p1++ = (L_tmp + 0x4000)>>15;
1000e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			*vo_p1++ = (L_tmp1 + 0x4000)>>15;
1001e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
1002e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1003e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef ASM_OPT                 /* asm optimization branch */
1004e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Convolve_asm(code, h1, y2, L_SUBFR);
1005e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
1006e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Convolve(code, h1, y2, L_SUBFR);
1007b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard#endif
1008e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1009e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		gain2 = G_pitch(xn, y2, g_coeff2, L_SUBFR);
1010e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1011e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* clip gain if necessary to avoid problem at decoder */
1012e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if ((clip_gain != 0) && (gain2 > GP_CLIP))
1013e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
1014e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			gain2 = GP_CLIP;
1015e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
1016e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* find energy of new target xn2[] */
1017e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Updt_tar(xn, xn2, y2, gain2, L_SUBFR);
1018e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/*-----------------------------------------------------------------*
1019e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 * use the best prediction (minimise quadratic error).             *
1020e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 *-----------------------------------------------------------------*/
1021b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		select = 0;
1022e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if(*ser_size > NBBITS_9k)
1023e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
1024e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			L_tmp = 0L;
1025e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			vo_p0 = dn;
1026e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			vo_p1 = xn2;
1027e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			for (i = 0; i < L_SUBFR/2; i++)
1028e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			{
1029e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				L_tmp += *vo_p0 * *vo_p0;
1030e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				vo_p0++;
1031e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				L_tmp -= *vo_p1 * *vo_p1;
1032e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				vo_p1++;
1033e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				L_tmp += *vo_p0 * *vo_p0;
1034e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				vo_p0++;
1035e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				L_tmp -= *vo_p1 * *vo_p1;
1036e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				vo_p1++;
1037e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			}
1038e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1039e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			if (L_tmp <= 0)
1040e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			{
1041b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard				select = 1;
1042e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			}
1043e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Parm_serial(select, 1, &prms);
1044e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
1045e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if (select == 0)
1046e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
1047e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			/* use the lp filter for pitch excitation prediction */
1048e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			gain_pit = gain2;
1049e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Copy(code, &exc[i_subfr], L_SUBFR);
1050e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Copy(y2, y1, L_SUBFR);
1051e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Copy(g_coeff2, g_coeff, 4);
1052e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		} else
1053e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
1054e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			/* no filter used for pitch excitation prediction */
1055e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			gain_pit = gain1;
1056e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Copy(dn, xn2, L_SUBFR);        /* target vector for codebook search */
1057e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
1058e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/*-----------------------------------------------------------------*
1059e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 * - update cn[] for codebook search                               *
1060e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 *-----------------------------------------------------------------*/
1061e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Updt_tar(cn, cn, &exc[i_subfr], gain_pit, L_SUBFR);
1062e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1063e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef  ASM_OPT                           /* asm optimization branch */
1064e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Scale_sig_opt(cn, L_SUBFR, shift);     /* scaling of cn[] to limit dynamic at 12 bits */
1065e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
1066e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Scale_sig(cn, L_SUBFR, shift);     /* scaling of cn[] to limit dynamic at 12 bits */
1067e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
1068e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/*-----------------------------------------------------------------*
1069e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 * - include fixed-gain pitch contribution into impulse resp. h1[] *
1070e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 *-----------------------------------------------------------------*/
1071e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		tmp = 0;
1072e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Preemph(h2, st->tilt_code, L_SUBFR, &tmp);
1073e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1074e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if (T0_frac > 2)
1075e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			T0 = (T0 + 1);
1076e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Pit_shrp(h2, T0, PIT_SHARP, L_SUBFR);
1077e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/*-----------------------------------------------------------------*
1078e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 * - Correlation between target xn2[] and impulse response h1[]    *
1079e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 * - Innovative codebook search                                    *
1080e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 *-----------------------------------------------------------------*/
1081e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		cor_h_x(h2, xn2, dn);
1082e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if (*ser_size <= NBBITS_7k)
1083e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
1084e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			ACELP_2t64_fx(dn, cn, h2, code, y2, indice);
1085e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1086e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Parm_serial(indice[0], 12, &prms);
1087e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		} else if(*ser_size <= NBBITS_9k)
1088e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
1089e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			ACELP_4t64_fx(dn, cn, h2, code, y2, 20, *ser_size, indice);
1090e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1091e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Parm_serial(indice[0], 5, &prms);
1092e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Parm_serial(indice[1], 5, &prms);
1093e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Parm_serial(indice[2], 5, &prms);
1094e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Parm_serial(indice[3], 5, &prms);
1095e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		} else if(*ser_size <= NBBITS_12k)
1096e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
1097e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			ACELP_4t64_fx(dn, cn, h2, code, y2, 36, *ser_size, indice);
1098e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1099e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Parm_serial(indice[0], 9, &prms);
1100e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Parm_serial(indice[1], 9, &prms);
1101e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Parm_serial(indice[2], 9, &prms);
1102e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Parm_serial(indice[3], 9, &prms);
1103e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		} else if(*ser_size <= NBBITS_14k)
1104e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
1105e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			ACELP_4t64_fx(dn, cn, h2, code, y2, 44, *ser_size, indice);
1106e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1107e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Parm_serial(indice[0], 13, &prms);
1108e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Parm_serial(indice[1], 13, &prms);
1109e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Parm_serial(indice[2], 9, &prms);
1110e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Parm_serial(indice[3], 9, &prms);
1111e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		} else if(*ser_size <= NBBITS_16k)
1112e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
1113e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			ACELP_4t64_fx(dn, cn, h2, code, y2, 52, *ser_size, indice);
1114e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1115e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Parm_serial(indice[0], 13, &prms);
1116e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Parm_serial(indice[1], 13, &prms);
1117e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Parm_serial(indice[2], 13, &prms);
1118e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Parm_serial(indice[3], 13, &prms);
1119e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		} else if(*ser_size <= NBBITS_18k)
1120e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
1121e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			ACELP_4t64_fx(dn, cn, h2, code, y2, 64, *ser_size, indice);
1122e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1123e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Parm_serial(indice[0], 2, &prms);
1124e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Parm_serial(indice[1], 2, &prms);
1125e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Parm_serial(indice[2], 2, &prms);
1126e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Parm_serial(indice[3], 2, &prms);
1127e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Parm_serial(indice[4], 14, &prms);
1128e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Parm_serial(indice[5], 14, &prms);
1129e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Parm_serial(indice[6], 14, &prms);
1130e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Parm_serial(indice[7], 14, &prms);
1131e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		} else if(*ser_size <= NBBITS_20k)
1132e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
1133e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			ACELP_4t64_fx(dn, cn, h2, code, y2, 72, *ser_size, indice);
1134e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1135e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Parm_serial(indice[0], 10, &prms);
1136e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Parm_serial(indice[1], 10, &prms);
1137e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Parm_serial(indice[2], 2, &prms);
1138e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Parm_serial(indice[3], 2, &prms);
1139e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Parm_serial(indice[4], 10, &prms);
1140e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Parm_serial(indice[5], 10, &prms);
1141e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Parm_serial(indice[6], 14, &prms);
1142e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Parm_serial(indice[7], 14, &prms);
1143e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		} else
1144e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
1145e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			ACELP_4t64_fx(dn, cn, h2, code, y2, 88, *ser_size, indice);
1146e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1147e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Parm_serial(indice[0], 11, &prms);
1148e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Parm_serial(indice[1], 11, &prms);
1149e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Parm_serial(indice[2], 11, &prms);
1150e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Parm_serial(indice[3], 11, &prms);
1151e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Parm_serial(indice[4], 11, &prms);
1152e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Parm_serial(indice[5], 11, &prms);
1153e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Parm_serial(indice[6], 11, &prms);
1154e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Parm_serial(indice[7], 11, &prms);
1155e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
1156e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/*-------------------------------------------------------*
1157e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 * - Add the fixed-gain pitch contribution to code[].    *
1158e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 *-------------------------------------------------------*/
1159b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		tmp = 0;
1160e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Preemph(code, st->tilt_code, L_SUBFR, &tmp);
1161e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Pit_shrp(code, T0, PIT_SHARP, L_SUBFR);
1162e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/*----------------------------------------------------------*
1163e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 *  - Compute the fixed codebook gain                       *
1164e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 *  - quantize fixed codebook gain                          *
1165e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 *----------------------------------------------------------*/
1166e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if(*ser_size <= NBBITS_9k)
1167e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
1168e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			index = Q_gain2(xn, y1, Q_new + shift, y2, code, g_coeff, L_SUBFR, 6,
1169e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					&gain_pit, &L_gain_code, clip_gain, st->qua_gain);
1170e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Parm_serial(index, 6, &prms);
1171e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		} else
1172e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
1173e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			index = Q_gain2(xn, y1, Q_new + shift, y2, code, g_coeff, L_SUBFR, 7,
1174e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					&gain_pit, &L_gain_code, clip_gain, st->qua_gain);
1175e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Parm_serial(index, 7, &prms);
1176e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
1177e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* test quantized gain of pitch for pitch clipping algorithm */
1178e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Gp_clip_test_gain_pit(gain_pit, st->gp_clip);
1179e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1180b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		L_tmp = L_shl(L_gain_code, Q_new);
1181e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		gain_code = extract_h(L_add(L_tmp, 0x8000));
1182e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1183e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/*----------------------------------------------------------*
1184e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 * Update parameters for the next subframe.                 *
1185e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 * - tilt of code: 0.0 (unvoiced) to 0.5 (voiced)           *
1186e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 *----------------------------------------------------------*/
1187e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* find voice factor in Q15 (1=voiced, -1=unvoiced) */
1188e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Copy(&exc[i_subfr], exc2, L_SUBFR);
1189e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1190e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef ASM_OPT                           /* asm optimization branch */
1191e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Scale_sig_opt(exc2, L_SUBFR, shift);
1192e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
1193e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Scale_sig(exc2, L_SUBFR, shift);
1194e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
1195e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		voice_fac = voice_factor(exc2, shift, gain_pit, code, gain_code, L_SUBFR);
1196e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* tilt of code for next subframe: 0.5=voiced, 0=unvoiced */
1197e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		st->tilt_code = ((voice_fac >> 2) + 8192);
1198e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/*------------------------------------------------------*
1199e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 * - Update filter's memory "mem_w0" for finding the    *
1200e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 *   target vector in the next subframe.                *
1201e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 * - Find the total excitation                          *
1202e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 * - Find synthesis speech to update mem_syn[].         *
1203e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 *------------------------------------------------------*/
1204e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1205e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* y2 in Q9, gain_pit in Q14 */
1206e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		L_tmp = (gain_code * y2[L_SUBFR - 1])<<1;
1207e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		L_tmp = L_shl(L_tmp, (5 + shift));
1208e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		L_tmp = L_negate(L_tmp);
1209e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		L_tmp += (xn[L_SUBFR - 1] * 16384)<<1;
1210e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		L_tmp -= (y1[L_SUBFR - 1] * gain_pit)<<1;
1211e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		L_tmp = L_shl(L_tmp, (1 - shift));
1212e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		st->mem_w0 = extract_h(L_add(L_tmp, 0x8000));
1213e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1214e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if (*ser_size >= NBBITS_24k)
1215e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Copy(&exc[i_subfr], exc2, L_SUBFR);
1216e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1217e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		for (i = 0; i < L_SUBFR; i++)
1218e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
1219e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			/* code in Q9, gain_pit in Q14 */
1220e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			L_tmp = (gain_code * code[i])<<1;
1221e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			L_tmp = (L_tmp << 5);
1222e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			L_tmp += (exc[i + i_subfr] * gain_pit)<<1;
1223b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard			L_tmp = L_shl2(L_tmp, 1);
1224e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			exc[i + i_subfr] = extract_h(L_add(L_tmp, 0x8000));
1225e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
1226e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1227e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Syn_filt(p_Aq,&exc[i_subfr], synth, L_SUBFR, st->mem_syn, 1);
1228e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1229e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if(*ser_size >= NBBITS_24k)
1230e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
1231e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			/*------------------------------------------------------------*
1232e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			 * phase dispersion to enhance noise in low bit rate          *
1233e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			 *------------------------------------------------------------*/
1234e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			/* L_gain_code in Q16 */
1235e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			VO_L_Extract(L_gain_code, &gain_code, &gain_code_lo);
1236e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1237e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			/*------------------------------------------------------------*
1238e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			 * noise enhancer                                             *
1239e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			 * ~~~~~~~~~~~~~~                                             *
1240e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			 * - Enhance excitation on noise. (modify gain of code)       *
1241e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			 *   If signal is noisy and LPC filter is stable, move gain   *
1242e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			 *   of code 1.5 dB toward gain of code threshold.            *
1243e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			 *   This decrease by 3 dB noise energy variation.            *
1244e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			 *------------------------------------------------------------*/
1245e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			tmp = (16384 - (voice_fac >> 1));        /* 1=unvoiced, 0=voiced */
1246e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			fac = vo_mult(stab_fac, tmp);
1247b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard			L_tmp = L_gain_code;
1248e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			if(L_tmp < st->L_gc_thres)
1249e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			{
1250e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				L_tmp = vo_L_add(L_tmp, Mpy_32_16(gain_code, gain_code_lo, 6226));
1251e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				if(L_tmp > st->L_gc_thres)
1252e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				{
1253e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					L_tmp = st->L_gc_thres;
1254e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				}
1255e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			} else
1256e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			{
1257e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				L_tmp = Mpy_32_16(gain_code, gain_code_lo, 27536);
1258e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				if(L_tmp < st->L_gc_thres)
1259e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				{
1260e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard					L_tmp = st->L_gc_thres;
1261e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				}
1262e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			}
1263e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			st->L_gc_thres = L_tmp;
1264e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1265e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			L_gain_code = Mpy_32_16(gain_code, gain_code_lo, (32767 - fac));
1266e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			VO_L_Extract(L_tmp, &gain_code, &gain_code_lo);
1267e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			L_gain_code = vo_L_add(L_gain_code, Mpy_32_16(gain_code, gain_code_lo, fac));
1268e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1269e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			/*------------------------------------------------------------*
1270e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			 * pitch enhancer                                             *
1271e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			 * ~~~~~~~~~~~~~~                                             *
1272e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			 * - Enhance excitation on voice. (HP filtering of code)      *
1273e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			 *   On voiced signal, filtering of code by a smooth fir HP   *
1274e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			 *   filter to decrease energy of code in low frequency.      *
1275e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			 *------------------------------------------------------------*/
1276e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1277e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			tmp = ((voice_fac >> 3) + 4096); /* 0.25=voiced, 0=unvoiced */
1278e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1279e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			L_tmp = L_deposit_h(code[0]);
1280e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			L_tmp -= (code[1] * tmp)<<1;
1281b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard			code2[0] = vo_round(L_tmp);
1282e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1283e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			for (i = 1; i < L_SUBFR - 1; i++)
1284e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			{
1285e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				L_tmp = L_deposit_h(code[i]);
1286e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				L_tmp -= (code[i + 1] * tmp)<<1;
1287e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				L_tmp -= (code[i - 1] * tmp)<<1;
1288b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard				code2[i] = vo_round(L_tmp);
1289e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			}
1290e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1291e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			L_tmp = L_deposit_h(code[L_SUBFR - 1]);
1292e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			L_tmp -= (code[L_SUBFR - 2] * tmp)<<1;
1293b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard			code2[L_SUBFR - 1] = vo_round(L_tmp);
1294e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1295e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			/* build excitation */
1296e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			gain_code = vo_round(L_shl(L_gain_code, Q_new));
1297e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1298e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			for (i = 0; i < L_SUBFR; i++)
1299e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			{
1300e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				L_tmp = (code2[i] * gain_code)<<1;
1301e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				L_tmp = (L_tmp << 5);
1302e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				L_tmp += (exc2[i] * gain_pit)<<1;
1303e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				L_tmp = (L_tmp << 1);
1304e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				exc2[i] = vo_round(L_tmp);
1305e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			}
1306e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1307e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			corr_gain = synthesis(p_Aq, exc2, Q_new, &speech16k[i_subfr * 5 / 4], st);
1308e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			Parm_serial(corr_gain, 4, &prms);
1309e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
1310e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		p_A += (M + 1);
1311e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		p_Aq += (M + 1);
1312e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}                                      /* end of subframe loop */
1313e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1314e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/*--------------------------------------------------*
1315e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 * Update signal for next frame.                    *
1316e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 * -> save past of speech[], wsp[] and exc[].       *
1317e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *--------------------------------------------------*/
1318e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Copy(&old_speech[L_FRAME], st->old_speech, L_TOTAL - L_FRAME);
1319e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Copy(&old_wsp[L_FRAME / OPL_DECIM], st->old_wsp, PIT_MAX / OPL_DECIM);
1320e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Copy(&old_exc[L_FRAME], st->old_exc, PIT_MAX + L_INTERPOL);
1321e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return;
1322e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
1323e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1324e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*-----------------------------------------------------*
1325e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Function synthesis()                                *
1326e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*                                                     *
1327e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Synthesis of signal at 16kHz with HF extension.     *
1328e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*                                                     *
1329e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*-----------------------------------------------------*/
1330e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1331e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic Word16 synthesis(
1332e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Word16 Aq[],                          /* A(z)  : quantized Az               */
1333e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Word16 exc[],                         /* (i)   : excitation at 12kHz        */
1334e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Word16 Q_new,                         /* (i)   : scaling performed on exc   */
1335e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Word16 synth16k[],                    /* (o)   : 16kHz synthesis signal     */
1336e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Coder_State * st                      /* (i/o) : State structure            */
1337e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		)
1338e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
1339e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 fac, tmp, exp;
1340e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 ener, exp_ener;
1341e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word32 L_tmp, i;
1342e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1343e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 synth_hi[M + L_SUBFR], synth_lo[M + L_SUBFR];
1344e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 synth[L_SUBFR];
1345e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 HF[L_SUBFR16k];                 /* High Frequency vector      */
1346e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 Ap[M + 1];
1347e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1348e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 HF_SP[L_SUBFR16k];              /* High Frequency vector (from original signal) */
1349e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1350e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 HP_est_gain, HP_calc_gain, HP_corr_gain;
1351e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 dist_min, dist;
1352e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 HP_gain_ind = 0;
1353e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 gain1, gain2;
1354e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 weight1, weight2;
1355e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1356e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/*------------------------------------------------------------*
1357e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 * speech synthesis                                           *
1358e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 * ~~~~~~~~~~~~~~~~                                           *
1359e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 * - Find synthesis speech corresponding to exc2[].           *
1360e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 * - Perform fixed deemphasis and hp 50hz filtering.          *
1361e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 * - Oversampling from 12.8kHz to 16kHz.                      *
1362e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *------------------------------------------------------------*/
1363e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Copy(st->mem_syn_hi, synth_hi, M);
1364e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Copy(st->mem_syn_lo, synth_lo, M);
1365e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1366e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef ASM_OPT                 /* asm optimization branch */
1367e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Syn_filt_32_asm(Aq, M, exc, Q_new, synth_hi + M, synth_lo + M, L_SUBFR);
1368e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
1369e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Syn_filt_32(Aq, M, exc, Q_new, synth_hi + M, synth_lo + M, L_SUBFR);
1370e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
1371e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1372e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Copy(synth_hi + L_SUBFR, st->mem_syn_hi, M);
1373e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Copy(synth_lo + L_SUBFR, st->mem_syn_lo, M);
1374e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1375e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef ASM_OPT                 /* asm optimization branch */
1376e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Deemph_32_asm(synth_hi + M, synth_lo + M, synth, &(st->mem_deemph));
1377e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
1378e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Deemph_32(synth_hi + M, synth_lo + M, synth, PREEMPH_FAC, L_SUBFR, &(st->mem_deemph));
1379e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
1380e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1381e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	HP50_12k8(synth, L_SUBFR, st->mem_sig_out);
1382e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1383e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* Original speech signal as reference for high band gain quantisation */
1384e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	for (i = 0; i < L_SUBFR16k; i++)
1385e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
1386b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		HF_SP[i] = synth16k[i];
1387e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
1388e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1389e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/*------------------------------------------------------*
1390e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 * HF noise synthesis                                   *
1391e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 * ~~~~~~~~~~~~~~~~~~                                   *
1392e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 * - Generate HF noise between 5.5 and 7.5 kHz.         *
1393e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 * - Set energy of noise according to synthesis tilt.   *
1394e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *     tilt > 0.8 ==> - 14 dB (voiced)                  *
1395e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *     tilt   0.5 ==> - 6 dB  (voiced or noise)         *
1396e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *     tilt < 0.0 ==>   0 dB  (noise)                   *
1397e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *------------------------------------------------------*/
1398e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* generate white noise vector */
1399e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	for (i = 0; i < L_SUBFR16k; i++)
1400e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
1401e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		HF[i] = Random(&(st->seed2))>>3;
1402e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
1403e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* energy of excitation */
1404e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef ASM_OPT                    /* asm optimization branch */
1405e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Scale_sig_opt(exc, L_SUBFR, -3);
1406e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Q_new = Q_new - 3;
1407e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	ener = extract_h(Dot_product12_asm(exc, exc, L_SUBFR, &exp_ener));
1408e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
1409e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Scale_sig(exc, L_SUBFR, -3);
1410e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Q_new = Q_new - 3;
1411e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	ener = extract_h(Dot_product12(exc, exc, L_SUBFR, &exp_ener));
1412e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
1413e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1414e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	exp_ener = exp_ener - (Q_new + Q_new);
1415e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* set energy of white noise to energy of excitation */
1416e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef ASM_OPT              /* asm optimization branch */
1417e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	tmp = extract_h(Dot_product12_asm(HF, HF, L_SUBFR16k, &exp));
1418e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
1419e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	tmp = extract_h(Dot_product12(HF, HF, L_SUBFR16k, &exp));
1420e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
1421e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1422e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(tmp > ener)
1423e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
1424e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		tmp = (tmp >> 1);                 /* Be sure tmp < ener */
1425e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		exp = (exp + 1);
1426e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
1427e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	L_tmp = L_deposit_h(div_s(tmp, ener)); /* result is normalized */
1428e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	exp = (exp - exp_ener);
1429e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Isqrt_n(&L_tmp, &exp);
1430e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	L_tmp = L_shl(L_tmp, (exp + 1));       /* L_tmp x 2, L_tmp in Q31 */
1431e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	tmp = extract_h(L_tmp);                /* tmp = 2 x sqrt(ener_exc/ener_hf) */
1432e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1433e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	for (i = 0; i < L_SUBFR16k; i++)
1434e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
1435e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		HF[i] = vo_mult(HF[i], tmp);
1436e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
1437e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1438e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* find tilt of synthesis speech (tilt: 1=voiced, -1=unvoiced) */
1439e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	HP400_12k8(synth, L_SUBFR, st->mem_hp400);
1440e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1441e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	L_tmp = 1L;
1442e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	for (i = 0; i < L_SUBFR; i++)
1443e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		L_tmp += (synth[i] * synth[i])<<1;
1444e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1445e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	exp = norm_l(L_tmp);
1446e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	ener = extract_h(L_tmp << exp);   /* ener = r[0] */
1447e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1448e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	L_tmp = 1L;
1449e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	for (i = 1; i < L_SUBFR; i++)
1450e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		L_tmp +=(synth[i] * synth[i - 1])<<1;
1451e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1452e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	tmp = extract_h(L_tmp << exp);    /* tmp = r[1] */
1453e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1454e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if (tmp > 0)
1455e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
1456e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		fac = div_s(tmp, ener);
1457e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	} else
1458e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
1459b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		fac = 0;
1460e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
1461e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1462e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* modify energy of white noise according to synthesis tilt */
1463e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	gain1 = 32767 - fac;
1464e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	gain2 = vo_mult(gain1, 20480);
1465e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	gain2 = shl(gain2, 1);
1466e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1467e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if (st->vad_hist > 0)
1468e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
1469e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		weight1 = 0;
1470e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		weight2 = 32767;
1471e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	} else
1472e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
1473e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		weight1 = 32767;
1474e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		weight2 = 0;
1475e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
1476e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	tmp = vo_mult(weight1, gain1);
1477e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	tmp = add1(tmp, vo_mult(weight2, gain2));
1478e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1479e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if (tmp != 0)
1480e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
1481e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		tmp = (tmp + 1);
1482e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
1483e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	HP_est_gain = tmp;
1484e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1485e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(HP_est_gain < 3277)
1486e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
1487e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		HP_est_gain = 3277;                /* 0.1 in Q15 */
1488e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
1489e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* synthesis of noise: 4.8kHz..5.6kHz --> 6kHz..7kHz */
1490e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Weight_a(Aq, Ap, 19661, M);            /* fac=0.6 */
1491e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1492e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef ASM_OPT                /* asm optimization branch */
1493e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Syn_filt_asm(Ap, HF, HF, st->mem_syn_hf);
1494e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* noise High Pass filtering (1ms of delay) */
1495e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Filt_6k_7k_asm(HF, L_SUBFR16k, st->mem_hf);
1496e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* filtering of the original signal */
1497e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Filt_6k_7k_asm(HF_SP, L_SUBFR16k, st->mem_hf2);
1498e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1499e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* check the gain difference */
1500e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Scale_sig_opt(HF_SP, L_SUBFR16k, -1);
1501e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	ener = extract_h(Dot_product12_asm(HF_SP, HF_SP, L_SUBFR16k, &exp_ener));
1502e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* set energy of white noise to energy of excitation */
1503e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	tmp = extract_h(Dot_product12_asm(HF, HF, L_SUBFR16k, &exp));
1504e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
1505e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Syn_filt(Ap, HF, HF, L_SUBFR16k, st->mem_syn_hf, 1);
1506e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* noise High Pass filtering (1ms of delay) */
1507e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Filt_6k_7k(HF, L_SUBFR16k, st->mem_hf);
1508e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* filtering of the original signal */
1509e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Filt_6k_7k(HF_SP, L_SUBFR16k, st->mem_hf2);
1510e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* check the gain difference */
1511e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Scale_sig(HF_SP, L_SUBFR16k, -1);
1512e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	ener = extract_h(Dot_product12(HF_SP, HF_SP, L_SUBFR16k, &exp_ener));
1513e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* set energy of white noise to energy of excitation */
1514e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	tmp = extract_h(Dot_product12(HF, HF, L_SUBFR16k, &exp));
1515e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
1516e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1517e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if (tmp > ener)
1518e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
1519e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		tmp = (tmp >> 1);                 /* Be sure tmp < ener */
1520e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		exp = (exp + 1);
1521e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
1522e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	L_tmp = L_deposit_h(div_s(tmp, ener)); /* result is normalized */
1523e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	exp = vo_sub(exp, exp_ener);
1524e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Isqrt_n(&L_tmp, &exp);
1525e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	L_tmp = L_shl(L_tmp, exp);             /* L_tmp, L_tmp in Q31 */
1526e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	HP_calc_gain = extract_h(L_tmp);       /* tmp = sqrt(ener_input/ener_hf) */
1527e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1528e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* st->gain_alpha *= st->dtx_encSt->dtxHangoverCount/7 */
1529e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	L_tmp = (vo_L_mult(st->dtx_encSt->dtxHangoverCount, 4681) << 15);
1530e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	st->gain_alpha = vo_mult(st->gain_alpha, extract_h(L_tmp));
1531e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1532e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(st->dtx_encSt->dtxHangoverCount > 6)
1533e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		st->gain_alpha = 32767;
1534e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	HP_est_gain = HP_est_gain >> 1;     /* From Q15 to Q14 */
1535e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	HP_corr_gain = add1(vo_mult(HP_calc_gain, st->gain_alpha), vo_mult((32767 - st->gain_alpha), HP_est_gain));
1536e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1537e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* Quantise the correction gain */
1538e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	dist_min = 32767;
1539e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	for (i = 0; i < 16; i++)
1540e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
1541e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		dist = vo_mult((HP_corr_gain - HP_gain[i]), (HP_corr_gain - HP_gain[i]));
1542e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if (dist_min > dist)
1543e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
1544e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			dist_min = dist;
1545e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			HP_gain_ind = i;
1546e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
1547e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
1548e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	HP_corr_gain = HP_gain[HP_gain_ind];
1549e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* return the quantised gain index when using the highest mode, otherwise zero */
1550e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return (HP_gain_ind);
1551e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
1552e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1553e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*************************************************
1554e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*
1555b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard* Breif: Codec main function
1556e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*
1557e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard**************************************************/
1558e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1559e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardint AMR_Enc_Encode(HAMRENC hCodec)
1560e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
1561e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word32 i;
1562e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Coder_State *gData = (Coder_State*)hCodec;
1563e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 *signal;
1564e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 packed_size = 0;
1565e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 prms[NB_BITS_MAX];
1566e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 coding_mode = 0, nb_bits, allow_dtx, mode, reset_flag;
1567e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	mode = gData->mode;
1568e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	coding_mode = gData->mode;
1569e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	nb_bits = nb_of_bits[mode];
1570e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	signal = (Word16 *)gData->inputStream;
1571e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	allow_dtx = gData->allow_dtx;
1572e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1573e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* check for homing frame */
1574e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	reset_flag = encoder_homing_frame_test(signal);
1575e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1576e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	for (i = 0; i < L_FRAME16k; i++)   /* Delete the 2 LSBs (14-bit input) */
1577e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
1578e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		*(signal + i) = (Word16) (*(signal + i) & 0xfffC);
1579e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
1580e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1581e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	coder(&coding_mode, signal, prms, &nb_bits, gData, allow_dtx);
1582e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	packed_size = PackBits(prms, coding_mode, mode, gData);
1583e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if (reset_flag != 0)
1584e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
1585e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Reset_encoder(gData, 1);
1586e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
1587e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return packed_size;
1588e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
1589e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1590e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/***************************************************************************
1591e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*
1592e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*Brief: Codec API function --- Initialize the codec and return a codec handle
1593e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*
1594e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard***************************************************************************/
1595e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1596e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardVO_U32 VO_API voAMRWB_Init(VO_HANDLE * phCodec,                   /* o: the audio codec handle */
1597e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard						   VO_AUDIO_CODINGTYPE vType,             /* i: Codec Type ID */
1598e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard						   VO_CODEC_INIT_USERDATA * pUserData     /* i: init Parameters */
1599e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard						   )
1600e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
1601e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Coder_State *st;
1602e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	FrameStream *stream;
1603e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef USE_DEAULT_MEM
1604e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VO_MEM_OPERATOR voMemoprator;
1605e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
1606e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VO_MEM_OPERATOR *pMemOP;
160784333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber        UNUSED(vType);
160884333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber
1609e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	int interMem = 0;
1610e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1611e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(pUserData == NULL || pUserData->memflag != VO_IMF_USERMEMOPERATOR || pUserData->memData == NULL )
1612e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
1613e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef USE_DEAULT_MEM
1614e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		voMemoprator.Alloc = cmnMemAlloc;
1615e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		voMemoprator.Copy = cmnMemCopy;
1616e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		voMemoprator.Free = cmnMemFree;
1617e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		voMemoprator.Set = cmnMemSet;
1618e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		voMemoprator.Check = cmnMemCheck;
1619e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		interMem = 1;
1620e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		pMemOP = &voMemoprator;
1621e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
1622e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		*phCodec = NULL;
1623e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		return VO_ERR_INVALID_ARG;
1624e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
1625e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
1626e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	else
1627e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
1628e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		pMemOP = (VO_MEM_OPERATOR *)pUserData->memData;
1629b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	}
1630e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/*-------------------------------------------------------------------------*
1631e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 * Memory allocation for coder state.                                      *
1632e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *-------------------------------------------------------------------------*/
1633e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if ((st = (Coder_State *)mem_malloc(pMemOP, sizeof(Coder_State), 32, VO_INDEX_ENC_AMRWB)) == NULL)
1634e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
1635e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		return VO_ERR_OUTOF_MEMORY;
1636e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
1637e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1638b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	st->vadSt = NULL;
1639b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	st->dtx_encSt = NULL;
1640e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	st->sid_update_counter = 3;
1641e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	st->sid_handover_debt = 0;
1642e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	st->prev_ft = TX_SPEECH;
1643e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	st->inputStream = NULL;
1644e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	st->inputSize = 0;
1645e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1646e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* Default setting */
1647e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	st->mode = VOAMRWB_MD2385;                        /* bit rate 23.85kbps */
1648e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	st->frameType = VOAMRWB_RFC3267;                  /* frame type: RFC3267 */
1649e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	st->allow_dtx = 0;                                /* disable DTX mode */
1650e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1651e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	st->outputStream = NULL;
1652e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	st->outputSize = 0;
1653e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1654e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	st->stream = (FrameStream *)mem_malloc(pMemOP, sizeof(FrameStream), 32, VO_INDEX_ENC_AMRWB);
1655e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(st->stream == NULL)
1656e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		return VO_ERR_OUTOF_MEMORY;
1657e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1658e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	st->stream->frame_ptr = (unsigned char *)mem_malloc(pMemOP, Frame_Maxsize, 32, VO_INDEX_ENC_AMRWB);
1659e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(st->stream->frame_ptr == NULL)
1660e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		return  VO_ERR_OUTOF_MEMORY;
1661e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1662e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	stream = st->stream;
1663e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	voAWB_InitFrameBuffer(stream);
1664e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1665e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	wb_vad_init(&(st->vadSt), pMemOP);
1666e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	dtx_enc_init(&(st->dtx_encSt), isf_init, pMemOP);
1667e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1668e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Reset_encoder((void *) st, 1);
1669e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1670e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(interMem)
1671e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
1672e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		st->voMemoprator.Alloc = cmnMemAlloc;
1673e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		st->voMemoprator.Copy = cmnMemCopy;
1674e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		st->voMemoprator.Free = cmnMemFree;
1675e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		st->voMemoprator.Set = cmnMemSet;
1676e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		st->voMemoprator.Check = cmnMemCheck;
1677e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		pMemOP = &st->voMemoprator;
1678e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
1679e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1680e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	st->pvoMemop = pMemOP;
1681e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1682e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	*phCodec = (void *) st;
1683e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1684e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return VO_ERR_NONE;
1685e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
1686e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1687e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/**********************************************************************************
1688e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*
1689e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Brief: Codec API function: Input PCM data
1690e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*
1691e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard***********************************************************************************/
1692e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1693e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardVO_U32 VO_API voAMRWB_SetInputData(
1694e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		VO_HANDLE hCodec,                   /* i/o: The codec handle which was created by Init function */
1695e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		VO_CODECBUFFER * pInput             /*   i: The input buffer parameter  */
1696e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		)
1697e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
1698e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Coder_State  *gData;
1699e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	FrameStream  *stream;
1700e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1701e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(NULL == hCodec)
1702e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
1703e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		return VO_ERR_INVALID_ARG;
1704e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
1705e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1706e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	gData = (Coder_State *)hCodec;
1707e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	stream = gData->stream;
1708e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1709c4ef4bb50d1407aec63358d4c14d1007ae0c4c1dMartin Storsjo	if(NULL == pInput || NULL == pInput->Buffer)
1710e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
1711e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		return VO_ERR_INVALID_ARG;
1712e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
1713e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1714e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	stream->set_ptr    = pInput->Buffer;
1715e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	stream->set_len    = pInput->Length;
1716e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	stream->frame_ptr  = stream->frame_ptr_bk;
1717e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	stream->used_len   = 0;
1718e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1719e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return VO_ERR_NONE;
1720e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
1721e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1722e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/**************************************************************************************
1723e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*
1724e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Brief: Codec API function: Get the compression audio data frame by frame
1725e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*
1726e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard***************************************************************************************/
1727e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1728e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardVO_U32 VO_API voAMRWB_GetOutputData(
1729e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		VO_HANDLE hCodec,                    /* i: The Codec Handle which was created by Init function*/
1730e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		VO_CODECBUFFER * pOutput,            /* o: The output audio data */
1731e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		VO_AUDIO_OUTPUTINFO * pAudioFormat   /* o: The encoder module filled audio format and used the input size*/
1732e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		)
1733e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
1734e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Coder_State* gData = (Coder_State*)hCodec;
1735e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VO_MEM_OPERATOR  *pMemOP;
1736e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	FrameStream  *stream = (FrameStream *)gData->stream;
1737e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	pMemOP = (VO_MEM_OPERATOR  *)gData->pvoMemop;
1738e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1739e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(stream->framebuffer_len  < Frame_MaxByte)         /* check the work buffer len */
1740e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
1741e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		stream->frame_storelen = stream->framebuffer_len;
1742e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if(stream->frame_storelen)
1743e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
1744e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			pMemOP->Copy(VO_INDEX_ENC_AMRWB, stream->frame_ptr_bk , stream->frame_ptr , stream->frame_storelen);
1745e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
1746e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if(stream->set_len > 0)
1747e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
1748e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			voAWB_UpdateFrameBuffer(stream, pMemOP);
1749e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
1750e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if(stream->framebuffer_len < Frame_MaxByte)
1751e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
1752e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			if(pAudioFormat)
1753e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				pAudioFormat->InputUsed = stream->used_len;
1754e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			return VO_ERR_INPUT_BUFFER_SMALL;
1755e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
1756e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
1757e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1758e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	gData->inputStream = stream->frame_ptr;
1759e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	gData->outputStream = (unsigned short*)pOutput->Buffer;
1760e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1761e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	gData->outputSize = AMR_Enc_Encode(gData);         /* encoder main function */
1762e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1763e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	pOutput->Length = gData->outputSize;               /* get the output buffer length */
1764e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	stream->frame_ptr += 640;                          /* update the work buffer ptr */
1765e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	stream->framebuffer_len  -= 640;
1766e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1767e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(pAudioFormat)                                   /* return output audio information */
1768e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
1769e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		pAudioFormat->Format.Channels = 1;
1770e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		pAudioFormat->Format.SampleRate = 8000;
1771b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		pAudioFormat->Format.SampleBits = 16;
1772e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		pAudioFormat->InputUsed = stream->used_len;
1773e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
1774e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return VO_ERR_NONE;
1775e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
1776e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1777e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*************************************************************************
1778e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*
1779e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Brief: Codec API function---set the data by specified parameter ID
1780e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*
1781e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*************************************************************************/
1782e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1783e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1784e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardVO_U32 VO_API voAMRWB_SetParam(
1785e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		VO_HANDLE hCodec,   /* i/o: The Codec Handle which was created by Init function */
1786e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		VO_S32 uParamID,    /*   i: The param ID */
1787e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		VO_PTR pData        /*   i: The param value depend on the ID */
1788e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		)
1789e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
1790e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Coder_State* gData = (Coder_State*)hCodec;
1791e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	FrameStream *stream = (FrameStream *)(gData->stream);
1792e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	int *lValue = (int*)pData;
1793e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1794e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	switch(uParamID)
1795e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
1796e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* setting AMR-WB frame type*/
1797e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		case VO_PID_AMRWB_FRAMETYPE:
1798e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			if(*lValue < VOAMRWB_DEFAULT || *lValue > VOAMRWB_RFC3267)
1799b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard				return VO_ERR_WRONG_PARAM_ID;
1800e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			gData->frameType = *lValue;
1801e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			break;
1802e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* setting AMR-WB bit rate */
1803e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		case VO_PID_AMRWB_MODE:
1804e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			{
1805e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				if(*lValue < VOAMRWB_MD66 || *lValue > VOAMRWB_MD2385)
1806b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard					return VO_ERR_WRONG_PARAM_ID;
1807e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				gData->mode = *lValue;
1808e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			}
1809e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			break;
1810e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* enable or disable DTX mode */
1811e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		case VO_PID_AMRWB_DTX:
1812e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			gData->allow_dtx = (Word16)(*lValue);
1813e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			break;
1814e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1815e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		case VO_PID_COMMON_HEADDATA:
1816e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			break;
1817e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        /* flush the work buffer */
1818e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		case VO_PID_COMMON_FLUSH:
1819e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			stream->set_ptr = NULL;
1820e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			stream->frame_storelen = 0;
1821e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			stream->framebuffer_len = 0;
1822e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			stream->set_len = 0;
1823e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			break;
1824e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1825e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		default:
1826e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			return VO_ERR_WRONG_PARAM_ID;
1827e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
1828e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return VO_ERR_NONE;
1829e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
1830e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1831e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/**************************************************************************
1832e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*
1833e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*Brief: Codec API function---Get the data by specified parameter ID
1834e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*
1835e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard***************************************************************************/
1836e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1837e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardVO_U32 VO_API voAMRWB_GetParam(
1838e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		VO_HANDLE hCodec,      /* i: The Codec Handle which was created by Init function */
1839e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		VO_S32 uParamID,       /* i: The param ID */
1840e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		VO_PTR pData           /* o: The param value depend on the ID */
1841e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		)
1842e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
1843e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	int    temp;
1844e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Coder_State* gData = (Coder_State*)hCodec;
1845e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1846b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	if (gData==NULL)
1847e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		return VO_ERR_INVALID_ARG;
1848e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	switch(uParamID)
1849e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
1850e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* output audio format */
1851e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		case VO_PID_AMRWB_FORMAT:
1852e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			{
1853e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				VO_AUDIO_FORMAT* fmt = (VO_AUDIO_FORMAT*)pData;
1854e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				fmt->Channels   = 1;
1855e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				fmt->SampleRate = 16000;
1856e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				fmt->SampleBits = 16;
1857e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				break;
1858e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			}
1859e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        /* output audio channel number */
1860e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		case VO_PID_AMRWB_CHANNELS:
1861e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			temp = 1;
1862e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			pData = (void *)(&temp);
1863e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			break;
1864e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard        /* output audio sample rate */
1865e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		case VO_PID_AMRWB_SAMPLERATE:
1866e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			temp = 16000;
1867e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			pData = (void *)(&temp);
1868e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			break;
1869e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* output audio frame type */
1870e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		case VO_PID_AMRWB_FRAMETYPE:
1871e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			temp = gData->frameType;
1872e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			pData = (void *)(&temp);
1873e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			break;
1874e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* output audio bit rate */
1875e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		case VO_PID_AMRWB_MODE:
1876e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			temp = gData->mode;
1877e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			pData = (void *)(&temp);
1878e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			break;
1879e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		default:
1880e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			return VO_ERR_WRONG_PARAM_ID;
1881e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
1882e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1883e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return VO_ERR_NONE;
1884e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
1885e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1886e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/***********************************************************************************
1887e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*
1888e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Brief: Codec API function---Release the codec after all encoder operations are done
1889e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*
1890e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*************************************************************************************/
1891e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1892e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardVO_U32 VO_API voAMRWB_Uninit(VO_HANDLE hCodec           /* i/o: Codec handle pointer */
1893e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard							 )
1894e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
1895e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Coder_State* gData = (Coder_State*)hCodec;
1896e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VO_MEM_OPERATOR *pMemOP;
1897e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	pMemOP = gData->pvoMemop;
1898e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1899e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(hCodec)
1900e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
1901e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if(gData->stream)
1902e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
1903e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			if(gData->stream->frame_ptr_bk)
1904e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			{
1905e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				mem_free(pMemOP, gData->stream->frame_ptr_bk, VO_INDEX_ENC_AMRWB);
1906e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				gData->stream->frame_ptr_bk = NULL;
1907e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			}
1908e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			mem_free(pMemOP, gData->stream, VO_INDEX_ENC_AMRWB);
1909e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			gData->stream = NULL;
1910e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
1911e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		wb_vad_exit(&(((Coder_State *) gData)->vadSt), pMemOP);
1912e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		dtx_enc_exit(&(((Coder_State *) gData)->dtx_encSt), pMemOP);
1913e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1914e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		mem_free(pMemOP, hCodec, VO_INDEX_ENC_AMRWB);
1915e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		hCodec = NULL;
1916e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
1917e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1918e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return VO_ERR_NONE;
1919e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
1920e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1921e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/********************************************************************************
1922e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*
1923e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Brief: voGetAMRWBEncAPI gets the API handle of the codec
1924e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*
1925e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard********************************************************************************/
1926e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1927e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardVO_S32 VO_API voGetAMRWBEncAPI(
1928e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard							   VO_AUDIO_CODECAPI * pEncHandle      /* i/o: Codec handle pointer */
1929e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard							   )
1930e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
1931e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(NULL == pEncHandle)
1932e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		return VO_ERR_INVALID_ARG;
1933e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	pEncHandle->Init = voAMRWB_Init;
1934e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	pEncHandle->SetInputData = voAMRWB_SetInputData;
1935e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	pEncHandle->GetOutputData = voAMRWB_GetOutputData;
1936e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	pEncHandle->SetParam = voAMRWB_SetParam;
1937e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	pEncHandle->GetParam = voAMRWB_GetParam;
1938e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	pEncHandle->Uninit = voAMRWB_Uninit;
1939e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1940e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return VO_ERR_NONE;
1941e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
1942e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1943e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef __cplusplus
1944e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
1945e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
1946