--- trunk/xvidcore/src/xvid.c 2003/02/16 05:11:39 860 +++ trunk/xvidcore/src/xvid.c 2003/06/11 14:10:59 1066 @@ -3,15 +3,6 @@ * XVID MPEG-4 VIDEO CODEC * - Native API implementation - * - * This program is an implementation of a part of one or more MPEG-4 - * Video tools as specified in ISO/IEC 14496-2 standard. Those intending - * to use this software module in hardware or software products are - * advised that its use may infringe existing patents or copyrights, and - * any such use would be at such party's own risk. The original - * developer of this software module and his/her company, and subsequent - * editors and their companies, will have no liability for use of this - * software or modifications or derivatives thereof. - * * 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 * the Free Software Foundation ; either version 2 of the License, or @@ -26,18 +17,7 @@ * along with this program ; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - ****************************************************************************/ - -/***************************************************************************** - * - * History - * - * - 23.06.2002 added XVID_CPU_CHKONLY - * - 17.03.2002 Added interpolate8x8_halfpel_hv_xmm - * - 22.12.2001 API change: added xvid_init() - Isibaar - * - 16.12.2001 inital version; (c)2001 peter ross - * - * $Id: xvid.c,v 1.42 2003-02-16 05:11:39 suxen_drol Exp $ + * $Id: xvid.c,v 1.47 2003-06-11 14:10:55 Isibaar Exp $ * ****************************************************************************/ @@ -84,12 +64,14 @@ /* -calls the funcptr, and returns whether SIGILL (illegal instruction) was signalled -return values: --1 : could not determine -0 : SIGILL was *not* signalled -1 : SIGILL was signalled -*/ + * Calls the funcptr, and returns whether SIGILL (illegal instruction) was + * signalled + * + * Return values: + * -1 : could not determine + * 0 : SIGILL was *not* signalled + * 1 : SIGILL was signalled + */ int sigill_check(void (*func)()) @@ -316,7 +298,7 @@ dev16 = dev16_c; sad16v = sad16v_c; -// Halfpel8_Refine = Halfpel8_Refine_c; +/* Halfpel8_Refine = Halfpel8_Refine_c; */ #if defined(ARCH_IS_IA32) @@ -506,6 +488,9 @@ if ((cpu_flags & XVID_CPU_SSE2)) { +#if defined(EXPERIMENTAL_SSE2_CODE) /* many people reported crashes with SSE2 */ + /* better deactivate it completely and fix everything */ + /* in dev-api-4 */ calc_cbp = calc_cbp_sse2; /* Quantization */ @@ -514,22 +499,21 @@ quant_inter = quant_inter_sse2; dequant_inter = dequant_inter_sse2; -#if defined(EXPERIMENTAL_SSE2_CODE) /* ME; slower than xmm */ sad16 = sad16_sse2; dev16 = dev16_sse2; #endif /* Forward and Inverse DCT */ - idct = idct_sse2; - fdct = fdct_sse2; + /* idct = idct_sse2; + /* fdct = fdct_sse2; Both are none to be unprecise - better deactivate for now */ } #endif #if defined(ARCH_IS_IA64) - if ((cpu_flags & XVID_CPU_ASM)) { //use assembler routines? + if ((cpu_flags & XVID_CPU_ASM)) { /* use assembler routines? */ idct_ia64_init(); fdct = fdct_ia64; - idct = idct_ia64; //not yet working, crashes + idct = idct_ia64; /*not yet working, crashes */ interpolate8x8_halfpel_h = interpolate8x8_halfpel_h_ia64; interpolate8x8_halfpel_v = interpolate8x8_halfpel_v_ia64; interpolate8x8_halfpel_hv = interpolate8x8_halfpel_hv_ia64; @@ -537,7 +521,7 @@ sad16bi = sad16bi_ia64; sad8 = sad8_ia64; dev16 = dev16_ia64; -// Halfpel8_Refine = Halfpel8_Refine_ia64; +/* Halfpel8_Refine = Halfpel8_Refine_ia64; */ quant_intra = quant_intra_ia64; dequant_intra = dequant_intra_ia64; quant_inter = quant_inter_ia64; @@ -548,7 +532,7 @@ transfer_8to16sub2 = transfer_8to16sub2_ia64; transfer_16to8add = transfer_16to8add_ia64; transfer8x8_copy = transfer8x8_copy_ia64; - DEBUG("Using IA-64 assembler routines.\n"); + DPRINTF(DPRINTF_DEBUG, "Using IA-64 assembler routines."); } #endif @@ -578,7 +562,11 @@ static int xvid_init_convert(XVID_INIT_CONVERTINFO* convert) { - // const int flip1 = (convert->input.colorspace & XVID_CSP_VFLIP) ^ (convert->output.colorspace & XVID_CSP_VFLIP); +/* + const int flip1 = + (convert->input.colorspace & XVID_CSP_VFLIP) ^ + (convert->output.colorspace & XVID_CSP_VFLIP); +*/ const int width = convert->width; const int height = convert->height; const int width2 = convert->width/2; @@ -751,7 +739,7 @@ int64_t timeSTART; int64_t timeA = 0; int64_t timeB = 0; - int retA, retB; + int retA = 0, retB = 0; DECLARE_ALIGNED_MATRIX(arrayX, 1, 64, int16_t, CACHE_LINE); DECLARE_ALIGNED_MATRIX(arrayA, 1, 64, int16_t, CACHE_LINE); DECLARE_ALIGNED_MATRIX(arrayB, 1, 64, int16_t, CACHE_LINE); @@ -825,26 +813,37 @@ int xvid_init_test(int flags) { +#if defined(ARCH_IS_IA32) int cpu_flags; +#endif - srand(time(0)); - - printf("xvid_init_test\n"); + printf("XviD tests\n\n"); -#if defined(ARCH_IS_IA32) +#if defined(ARCH_IS_IA32) cpu_flags = detect_cpu_flags(); +#endif + idct_int32_init(); - emms_mmx(); + emms(); + srand(time(0)); + + /* fDCT test */ printf("--- fdct ---\n"); test_transform(fdct_int32, fdct_int32, "c", TEST_FDCT, flags); + +#if defined(ARCH_IS_IA32) if (cpu_flags & XVID_CPU_MMX) test_transform(fdct_int32, fdct_mmx, "mmx", TEST_FDCT, flags); if (cpu_flags & XVID_CPU_SSE2) test_transform(fdct_int32, fdct_sse2, "sse2", TEST_FDCT, flags); +#endif + /* iDCT test */ printf("\n--- idct ---\n"); test_transform(idct_int32, idct_int32, "c", TEST_IDCT, flags); + +#if defined(ARCH_IS_IA32) if (cpu_flags & XVID_CPU_MMX) test_transform(idct_int32, idct_mmx, "mmx", TEST_IDCT, flags); if (cpu_flags & XVID_CPU_MMXEXT) @@ -853,27 +852,39 @@ test_transform(idct_int32, idct_3dne, "3dne", TEST_IDCT, flags); if (cpu_flags & XVID_CPU_SSE2) test_transform(idct_int32, idct_sse2, "sse2", TEST_IDCT, flags); +#endif + /* Intra quantization test */ printf("\n--- quant intra ---\n"); test_quant(quant_intra_c, quant_intra_c, "c", TEST_QUANT_INTRA, flags); + +#if defined(ARCH_IS_IA32) if (cpu_flags & XVID_CPU_MMX) test_quant(quant_intra_c, quant_intra_mmx, "mmx", TEST_QUANT_INTRA, flags); if (cpu_flags & XVID_CPU_3DNOWEXT) test_quant(quant_intra_c, quant_intra_3dne, "3dne", TEST_QUANT_INTRA, flags); if (cpu_flags & XVID_CPU_SSE2) test_quant(quant_intra_c, quant_intra_sse2, "sse2", TEST_QUANT_INTRA, flags); +#endif + /* Inter quantization test */ printf("\n--- quant inter ---\n"); test_quant(quant_inter_c, quant_inter_c, "c", TEST_QUANT_INTER, flags); + +#if defined(ARCH_IS_IA32) if (cpu_flags & XVID_CPU_MMX) test_quant(quant_inter_c, quant_inter_mmx, "mmx", TEST_QUANT_INTER, flags); if (cpu_flags & XVID_CPU_3DNOWEXT) test_quant(quant_inter_c, quant_inter_3dne, "3dne", TEST_QUANT_INTER, flags); if (cpu_flags & XVID_CPU_SSE2) test_quant(quant_inter_c, quant_inter_sse2, "sse2", TEST_QUANT_INTER, flags); +#endif + /* Intra dequantization test */ printf("\n--- dequant intra ---\n"); test_quant(dequant_intra_c, dequant_intra_c, "c", TEST_DEQUANT_INTRA, flags); + +#if defined(ARCH_IS_IA32) if (cpu_flags & XVID_CPU_MMX) test_quant(dequant_intra_c, dequant_intra_mmx, "mmx", TEST_DEQUANT_INTRA, flags); if (cpu_flags & XVID_CPU_MMXEXT) @@ -882,9 +893,13 @@ test_quant(dequant_intra_c, dequant_intra_3dne, "3dne", TEST_DEQUANT_INTRA, flags); if (cpu_flags & XVID_CPU_SSE2) test_quant(dequant_intra_c, dequant_intra_sse2, "sse2", TEST_DEQUANT_INTRA, flags); +#endif + /* Inter dequantization test */ printf("\n--- dequant inter ---\n"); test_quant(dequant_inter_c, dequant_inter_c, "c", TEST_DEQUANT_INTER, flags); + +#if defined(ARCH_IS_IA32) if (cpu_flags & XVID_CPU_MMX) test_quant(dequant_inter_c, dequant_inter_mmx, "mmx", TEST_DEQUANT_INTER, flags); if (cpu_flags & XVID_CPU_MMXEXT) @@ -893,39 +908,54 @@ test_quant(dequant_inter_c, dequant_inter_3dne, "3dne", TEST_DEQUANT_INTER, flags); if (cpu_flags & XVID_CPU_SSE2) test_quant(dequant_inter_c, dequant_inter_sse2, "sse2", TEST_DEQUANT_INTER, flags); +#endif - printf("\n--- quant4_intra ---\n"); + /* Intra quantization test */ + printf("\n--- quant4 intra ---\n"); test_quant(quant4_intra_c, quant4_intra_c, "c", TEST_QUANT_INTRA, flags); + +#if defined(ARCH_IS_IA32) if (cpu_flags & XVID_CPU_MMX) test_quant(quant4_intra_c, quant4_intra_mmx, "mmx", TEST_QUANT_INTRA, flags); if (cpu_flags & XVID_CPU_MMXEXT) test_quant(quant4_intra_c, quant4_intra_xmm, "xmm", TEST_QUANT_INTRA, flags); +#endif - printf("\n--- quant4_inter ---\n"); + /* Inter quantization test */ + printf("\n--- quant4 inter ---\n"); test_quant(quant4_inter_c, quant4_inter_c, "c", TEST_QUANT_INTER, flags); + +#if defined(ARCH_IS_IA32) if (cpu_flags & XVID_CPU_MMX) test_quant(quant4_inter_c, quant4_inter_mmx, "mmx", TEST_QUANT_INTER, flags); if (cpu_flags & XVID_CPU_MMXEXT) test_quant(quant4_inter_c, quant4_inter_xmm, "xmm", TEST_QUANT_INTER, flags); +#endif - printf("\n--- dequant4_intra ---\n"); + /* Intra dequantization test */ + printf("\n--- dequant4 intra ---\n"); test_quant(dequant4_intra_c, dequant4_intra_c, "c", TEST_DEQUANT_INTRA, flags); + +#if defined(ARCH_IS_IA32) if (cpu_flags & XVID_CPU_MMX) test_quant(dequant4_intra_c, dequant4_intra_mmx, "mmx", TEST_DEQUANT_INTRA, flags); if (cpu_flags & XVID_CPU_3DNOWEXT) test_quant(dequant4_intra_c, dequant4_intra_3dne, "3dne", TEST_DEQUANT_INTRA, flags); +#endif - printf("\n--- dequant4_inter ---\n"); + /* Inter dequantization test */ + printf("\n--- dequant4 inter ---\n"); test_quant(dequant4_inter_c, dequant4_inter_c, "c", TEST_DEQUANT_INTER, flags); + +#if defined(ARCH_IS_IA32) if (cpu_flags & XVID_CPU_MMX) test_quant(dequant4_inter_c, dequant4_inter_mmx, "mmx", TEST_DEQUANT_INTER, flags); if (cpu_flags & XVID_CPU_3DNOWEXT) test_quant(dequant4_inter_c, dequant4_inter_3dne, "3dne", TEST_DEQUANT_INTER, flags); - - emms_mmx(); - #endif + emms(); + return XVID_ERR_OK; } @@ -945,8 +975,10 @@ return xvid_init_convert((XVID_INIT_CONVERTINFO*)param1); case XVID_INIT_TEST : - return xvid_init_test((int)param1); - + { + ptr_t flags = (ptr_t)param1; + return xvid_init_test((int)flags); + } default : return XVID_ERR_FAIL; } @@ -1004,11 +1036,13 @@ case XVID_ENC_ENCODE: if (((Encoder *) handle)->mbParam.max_bframes >= 0) - return encoder_encode_bframes((Encoder *) handle, (XVID_ENC_FRAME *) param1, - (XVID_ENC_STATS *) param2); + return encoder_encode_bframes((Encoder *) handle, + (XVID_ENC_FRAME *) param1, + (XVID_ENC_STATS *) param2); else - return encoder_encode((Encoder *) handle, (XVID_ENC_FRAME *) param1, - (XVID_ENC_STATS *) param2); + return encoder_encode((Encoder *) handle, + (XVID_ENC_FRAME *) param1, + (XVID_ENC_STATS *) param2); case XVID_ENC_CREATE: return encoder_create((XVID_ENC_PARAM *) param1);