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 Pathname: ./src/pvamrwbdecoder_basic_op.h
35
36 Date: 05/07/2007
37
38 ------------------------------------------------------------------------------
39 REVISION HISTORY
40
41 Description:
42 ------------------------------------------------------------------------------
43 INCLUDE DESCRIPTION
44
45 ------------------------------------------------------------------------------
46 */
47
48
49 #ifndef PVAMRWBDECODER_BASIC_OP_H
50 #define PVAMRWBDECODER_BASIC_OP_H
51
52
53 #include "normalize_amr_wb.h"
54
55
56 #define MAX_32 (int32)0x7fffffffL
57 #define MIN_32 (int32)0x80000000L
58
59 #define MAX_16 ((int16)+32767) /* 0x7fff */
60 #define MIN_16 ((int16)-32768) /* 0x8000 */
61
62
63
64
65 /*----------------------------------------------------------------------------
66 Function Name : negate_int16
67
68 Negate var1 with saturation, saturate in the case where input is -32768:
69 negate(var1) = sub(0,var1).
70
71 Inputs :
72 var1
73 16 bit short signed integer (int16) whose value falls in the
74 range : 0x8000 <= var1 <= 0x7fff.
75
76 Outputs :
77 none
78
79 Return Value :
80 16 bit short signed integer (int16) whose value falls in the
81 range : 0x8000 <= var_out <= 0x7fff.
82 ----------------------------------------------------------------------------*/
83
negate_int16(int16 var1)84 __inline int16 negate_int16(int16 var1)
85 {
86 return (((var1 == MIN_16) ? MAX_16 : -var1));
87 }
88
89
90 /*----------------------------------------------------------------------------
91
92 Function Name : shl_int16
93
94 Arithmetically shift the 16 bit input var1 left var2 positions.Zero fill
95 the var2 LSB of the result. If var2 is negative, arithmetically shift
96 var1 right by -var2 with sign extension. Saturate the result in case of
97 underflows or overflows.
98
99 Inputs :
100 var1
101 16 bit short signed integer (int16) whose value falls in the
102 range : 0x8000 <= var1 <= 0x7fff.
103
104 var2
105 16 bit short signed integer (int16) whose value falls in the
106 range : 0x8000 <= var1 <= 0x7fff.
107
108 Return Value :
109 var_out
110 16 bit short signed integer (int16) whose value falls in the
111 range : 0x8000 <= var_out <= 0x7fff.
112 ----------------------------------------------------------------------------*/
113
shl_int16(int16 var1,int16 var2)114 __inline int16 shl_int16(int16 var1, int16 var2)
115 {
116 int16 var_out;
117
118 if (var2 < 0)
119 {
120 var2 = (-var2) & (0xf);
121 var_out = var1 >> var2;
122 }
123 else
124 {
125 var2 &= 0xf;
126 var_out = var1 << var2;
127 if (var_out >> var2 != var1)
128 {
129 var_out = (var1 >> 15) ^ MAX_16;
130 }
131 }
132 return (var_out);
133 }
134
135
136 /*----------------------------------------------------------------------------
137
138 Function Name : shl_int32
139
140 Arithmetically shift the 32 bit input L_var1 left var2 positions. Zero
141 fill the var2 LSB of the result. If var2 is negative, arithmetically
142 shift L_var1 right by -var2 with sign extension. Saturate the result in
143 case of underflows or overflows.
144
145 Inputs :
146 L_var1 32 bit long signed integer (int32) whose value falls in the
147 range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.
148
149 var2
150 16 bit short signed integer (int16) whose value falls in the
151 range : 8000 <= var2 <= 7fff.
152 Return Value :
153 32 bit long signed integer (int32) whose value falls in the
154 range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.
155
156 ----------------------------------------------------------------------------*/
157
shl_int32(int32 L_var1,int16 var2)158 __inline int32 shl_int32(int32 L_var1, int16 var2)
159 {
160 int32 L_var_out;
161
162 if (var2 > 0)
163 {
164 L_var_out = L_var1 << var2;
165 if (L_var_out >> var2 != L_var1)
166 {
167 L_var_out = (L_var1 >> 31) ^ MAX_32;
168 }
169 }
170 else
171 {
172 var2 = (-var2) & (0xf);
173 L_var_out = L_var1 >> var2;
174 }
175
176 return (L_var_out);
177 }
178
179
180 /*----------------------------------------------------------------------------
181
182 Function Name : shr_int32
183
184 Arithmetically shift the 32 bit input L_var1 right var2 positions with
185 sign extension. If var2 is negative, arithmetically shift L_var1 left
186 by -var2 and zero fill the -var2 LSB of the result. Saturate the result
187 in case of underflows or overflows.
188
189 Inputs :
190 L_var1 32 bit long signed integer (int32) whose value falls in the
191 range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.
192
193 var2
194 16 bit short signed integer (int16) whose value falls in the
195 range : 8000 <= var2 <= 7fff.
196 Return Value :
197 32 bit long signed integer (int32) whose value falls in the
198 range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.
199
200 ----------------------------------------------------------------------------*/
201
shr_int32(int32 L_var1,int16 var2)202 __inline int32 shr_int32(int32 L_var1, int16 var2)
203 {
204 int32 L_var_out;
205
206 if (var2 >= 0)
207 {
208 L_var_out = L_var1 >> (var2 & 0x1f);
209 }
210 else
211 {
212 var2 = (int16)(-var2);
213 var2 &= 0x1f;
214 L_var_out = L_var1 << var2;
215 if (L_var_out >> var2 != L_var1)
216 {
217 L_var_out = (L_var1 >> 31) ^ MAX_32;
218 }
219
220 }
221 return (L_var_out);
222 }
223
224
225
226
227
228
229 #if defined(PV_ARM_V5)
230
231 #include "pvamrwbdecoder_basic_op_armv5.h"
232
233 #elif defined(PV_ARM_GCC_V5)
234
235 #include "pvamrwbdecoder_basic_op_gcc_armv5.h"
236
237 #else
238
239 #ifndef C_EQUIVALENT
240 #define C_EQUIVALENT // default to C_EQUIVALENT
241 #endif
242
243 #include "pvamrwbdecoder_basic_op_cequivalent.h"
244
245 #endif
246
247
248 #endif /* PVAMRWBDECODER_BASIC_OP_H */
249
250