1 /*
2  * Copyright (C) 2004-2010 NXP Software
3  * Copyright (C) 2010 The Android Open Source Project
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 #ifndef _VECTOR_ARITHMETIC_H_
19 #define _VECTOR_ARITHMETIC_H_
20 
21 
22 #ifdef __cplusplus
23 extern "C" {
24 #endif /* __cplusplus */
25 
26 #include "LVM_Types.h"
27 
28 /**********************************************************************************
29     VARIOUS FUNCTIONS
30 ***********************************************************************************/
31 
32 void LoadConst_16(            const LVM_INT16 val,
33                                     LVM_INT16 *dst,
34                                     LVM_INT16 n );
35 
36 void LoadConst_32(            const LVM_INT32 val,
37                                     LVM_INT32 *dst,
38                                     LVM_INT16 n );
39 
40 void Copy_16(                 const LVM_INT16 *src,
41                                     LVM_INT16 *dst,
42                                     LVM_INT16 n );
43 
44 /*********************************************************************************
45  * note: In Mult3s_16x16() saturation of result is not taken care when           *
46  *       overflow occurs.                                                        *
47  *       For example when *src = 0x8000, val = *0x8000                           *
48  *       The function gives the output as 0x8000 instead of 0x7fff               *
49  *       This is the only case which will give wrong result.                     *
50  *       For more information refer to Vector_Arithmetic.doc in /doc folder      *
51  *********************************************************************************/
52 void Mult3s_16x16(            const LVM_INT16 *src,
53                               const LVM_INT16 val,
54                                     LVM_INT16 *dst,
55                                     LVM_INT16 n);
56 
57 /*********************************************************************************
58  * note: In Mult3s_32x16() saturation of result is not taken care when           *
59  *       overflow occurs.                                                        *
60  *       For example when *src = 0x8000000, val = *0x8000                        *
61  *       The function gives the output as 0x8000000 instead of 0x7fffffff        *
62  *       This is the only extreme condition which is giving unexpected result    *
63  *       For more information refer to Vector_Arithmetic.doc in /doc folder      *
64  *********************************************************************************/
65 void Mult3s_32x16(            const LVM_INT32  *src,
66                               const LVM_INT16 val,
67                                     LVM_INT32  *dst,
68                                     LVM_INT16 n);
69 
70 void DelayMix_16x16(          const LVM_INT16 *src,
71                                     LVM_INT16 *delay,
72                                     LVM_INT16 size,
73                                     LVM_INT16 *dst,
74                                     LVM_INT16 *pOffset,
75                                     LVM_INT16 n);
76 
77 void DelayWrite_32(           const LVM_INT32  *src,               /* Source 1, to be delayed */
78                                     LVM_INT32  *delay,             /* Delay buffer */
79                                     LVM_UINT16 size,               /* Delay size */
80                                     LVM_UINT16 *pOffset,           /* Delay offset */
81                                     LVM_INT16 n);
82 
83 void Add2_Sat_16x16(          const LVM_INT16 *src,
84                                     LVM_INT16 *dst,
85                                     LVM_INT16 n );
86 
87 void Add2_Sat_32x32(          const LVM_INT32  *src,
88                                     LVM_INT32  *dst,
89                                     LVM_INT16 n );
90 
91 void Mac3s_Sat_16x16(         const LVM_INT16 *src,
92                               const LVM_INT16 val,
93                                     LVM_INT16 *dst,
94                                     LVM_INT16 n);
95 
96 void Mac3s_Sat_32x16(         const LVM_INT32  *src,
97                               const LVM_INT16 val,
98                                     LVM_INT32  *dst,
99                                     LVM_INT16 n);
100 
101 void DelayAllPass_Sat_32x16To32(    LVM_INT32  *delay,              /* Delay buffer */
102                                     LVM_UINT16 size,                /* Delay size */
103                                     LVM_INT16 coeff,                /* All pass filter coefficient */
104                                     LVM_UINT16 DelayOffset,         /* Simple delay offset */
105                                     LVM_UINT16 *pAllPassOffset,     /* All pass filter delay offset */
106                                     LVM_INT32  *dst,                /* Source/destination */
107                                     LVM_INT16 n);
108 
109 /**********************************************************************************
110     SHIFT FUNCTIONS
111 ***********************************************************************************/
112 
113 void Shift_Sat_v16xv16 (      const LVM_INT16 val,
114                               const LVM_INT16 *src,
115                                     LVM_INT16 *dst,
116                                     LVM_INT16 n);
117 
118 void Shift_Sat_v32xv32 (      const LVM_INT16 val,
119                               const LVM_INT32 *src,
120                                     LVM_INT32 *dst,
121                                     LVM_INT16 n);
122 
123 /**********************************************************************************
124     AUDIO FORMAT CONVERSION FUNCTIONS
125 ***********************************************************************************/
126 
127 void MonoTo2I_16(             const LVM_INT16 *src,
128                                     LVM_INT16 *dst,
129                                     LVM_INT16 n);
130 
131 void MonoTo2I_32(             const LVM_INT32  *src,
132                                     LVM_INT32  *dst,
133                                     LVM_INT16 n);
134 
135 void From2iToMono_32(         const LVM_INT32  *src,
136                                     LVM_INT32  *dst,
137                                     LVM_INT16 n);
138 
139 void MSTo2i_Sat_16x16(        const LVM_INT16 *srcM,
140                               const LVM_INT16 *srcS,
141                                     LVM_INT16 *dst,
142                                     LVM_INT16 n );
143 
144 void From2iToMS_16x16(        const LVM_INT16 *src,
145                                     LVM_INT16 *dstM,
146                                     LVM_INT16 *dstS,
147                                     LVM_INT16 n );
148 
149 void From2iToMono_16(         const LVM_INT16 *src,
150                                     LVM_INT16 *dst,
151                                     LVM_INT16 n);
152 
153 void JoinTo2i_32x32(          const LVM_INT32  *srcL,
154                               const LVM_INT32  *srcR,
155                                     LVM_INT32  *dst,
156                                     LVM_INT16 n );
157 
158 /**********************************************************************************
159     DATA TYPE CONVERSION FUNCTIONS
160 ***********************************************************************************/
161 
162 void Int16LShiftToInt32_16x32(const LVM_INT16 *src,
163                                     LVM_INT32  *dst,
164                                     LVM_INT16 n,
165                                     LVM_INT16 shift );
166 
167 void Int32RShiftToInt16_Sat_32x16(const  LVM_INT32  *src,
168                                     LVM_INT16 *dst,
169                                     LVM_INT16 n,
170                                     LVM_INT16 shift );
171 
172 #ifdef __cplusplus
173 }
174 #endif /* __cplusplus */
175 
176 
177 /**********************************************************************************/
178 
179 #endif  /* _VECTOR_ARITHMETIC_H_ */
180 
181 /**********************************************************************************/
182