--- qpel.c 2005/07/11 22:10:24 1.6 +++ qpel.c 2008/11/26 01:04:34 1.9 @@ -19,12 +19,14 @@ * along with this program ; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * $Id: qpel.c,v 1.6 2005/07/11 22:10:24 Skal Exp $ + * $Id: qpel.c,v 1.9 2008/11/26 01:04:34 Isibaar Exp $ * ****************************************************************************/ #ifndef XVID_AUTO_INCLUDE +#include + #include "../portab.h" #include "qpel.h" @@ -197,8 +199,8 @@ /* Global scope hooks ****************************************************************************/ -XVID_QP_FUNCS *xvid_QP_Funcs = 0; -XVID_QP_FUNCS *xvid_QP_Add_Funcs = 0; +XVID_QP_FUNCS *xvid_QP_Funcs = NULL; +XVID_QP_FUNCS *xvid_QP_Add_Funcs = NULL; /* Reference plain C impl. declaration ****************************************************************************/ @@ -241,7 +243,7 @@ /* mmx impl. declaration (see. qpel_mmx.asm ****************************************************************************/ -#ifdef ARCH_IS_IA32 +#if defined (ARCH_IS_IA32) || defined(ARCH_IS_X86_64) extern XVID_QP_PASS_SIGNATURE(xvid_H_Pass_16_mmx); extern XVID_QP_PASS_SIGNATURE(xvid_H_Pass_Avrg_16_mmx); extern XVID_QP_PASS_SIGNATURE(xvid_H_Pass_Avrg_Up_16_mmx); @@ -340,74 +342,15 @@ #endif /* ARCH_IS_PPC */ -/* mmx impl. (for 64bit bus) declaration (see. qpel_mmx.asm - ****************************************************************************/ - -#ifdef ARCH_IS_X86_64 -extern XVID_QP_PASS_SIGNATURE(xvid_H_Pass_16_x86_64); -extern XVID_QP_PASS_SIGNATURE(xvid_H_Pass_Avrg_16_x86_64); -extern XVID_QP_PASS_SIGNATURE(xvid_H_Pass_Avrg_Up_16_x86_64); -extern XVID_QP_PASS_SIGNATURE(xvid_V_Pass_16_x86_64); -extern XVID_QP_PASS_SIGNATURE(xvid_V_Pass_Avrg_16_x86_64); -extern XVID_QP_PASS_SIGNATURE(xvid_V_Pass_Avrg_Up_16_x86_64); - -extern XVID_QP_PASS_SIGNATURE(xvid_H_Pass_8_x86_64); -extern XVID_QP_PASS_SIGNATURE(xvid_H_Pass_Avrg_8_x86_64); -extern XVID_QP_PASS_SIGNATURE(xvid_H_Pass_Avrg_Up_8_x86_64); -extern XVID_QP_PASS_SIGNATURE(xvid_V_Pass_8_x86_64); -extern XVID_QP_PASS_SIGNATURE(xvid_V_Pass_Avrg_8_x86_64); -extern XVID_QP_PASS_SIGNATURE(xvid_V_Pass_Avrg_Up_8_x86_64); - -extern XVID_QP_PASS_SIGNATURE(xvid_H_Pass_Add_16_x86_64); -extern XVID_QP_PASS_SIGNATURE(xvid_H_Pass_Avrg_Add_16_x86_64); -extern XVID_QP_PASS_SIGNATURE(xvid_H_Pass_Avrg_Up_Add_16_x86_64); -extern XVID_QP_PASS_SIGNATURE(xvid_V_Pass_Add_16_x86_64); -extern XVID_QP_PASS_SIGNATURE(xvid_V_Pass_Avrg_Add_16_x86_64); -extern XVID_QP_PASS_SIGNATURE(xvid_V_Pass_Avrg_Up_Add_16_x86_64); - -extern XVID_QP_PASS_SIGNATURE(xvid_H_Pass_8_Add_x86_64); -extern XVID_QP_PASS_SIGNATURE(xvid_H_Pass_Avrg_8_Add_x86_64); -extern XVID_QP_PASS_SIGNATURE(xvid_H_Pass_Avrg_Up_8_Add_x86_64); -extern XVID_QP_PASS_SIGNATURE(xvid_V_Pass_8_Add_x86_64); -extern XVID_QP_PASS_SIGNATURE(xvid_V_Pass_Avrg_8_Add_x86_64); -extern XVID_QP_PASS_SIGNATURE(xvid_V_Pass_Avrg_Up_8_Add_x86_64); - -XVID_QP_FUNCS xvid_QP_Funcs_x86_64 = { - xvid_H_Pass_16_x86_64, xvid_H_Pass_Avrg_16_x86_64, xvid_H_Pass_Avrg_Up_16_x86_64, - xvid_V_Pass_16_x86_64, xvid_V_Pass_Avrg_16_x86_64, xvid_V_Pass_Avrg_Up_16_x86_64, - - xvid_H_Pass_8_x86_64, xvid_H_Pass_Avrg_8_x86_64, xvid_H_Pass_Avrg_Up_8_x86_64, - xvid_V_Pass_8_x86_64, xvid_V_Pass_Avrg_8_x86_64, xvid_V_Pass_Avrg_Up_8_x86_64 -}; - -XVID_QP_FUNCS xvid_QP_Add_Funcs_x86_64 = { - xvid_H_Pass_Add_16_x86_64, xvid_H_Pass_Avrg_Add_16_x86_64, xvid_H_Pass_Avrg_Up_Add_16_x86_64, - xvid_V_Pass_Add_16_x86_64, xvid_V_Pass_Avrg_Add_16_x86_64, xvid_V_Pass_Avrg_Up_Add_16_x86_64, - - xvid_H_Pass_8_Add_x86_64, xvid_H_Pass_Avrg_8_Add_x86_64, xvid_H_Pass_Avrg_Up_8_Add_x86_64, - xvid_V_Pass_8_Add_x86_64, xvid_V_Pass_Avrg_8_Add_x86_64, xvid_V_Pass_Avrg_Up_8_Add_x86_64, -}; -#endif /* ARCH_IS_X86_64 */ - /* tables for ASM ****************************************************************************/ -#ifdef ARCH_IS_IA32 -uint16_t xvid_Expand_mmx[256][4]; /* 8b -> 64b expansion table */ -#endif -#ifdef ARCH_IS_X86_64 +#if defined(ARCH_IS_IA32) || defined(ARCH_IS_X86_64) +/* These symbols will be used outside this file, so tell the compiler + * they're global. */ extern uint16_t xvid_Expand_mmx[256][4]; /* 8b -> 64b expansion table */ -#endif -/* Alternate way of filtering (cf. USE_TABLES flag in qpel_mmx.asm) - * - * 17 tables, 2K each => 34K - * Mirroring can be acheived composing 11 basic tables - * (for instance: (23,19,-6,3)=(20,20,-6,3)+(3,-1,0,0) - * Using Symmetries (and bswap) could reduce further - * the memory to 7 tables (->14K). */ -#ifdef ARCH_IS_X86_64 extern int16_t xvid_FIR_1_0_0_0[256][4]; extern int16_t xvid_FIR_3_1_0_0[256][4]; extern int16_t xvid_FIR_6_3_1_0[256][4]; @@ -425,24 +368,31 @@ extern int16_t xvid_FIR_0_1_3_6[256][4]; extern int16_t xvid_FIR_0_0_1_3[256][4]; extern int16_t xvid_FIR_0_0_0_1[256][4]; -#else -int16_t xvid_FIR_1_0_0_0[256][4]; -int16_t xvid_FIR_3_1_0_0[256][4]; -int16_t xvid_FIR_6_3_1_0[256][4]; -int16_t xvid_FIR_14_3_2_1[256][4]; -int16_t xvid_FIR_20_6_3_1[256][4]; -int16_t xvid_FIR_20_20_6_3[256][4]; -int16_t xvid_FIR_23_19_6_3[256][4]; -int16_t xvid_FIR_7_20_20_6[256][4]; -int16_t xvid_FIR_6_20_20_6[256][4]; -int16_t xvid_FIR_6_20_20_7[256][4]; -int16_t xvid_FIR_3_6_20_20[256][4]; -int16_t xvid_FIR_3_6_19_23[256][4]; -int16_t xvid_FIR_1_3_6_20[256][4]; -int16_t xvid_FIR_1_2_3_14[256][4]; -int16_t xvid_FIR_0_1_3_6[256][4]; -int16_t xvid_FIR_0_0_1_3[256][4]; -int16_t xvid_FIR_0_0_0_1[256][4]; +#endif + +/* Arrays definitions, according to the target platform */ + +#if !defined(ARCH_IS_X86_64) && !defined(ARCH_IS_IA32) +/* Only ia32/ia64 will use these tables outside this file so mark them +* static for all other archs */ +#define __SCOPE static +__SCOPE int16_t xvid_FIR_1_0_0_0[256][4]; +__SCOPE int16_t xvid_FIR_3_1_0_0[256][4]; +__SCOPE int16_t xvid_FIR_6_3_1_0[256][4]; +__SCOPE int16_t xvid_FIR_14_3_2_1[256][4]; +__SCOPE int16_t xvid_FIR_20_6_3_1[256][4]; +__SCOPE int16_t xvid_FIR_20_20_6_3[256][4]; +__SCOPE int16_t xvid_FIR_23_19_6_3[256][4]; +__SCOPE int16_t xvid_FIR_7_20_20_6[256][4]; +__SCOPE int16_t xvid_FIR_6_20_20_6[256][4]; +__SCOPE int16_t xvid_FIR_6_20_20_7[256][4]; +__SCOPE int16_t xvid_FIR_3_6_20_20[256][4]; +__SCOPE int16_t xvid_FIR_3_6_19_23[256][4]; +__SCOPE int16_t xvid_FIR_1_3_6_20[256][4]; +__SCOPE int16_t xvid_FIR_1_2_3_14[256][4]; +__SCOPE int16_t xvid_FIR_0_1_3_6[256][4]; +__SCOPE int16_t xvid_FIR_0_0_1_3[256][4]; +__SCOPE int16_t xvid_FIR_0_0_0_1[256][4]; #endif static void Init_FIR_Table(int16_t Tab[][4], @@ -458,9 +408,9 @@ } -void xvid_Init_QP() +void xvid_Init_QP(void) { -#ifdef ARCH_IS_IA32 +#if defined (ARCH_IS_IA32) || defined (ARCH_IS_X86_64) int i; for(i=0; i<256; ++i) {