123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251 |
- /*!
- ************************************************************************
- * \file
- * ifunctions.h
- *
- * \brief
- * define some inline functions that are used within the encoder.
- *
- * \author
- * Main contributors (see contributors.h for copyright, address and affiliation details)
- * - Karsten Sühring <[email protected]>
- * - Alexis Tourapis <[email protected]>
- *
- ************************************************************************
- */
- #ifndef _IFUNCTIONS_H_
- #define _IFUNCTIONS_H_
- # if !defined(WIN32) && (__STDC_VERSION__ < 199901L)
- #define static
- #define inline
- #endif
- #include <math.h>
- #include <limits.h>
- static inline short smin(short a, short b)
- {
- return (short) (((a) < (b)) ? (a) : (b));
- }
- static inline short smax(short a, short b)
- {
- return (short) (((a) > (b)) ? (a) : (b));
- }
- static inline int imin(int a, int b)
- {/*
- int retu;
- _asm
- {
- mov eax, a
- mov edx, b
- cmp edx, eax
- cmovle eax, edx
- mov retu, eax
- }
- return retu;*/
- return ((a) < (b)) ? (a) : (b);
- }
- static inline int imax(int a, int b)
- {
- return ((a) > (b)) ? (a) : (b);
- }
- static inline double dmin(double a, double b)
- {
- return ((a) < (b)) ? (a) : (b);
- }
- static inline double dmax(double a, double b)
- {
- return ((a) > (b)) ? (a) : (b);
- }
- static inline int64 i64min(int64 a, int64 b)
- {
- return ((a) < (b)) ? (a) : (b);
- }
- static inline int64 i64max(int64 a, int64 b)
- {
- return ((a) > (b)) ? (a) : (b);
- }
- static inline short sabs(short x)
- {
- static const short SHORT_BITS = (sizeof(short) * CHAR_BIT) - 1;
- short y = (short) (x >> SHORT_BITS);
- return (short) ((x ^ y) - y);
- }
- static inline int iabs(int x)
- {
- static const int INT_BITS = (sizeof(int) * CHAR_BIT) - 1;
- int y = x >> INT_BITS;
- return (x ^ y) - y;
- }
- static inline double dabs(double x)
- {
- return ((x) < 0) ? -(x) : (x);
- }
- static inline int64 i64abs(int64 x)
- {
- static const int64 INT64_BITS = (sizeof(int64) * CHAR_BIT) - 1;
- int64 y = x >> INT64_BITS;
- return (x ^ y) - y;
- }
- static inline double dabs2(double x)
- {
- return (x) * (x);
- }
- static inline int iabs2(int x)
- {
- return (x) * (x);
- }
- static inline int64 i64abs2(int64 x)
- {
- return (x) * (x);
- }
- static inline int isign(int x)
- {
- return ( (x > 0) - (x < 0));
- }
- static inline int isignab(int a, int b)
- {
- return ((b) < 0) ? -iabs(a) : iabs(a);
- }
- static inline int rshift_rnd(int x, int a)
- {
- return (a > 0) ? ((x + (1 << (a-1) )) >> a) : (x << (-a));
- }
- static inline int rshift_rnd_pos(int x, int a)
- {
- return (x + (1 << (a-1) )) >> a;
- }
- // flip a before calling
- static inline int rshift_rnd_nonpos(int x, int a)
- {
- return (x << a);
- }
- static inline int rshift_rnd_sign(int x, int a)
- {
- return (x > 0) ? ( ( x + (1 << (a-1)) ) >> a ) : (-( ( iabs(x) + (1 << (a-1)) ) >> a ));
- }
- static inline unsigned int rshift_rnd_us(unsigned int x, unsigned int a)
- {
- return (a > 0) ? ((x + (1 << (a-1))) >> a) : x;
- }
- static inline int rshift_rnd_sf(int x, int a)
- {
- return ((x + (1 << (a-1) )) >> a);
- }
- static inline unsigned int rshift_rnd_us_sf(unsigned int x, unsigned int a)
- {
- return ((x + (1 << (a-1))) >> a);
- }
- static inline int iClip1(int high, int x)
- {
- if (x < 0)
- return 0;
- if (x > high)
- return high;
- return x;
- /* old:
- x = imax(x, 0);
- x = imin(x, high);
- return x;*/
- }
- static inline int iClip3(int low, int high, int x)
- {
- if (x < low)
- return low;
- if (x > high)
- return high;
- return x;
- /* old:
- x = imax(x, low);
- x = imin(x, high);
- return x;*/
- }
- static inline short sClip3(short low, short high, short x)
- {
- x = smax(x, low);
- x = smin(x, high);
- return x;
- }
- static inline double dClip3(double low, double high, double x)
- {
- x = dmax(x, low);
- x = dmin(x, high);
- return x;
- }
- static inline int weighted_cost(int factor, int bits)
- {
- return (((factor)*(bits))>>LAMBDA_ACCURACY_BITS);
- }
- static inline int RSD(int x)
- {
- return ((x&2)?(x|1):(x&(~1)));
- }
- static inline int power2(int x)
- {
- return 1 << (x);
- }
- static inline int float2int (float x)
- {
- return (int)((x < 0) ? (x - 0.5f) : (x + 0.5f));
- }
- #if ZEROSNR
- static inline float psnr(int max_sample_sq, int samples, float sse_distortion )
- {
- return (float) (10.0 * log10(max_sample_sq * (double) ((double) samples / (sse_distortion < 1.0 ? 1.0 : sse_distortion))));
- }
- #else
- static inline float psnr(int max_sample_sq, int samples, float sse_distortion )
- {
- return (float) (sse_distortion == 0.0 ? 0.0 : (10.0 * log10(max_sample_sq * (double) ((double) samples / sse_distortion))));
- }
- #endif
- # if !defined(WIN32) && (__STDC_VERSION__ < 199901L)
- #undef static
- #undef inline
- #endif
- #endif
|