q_gain_p.cpp revision b841f14f8e51f2365945281fbfa54ef6a1b1b5a6
17de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok/* ------------------------------------------------------------------ 27de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok * Copyright (C) 1998-2009 PacketVideo 37de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok * 47de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok * Licensed under the Apache License, Version 2.0 (the "License"); 57de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok * you may not use this file except in compliance with the License. 67de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok * You may obtain a copy of the License at 77de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok * 87de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok * http://www.apache.org/licenses/LICENSE-2.0 97de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok * 107de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok * Unless required by applicable law or agreed to in writing, software 117de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok * distributed under the License is distributed on an "AS IS" BASIS, 120434289c45bc18f81f26d66e6bcbf8facf128665Jaekyun Seok * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 13d5566c6c47faa6b9dda282741e25ac78c9487d58Todd Lee * express or implied. 147de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok * See the License for the specific language governing permissions 157de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok * and limitations under the License. 167de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok * ------------------------------------------------------------------- 177de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok */ 187de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok/**************************************************************************************** 197de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun SeokPortions of this file are derived from the following 3GPP standard: 207de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok 217de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok 3GPP TS 26.073 227de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec 237de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok Available from http://www.3gpp.org 247de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok 257de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC) 267de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun SeokPermission to distribute, modify and use this file under the standard license 277de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seokterms listed above has been obtained from the copyright holder. 287de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok****************************************************************************************/ 297de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok/* 307de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok------------------------------------------------------------------------------ 317de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok 327de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok 337de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok 347de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok Pathname: ./audio/gsm-amr/c/src/q_gain_p.c 357de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok Functions: q_gain_pitch 367de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok 377de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok Date: 02/04/2002 387de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok 397de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok------------------------------------------------------------------------------ 407de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok REVISION HISTORY 417de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok 427de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok Description: Updated template used to PV coding template. 437de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok Changed to accept the pOverflow flag for EPOC compatibility. 447de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok 457de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok Description: Replaced "int" and/or "char" with OSCL defined types. 467de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok 477de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok Description: Added #ifdef __cplusplus around extern'ed table. 487de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok 497de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok Description: 507de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok 517de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok------------------------------------------------------------------------------ 527de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok MODULE DESCRIPTION 537de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok 547de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok 557de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok------------------------------------------------------------------------------ 567de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok*/ 577de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok 587de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok/*---------------------------------------------------------------------------- 597de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok; INCLUDES 607de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok----------------------------------------------------------------------------*/ 617de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok#include "q_gain_p.h" 627de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok#include "typedef.h" 637de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok#include "oper_32b.h" 647de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok#include "cnst.h" 657de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok#include "basic_op.h" 667de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok 677de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok 687de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok/*--------------------------------------------------------------------------*/ 697de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok#ifdef __cplusplus 707de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seokextern "C" 717de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok{ 727de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok#endif 737de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok 747de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok /*---------------------------------------------------------------------------- 757de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok ; MACROS 767de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok ; Define module specific macros here 777de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok ----------------------------------------------------------------------------*/ 787de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok 797de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok /*---------------------------------------------------------------------------- 807de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok ; DEFINES 817de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok ; Include all pre-processor statements here. Include conditional 827de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok ; compile variables also. 837de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok ----------------------------------------------------------------------------*/ 847de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok#define NB_QUA_PITCH 16 857de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok 86d5566c6c47faa6b9dda282741e25ac78c9487d58Todd Lee /*---------------------------------------------------------------------------- 87d5566c6c47faa6b9dda282741e25ac78c9487d58Todd Lee ; LOCAL FUNCTION DEFINITIONS 88d5566c6c47faa6b9dda282741e25ac78c9487d58Todd Lee ; Function Prototype declaration 89d5566c6c47faa6b9dda282741e25ac78c9487d58Todd Lee ----------------------------------------------------------------------------*/ 90d5566c6c47faa6b9dda282741e25ac78c9487d58Todd Lee 91d5566c6c47faa6b9dda282741e25ac78c9487d58Todd Lee /*---------------------------------------------------------------------------- 92d5566c6c47faa6b9dda282741e25ac78c9487d58Todd Lee ; LOCAL VARIABLE DEFINITIONS 93d5566c6c47faa6b9dda282741e25ac78c9487d58Todd Lee ; Variable declaration - defined here and used outside this module 94d5566c6c47faa6b9dda282741e25ac78c9487d58Todd Lee ----------------------------------------------------------------------------*/ 95d5566c6c47faa6b9dda282741e25ac78c9487d58Todd Lee 96d5566c6c47faa6b9dda282741e25ac78c9487d58Todd Lee /*---------------------------------------------------------------------------- 97d5566c6c47faa6b9dda282741e25ac78c9487d58Todd Lee ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES 980434289c45bc18f81f26d66e6bcbf8facf128665Jaekyun Seok ; Declare variables used in this module but defined elsewhere 990434289c45bc18f81f26d66e6bcbf8facf128665Jaekyun Seok ----------------------------------------------------------------------------*/ 1007de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok extern const Word16 qua_gain_pitch[NB_QUA_PITCH]; 1017de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok 1027de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok /*--------------------------------------------------------------------------*/ 1037de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok#ifdef __cplusplus 104d5566c6c47faa6b9dda282741e25ac78c9487d58Todd Lee} 105d5566c6c47faa6b9dda282741e25ac78c9487d58Todd Lee#endif 1067de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok 1077de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok/* 1087de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok------------------------------------------------------------------------------ 1097de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok FUNCTION NAME: q_gain_pitch 1107de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok------------------------------------------------------------------------------ 1117de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok INPUT AND OUTPUT DEFINITIONS 1127de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok 1137de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok Inputs: 1147de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok mode -- enum Mode -- AMR mode 1157de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok gp_limit -- Word16 -- pitch gain limit 1167de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok gain -- Pointer to Word16 -- Pitch gain (unquant/quant), Q14 1177de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok 1187de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok Outputs: 1197de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok gain -- Pointer to Word16 -- Pitch gain (unquant/quant), Q14 1207de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok 1217de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok gain_cand -- Array of type Word16 -- pitch gain candidates (3), 1220434289c45bc18f81f26d66e6bcbf8facf128665Jaekyun Seok MR795 only, Q14 1230434289c45bc18f81f26d66e6bcbf8facf128665Jaekyun Seok 1240434289c45bc18f81f26d66e6bcbf8facf128665Jaekyun Seok gain_cind -- Array of type Word16 -- pitch gain cand. indices (3), 1250434289c45bc18f81f26d66e6bcbf8facf128665Jaekyun Seok MR795 only, Q0 1260434289c45bc18f81f26d66e6bcbf8facf128665Jaekyun Seok 127d5566c6c47faa6b9dda282741e25ac78c9487d58Todd Lee pOverflow -- Pointer to Flag -- overflow indicator 1280434289c45bc18f81f26d66e6bcbf8facf128665Jaekyun Seok 1290434289c45bc18f81f26d66e6bcbf8facf128665Jaekyun Seok Returns: 130d5566c6c47faa6b9dda282741e25ac78c9487d58Todd Lee Word16 -- index of quantization 131d5566c6c47faa6b9dda282741e25ac78c9487d58Todd Lee 132d5566c6c47faa6b9dda282741e25ac78c9487d58Todd Lee Global Variables Used: 133d5566c6c47faa6b9dda282741e25ac78c9487d58Todd Lee qua_gain_pitch 134d5566c6c47faa6b9dda282741e25ac78c9487d58Todd Lee 135d5566c6c47faa6b9dda282741e25ac78c9487d58Todd Lee Local Variables Needed: 1360434289c45bc18f81f26d66e6bcbf8facf128665Jaekyun Seok None 1370434289c45bc18f81f26d66e6bcbf8facf128665Jaekyun Seok 1380434289c45bc18f81f26d66e6bcbf8facf128665Jaekyun Seok------------------------------------------------------------------------------ 1390434289c45bc18f81f26d66e6bcbf8facf128665Jaekyun Seok FUNCTION DESCRIPTION 140d5566c6c47faa6b9dda282741e25ac78c9487d58Todd Lee 141d5566c6c47faa6b9dda282741e25ac78c9487d58Todd Lee 142d5566c6c47faa6b9dda282741e25ac78c9487d58Todd Lee------------------------------------------------------------------------------ 143d5566c6c47faa6b9dda282741e25ac78c9487d58Todd Lee REQUIREMENTS 144d5566c6c47faa6b9dda282741e25ac78c9487d58Todd Lee 145d5566c6c47faa6b9dda282741e25ac78c9487d58Todd Lee None 146d5566c6c47faa6b9dda282741e25ac78c9487d58Todd Lee 147d5566c6c47faa6b9dda282741e25ac78c9487d58Todd Lee------------------------------------------------------------------------------ 148d5566c6c47faa6b9dda282741e25ac78c9487d58Todd Lee REFERENCES 149d5566c6c47faa6b9dda282741e25ac78c9487d58Todd Lee 150d5566c6c47faa6b9dda282741e25ac78c9487d58Todd Lee q_gain_p.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 151d5566c6c47faa6b9dda282741e25ac78c9487d58Todd Lee 152d5566c6c47faa6b9dda282741e25ac78c9487d58Todd Lee------------------------------------------------------------------------------ 1530434289c45bc18f81f26d66e6bcbf8facf128665Jaekyun Seok PSEUDO-CODE 1540434289c45bc18f81f26d66e6bcbf8facf128665Jaekyun Seok 1557de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok 1567de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok------------------------------------------------------------------------------ 1577de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok RESOURCES USED [optional] 1587de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok 1597de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok When the code is written for a specific target processor the 1607de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok the resources used should be documented below. 1617de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok 1627de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok HEAP MEMORY USED: x bytes 1637de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok 1647de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok STACK MEMORY USED: x bytes 1650434289c45bc18f81f26d66e6bcbf8facf128665Jaekyun Seok 1660434289c45bc18f81f26d66e6bcbf8facf128665Jaekyun Seok CLOCK CYCLES: (cycle count equation for this function) + (variable 1677de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok used to represent cycle count for each subroutine 1687de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok called) 1697de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok where: (cycle count variable) = cycle count for [subroutine 1707de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok name] 1717de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok 172d5566c6c47faa6b9dda282741e25ac78c9487d58Todd Lee------------------------------------------------------------------------------ 1730434289c45bc18f81f26d66e6bcbf8facf128665Jaekyun Seok CAUTION [optional] 1740434289c45bc18f81f26d66e6bcbf8facf128665Jaekyun Seok [State any special notes, constraints or cautions for users of this function] 1757de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok 1767de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok------------------------------------------------------------------------------ 1777de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok*/ 1787de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok 179d5566c6c47faa6b9dda282741e25ac78c9487d58Todd LeeWord16 q_gain_pitch( /* Return index of quantization */ 1800434289c45bc18f81f26d66e6bcbf8facf128665Jaekyun Seok enum Mode mode, /* i : AMR mode */ 1810434289c45bc18f81f26d66e6bcbf8facf128665Jaekyun Seok Word16 gp_limit, /* i : pitch gain limit */ 1827de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok Word16 *gain, /* i/o: Pitch gain (unquant/quant), Q14 */ 1837de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok Word16 gain_cand[], /* o : pitch gain candidates (3), MR795 only, Q14 */ 1847de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok Word16 gain_cind[], /* o : pitch gain cand. indices (3),MR795 only, Q0 */ 1857de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok Flag *pOverflow 1867de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok) 1877de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok{ 1887de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok Word16 i; 1897de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok Word16 index; 1907de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok Word16 err; 1917de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok Word16 err_min; 1927de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok 1937de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok err_min = sub(*gain, qua_gain_pitch[0], pOverflow); 1947de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok err_min = abs_s(err_min); 1957de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok 1967de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok index = 0; 1977de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok 1987de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok for (i = 1; i < NB_QUA_PITCH; i++) 1997de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok { 2007de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok if (qua_gain_pitch[i] <= gp_limit) 2017de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok { 2027de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok err = sub(*gain, qua_gain_pitch[i], pOverflow); 2037de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok err = abs_s(err); 2047de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok 2057de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok if (err < err_min) 2067de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok { 2077de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok err_min = err; 2087de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok index = i; 2097de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok } 2107de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok } 2117de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok } 2127de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok 2137de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok if (mode == MR795) 2147de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok { 2157de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok /* in MR795 mode, compute three gain_pit candidates around the index 2167de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok * found in the quantization loop: the index found and the two direct 2177de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok * neighbours, except for the extreme cases (i=0 or i=NB_QUA_PITCH-1), 2187de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok * where the direct neighbour and the neighbour to that is used. 2197de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok */ 2207de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok Word16 ii; 2217de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok 2227de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok if (index == 0) 2237de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok { 2247de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok ii = index; 2257de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok } 2267de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok else 2277de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok { 2287de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok if (index == (NB_QUA_PITCH - 1) || 2297de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok (qua_gain_pitch[index+1] > gp_limit)) 2307de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok { 2317de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok ii = index - 2; 2327de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok } 2337de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok else 2347de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok { 2357de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok ii = index - 1; 2367de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok } 2377de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok } 2387de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok 2397de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok /* store candidate indices and values */ 2407de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok for (i = 0; i < 3; i++) 2417de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok { 2427de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok gain_cind[i] = ii; 2437de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok gain_cand[i] = qua_gain_pitch[ii]; 2447de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok 2457de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok ii = add(ii, 1, pOverflow); 2467de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok } 2477de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok 2487de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok *gain = qua_gain_pitch[index]; 2497de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok } 2507de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok else 2517de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok { 2527de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok /* in MR122 mode, just return the index and gain pitch found. 2537de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok * If bitexactness is required, mask away the two LSBs (because 2547de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok * in the original EFR, gain_pit was scaled Q12) 2557de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok */ 2567de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok if (mode == MR122) 2577de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok { 2587de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok /* clear 2 LSBits */ 2597de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok *gain = qua_gain_pitch[index] & 0xFFFC; 2607de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok } 2617de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok else 2627de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok { 2637de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok *gain = qua_gain_pitch[index]; 2647de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok } 2657de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok } 2667de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok return index; 2677de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok} 2687de2f9c73fbe93bfb7dff3c046cf7a3137599f6cJaekyun Seok