--- xvid.c 2008/11/28 18:16:42 1.78 +++ xvid.c 2010/03/09 10:00:14 1.83 @@ -4,6 +4,7 @@ * - Native API implementation - * * Copyright(C) 2001-2004 Peter Ross + * 2002-2010 Michael Militzer * * 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 @@ -19,7 +20,7 @@ * along with this program ; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * $Id: xvid.c,v 1.78 2008/11/28 18:16:42 Isibaar Exp $ + * $Id: xvid.c,v 1.83 2010/03/09 10:00:14 Isibaar Exp $ * ****************************************************************************/ @@ -28,6 +29,26 @@ #include #include +#if !defined(_WIN32) +#include +#endif + +#if defined(__APPLE__) && defined(__MACH__) && !defined(_SC_NPROCESSORS_CONF) +#include +#include +#ifdef MAX +#undef MAX +#endif +#ifdef MIN +#undef MIN +#endif +#endif + +#if defined(__amigaos4__) +#include +#include +#endif + #include "xvid.h" #include "decoder.h" #include "encoder.h" @@ -54,7 +75,7 @@ #if (defined(ARCH_IS_IA32) || defined(ARCH_IS_X86_64)) && defined(_MSC_VER) # include -#elif defined(ARCH_IS_IA32) || defined(ARCH_IS_X86_64) || defined(ARCH_IS_PPC) +#elif defined(ARCH_IS_IA32) || defined(ARCH_IS_X86_64) || (defined(ARCH_IS_PPC) && !defined(__amigaos4__)) # include # include @@ -67,7 +88,6 @@ } #endif - /* * Calls the funcptr, and returns whether SIGILL (illegal instruction) was * signalled @@ -90,7 +110,7 @@ } return(0); } -#elif defined(ARCH_IS_IA32) || defined(ARCH_IS_X86_64) || defined(ARCH_IS_PPC) +#elif defined(ARCH_IS_IA32) || defined(ARCH_IS_X86_64) || (defined(ARCH_IS_PPC) && !defined(__amigaos4__)) static int sigill_check(void (*func)()) { @@ -142,16 +162,26 @@ #endif #if defined(ARCH_IS_PPC) +#if defined(__amigaos4__) + { + uint32_t vector_unit = VECTORTYPE_NONE; + IExec->GetCPUInfoTags(GCIT_VectorUnit, &vector_unit, TAG_END); + if (vector_unit == VECTORTYPE_ALTIVEC) { + cpu_flags |= XVID_CPU_ALTIVEC; + } + } +#else if (!sigill_check(altivec_trigger)) cpu_flags |= XVID_CPU_ALTIVEC; #endif +#endif return cpu_flags; } /***************************************************************************** - * XviD Init Entry point + * Xvid Init Entry point * * Well this function initialize all internal function pointers according * to the CPU features forced by the library client or autodetected (depending @@ -663,29 +693,43 @@ info->actual_version = XVID_VERSION; info->build = "xvid-1.3.0-dev"; info->cpu_flags = detect_cpu_flags(); - info->num_threads = 0; + info->num_threads = 0; /* single-thread */ #if defined(_WIN32) + { - DWORD dwProcessAffinityMask, dwSystemAffinityMask; - if (GetProcessAffinityMask(GetCurrentProcess(), (PDWORD_PTR) &dwProcessAffinityMask, (PDWORD_PTR) &dwSystemAffinityMask)) { - int i; - for(i=0; i<32; i++) { - if ((dwProcessAffinityMask & (1<num_threads++; - } - if (info->num_threads == 0) { - SYSTEM_INFO siSysInfo; - GetSystemInfo(&siSysInfo); - info->num_threads = siSysInfo.dwNumberOfProcessors; /* number of _logical_ cores */ - } - } + SYSTEM_INFO siSysInfo; + GetSystemInfo(&siSysInfo); + info->num_threads = siSysInfo.dwNumberOfProcessors; /* number of _logical_ cores */ } -#else - #include +#elif defined(_SC_NPROCESSORS_CONF) /* should be available on Apple too actually */ + info->num_threads = sysconf(_SC_NPROCESSORS_CONF); +#elif defined(__APPLE__) && defined(__MACH__) + + { + size_t len; + int mib[2], ncpu; + + mib[0] = CTL_HW; + mib[1] = HW_NCPU; + len = sizeof(ncpu); + if (sysctl(mib, 2, &ncpu, &len, NULL, 0) == 0) + info -> num_threads = ncpu; + else + info -> num_threads = 1; + } + +#elif defined(__amigaos4__) + + { + uint32_t num_threads = 1; + IExec->GetCPUInfoTags(GCIT_NumberOfCPUs, &num_threads, TAG_END); + info->num_threads = num_threads; + } + #endif return 0; @@ -733,7 +777,7 @@ } /***************************************************************************** - * XviD Global Entry point + * Xvid Global Entry point * * Well this function initialize all internal function pointers according * to the CPU features forced by the library client or autodetected (depending @@ -766,7 +810,7 @@ } /***************************************************************************** - * XviD Native decoder entry point + * Xvid Native decoder entry point * * This function is just a wrapper to all the option cases. * @@ -798,7 +842,7 @@ /***************************************************************************** - * XviD Native encoder entry point + * Xvid Native encoder entry point * * This function is just a wrapper to all the option cases. *