• 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.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