libg722_1  0.0.1
basop32.h
1 /*
2  * g722_1 - a library for the G.722.1 and Annex C codecs
3  *
4  * basops32.h
5  *
6  * Adapted by Steve Underwood <steveu@coppice.org> from the reference
7  * code supplied with ITU G.722.1, which is:
8  *
9  * (C) 2004 Polycom, Inc.
10  * All rights reserved.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
15  */
16 
17 #if !defined(BASOP32_H_DEFINED)
18 #define BASOP32_H_DEFINED
19 
20 int32_t L_add(int32_t L_var1, int32_t L_var2);
21 
22 static __inline__ int16_t saturate(int32_t amp)
23 {
24  int16_t amp16;
25 
26  /* Hopefully this is optimised for the common case - not clipping */
27  amp16 = (int16_t) amp;
28  if (amp == amp16)
29  return amp16;
30  if (amp > INT16_MAX)
31  return INT16_MAX;
32  return INT16_MIN;
33 }
34 /*- End of function --------------------------------------------------------*/
35 
36 static __inline__ int16_t xround(int32_t L_var1)
37 {
38  return (int16_t) (L_add(L_var1, (int32_t) 0x00008000L) >> 16);
39 }
40 /*- End of function --------------------------------------------------------*/
41 
42 static __inline__ int16_t abs_s(int16_t var1)
43 {
44  if (var1 == INT16_MIN)
45  return INT16_MAX;
46  return abs(var1);
47 }
48 /*- End of function --------------------------------------------------------*/
49 
50 static __inline__ int16_t add(int16_t var1, int16_t var2)
51 {
52  return saturate((int32_t) var1 + var2);
53 }
54 /*- End of function --------------------------------------------------------*/
55 
56 static __inline__ int16_t sub(int16_t var1, int16_t var2)
57 {
58  return saturate((int32_t) var1 - var2);
59 }
60 /*- End of function --------------------------------------------------------*/
61 
62 static __inline__ int16_t mult(int16_t var1, int16_t var2)
63 {
64  return saturate(((int32_t) var1*(int32_t) var2) >> 15);
65 }
66 /*- End of function --------------------------------------------------------*/
67 
68 static __inline__ int32_t L_mult0(int16_t var1, int16_t var2)
69 {
70  return (int32_t) var1*(int32_t) var2;
71 }
72 /*- End of function --------------------------------------------------------*/
73 
74 static __inline__ int32_t L_mac0(int32_t L_var3, int16_t var1, int16_t var2)
75 {
76  return L_add(L_var3, L_mult0(var1, var2));
77 }
78 /*- End of function --------------------------------------------------------*/
79 
80 static __inline__ int32_t L_mult(int16_t var1, int16_t var2)
81 {
82  int32_t L_var_out;
83 
84  L_var_out = (int32_t) var1*(int32_t) var2;
85  if (L_var_out == (int32_t) 0x40000000L)
86  return INT32_MAX;
87  return L_var_out << 1;
88 }
89 /*- End of function --------------------------------------------------------*/
90 
91 static __inline__ int16_t negate(int16_t var1)
92 {
93  if (var1 == INT16_MIN)
94  return INT16_MAX;
95  return -var1;
96 }
97 /*- End of function --------------------------------------------------------*/
98 
99 static __inline__ int32_t L_mac(int32_t L_var3, int16_t var1, int16_t var2)
100 {
101  return L_add(L_var3, L_mult(var1, var2));
102 }
103 /*- End of function --------------------------------------------------------*/
104 
105 int16_t shl(int16_t var1, int16_t var2); /* Short shift left, 1 */
106 int16_t shr(int16_t var1, int16_t var2); /* Short shift right, 1 */
107 int32_t L_sub(int32_t L_var1, int32_t L_var2); /* Long sub, 2 */
108 int32_t L_shl(int32_t L_var1, int16_t var2); /* Long shift left, 2 */
109 int32_t L_shr(int32_t L_var1, int16_t var2); /* Long shift right, 2 */
110 int16_t norm_s(int16_t var1); /* Short norm, 15 */
111 int16_t div_s(int16_t var1, int16_t var2); /* Short division, 18 */
112 int16_t norm_l(int32_t L_var1); /* Long norm, 30 */
113 
114 #endif
115 
116 /*- End of file ------------------------------------------------------------*/