X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=common%2Fosdep.h;h=28a2e85f0f3a98c933869375d06614efa8378aea;hb=0d668be8d7525992c1c163c97551ee897e43c177;hp=6249dbe0c53085167a4556ce85c4a8136abbfc90;hpb=4c624dccf4d1e13653be90c26dac49664c0f8241;p=x264 diff --git a/common/osdep.h b/common/osdep.h index 6249dbe0..28a2e85f 100644 --- a/common/osdep.h +++ b/common/osdep.h @@ -1,10 +1,11 @@ /***************************************************************************** * osdep.h: platform-specific code ***************************************************************************** - * Copyright (C) 2007-2011 x264 project + * Copyright (C) 2007-2014 x264 project * * Authors: Loren Merritt * Laurent Aimar + * Henrik Gramner * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -31,13 +32,15 @@ #define _FILE_OFFSET_BITS 64 #include #include +#include +#include #include "config.h" -#if HAVE_STDINT_H -#include +#ifdef __INTEL_COMPILER +#include #else -#include +#include #endif #if !HAVE_LOG2F @@ -45,11 +48,6 @@ #define log2(x) (log(x)/0.693147180559945) #endif -#ifdef _WIN32 -#include // _setmode() -#include // _O_BINARY -#endif - #ifdef __ICL #define inline __inline #define strcasecmp _stricmp @@ -59,12 +57,6 @@ #define S_ISREG(x) (((x) & S_IFMT) == S_IFREG) #endif -#ifdef __INTEL_COMPILER -#include -#else -#include -#endif - #if (defined(__GNUC__) || defined(__INTEL_COMPILER)) && (ARCH_X86 || ARCH_X86_64) #define HAVE_X86_INLINE_ASM 1 #endif @@ -72,11 +64,29 @@ #if !defined(isfinite) && (SYS_OPENBSD || SYS_SunOS) #define isfinite finite #endif + #ifdef _WIN32 -#define rename(src,dst) (unlink(dst), rename(src,dst)) // POSIX says that rename() removes the destination, but win32 doesn't. #ifndef strtok_r #define strtok_r(str,delim,save) strtok(str,delim) #endif + +#define utf8_to_utf16( utf8, utf16 )\ + MultiByteToWideChar( CP_UTF8, MB_ERR_INVALID_CHARS, utf8, -1, utf16, sizeof(utf16)/sizeof(wchar_t) ) +FILE *x264_fopen( const char *filename, const char *mode ); +int x264_rename( const char *oldname, const char *newname ); +#define x264_struct_stat struct _stati64 +#define x264_fstat _fstati64 +int x264_stat( const char *path, x264_struct_stat *buf ); +int x264_vfprintf( FILE *stream, const char *format, va_list arg ); +int x264_is_pipe( const char *path ); +#else +#define x264_fopen fopen +#define x264_rename rename +#define x264_struct_stat struct stat +#define x264_fstat fstat +#define x264_stat stat +#define x264_vfprintf vfprintf +#define x264_is_pipe(x) 0 #endif #ifdef __ICL @@ -84,6 +94,7 @@ #else #define DECLARE_ALIGNED( var, n ) var __attribute__((aligned(n))) #endif +#define ALIGNED_32( var ) DECLARE_ALIGNED( var, 32 ) #define ALIGNED_16( var ) DECLARE_ALIGNED( var, 16 ) #define ALIGNED_8( var ) DECLARE_ALIGNED( var, 8 ) #define ALIGNED_4( var ) DECLARE_ALIGNED( var, 4 ) @@ -94,24 +105,47 @@ // - armcc can't either, but is nice enough to actually tell you so // - Apple gcc only maintains 4 byte alignment // - llvm can align the stack, but only in svn and (unrelated) it exposes bugs in all released GNU binutils... + +#define ALIGNED_ARRAY_EMU( mask, type, name, sub1, ... )\ + uint8_t name##_u [sizeof(type sub1 __VA_ARGS__) + mask]; \ + type (*name) __VA_ARGS__ = (void*)((intptr_t)(name##_u+mask) & ~mask) + #if ARCH_ARM && SYS_MACOSX -#define ALIGNED_ARRAY_8( type, name, sub1, ... )\ - uint8_t name##_u [sizeof(type sub1 __VA_ARGS__) + 7]; \ - type (*name) __VA_ARGS__ = (void*)((intptr_t)(name##_u+7) & ~7) +#define ALIGNED_ARRAY_8( ... ) ALIGNED_ARRAY_EMU( 7, __VA_ARGS__ ) #else #define ALIGNED_ARRAY_8( type, name, sub1, ... )\ ALIGNED_8( type name sub1 __VA_ARGS__ ) #endif #if ARCH_ARM -#define ALIGNED_ARRAY_16( type, name, sub1, ... )\ - uint8_t name##_u [sizeof(type sub1 __VA_ARGS__) + 15];\ - type (*name) __VA_ARGS__ = (void*)((intptr_t)(name##_u+15) & ~15) +#define ALIGNED_ARRAY_16( ... ) ALIGNED_ARRAY_EMU( 15, __VA_ARGS__ ) #else #define ALIGNED_ARRAY_16( type, name, sub1, ... )\ ALIGNED_16( type name sub1 __VA_ARGS__ ) #endif +#define EXPAND(x) x + +#if HAVE_32B_STACK_ALIGNMENT +#define ALIGNED_ARRAY_32( type, name, sub1, ... )\ + ALIGNED_32( type name sub1 __VA_ARGS__ ) +#else +#define ALIGNED_ARRAY_32( ... ) EXPAND( ALIGNED_ARRAY_EMU( 31, __VA_ARGS__ ) ) +#endif + +#define ALIGNED_ARRAY_64( ... ) EXPAND( ALIGNED_ARRAY_EMU( 63, __VA_ARGS__ ) ) + +/* For AVX2 */ +#if ARCH_X86 || ARCH_X86_64 +#define NATIVE_ALIGN 32 +#define ALIGNED_N ALIGNED_32 +#define ALIGNED_ARRAY_N ALIGNED_ARRAY_32 +#else +#define NATIVE_ALIGN 16 +#define ALIGNED_N ALIGNED_16 +#define ALIGNED_ARRAY_N ALIGNED_ARRAY_16 +#endif + #define UNINIT(x) x=x #if defined(__GNUC__) && (__GNUC__ > 3 || __GNUC__ == 3 && __GNUC_MINOR__ > 0) @@ -148,7 +182,7 @@ static inline int x264_pthread_create( x264_pthread_t *t, void *a, void *(*f)(vo return 0; } #define x264_pthread_join(t,s) { long tmp; \ - wait_for_thread(t,(s)?(long*)(*(s)):&tmp); } + wait_for_thread(t,(s)?(long*)(s):&tmp); } #elif HAVE_POSIXTHREAD #include @@ -203,6 +237,25 @@ int x264_threading_init( void ); #define x264_threading_init() 0 #endif +static ALWAYS_INLINE int x264_pthread_fetch_and_add( int *val, int add, x264_pthread_mutex_t *mutex ) +{ +#if HAVE_THREAD +#if defined(__GNUC__) && (__GNUC__ > 4 || __GNUC__ == 4 && __GNUC_MINOR__ > 0) && ARCH_X86 + return __sync_fetch_and_add( val, add ); +#else + x264_pthread_mutex_lock( mutex ); + int res = *val; + *val += add; + x264_pthread_mutex_unlock( mutex ); + return res; +#endif +#else + int res = *val; + *val += add; + return res; +#endif +} + #define WORD_SIZE sizeof(void*) #define asm __asm__ @@ -253,6 +306,13 @@ static ALWAYS_INLINE uint16_t endian_fix16( uint16_t x ) } #endif +/* For values with 4 bits or less. */ +static int ALWAYS_INLINE x264_ctz_4bit( uint32_t x ) +{ + static uint8_t lut[16] = {4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0}; + return lut[x]; +} + #if defined(__GNUC__) && (__GNUC__ > 3 || __GNUC__ == 3 && __GNUC_MINOR__ > 3) #define x264_clz(x) __builtin_clz(x) #define x264_ctz(x) __builtin_ctz(x) @@ -319,19 +379,19 @@ static ALWAYS_INLINE void x264_prefetch( void *p ) #define x264_lower_thread_priority(p) #endif -static inline uint8_t x264_is_regular_file( FILE *filehandle ) +static inline int x264_is_regular_file( FILE *filehandle ) { - struct stat file_stat; - if( fstat( fileno( filehandle ), &file_stat ) ) - return -1; + x264_struct_stat file_stat; + if( x264_fstat( fileno( filehandle ), &file_stat ) ) + return 1; return S_ISREG( file_stat.st_mode ); } -static inline uint8_t x264_is_regular_file_path( const char *filename ) +static inline int x264_is_regular_file_path( const char *filename ) { - struct stat file_stat; - if( stat( filename, &file_stat ) ) - return -1; + x264_struct_stat file_stat; + if( x264_stat( filename, &file_stat ) ) + return !x264_is_pipe( filename ); return S_ISREG( file_stat.st_mode ); }