X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavutil%2Finternal.h;h=a41a94636f10dde457d1877380416e8a08c06f2e;hb=3344cf851c55d80080ec8f47bb1637200619ed5f;hp=e2316e647a87acffb668d1c2676979a661058c64;hpb=635eb0cc3d65b074e03c8dd608345f96631c459f;p=ffmpeg diff --git a/libavutil/internal.h b/libavutil/internal.h index e2316e647a8..a41a94636f1 100644 --- a/libavutil/internal.h +++ b/libavutil/internal.h @@ -19,145 +19,172 @@ */ /** - * @file internal.h - * common internal api header. + * @file libavutil/internal.h + * common internal API header */ -#ifndef INTERNAL_H -#define INTERNAL_H +#ifndef AVUTIL_INTERNAL_H +#define AVUTIL_INTERNAL_H -#if ( defined(__PIC__) || defined(__pic__) ) && ! defined(PIC) -# define PIC +#if !defined(DEBUG) && !defined(NDEBUG) +# define NDEBUG +#endif + +#include +#include +#include +#include +#include "config.h" +#include "common.h" +#include "mem.h" +#include "timer.h" + +#ifndef attribute_align_arg +#if (!defined(__ICC) || __ICC > 1100) && AV_GCC_VERSION_AT_LEAST(4,2) +# define attribute_align_arg __attribute__((force_align_arg_pointer)) +#else +# define attribute_align_arg +#endif #endif -#ifndef ENODATA -# define ENODATA 61 +#ifndef attribute_used +#if AV_GCC_VERSION_AT_LEAST(3,1) +# define attribute_used __attribute__((used)) +#else +# define attribute_used +#endif #endif -#include "bswap.h" +#ifndef INT16_MIN +#define INT16_MIN (-0x7fff-1) +#endif -#include -#ifndef offsetof -# define offsetof(T,F) ((unsigned int)((char *)&((T *)0)->F)) +#ifndef INT16_MAX +#define INT16_MAX 0x7fff +#endif + +#ifndef INT32_MIN +#define INT32_MIN (-0x7fffffff-1) +#endif + +#ifndef INT32_MAX +#define INT32_MAX 0x7fffffff #endif -#ifdef __MINGW32__ -# ifdef _DEBUG -# define DEBUG -# endif +#ifndef UINT32_MAX +#define UINT32_MAX 0xffffffff +#endif -# define snprintf _snprintf -# define vsnprintf _vsnprintf +#ifndef INT64_MIN +#define INT64_MIN (-0x7fffffffffffffffLL-1) +#endif -# ifdef CONFIG_WINCE -# define perror(a) -# endif +#ifndef INT64_MAX +#define INT64_MAX INT64_C(9223372036854775807) +#endif -/* __MINGW32__ end */ -#elif defined (CONFIG_OS2) -/* OS/2 EMX */ +#ifndef UINT64_MAX +#define UINT64_MAX UINT64_C(0xFFFFFFFFFFFFFFFF) +#endif -# include +#ifndef INT_BIT +# define INT_BIT (CHAR_BIT * sizeof(int)) +#endif -#endif /* !__MINGW32__ && CONFIG_OS2 */ +#if ( defined(__PIC__) || defined(__pic__) ) && ! defined(PIC) +# define PIC +#endif -#ifdef USE_FASTMEMCPY -# include "libvo/fastmemcpy.h" +#ifndef offsetof +# define offsetof(T,F) ((unsigned int)((char *)&((T *)0)->F)) #endif // Use rip-relative addressing if compiling PIC code on x86-64. -#if defined(__MINGW32__) || defined(__CYGWIN__) || \ - defined(__OS2__) || (defined (__OpenBSD__) && !defined(__ELF__)) -# if defined(ARCH_X86_64) && defined(PIC) -# define MANGLE(a) "_" #a"(%%rip)" -# else -# define MANGLE(a) "_" #a -# endif +#if ARCH_X86_64 && defined(PIC) +# define LOCAL_MANGLE(a) #a "(%%rip)" #else -# if defined(ARCH_X86_64) && defined(PIC) -# define MANGLE(a) #a"(%%rip)" -# elif defined(CONFIG_DARWIN) -# define MANGLE(a) "_" #a -# else -# define MANGLE(a) #a -# endif +# define LOCAL_MANGLE(a) #a #endif -/* debug stuff */ +#define MANGLE(a) EXTERN_PREFIX LOCAL_MANGLE(a) -#if !defined(DEBUG) && !defined(NDEBUG) -# define NDEBUG -#endif -#include +/* debug stuff */ /* dprintf macros */ #ifdef DEBUG -# define dprintf(fmt,...) av_log(NULL, AV_LOG_DEBUG, fmt, __VA_ARGS__) +# define dprintf(pctx, ...) av_log(pctx, AV_LOG_DEBUG, __VA_ARGS__) #else -# define dprintf(fmt,...) -#endif - -#ifdef CONFIG_WINCE -# define abort() +# define dprintf(pctx, ...) #endif #define av_abort() do { av_log(NULL, AV_LOG_ERROR, "Abort at %s:%d\n", __FILE__, __LINE__); abort(); } while (0) +/* math */ + extern const uint32_t ff_inverse[256]; -#if defined(ARCH_X86) +#if ARCH_X86 # define FASTDIV(a,b) \ ({\ int ret,dmy;\ - asm volatile(\ + __asm__ volatile(\ "mull %3"\ :"=d"(ret),"=a"(dmy)\ :"1"(a),"g"(ff_inverse[b])\ );\ ret;\ }) -#elif defined(ARCH_ARMV4L) -# define FASTDIV(a,b) \ - ({\ - int ret,dmy;\ - asm volatile(\ - "umull %1, %0, %2, %3"\ - :"=&r"(ret),"=&r"(dmy)\ - :"r"(a),"r"(ff_inverse[b])\ - );\ - ret;\ - }) -#elif defined(CONFIG_FASTDIV) +#elif HAVE_ARMV6 && HAVE_INLINE_ASM +static inline av_const int FASTDIV(int a, int b) +{ + int r, t; + __asm__ volatile("cmp %3, #2 \n\t" + "ldr %1, [%4, %3, lsl #2] \n\t" + "lsrle %0, %2, #1 \n\t" + "smmulgt %0, %1, %2 \n\t" + : "=&r"(r), "=&r"(t) : "r"(a), "r"(b), "r"(ff_inverse)); + return r; +} +#elif ARCH_ARM && HAVE_INLINE_ASM +static inline av_const int FASTDIV(int a, int b) +{ + int r, t; + __asm__ volatile ("umull %1, %0, %2, %3" + : "=&r"(r), "=&r"(t) : "r"(a), "r"(ff_inverse[b])); + return r; +} +#elif CONFIG_FASTDIV # define FASTDIV(a,b) ((uint32_t)((((uint64_t)a)*ff_inverse[b])>>32)) #else # define FASTDIV(a,b) ((a)/(b)) #endif -/* math */ -extern FF_IMPORT_ATTR const uint8_t ff_sqrt_tab[128]; +extern const uint8_t ff_sqrt_tab[256]; -static inline int ff_sqrt(int a) +static inline av_const unsigned int ff_sqrt(unsigned int a) { - int ret=0; - int s; - int ret_sq=0; - - if(a<128) return ff_sqrt_tab[a]; - - for(s=15; s>=0; s--){ - int b= ret_sq + (1<<(s*2)) + (ret<>4; + else if(a<(1<<12)) b= ff_sqrt_tab[a>>4 ]>>2; +#if !CONFIG_SMALL + else if(a<(1<<14)) b= ff_sqrt_tab[a>>6 ]>>1; + else if(a<(1<<16)) b= ff_sqrt_tab[a>>8 ] ; +#endif + else{ + int s= av_log2_16bit(a>>16)>>1; + unsigned int c= a>>(s+2); + b= ff_sqrt_tab[c>>(s+8)]; + b= FASTDIV(c,b) + (b< 0) ? floor(x + 0.5) : ceil(x - 0.5); +} +#endif /* HAVE_ROUND */ + +#if !HAVE_ROUNDF +static av_always_inline av_const float roundf(float x) +{ + return (x > 0) ? floor(x + 0.5) : ceil(x - 0.5); +} +#endif /* HAVE_ROUNDF */ + +#if !HAVE_TRUNCF +static av_always_inline av_const float truncf(float x) +{ + return (x > 0) ? floor(x) : ceil(x); +} +#endif /* HAVE_TRUNCF */ + +/** + * Returns NULL if CONFIG_SMALL is true, otherwise the argument + * without modification. Used to disable the definition of strings + * (for example AVCodec long_names). + */ +#if CONFIG_SMALL +# define NULL_IF_CONFIG_SMALL(x) NULL +#else +# define NULL_IF_CONFIG_SMALL(x) x +#endif + +#endif /* AVUTIL_INTERNAL_H */