libg722_1
0.0.1
|
00001 /* 00002 * g722_1 - a library for the G.722.1 and Annex C codecs 00003 * 00004 * basops32.h 00005 * 00006 * Adapted by Steve Underwood <steveu@coppice.org> from the reference 00007 * code supplied with ITU G.722.1, which is: 00008 * 00009 * (C) 2004 Polycom, Inc. 00010 * All rights reserved. 00011 * 00012 * This program is distributed in the hope that it will be useful, 00013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 00015 */ 00016 00017 #if !defined(BASOP32_H_DEFINED) 00018 #define BASOP32_H_DEFINED 00019 00020 int32_t L_add(int32_t L_var1, int32_t L_var2); 00021 00022 static __inline__ int16_t saturate(int32_t amp) 00023 { 00024 int16_t amp16; 00025 00026 /* Hopefully this is optimised for the common case - not clipping */ 00027 amp16 = (int16_t) amp; 00028 if (amp == amp16) 00029 return amp16; 00030 if (amp > INT16_MAX) 00031 return INT16_MAX; 00032 return INT16_MIN; 00033 } 00034 /*- End of function --------------------------------------------------------*/ 00035 00036 static __inline__ int16_t xround(int32_t L_var1) 00037 { 00038 return (int16_t) (L_add(L_var1, (int32_t) 0x00008000L) >> 16); 00039 } 00040 /*- End of function --------------------------------------------------------*/ 00041 00042 static __inline__ int16_t abs_s(int16_t var1) 00043 { 00044 if (var1 == INT16_MIN) 00045 return INT16_MAX; 00046 return abs(var1); 00047 } 00048 /*- End of function --------------------------------------------------------*/ 00049 00050 static __inline__ int16_t add(int16_t var1, int16_t var2) 00051 { 00052 return saturate((int32_t) var1 + var2); 00053 } 00054 /*- End of function --------------------------------------------------------*/ 00055 00056 static __inline__ int16_t sub(int16_t var1, int16_t var2) 00057 { 00058 return saturate((int32_t) var1 - var2); 00059 } 00060 /*- End of function --------------------------------------------------------*/ 00061 00062 static __inline__ int16_t mult(int16_t var1, int16_t var2) 00063 { 00064 return saturate(((int32_t) var1*(int32_t) var2) >> 15); 00065 } 00066 /*- End of function --------------------------------------------------------*/ 00067 00068 static __inline__ int32_t L_mult0(int16_t var1, int16_t var2) 00069 { 00070 return (int32_t) var1*(int32_t) var2; 00071 } 00072 /*- End of function --------------------------------------------------------*/ 00073 00074 static __inline__ int32_t L_mac0(int32_t L_var3, int16_t var1, int16_t var2) 00075 { 00076 return L_add(L_var3, L_mult0(var1, var2)); 00077 } 00078 /*- End of function --------------------------------------------------------*/ 00079 00080 static __inline__ int32_t L_mult(int16_t var1, int16_t var2) 00081 { 00082 int32_t L_var_out; 00083 00084 L_var_out = (int32_t) var1*(int32_t) var2; 00085 if (L_var_out == (int32_t) 0x40000000L) 00086 return INT32_MAX; 00087 return L_var_out << 1; 00088 } 00089 /*- End of function --------------------------------------------------------*/ 00090 00091 static __inline__ int16_t negate(int16_t var1) 00092 { 00093 if (var1 == INT16_MIN) 00094 return INT16_MAX; 00095 return -var1; 00096 } 00097 /*- End of function --------------------------------------------------------*/ 00098 00099 static __inline__ int32_t L_mac(int32_t L_var3, int16_t var1, int16_t var2) 00100 { 00101 return L_add(L_var3, L_mult(var1, var2)); 00102 } 00103 /*- End of function --------------------------------------------------------*/ 00104 00105 int16_t shl(int16_t var1, int16_t var2); /* Short shift left, 1 */ 00106 int16_t shr(int16_t var1, int16_t var2); /* Short shift right, 1 */ 00107 int32_t L_sub(int32_t L_var1, int32_t L_var2); /* Long sub, 2 */ 00108 int32_t L_shl(int32_t L_var1, int16_t var2); /* Long shift left, 2 */ 00109 int32_t L_shr(int32_t L_var1, int16_t var2); /* Long shift right, 2 */ 00110 int16_t norm_s(int16_t var1); /* Short norm, 15 */ 00111 int16_t div_s(int16_t var1, int16_t var2); /* Short division, 18 */ 00112 int16_t norm_l(int32_t L_var1); /* Long norm, 30 */ 00113 00114 #endif 00115 00116 /*- End of file ------------------------------------------------------------*/