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 @@ -11,10 +11,14 @@ #include #include "loopfilter.h" #include "onyxc_int.h" +#ifdef __SUNPRO_C +#define __inline inline +#endif + typedef unsigned char uc; static __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 @@ -45,16 +45,36 @@ #define cpuid(func,ax,bx,cx,dx)\ __asm__ __volatile__ (\ "mov %%ebx, %%edi \n\t" \ "cpuid \n\t" \ "xchg %%edi, %%ebx \n\t" \ : "=a" (ax), "=D" (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