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 
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 ------------------------------------------------------------*/

Generated on 29 Mar 2018 for libg722_1 by  doxygen 1.6.1