diff --git a/media/libvpx/Makefile.in b/media/libvpx/Makefile.in index f73acfb2023..101c0f2be45 100644 --- a/media/libvpx/Makefile.in +++ b/media/libvpx/Makefile.in @@ -202,3 +202,13 @@ endif endif include $(topsrcdir)/config/rules.mk + +# Workaround a bug of Sun Studio (CR 6963410) +ifdef SOLARIS_SUNPRO_CC +ifeq (86,$(findstring 86,$(OS_TEST))) +filter_c.o: filter_c.c Makefile.in + $(REPORT_BUILD) + @$(MAKE_DEPS_AUTO_CC) + $(CC) -o $@ -c $(patsubst -xO[45],-xO3,$(COMPILE_CFLAGS)) $< +endif +endif diff --git a/media/libvpx/solaris.patch b/media/libvpx/solaris.patch new file mode 100644 index 00000000000..67ab854079b --- /dev/null +++ b/media/libvpx/solaris.patch @@ -0,0 +1,215 @@ +diff --git a/media/libvpx/vp8/common/loopfilter_filters.c b/media/libvpx/vp8/common/loopfilter_filters.c +--- a/media/libvpx/vp8/common/loopfilter_filters.c ++++ b/media/libvpx/vp8/common/loopfilter_filters.c +@@ -8,16 +8,19 @@ + * be found in the AUTHORS file in the root of the source tree. + */ + + + #include + #include "loopfilter.h" + #include "onyxc_int.h" + ++#ifdef __SUNPRO_C ++#define __inline static inline ++#endif + + #define NEW_LOOPFILTER_MASK + + typedef unsigned char uc; + + __inline signed char vp8_signed_char_clamp(int t) + { + t = (t < -128 ? -128 : t); +diff --git a/media/libvpx/vpx/internal/vpx_codec_internal.h b/media/libvpx/vpx/internal/vpx_codec_internal.h +--- a/media/libvpx/vpx/internal/vpx_codec_internal.h ++++ b/media/libvpx/vpx/internal/vpx_codec_internal.h +@@ -316,17 +316,17 @@ struct vpx_codec_iface + + /*!\brief Callback function pointer / user data pair storage */ + typedef struct vpx_codec_priv_cb_pair + { + union + { + vpx_codec_put_frame_cb_fn_t put_frame; + vpx_codec_put_slice_cb_fn_t put_slice; +- }; ++ } fn; + void *user_priv; + } vpx_codec_priv_cb_pair_t; + + + /*!\brief Instance private storage + * + * This structure is allocated by the algorithm's init function. It can be + * extended in one of two ways. First, a second, algorithm specific structure +diff --git a/media/libvpx/vpx/src/vpx_decoder.c b/media/libvpx/vpx/src/vpx_decoder.c +--- a/media/libvpx/vpx/src/vpx_decoder.c ++++ b/media/libvpx/vpx/src/vpx_decoder.c +@@ -165,17 +165,17 @@ vpx_codec_err_t vpx_codec_register_put_f + + if (!ctx || !cb) + res = VPX_CODEC_INVALID_PARAM; + else if (!ctx->iface || !ctx->priv + || !(ctx->iface->caps & VPX_CODEC_CAP_PUT_FRAME)) + res = VPX_CODEC_ERROR; + else + { +- ctx->priv->dec.put_frame_cb.put_frame = cb; ++ ctx->priv->dec.put_frame_cb.fn.put_frame = cb; + ctx->priv->dec.put_frame_cb.user_priv = user_priv; + res = VPX_CODEC_OK; + } + + return SAVE_STATUS(ctx, res); + } + + +@@ -187,17 +187,17 @@ vpx_codec_err_t vpx_codec_register_put_s + + if (!ctx || !cb) + res = VPX_CODEC_INVALID_PARAM; + else if (!ctx->iface || !ctx->priv + || !(ctx->iface->caps & VPX_CODEC_CAP_PUT_FRAME)) + res = VPX_CODEC_ERROR; + else + { +- ctx->priv->dec.put_slice_cb.put_slice = cb; ++ ctx->priv->dec.put_slice_cb.fn.put_slice = cb; + ctx->priv->dec.put_slice_cb.user_priv = user_priv; + res = VPX_CODEC_OK; + } + + return SAVE_STATUS(ctx, res); + } + + +diff --git a/media/libvpx/vpx_ports/mem.h b/media/libvpx/vpx_ports/mem.h +--- a/media/libvpx/vpx_ports/mem.h ++++ b/media/libvpx/vpx_ports/mem.h +@@ -9,17 +9,17 @@ + */ + + + #ifndef VPX_PORTS_MEM_H + #define VPX_PORTS_MEM_H + #include "vpx_config.h" + #include "vpx/vpx_integer.h" + +-#if defined(__GNUC__) && __GNUC__ ++#if (defined(__GNUC__) && __GNUC__) || defined(__SUNPRO_C) + #define DECLARE_ALIGNED(n,typ,val) typ val __attribute__ ((aligned (n))) + #elif defined(_MSC_VER) + #define DECLARE_ALIGNED(n,typ,val) __declspec(align(n)) typ val + #else + #warning No alignment directives known for this compiler. + #define DECLARE_ALIGNED(n,typ,val) typ val + #endif + #endif +diff --git a/media/libvpx/vpx_ports/x86.h b/media/libvpx/vpx_ports/x86.h +--- a/media/libvpx/vpx_ports/x86.h ++++ b/media/libvpx/vpx_ports/x86.h +@@ -26,16 +26,36 @@ + __asm__ __volatile__ (\ + "pushl %%ebx \n\t" \ + "cpuid \n\t" \ + "movl %%ebx, %1 \n\t" \ + "popl %%ebx \n\t" \ + : "=a" (ax), "=r" (bx), "=c" (cx), "=d" (dx) \ + : "a" (func)); + #endif ++#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) ++#if ARCH_X86_64 ++#define cpuid(func,ax,bx,cx,dx)\ ++ asm volatile (\ ++ "xchg %rsi, %rbx \n\t" \ ++ "cpuid \n\t" \ ++ "movl %ebx, %edi \n\t" \ ++ "xchg %rsi, %rbx \n\t" \ ++ : "=a" (ax), "=D" (bx), "=c" (cx), "=d" (dx) \ ++ : "a" (func)); ++#else ++#define cpuid(func,ax,bx,cx,dx)\ ++ asm volatile (\ ++ "pushl %ebx \n\t" \ ++ "cpuid \n\t" \ ++ "movl %ebx, %edi \n\t" \ ++ "popl %ebx \n\t" \ ++ : "=a" (ax), "=D" (bx), "=c" (cx), "=d" (dx) \ ++ : "a" (func)); ++#endif + #else + #if ARCH_X86_64 + void __cpuid(int CPUInfo[4], int info_type); + #pragma intrinsic(__cpuid) + #define cpuid(func,a,b,c,d) do{\ + int regs[4];\ + __cpuid(regs,func); a=regs[0]; b=regs[1]; c=regs[2]; d=regs[3];\ + } while(0) +@@ -108,29 +128,36 @@ unsigned __int64 __rdtsc(void); + #endif + static unsigned int + x86_readtsc(void) + { + #if defined(__GNUC__) && __GNUC__ + unsigned int tsc; + __asm__ __volatile__("rdtsc\n\t":"=a"(tsc):); + return tsc; ++#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) ++ unsigned int tsc; ++ asm volatile("rdtsc\n\t":"=a"(tsc):); ++ return tsc; + #else + #if ARCH_X86_64 + return __rdtsc(); + #else + __asm rdtsc; + #endif + #endif + } + + + #if defined(__GNUC__) && __GNUC__ + #define x86_pause_hint()\ + __asm__ __volatile__ ("pause \n\t") ++#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) ++#define x86_pause_hint()\ ++ asm volatile ("pause \n\t") + #else + #if ARCH_X86_64 + /* No pause intrinsic for windows x64 */ + #define x86_pause_hint() + #else + #define x86_pause_hint()\ + __asm pause + #endif +@@ -144,16 +171,29 @@ x87_set_control_word(unsigned short mode + } + static unsigned short + x87_get_control_word(void) + { + unsigned short mode; + __asm__ __volatile__("fstcw %0\n\t":"=m"(*&mode):); + return mode; + } ++#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) ++static void ++x87_set_control_word(unsigned short mode) ++{ ++ asm volatile("fldcw %0" : : "m"(*&mode)); ++} ++static unsigned short ++x87_get_control_word(void) ++{ ++ unsigned short mode; ++ asm volatile("fstcw %0\n\t":"=m"(*&mode):); ++ return mode; ++} + #elif ARCH_X86_64 + /* No fldcw intrinsics on Windows x64, punt to external asm */ + extern void vpx_winx64_fldcw(unsigned short mode); + extern unsigned short vpx_winx64_fstcw(void); + #define x87_set_control_word vpx_winx64_fldcw + #define x87_get_control_word vpx_winx64_fstcw + #else + static void diff --git a/media/libvpx/update.sh b/media/libvpx/update.sh index bff52227a79..eaa999840ce 100755 --- a/media/libvpx/update.sh +++ b/media/libvpx/update.sh @@ -208,12 +208,12 @@ cp $1/objdir/x86-win32-vs8/vpx_config.h vpx_config_x86-win32-vs8.h # Should be same for all platforms... cp $1/objdir/x86-win32-vs8/vpx_version.h vpx_version.h -# Config files for x86-linux-gcc +# Config files for x86-linux-gcc and Solaris x86 cp $1/objdir/x86-linux-gcc/vpx_config.c vpx_config_x86-linux-gcc.c cp $1/objdir/x86-linux-gcc/vpx_config.asm vpx_config_x86-linux-gcc.asm cp $1/objdir/x86-linux-gcc/vpx_config.h vpx_config_x86-linux-gcc.h -# Config files for x86_64-linux-gcc +# Config files for x86_64-linux-gcc and Solaris x86_64 cp $1/objdir/x86_64-linux-gcc/vpx_config.c vpx_config_x86-linux-gcc.c cp $1/objdir/x86_64-linux-gcc/vpx_config.asm vpx_config_x86-linux-gcc.asm cp $1/objdir/x86_64-linux-gcc/vpx_config.h vpx_config_x86-linux-gcc.h @@ -246,3 +246,5 @@ patch -p3 < subpixel-qword.patch # Patch to make asm globals symbol hidden so linking succeeds on x86-64. patch -p3 < subpixel-hidden.patch patch -p3 < emptyif_warning.patch +# Patch to compile with Sun Studio on Solaris +patch -p3 < solaris.patch diff --git a/media/libvpx/vp8/common/loopfilter_filters.c b/media/libvpx/vp8/common/loopfilter_filters.c index eaf7327b45c..c266b748437 100644 --- a/media/libvpx/vp8/common/loopfilter_filters.c +++ b/media/libvpx/vp8/common/loopfilter_filters.c @@ -13,6 +13,9 @@ #include "loopfilter.h" #include "onyxc_int.h" +#ifdef __SUNPRO_C +#define __inline static inline +#endif #define NEW_LOOPFILTER_MASK diff --git a/media/libvpx/vpx/internal/vpx_codec_internal.h b/media/libvpx/vpx/internal/vpx_codec_internal.h index f525a6013c4..723efc17baf 100644 --- a/media/libvpx/vpx/internal/vpx_codec_internal.h +++ b/media/libvpx/vpx/internal/vpx_codec_internal.h @@ -321,7 +321,7 @@ typedef struct vpx_codec_priv_cb_pair { vpx_codec_put_frame_cb_fn_t put_frame; vpx_codec_put_slice_cb_fn_t put_slice; - }; + } fn; void *user_priv; } vpx_codec_priv_cb_pair_t; diff --git a/media/libvpx/vpx/src/vpx_decoder.c b/media/libvpx/vpx/src/vpx_decoder.c index 9939aa28a02..60fc8889aa8 100644 --- a/media/libvpx/vpx/src/vpx_decoder.c +++ b/media/libvpx/vpx/src/vpx_decoder.c @@ -170,7 +170,7 @@ vpx_codec_err_t vpx_codec_register_put_frame_cb(vpx_codec_ctx_t *ctx res = VPX_CODEC_ERROR; else { - ctx->priv->dec.put_frame_cb.put_frame = cb; + ctx->priv->dec.put_frame_cb.fn.put_frame = cb; ctx->priv->dec.put_frame_cb.user_priv = user_priv; res = VPX_CODEC_OK; } @@ -192,7 +192,7 @@ vpx_codec_err_t vpx_codec_register_put_slice_cb(vpx_codec_ctx_t *ctx res = VPX_CODEC_ERROR; else { - ctx->priv->dec.put_slice_cb.put_slice = cb; + ctx->priv->dec.put_slice_cb.fn.put_slice = cb; ctx->priv->dec.put_slice_cb.user_priv = user_priv; res = VPX_CODEC_OK; } diff --git a/media/libvpx/vpx_config.h b/media/libvpx/vpx_config.h index 030cf590e8f..4f4ed5965a6 100644 --- a/media/libvpx/vpx_config.h +++ b/media/libvpx/vpx_config.h @@ -20,6 +20,14 @@ /* 64 bit Linux. */ #include "vpx_config_x86_64-linux-gcc.h" +#elif defined(__sun) && defined(__i386) +/* 32 bit Solaris. */ +#include "vpx_config_x86-linux-gcc.h" + +#elif defined(__sun) && defined(__x86_64) +/* 64 bit Solaris. */ +#include "vpx_config_x86_64-linux-gcc.h" + #elif defined(_MSC_VER) && defined(_M_X64) /* 64 bit Windows */ #include "vpx_config_x86_64-win64-vs8.h" diff --git a/media/libvpx/vpx_config_c.c b/media/libvpx/vpx_config_c.c index 97220aad683..98ba1685fa6 100644 --- a/media/libvpx/vpx_config_c.c +++ b/media/libvpx/vpx_config_c.c @@ -20,6 +20,14 @@ /* 64 bit Linux. */ #include "vpx_config_x86_64-linux-gcc.c" +#elif defined(__sun) && defined(__i386) +/* 32 bit Solaris. */ +#include "vpx_config_x86-linux-gcc.h" + +#elif defined(__sun) && defined(__x86_64) +/* 64 bit Solaris. */ +#include "vpx_config_x86_64-linux-gcc.h" + #elif defined(_MSC_VER) && defined(_M_X64) #include "vpx_config_x86_64-win64-vs8.c" diff --git a/media/libvpx/vpx_ports/mem.h b/media/libvpx/vpx_ports/mem.h index ade2e3024b1..f6d0001127c 100644 --- a/media/libvpx/vpx_ports/mem.h +++ b/media/libvpx/vpx_ports/mem.h @@ -14,7 +14,7 @@ #include "vpx_config.h" #include "vpx/vpx_integer.h" -#if defined(__GNUC__) && __GNUC__ +#if (defined(__GNUC__) && __GNUC__) || defined(__SUNPRO_C) #define DECLARE_ALIGNED(n,typ,val) typ val __attribute__ ((aligned (n))) #elif defined(_MSC_VER) #define DECLARE_ALIGNED(n,typ,val) __declspec(align(n)) typ val diff --git a/media/libvpx/vpx_ports/x86.h b/media/libvpx/vpx_ports/x86.h index 8c23abd3804..525bd52930a 100644 --- a/media/libvpx/vpx_ports/x86.h +++ b/media/libvpx/vpx_ports/x86.h @@ -31,6 +31,26 @@ : "=a" (ax), "=r" (bx), "=c" (cx), "=d" (dx) \ : "a" (func)); #endif +#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) +#if ARCH_X86_64 +#define cpuid(func,ax,bx,cx,dx)\ + asm volatile (\ + "xchg %rsi, %rbx \n\t" \ + "cpuid \n\t" \ + "movl %ebx, %edi \n\t" \ + "xchg %rsi, %rbx \n\t" \ + : "=a" (ax), "=D" (bx), "=c" (cx), "=d" (dx) \ + : "a" (func)); +#else +#define cpuid(func,ax,bx,cx,dx)\ + asm volatile (\ + "pushl %ebx \n\t" \ + "cpuid \n\t" \ + "movl %ebx, %edi \n\t" \ + "popl %ebx \n\t" \ + : "=a" (ax), "=D" (bx), "=c" (cx), "=d" (dx) \ + : "a" (func)); +#endif #else #if ARCH_X86_64 void __cpuid(int CPUInfo[4], int info_type); @@ -113,6 +133,10 @@ x86_readtsc(void) unsigned int tsc; __asm__ __volatile__("rdtsc\n\t":"=a"(tsc):); return tsc; +#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) + unsigned int tsc; + asm volatile("rdtsc\n\t":"=a"(tsc):); + return tsc; #else #if ARCH_X86_64 return __rdtsc(); @@ -126,6 +150,9 @@ x86_readtsc(void) #if defined(__GNUC__) && __GNUC__ #define x86_pause_hint()\ __asm__ __volatile__ ("pause \n\t") +#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) +#define x86_pause_hint()\ + asm volatile ("pause \n\t") #else #if ARCH_X86_64 /* No pause intrinsic for windows x64 */ @@ -149,6 +176,19 @@ x87_get_control_word(void) __asm__ __volatile__("fstcw %0\n\t":"=m"(*&mode):); return mode; } +#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) +static void +x87_set_control_word(unsigned short mode) +{ + asm volatile("fldcw %0" : : "m"(*&mode)); +} +static unsigned short +x87_get_control_word(void) +{ + unsigned short mode; + asm volatile("fstcw %0\n\t":"=m"(*&mode):); + return mode; +} #elif ARCH_X86_64 /* No fldcw intrinsics on Windows x64, punt to external asm */ extern void vpx_winx64_fldcw(unsigned short mode);