summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2003-01-18 19:29:46 +0000
committerarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2003-01-18 19:29:46 +0000
commit66e6173c0c950c2ed3d787eeaf26ff65df0da597 (patch)
treebfee2c27d08ec2e558893ec869a227a53ea1856a
parentf0c90c8e00f5452c7a27ed23522e7dc16e2db512 (diff)
downloadmpv-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--Makefile4
-rw-r--r--cpudetect.c62
-rw-r--r--cpudetect.h1
-rw-r--r--libmpcodecs/ad_liba52.c1
-rw-r--r--mencoder.c2
-rw-r--r--mplayer.c2
6 files changed, 70 insertions, 2 deletions
diff --git a/Makefile b/Makefile
index a4873f1907..8e6860b874 100644
--- a/Makefile
+++ b/Makefile
@@ -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,
diff --git a/mplayer.c b/mplayer.c
index de8a780712..eddff2b2e3 100644
--- a/mplayer.c
+++ b/mplayer.c
@@ -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,