• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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