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