basop32.h

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  * $Id: basop32.h,v 1.4 2008/11/22 15:39:15 steveu Exp $
00017  */
00018 
00019 #if !defined(BASOP32_H_DEFINED)
00020 #define BASOP32_H_DEFINED
00021 
00022 int32_t L_add(int32_t L_var1, int32_t L_var2);
00023 
00024 static __inline__ int16_t saturate(int32_t amp)
00025 {
00026     int16_t amp16;
00027 
00028     /* Hopefully this is optimised for the common case - not clipping */
00029     amp16 = (int16_t) amp;
00030     if (amp == amp16)
00031         return amp16;
00032     if (amp > INT16_MAX)
00033         return INT16_MAX;
00034     return INT16_MIN;
00035 }
00036 /*- End of function --------------------------------------------------------*/
00037 
00038 static __inline__ int16_t xround(int32_t L_var1)
00039 {
00040     return (int16_t) (L_add(L_var1, (int32_t) 0x00008000L) >> 16);
00041 }
00042 /*- End of function --------------------------------------------------------*/
00043 
00044 static __inline__ int16_t abs_s(int16_t var1)
00045 {
00046     if (var1 == INT16_MIN)
00047         return INT16_MAX;
00048     return abs(var1);
00049 }
00050 /*- End of function --------------------------------------------------------*/
00051 
00052 static __inline__ int16_t add(int16_t var1, int16_t var2)
00053 {
00054     return saturate((int32_t) var1 + var2);
00055 }
00056 /*- End of function --------------------------------------------------------*/
00057 
00058 static __inline__ int16_t sub(int16_t var1, int16_t var2)
00059 {
00060     return saturate((int32_t) var1 - var2);
00061 }
00062 /*- End of function --------------------------------------------------------*/
00063 
00064 static __inline__ int16_t mult(int16_t var1, int16_t var2)
00065 {
00066     return saturate(((int32_t) var1*(int32_t) var2) >> 15);
00067 }
00068 /*- End of function --------------------------------------------------------*/
00069 
00070 static __inline__ int32_t L_mult0(int16_t var1, int16_t var2)
00071 {
00072     return (int32_t) var1*(int32_t) var2;
00073 }
00074 /*- End of function --------------------------------------------------------*/
00075 
00076 static __inline__ int32_t L_mac0(int32_t L_var3, int16_t var1, int16_t var2)
00077 {
00078     return L_add(L_var3, L_mult0(var1, var2));
00079 }
00080 /*- End of function --------------------------------------------------------*/
00081 
00082 static __inline__ int32_t L_mult(int16_t var1, int16_t var2)
00083 {
00084     int32_t L_var_out;
00085 
00086     L_var_out = (int32_t) var1*(int32_t) var2;
00087     if (L_var_out == (int32_t) 0x40000000L)
00088         return INT32_MAX;
00089     return L_var_out << 1;
00090 }
00091 /*- End of function --------------------------------------------------------*/
00092 
00093 static __inline__ int16_t negate(int16_t var1)
00094 {
00095     if (var1 == INT16_MIN)
00096         return INT16_MAX;
00097     return -var1;
00098 }
00099 /*- End of function --------------------------------------------------------*/
00100 
00101 static __inline__ int32_t L_mac(int32_t L_var3, int16_t var1, int16_t var2)
00102 {
00103     return L_add(L_var3, L_mult(var1, var2));
00104 }
00105 /*- End of function --------------------------------------------------------*/
00106 
00107 int16_t shl(int16_t var1, int16_t var2);        /* Short shift left,      1 */
00108 int16_t shr(int16_t var1, int16_t var2);        /* Short shift right,     1 */
00109 int32_t L_sub(int32_t L_var1, int32_t L_var2);  /* Long sub,              2 */
00110 int32_t L_shl(int32_t L_var1, int16_t var2);    /* Long shift left,       2 */
00111 int32_t L_shr(int32_t L_var1, int16_t var2);    /* Long shift right,      2 */
00112 int16_t norm_s(int16_t var1);                   /* Short norm,           15 */
00113 int16_t div_s(int16_t var1, int16_t var2);      /* Short division,       18 */
00114 int16_t norm_l(int32_t L_var1);                 /* Long norm,            30 */
00115 
00116 #endif
00117 
00118 /*- End of file ------------------------------------------------------------*/

Generated on 16 Jul 2011 for libg722_1 by  doxygen 1.6.1