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 Filename: /audio/gsm_amr/c/src/prm2bits.c
35
36 Date: 02/04/2002
37
38 ------------------------------------------------------------------------------
39 REVISION HISTORY
40
41 Description: Improved the code as per review comments.
42
43 Description: For Int2bin() and Prm2bits()
44 1. Eliminated unused include file typedef.h.
45 2. Replaced array addressing by pointers
46 3. Changed to decrement loops
47
48 Description: Replaced "int" and/or "char" with OSCL defined types.
49
50 Description:
51
52 ------------------------------------------------------------------------------
53 */
54
55 /*----------------------------------------------------------------------------
56 ; INCLUDES
57 ----------------------------------------------------------------------------*/
58 #include "prm2bits.h"
59 #include "mode.h"
60 #include "bitno_tab.h"
61
62
63 /*----------------------------------------------------------------------------
64 ; MACROS
65 ; [Define module specific macros here]
66 ----------------------------------------------------------------------------*/
67
68 /*----------------------------------------------------------------------------
69 ; DEFINES
70 ; [Include all pre-processor statements here. Include conditional
71 ; compile variables also.]
72 ----------------------------------------------------------------------------*/
73 #define MASK 0x0001
74 /*----------------------------------------------------------------------------
75 ; LOCAL FUNCTION DEFINITIONS
76 ; [List function prototypes here]
77 ----------------------------------------------------------------------------*/
78
79 /*----------------------------------------------------------------------------
80 ; LOCAL VARIABLE DEFINITIONS
81 ; [Variable declaration - defined here and used outside this module]
82 ----------------------------------------------------------------------------*/
83
84 /*
85 ------------------------------------------------------------------------------
86 FUNCTION NAME: Int2bin
87 ------------------------------------------------------------------------------
88 INPUT AND OUTPUT DEFINITIONS
89
90 Inputs:
91 value = value to be converted to binary of type Word16
92 no_of_bits = number of bits associated with value of type Word16
93
94 Outputs:
95 bitstream = pointer to address where bits are written of type Word16
96
97 Returns:
98 None
99
100 Global Variables Used:
101 None
102
103 Local Variables Needed:
104 None
105
106 ------------------------------------------------------------------------------
107 FUNCTION DESCRIPTION
108
109 FUNCTION: Int2bin
110
111 PURPOSE: convert integer to binary and write the bits to the array
112 bitstream[]. The most significant bits are written first.
113
114 ------------------------------------------------------------------------------
115 REQUIREMENTS
116
117 None
118
119 ------------------------------------------------------------------------------
120 REFERENCES
121
122 prm2bits.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
123
124 ------------------------------------------------------------------------------
125 PSEUDO-CODE
126
127 static void Int2bin (
128 Word16 value, // input : value to be converted to binary
129 Word16 no_of_bits, // input : number of bits associated with value
130 Word16 *bitstream // output: address where bits are written
131 )
132 {
133 Word16 *pt_bitstream, i, bit;
134
135 pt_bitstream = &bitstream[no_of_bits];
136
137 for (i = 0; i < no_of_bits; i++)
138 {
139 bit = value & MASK;
140 if (bit == 0)
141 {
142 *--pt_bitstream = BIT_0;
143 }
144 else
145 {
146 *--pt_bitstream = BIT_1;
147 }
148 value = shr (value, 1);
149 }
150 }
151
152 ------------------------------------------------------------------------------
153 RESOURCES USED [optional]
154
155 When the code is written for a specific target processor the
156 the resources used should be documented below.
157
158 HEAP MEMORY USED: x bytes
159
160 STACK MEMORY USED: x bytes
161
162 CLOCK CYCLES: (cycle count equation for this function) + (variable
163 used to represent cycle count for each subroutine
164 called)
165 where: (cycle count variable) = cycle count for [subroutine
166 name]
167
168 ------------------------------------------------------------------------------
169 CAUTION [optional]
170 [State any special notes, constraints or cautions for users of this function]
171
172 ------------------------------------------------------------------------------
173 */
174
175 /*----------------------------------------------------------------------------
176 ; FUNCTION CODE
177 ----------------------------------------------------------------------------*/
Int2bin(Word16 value,Word16 no_of_bits,Word16 * bitstream)178 static void Int2bin(
179 Word16 value, /* input : value to be converted to binary */
180 Word16 no_of_bits, /* input : number of bits associated with value */
181 Word16 *bitstream /* output: address where bits are written */
182 )
183 {
184 Word16 *pt_bitstream;
185 Word16 i;
186
187 pt_bitstream = &bitstream[no_of_bits-1];
188
189 for (i = no_of_bits; i != 0; i--)
190 {
191 *(pt_bitstream--) = value & MASK;
192 value >>= 1;
193 }
194
195 }
196
197
198 /*
199 ------------------------------------------------------------------------------
200 FUNCTION NAME: prm2bits
201 ------------------------------------------------------------------------------
202 INPUT AND OUTPUT DEFINITIONS
203
204 Inputs:
205 mode = AMR mode of type enum Mode
206 prm[] = pointer to analysis parameters of type Word16
207
208 Outputs:
209 bits[] = pointer to serial bits of type Word16
210
211 Returns:
212 None
213
214 Global Variables Used:
215 None
216
217 Local Variables Needed:
218 None
219
220 ------------------------------------------------------------------------------
221 FUNCTION DESCRIPTION
222
223 FUNCTION: Prm2bits
224
225 PURPOSE: converts the encoder parameter vector into a vector of serial
226 bits.
227
228 DESCRIPTION: depending on the mode, different numbers of parameters
229 (with differing numbers of bits) are processed. Details
230 are found in bitno.tab
231
232 ------------------------------------------------------------------------------
233 REQUIREMENTS
234
235 None
236
237 ------------------------------------------------------------------------------
238 REFERENCES
239
240 prm2bits.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
241
242 ------------------------------------------------------------------------------
243 PSEUDO-CODE
244
245 void Prm2bits (
246 enum Mode mode, // i : AMR mode
247 Word16 prm[], // i : analysis parameters (size <= MAX_PRM_SIZE)
248 Word16 bits[] // o : serial bits (size <= MAX_SERIAL_SIZE)
249 )
250 {
251 Word16 i;
252
253 for (i = 0; i < prmno[mode]; i++)
254 {
255 Int2bin (prm[i], bitno[mode][i], bits);
256 bits += bitno[mode][i];
257 add(0,0); // account for above pointer update
258 }
259
260 return;
261 }
262
263 ------------------------------------------------------------------------------
264 RESOURCES USED [optional]
265
266 When the code is written for a specific target processor the
267 the resources used should be documented below.
268
269 HEAP MEMORY USED: x bytes
270
271 STACK MEMORY USED: x bytes
272
273 CLOCK CYCLES: (cycle count equation for this function) + (variable
274 used to represent cycle count for each subroutine
275 called)
276 where: (cycle count variable) = cycle count for [subroutine
277 name]
278
279 ------------------------------------------------------------------------------
280 CAUTION [optional]
281 [State any special notes, constraints or cautions for users of this function]
282
283 ------------------------------------------------------------------------------
284 */
285
286 /*----------------------------------------------------------------------------
287 ; FUNCTION CODE
288 ----------------------------------------------------------------------------*/
Prm2bits(enum Mode mode,Word16 prm[],Word16 bits[])289 void Prm2bits(
290 enum Mode mode, /* i : AMR mode */
291 Word16 prm[], /* i : analysis parameters (size <= MAX_PRM_SIZE) */
292 Word16 bits[] /* o : serial bits (size <= MAX_SERIAL_SIZE) */
293 )
294 {
295 Word16 i;
296 const Word16 *p_mode;
297 Word16 *p_prm;
298
299 p_mode = &bitno[mode][0];
300 p_prm = &prm[0];
301
302 for (i = prmno[mode]; i != 0; i--)
303 {
304 Int2bin(*(p_prm++), *(p_mode), bits);
305 bits += *(p_mode++);
306 }
307
308 return;
309 }
310
311