diff options
author | arpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2003-01-18 19:29:46 +0000 |
---|---|---|
committer | arpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2003-01-18 19:29:46 +0000 |
commit | 66e6173c0c950c2ed3d787eeaf26ff65df0da597 (patch) | |
tree | bfee2c27d08ec2e558893ec869a227a53ea1856a | |
parent | f0c90c8e00f5452c7a27ed23522e7dc16e2db512 (diff) | |
download | mpv-66e6173c0c950c2ed3d787eeaf26ff65df0da597.tar.bz2 mpv-66e6173c0c950c2ed3d787eeaf26ff65df0da597.tar.xz |
AltiVec detection code ("borrowed" from FFmpeg and
libmpeg2) & enough code to enable the AltiVec IMDCT
in liba52 and the DCT64 in mp3lib.
patch by Romain Dolbeau <dolbeau@irisa.fr>
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@9004 b3059339-0415-0410-9bf9-f77b7e298cf2
-rw-r--r-- | Makefile | 4 | ||||
-rw-r--r-- | cpudetect.c | 62 | ||||
-rw-r--r-- | cpudetect.h | 1 | ||||
-rw-r--r-- | libmpcodecs/ad_liba52.c | 1 | ||||
-rw-r--r-- | mencoder.c | 2 | ||||
-rw-r--r-- | mplayer.c | 2 |
6 files changed, 70 insertions, 2 deletions
@@ -40,6 +40,10 @@ COMMON_LIBS = libmpcodecs/libmpcodecs.a mp3lib/libMP3.a liba52/liba52.a libmpeg2 CFLAGS = $(OPTFLAGS) -Ilibmpdemux -Iloader -Ilibvo $(FREETYPE_INC) $(EXTRA_INC) $(CDPARANOIA_INC) $(SDL_INC) # -Wall +ifeq ($(TARGET_ALTIVEC),yes) +CFLAGS += -faltivec +endif + PARTS = libmpdemux libmpcodecs mp3lib liba52 libmpeg2 libavcodec libao2 drivers linux postproc input libvo libaf ifeq ($(VIDIX),yes) PARTS += libdha vidix diff --git a/cpudetect.c b/cpudetect.c index ffc56d8f74..ba5a0d0adc 100644 --- a/cpudetect.c +++ b/cpudetect.c @@ -429,6 +429,27 @@ static void check_os_katmai_support( void ) } #else /* ARCH_X86 */ +#ifdef SYS_DARWIN +#include <sys/sysctl.h> +#else +#include <signal.h> +#include <setjmp.h> + +static sigjmp_buf jmpbuf; +static volatile sig_atomic_t canjump = 0; + +static void sigill_handler (int sig) +{ + if (!canjump) { + signal (sig, SIG_DFL); + raise (sig); + } + + canjump = 0; + siglongjmp (jmpbuf, 1); +} +#endif + void GetCpuCaps( CpuCaps *caps) { caps->cpuType=0; @@ -440,5 +461,46 @@ void GetCpuCaps( CpuCaps *caps) caps->hasSSE=0; caps->hasSSE2=0; caps->isX86=0; + caps->hasAltiVec = 0; +#ifdef HAVE_ALTIVEC +#ifdef SYS_DARWIN +/* + rip-off from ffmpeg altivec detection code. + this code also appears on Apple's AltiVec pages. + */ + { + int sels[2] = {CTL_HW, HW_VECTORUNIT}; + int has_vu = 0; + size_t len = sizeof(has_vu); + int err; + + err = sysctl(sels, 2, &has_vu, &len, NULL, 0); + + if (err == 0) + if (has_vu != 0) + caps->hasAltiVec = 1; + mp_msg(MSGT_CPUDETECT,MSGL_INFO,"AltiVec %sfound\n", (caps->hasAltiVec ? "" : "not ")); + } +#else /* SYS_DARWIN */ +/* no Darwin, do it the brute-force way */ +/* this is borrowed from the libmpeg2 library */ + { + signal (SIGILL, sigill_handler); + if (sigsetjmp (jmpbuf, 1)) { + signal (SIGILL, SIG_DFL); + } else { + canjump = 1; + + asm volatile ("mtspr 256, %0\n\t" + "vand v0, v0, v0" + : + : "r" (-1)); + + signal (SIGILL, SIG_DFL); + caps->hasAltiVec = 1; + } + } +#endif /* SYS_DARWIN */ +#endif /* HAVE_ALTIVEC */ } #endif /* !ARCH_X86 */ diff --git a/cpudetect.h b/cpudetect.h index e879f6d047..c68013ba78 100644 --- a/cpudetect.h +++ b/cpudetect.h @@ -17,6 +17,7 @@ typedef struct cpucaps_s { int hasSSE2; int isX86; unsigned cl_size; /* size of cache line */ + int hasAltiVec; } CpuCaps; extern CpuCaps gCpuCaps; diff --git a/libmpcodecs/ad_liba52.c b/libmpcodecs/ad_liba52.c index ee20284251..4397c72bc2 100644 --- a/libmpcodecs/ad_liba52.c +++ b/libmpcodecs/ad_liba52.c @@ -112,6 +112,7 @@ static int init(sh_audio_t *sh_audio) if(gCpuCaps.hasMMX2) a52_accel|=MM_ACCEL_X86_MMXEXT; if(gCpuCaps.has3DNow) a52_accel|=MM_ACCEL_X86_3DNOW; if(gCpuCaps.has3DNowExt) a52_accel|=MM_ACCEL_X86_3DNOWEXT; + if(gCpuCaps.hasAltiVec) a52_accel|=MM_ACCEL_PPC_ALTIVEC; a52_samples=a52_init (a52_accel); if (a52_samples == NULL) { mp_msg(MSGT_DECAUDIO,MSGL_ERR,"A52 init failed\n"); diff --git a/mencoder.c b/mencoder.c index 270c06e4af..4b6cfe7cfc 100644 --- a/mencoder.c +++ b/mencoder.c @@ -367,8 +367,8 @@ unsigned int timer_start; mp_msg(MSGT_CPLAYER,MSGL_INFO,"%s",banner_text); /* Test for cpu capabilities (and corresponding OS support) for optimizing */ -#ifdef ARCH_X86 GetCpuCaps(&gCpuCaps); +#ifdef ARCH_X86 mp_msg(MSGT_CPLAYER,MSGL_INFO,"CPUflags: Type: %d MMX: %d MMX2: %d 3DNow: %d 3DNow2: %d SSE: %d SSE2: %d\n", gCpuCaps.cpuType,gCpuCaps.hasMMX,gCpuCaps.hasMMX2, gCpuCaps.has3DNow, gCpuCaps.has3DNowExt, @@ -665,8 +665,8 @@ int gui_no_filename=0; mp_msg(MSGT_CPLAYER,MSGL_INFO,banner_text); /* Test for cpu capabilities (and corresponding OS support) for optimizing */ -#ifdef ARCH_X86 GetCpuCaps(&gCpuCaps); +#ifdef ARCH_X86 mp_msg(MSGT_CPLAYER,MSGL_INFO,"CPUflags: MMX: %d MMX2: %d 3DNow: %d 3DNow2: %d SSE: %d SSE2: %d\n", gCpuCaps.hasMMX,gCpuCaps.hasMMX2, gCpuCaps.has3DNow, gCpuCaps.has3DNowExt, |