1 /* ------------------------------------------------------------------
2  * Copyright (C) 1998-2009 PacketVideo
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13  * express or implied.
14  * See the License for the specific language governing permissions
15  * and limitations under the License.
16  * -------------------------------------------------------------------
17  */
18 /****************************************************************************************
19 Portions of this file are derived from the following 3GPP standard:
20 
21     3GPP TS 26.073
22     ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
23     Available from http://www.3gpp.org
24 
25 (C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
26 Permission to distribute, modify and use this file under the standard license
27 terms listed above has been obtained from the copyright holder.
28 ****************************************************************************************/
29 /*
30 ------------------------------------------------------------------------------
31 
32 
33 
34  Pathname: ./audio/gsm-amr/c/src/d_gain_c.c
35  Functions: d_gain_c
36 
37      Date: 01/29/2002
38 
39 ------------------------------------------------------------------------------
40  REVISION HISTORY
41 
42  Description: Updated include files and intput/output section. Changed .tab
43               files to .c files.
44 
45  Description:  Replaced OSCL mem type functions and eliminated include
46                files that now are chosen by OSCL definitions
47 
48  Description:  Replaced "int" and/or "char" with OSCL defined types.
49 
50  Description: Added #ifdef __cplusplus around extern'ed table.
51 
52  Description:
53 
54  ------------------------------------------------------------------------------
55  INPUT AND OUTPUT DEFINITIONS
56 
57  Inputs:
58     pred_state  = pointer to sturcture type gc_predState. MA predictor state
59     mode        = AMR mode (MR795 or MR122) of type enum Mode
60     index       = received quantization index of type Word16
61     code[]      = pointer to innovation codevector of type Word16
62     pOverflow= pointer to value indicating existence of overflow (Flag)
63 
64  Outputs:
65     pred_state  = pointer to sturcture type gc_predState. MA predictor state
66     gain_code   = pointer to decoded innovation gain of type Word16
67     pOverflow = 1 if there is an overflow else it is zero.
68 
69  Returns:
70     None.
71 
72  Global Variables Used:
73     None
74 
75  Local Variables Needed:
76     None
77 
78 ------------------------------------------------------------------------------
79  FUNCTION DESCRIPTION
80 
81   Function    : d_gain_code
82   Purpose     : Decode the fixed codebook gain using the received index.
83 
84 ------------------------------------------------------------------------------
85  REQUIREMENTS
86 
87 
88 
89 ------------------------------------------------------------------------------
90  REFERENCES
91 
92  d_gain_c.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
93 
94 ------------------------------------------------------------------------------
95  PSEUDO-CODE
96 
97 
98 
99 ------------------------------------------------------------------------------
100  RESOURCES USED
101    When the code is written for a specific target processor the
102      the resources used should be documented below.
103 
104  STACK USAGE: [stack count for this module] + [variable to represent
105           stack usage for each subroutine called]
106 
107      where: [stack usage variable] = stack usage for [subroutine
108          name] (see [filename].ext)
109 
110  DATA MEMORY USED: x words
111 
112  PROGRAM MEMORY USED: x words
113 
114  CLOCK CYCLES: [cycle count equation for this module] + [variable
115            used to represent cycle count for each subroutine
116            called]
117 
118      where: [cycle count variable] = cycle count for [subroutine
119         name] (see [filename].ext)
120 
121 ------------------------------------------------------------------------------
122 */
123 
124 
125 /*----------------------------------------------------------------------------
126 ; INCLUDES
127 ----------------------------------------------------------------------------*/
128 #include "d_gain_c.h"
129 #include "typedef.h"
130 #include "mode.h"
131 
132 #include "oper_32b.h"
133 #include "cnst.h"
134 #include "log2.h"
135 #include "pow2.h"
136 #include "gc_pred.h"
137 
138 #include "basic_op.h"
139 
140 /*--------------------------------------------------------------------------*/
141 #ifdef __cplusplus
142 extern "C"
143 {
144 #endif
145 
146     /*----------------------------------------------------------------------------
147     ; MACROS
148     ; Define module specific macros here
149     ----------------------------------------------------------------------------*/
150 
151 
152     /*----------------------------------------------------------------------------
153     ; DEFINES
154     ; Include all pre-processor statements here. Include conditional
155     ; compile variables also.
156     ----------------------------------------------------------------------------*/
157 
158     /*----------------------------------------------------------------------------
159     ; LOCAL FUNCTION DEFINITIONS
160     ; Function Prototype declaration
161     ----------------------------------------------------------------------------*/
162 
163 
164     /*----------------------------------------------------------------------------
165     ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
166     ; Variable declaration - defined here and used outside this module
167     ----------------------------------------------------------------------------*/
168 
169 
170     /*----------------------------------------------------------------------------
171     ; EXTERNAL FUNCTION REFERENCES
172     ; Declare functions defined elsewhere and referenced in this module
173     ----------------------------------------------------------------------------*/
174 
175     /*----------------------------------------------------------------------------
176     ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
177     ; Declare variables used in this module but defined elsewhere
178     ----------------------------------------------------------------------------*/
179     extern const Word16 qua_gain_code[];
180 
181 
182     /*--------------------------------------------------------------------------*/
183 #ifdef __cplusplus
184 }
185 #endif
186 
187 /*----------------------------------------------------------------------------
188 ; FUNCTION CODE
189 ----------------------------------------------------------------------------*/
d_gain_code(gc_predState * pred_state,enum Mode mode,Word16 index,Word16 code[],Word16 * gain_code,Flag * pOverflow)190 void d_gain_code(
191     gc_predState *pred_state, /* i/o : MA predictor state               */
192     enum Mode mode,           /* i   : AMR mode (MR795 or MR122)        */
193     Word16 index,             /* i   : received quantization index      */
194     Word16 code[],            /* i   : innovation codevector            */
195     Word16 *gain_code,        /* o   : decoded innovation gain          */
196     Flag   *pOverflow
197 )
198 {
199     Word16 gcode0, exp, frac;
200     const Word16 *p;
201     Word16 qua_ener_MR122, qua_ener;
202     Word16 exp_inn_en;
203     Word16 frac_inn_en;
204     Word32 L_tmp;
205     Word16 tbl_tmp;
206     Word16 temp;
207     /*-------------- Decode codebook gain ---------------*/
208 
209     /*-------------------------------------------------------------------*
210      *  predict codebook gain                                            *
211      *  ~~~~~~~~~~~~~~~~~~~~~                                            *
212      *  gc0     = Pow2(int(d)+frac(d))                                   *
213      *          = 2^exp + 2^frac                                         *
214      *                                                                   *
215      *-------------------------------------------------------------------*/
216 
217     gc_pred(pred_state, mode, code, &exp, &frac,
218             &exp_inn_en, &frac_inn_en, pOverflow);
219 
220     index &= 31;                    /* index < 32, to avoid buffer overflow */
221     tbl_tmp = index + (index << 1);
222 
223     p = &qua_gain_code[tbl_tmp];
224 
225     /* Different scalings between MR122 and the other modes */
226     temp = sub((Word16)mode, (Word16)MR122, pOverflow);
227     if (temp == 0)
228     {
229         gcode0 = (Word16)(Pow2(exp, frac, pOverflow));    /* predicted gain */
230         gcode0 = shl(gcode0, 4, pOverflow);
231         *gain_code = shl(mult(gcode0, *p++, pOverflow), 1, pOverflow);
232     }
233     else
234     {
235         gcode0 = (Word16)(Pow2(14, frac, pOverflow));
236         L_tmp = L_mult(*p++, gcode0, pOverflow);
237         L_tmp = L_shr(L_tmp, sub(9, exp, pOverflow), pOverflow);
238         *gain_code = extract_h(L_tmp);          /* Q1 */
239     }
240 
241     /*-------------------------------------------------------------------*
242      *  update table of past quantized energies                          *
243      *  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                          *
244      *-------------------------------------------------------------------*/
245     qua_ener_MR122 = *p++;
246     qua_ener = *p++;
247     gc_pred_update(pred_state, qua_ener_MR122, qua_ener);
248 
249     return;
250 }
251 
252 
253 
254 
255