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.173
22 ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
23 Available from http://www.3gpp.org
24
25 (C) 2007, 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 Filename: homing_amr_wb_dec.cpp
35
36 Date: 4/25/2007
37
38 ------------------------------------------------------------------------------
39 REVISION HISTORY
40
41
42 Description:
43
44 ------------------------------------------------------------------------------
45
46
47
48 INPUT AND OUTPUT DEFINITIONS
49
50 Input
51 int16 input_frame[], 16-bit input frame
52 int16 mode 16-bit mode
53 int16 nparms 16-bit number of parameters
54 Returns
55 Int16 i number of leading zeros on x
56
57
58 ------------------------------------------------------------------------------
59 FUNCTION DESCRIPTION
60
61 Performs the homing routines
62
63 int16 dhf_test(int16 input_frame[], int16 mode, int16 nparms)
64 int16 decoder_homing_frame_test(int16 input_frame[], int16 mode)
65 int16 decoder_homing_frame_test_first(int16 input_frame[], int16 mode)
66
67 ------------------------------------------------------------------------------
68 REQUIREMENTS
69
70
71 ------------------------------------------------------------------------------
72 REFERENCES
73
74 ------------------------------------------------------------------------------
75 PSEUDO-CODE
76
77 ------------------------------------------------------------------------------
78 */
79
80
81 /*----------------------------------------------------------------------------
82 ; INCLUDES
83 ----------------------------------------------------------------------------*/
84
85 #include "pv_amr_wb_type_defs.h"
86 #include "pvamrwbdecoder_cnst.h"
87 #include "pvamrwbdecoder.h"
88 #include "pvamrwbdecoder_basic_op.h"
89 #include "get_amr_wb_bits.h"
90 #include "pvamrwbdecoder_api.h"
91 #include "pvamrwbdecoder.h"
92
93 /*----------------------------------------------------------------------------
94 ; MACROS
95 ; Define module specific macros here
96 ----------------------------------------------------------------------------*/
97
98
99 /*----------------------------------------------------------------------------
100 ; DEFINES
101 ; Include all pre-processor statements here. Include conditional
102 ; compile variables also.
103 ----------------------------------------------------------------------------*/
104 #define DHF_PARMS_MAX 32 /* homing frame pattern */
105 #define NUM_OF_SPMODES 9
106
107 #define PRML 15
108 #define PRMN_7k (NBBITS_7k/PRML + 1)
109 #define PRMN_9k (NBBITS_9k/PRML + 1)
110 #define PRMN_12k (NBBITS_12k/PRML + 1)
111 #define PRMN_14k (NBBITS_14k/PRML + 1)
112 #define PRMN_16k (NBBITS_16k/PRML + 1)
113 #define PRMN_18k (NBBITS_18k/PRML + 1)
114 #define PRMN_20k (NBBITS_20k/PRML + 1)
115 #define PRMN_23k (NBBITS_23k/PRML + 1)
116 #define PRMN_24k (NBBITS_24k/PRML + 1)
117
118 /*----------------------------------------------------------------------------
119 ; LOCAL FUNCTION DEFINITIONS
120 ; Function Prototype declaration
121 ----------------------------------------------------------------------------*/
122 #ifdef __cplusplus
123 extern "C"
124 {
125 #endif
126
127 int16 dhf_test(int16 input_frame[], int32 mode, int16 nparms);
128
129 #ifdef __cplusplus
130 }
131 #endif
132
133 /*----------------------------------------------------------------------------
134 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
135 ; Variable declaration - defined here and used outside this module
136 ----------------------------------------------------------------------------*/
137 static const int16 prmnofsf[NUM_OF_SPMODES] =
138 {
139 63, 81, 100,
140 108, 116, 128,
141 136, 152, 156
142 };
143
144
145 static const int16 dfh_M7k[PRMN_7k] =
146 {
147 3168, 29954, 29213, 16121,
148 64, 13440, 30624, 16430,
149 19008
150 };
151
152 static const int16 dfh_M9k[PRMN_9k] =
153 {
154 3168, 31665, 9943, 9123,
155 15599, 4358, 20248, 2048,
156 17040, 27787, 16816, 13888
157 };
158
159 static const int16 dfh_M12k[PRMN_12k] =
160 {
161 3168, 31665, 9943, 9128,
162 3647, 8129, 30930, 27926,
163 18880, 12319, 496, 1042,
164 4061, 20446, 25629, 28069,
165 13948
166 };
167
168 static const int16 dfh_M14k[PRMN_14k] =
169 {
170 3168, 31665, 9943, 9131,
171 24815, 655, 26616, 26764,
172 7238, 19136, 6144, 88,
173 4158, 25733, 30567, 30494,
174 221, 20321, 17823
175 };
176
177 static const int16 dfh_M16k[PRMN_16k] =
178 {
179 3168, 31665, 9943, 9131,
180 24815, 700, 3824, 7271,
181 26400, 9528, 6594, 26112,
182 108, 2068, 12867, 16317,
183 23035, 24632, 7528, 1752,
184 6759, 24576
185 };
186
187 static const int16 dfh_M18k[PRMN_18k] =
188 {
189 3168, 31665, 9943, 9135,
190 14787, 14423, 30477, 24927,
191 25345, 30154, 916, 5728,
192 18978, 2048, 528, 16449,
193 2436, 3581, 23527, 29479,
194 8237, 16810, 27091, 19052,
195 0
196 };
197
198 static const int16 dfh_M20k[PRMN_20k] =
199 {
200 3168, 31665, 9943, 9129,
201 8637, 31807, 24646, 736,
202 28643, 2977, 2566, 25564,
203 12930, 13960, 2048, 834,
204 3270, 4100, 26920, 16237,
205 31227, 17667, 15059, 20589,
206 30249, 29123, 0
207 };
208
209 static const int16 dfh_M23k[PRMN_23k] =
210 {
211 3168, 31665, 9943, 9132,
212 16748, 3202, 28179, 16317,
213 30590, 15857, 19960, 8818,
214 21711, 21538, 4260, 16690,
215 20224, 3666, 4194, 9497,
216 16320, 15388, 5755, 31551,
217 14080, 3574, 15932, 50,
218 23392, 26053, 31216
219 };
220
221 static const int16 dfh_M24k[PRMN_24k] =
222 {
223 3168, 31665, 9943, 9134,
224 24776, 5857, 18475, 28535,
225 29662, 14321, 16725, 4396,
226 29353, 10003, 17068, 20504,
227 720, 0, 8465, 12581,
228 28863, 24774, 9709, 26043,
229 7941, 27649, 13965, 15236,
230 18026, 22047, 16681, 3968
231 };
232
233
234 /*----------------------------------------------------------------------------
235 ; EXTERNAL FUNCTION REFERENCES
236 ; Declare functions defined elsewhere and referenced in this module
237 ----------------------------------------------------------------------------*/
238
239 /*----------------------------------------------------------------------------
240 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
241 ; Declare variables used in this module but defined elsewhere
242 ----------------------------------------------------------------------------*/
243
244 /*----------------------------------------------------------------------------
245 ; FUNCTION CODE
246 ----------------------------------------------------------------------------*/
247
dhf_test(int16 input_frame[],int32 mode,int16 nparms)248 int16 dhf_test(int16 input_frame[], int32 mode, int16 nparms)
249 {
250 int16 i, j, tmp, shift;
251 int16 param[DHF_PARMS_MAX];
252 int16 *prms;
253
254 /* overall table with the parameters of the
255 decoder homing frames for all modes */
256
257 const int16 *dhf[] =
258 {
259 dfh_M7k,
260 dfh_M9k,
261 dfh_M12k,
262 dfh_M14k,
263 dfh_M16k,
264 dfh_M18k,
265 dfh_M20k,
266 dfh_M23k,
267 dfh_M24k,
268 dfh_M24k
269 };
270
271 prms = input_frame;
272 j = 0;
273 i = 0;
274
275 if (mode != MRDTX)
276 {
277 if (mode != MODE_24k)
278 {
279 /* convert the received serial bits */
280 tmp = nparms - 15;
281 while (tmp > j)
282 {
283 param[i] = Serial_parm(15, &prms);
284 j += 15;
285 i++;
286 }
287 tmp = nparms - j;
288 param[i] = Serial_parm(tmp, &prms);
289 shift = 15 - tmp;
290 param[i] = shl_int16(param[i], shift);
291 }
292 else
293 {
294 /*If mode is 23.85Kbit/s, remove high band energy bits */
295 for (i = 0; i < 10; i++)
296 {
297 param[i] = Serial_parm(15, &prms);
298 }
299 param[10] = Serial_parm(15, &prms) & 0x61FF;
300
301 for (i = 11; i < 17; i++)
302 {
303 param[i] = Serial_parm(15, &prms);
304 }
305 param[17] = Serial_parm(15, &prms) & 0xE0FF;
306
307 for (i = 18; i < 24; i++)
308 {
309 param[i] = Serial_parm(15, &prms);
310 }
311 param[24] = Serial_parm(15, &prms) & 0x7F0F;
312
313 for (i = 25; i < 31; i++)
314 {
315 param[i] = Serial_parm(15, &prms);
316 }
317
318 tmp = Serial_parm(8, &prms);
319 param[31] = shl_int16(tmp, 7);
320 shift = 0;
321 }
322
323 /* check if the parameters matches the parameters of the corresponding decoder homing frame */
324 tmp = i;
325 j = 0;
326 for (i = 0; i < tmp; i++)
327 {
328 j = (param[i] ^ dhf[mode][i]);
329 if (j)
330 {
331 break;
332 }
333 }
334 tmp = 0x7fff;
335 tmp >>= shift;
336 tmp = shl_int16(tmp, shift);
337 tmp = (dhf[mode][i] & tmp);
338 tmp = (param[i] ^ tmp);
339 j = (int16)(j | tmp);
340
341 }
342 else
343 {
344 j = 1;
345 }
346
347 return (!j);
348 }
349
350 /*----------------------------------------------------------------------------
351 ; FUNCTION CODE
352 ----------------------------------------------------------------------------*/
353
354
pvDecoder_AmrWb_homing_frame_test(int16 input_frame[],int16 mode)355 int16 pvDecoder_AmrWb_homing_frame_test(int16 input_frame[], int16 mode)
356 {
357 /* perform test for COMPLETE parameter frame */
358 return dhf_test(input_frame, mode, AMR_WB_COMPRESSED[mode]);
359 }
360
361 /*----------------------------------------------------------------------------
362 ; FUNCTION CODE
363 ----------------------------------------------------------------------------*/
364
365
pvDecoder_AmrWb_homing_frame_test_first(int16 input_frame[],int16 mode)366 int16 pvDecoder_AmrWb_homing_frame_test_first(int16 input_frame[], int16 mode)
367 {
368 /* perform test for FIRST SUBFRAME of parameter frame ONLY */
369 return dhf_test(input_frame, mode, prmnofsf[mode]);
370 }
371