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