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
20int32_t L_add(int32_t L_var1, int32_t L_var2);
21
22static __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
36static __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
42static __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
50static __inline__ int16_t add(int16_t var1, int16_t var2)
51{
52 return saturate((int32_t) var1 + var2);
53}
54/*- End of function --------------------------------------------------------*/
55
56static __inline__ int16_t sub(int16_t var1, int16_t var2)
57{
58 return saturate((int32_t) var1 - var2);
59}
60/*- End of function --------------------------------------------------------*/
61
62static __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
68static __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
74static __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
80static __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
91static __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
99static __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
105int16_t shl(int16_t var1, int16_t var2); /* Short shift left, 1 */
106int16_t shr(int16_t var1, int16_t var2); /* Short shift right, 1 */
107int32_t L_sub(int32_t L_var1, int32_t L_var2); /* Long sub, 2 */
108int32_t L_shl(int32_t L_var1, int16_t var2); /* Long shift left, 2 */
109int32_t L_shr(int32_t L_var1, int16_t var2); /* Long shift right, 2 */
110int16_t norm_s(int16_t var1); /* Short norm, 15 */
111int16_t div_s(int16_t var1, int16_t var2); /* Short division, 18 */
112int16_t norm_l(int32_t L_var1); /* Long norm, 30 */
113
114#endif
115
116/*- End of file ------------------------------------------------------------*/