00001 00017 #ifndef _IFUNCTIONS_H_ 00018 #define _IFUNCTIONS_H_ 00019 00020 # if !defined(WIN32) && (__STDC_VERSION__ < 199901L) 00021 #define static 00022 #define inline 00023 #endif 00024 #include <math.h> 00025 00026 static inline int imin(int a, int b) 00027 { 00028 return ((a) < (b)) ? (a) : (b); 00029 } 00030 00031 static inline int imax(int a, int b) 00032 { 00033 return ((a) > (b)) ? (a) : (b); 00034 } 00035 00036 static inline double dmin(double a, double b) 00037 { 00038 return ((a) < (b)) ? (a) : (b); 00039 } 00040 00041 static inline double dmax(double a, double b) 00042 { 00043 return ((a) > (b)) ? (a) : (b); 00044 } 00045 00046 static inline int64 i64min(int64 a, int64 b) 00047 { 00048 return ((a) < (b)) ? (a) : (b); 00049 } 00050 00051 static inline int64 i64max(int64 a, int64 b) 00052 { 00053 return ((a) > (b)) ? (a) : (b); 00054 } 00055 00056 static inline int sabs(short x) 00057 { 00058 return ((x) < 0) ? -(x) : (x); 00059 } 00060 00061 static inline int iabs(int x) 00062 { 00063 return ((x) < 0) ? -(x) : (x); 00064 } 00065 00066 static inline double dabs(double x) 00067 { 00068 return ((x) < 0) ? -(x) : (x); 00069 } 00070 00071 static inline int64 i64abs(int64 x) 00072 { 00073 return ((x) < 0) ? -(x) : (x); 00074 } 00075 00076 static inline double dabs2(double x) 00077 { 00078 return (x) * (x); 00079 } 00080 00081 static inline int iabs2(int x) 00082 { 00083 return (x) * (x); 00084 } 00085 00086 static inline int64 i64abs2(int64 x) 00087 { 00088 return (x) * (x); 00089 } 00090 00091 static inline int isign(int x) 00092 { 00093 return ((x) < 0) ? -1 : 1; 00094 } 00095 00096 static inline int isignab(int a, int b) 00097 { 00098 return ((b) < 0) ? -iabs(a) : iabs(a); 00099 } 00100 00101 static inline int rshift_rnd(int x, int a) 00102 { 00103 return (a > 0) ? ((x + (1 << (a-1) )) >> a) : (x << (-a)); 00104 } 00105 00106 static inline int rshift_rnd_sign(int x, int a) 00107 { 00108 return (x > 0) ? ( ( x + (1 << (a-1)) ) >> a ) : (-( ( iabs(x) + (1 << (a-1)) ) >> a )); 00109 } 00110 00111 static inline unsigned int rshift_rnd_us(unsigned int x, unsigned int a) 00112 { 00113 return (a > 0) ? ((x + (1 << (a-1))) >> a) : x; 00114 } 00115 00116 static inline int rshift_rnd_sf(int x, int a) 00117 { 00118 return ((x + (1 << (a-1) )) >> a); 00119 } 00120 00121 static inline unsigned int rshift_rnd_us_sf(unsigned int x, unsigned int a) 00122 { 00123 return ((x + (1 << (a-1))) >> a); 00124 } 00125 00126 static inline int iClip1(int high, int x) 00127 { 00128 x = imax(x, 0); 00129 x = imin(x, high); 00130 00131 return x; 00132 } 00133 00134 static inline int iClip3(int low, int high, int x) 00135 { 00136 x = imax(x, low); 00137 x = imin(x, high); 00138 00139 return x; 00140 } 00141 00142 static inline double dClip3(double low, double high, double x) 00143 { 00144 x = dmax(x, low); 00145 x = dmin(x, high); 00146 00147 return x; 00148 } 00149 00150 static inline int RSD(int x) 00151 { 00152 return ((x&2)?(x|1):(x&(~1))); 00153 } 00154 00155 static inline int power2(int x) 00156 { 00157 return 1 << (x); 00158 } 00159 00160 static inline int float2int (float x) 00161 { 00162 return (int)((x < 0) ? (x - 0.5f) : (x + 0.5f)); 00163 } 00164 00165 static inline int get_bit(int64 x,int n) 00166 { 00167 return (int)(((x >> n) & 1)); 00168 } 00169 00170 #if ZEROSNR 00171 static inline float psnr(int max_sample_sq, int samples, float sse_distortion ) 00172 { 00173 return (float) (10.0 * log10(max_sample_sq * (double) ((double) samples / (sse_distortion == 0.0 ? 1.0 : sse_distortion)))); 00174 } 00175 #else 00176 static inline float psnr(int max_sample_sq, int samples, float sse_distortion ) 00177 { 00178 return (float) (sse_distortion == 0.0 ? 0.0 : (10.0 * log10(max_sample_sq * (double) ((double) samples / sse_distortion)))); 00179 } 00180 #endif 00181 00182 00183 # if !defined(WIN32) && (__STDC_VERSION__ < 199901L) 00184 #undef static 00185 #undef inline 00186 #endif 00187 00188 #endif 00189