summaryrefslogtreecommitdiff
path: root/src/libffmpeg/libavcodec/ppc
diff options
context:
space:
mode:
authorMiguel Freitas <miguelfreitas@users.sourceforge.net>2002-09-16 21:49:34 +0000
committerMiguel Freitas <miguelfreitas@users.sourceforge.net>2002-09-16 21:49:34 +0000
commitd2db0f3bbdc81aae2c316751daf1d53b42a3e6a0 (patch)
treee9f4a94547ada41ea13445185a20305378d6c0bd /src/libffmpeg/libavcodec/ppc
parentd35f836384d9fa164350612ead96362d9cd7b457 (diff)
downloadxine-lib-d2db0f3bbdc81aae2c316751daf1d53b42a3e6a0.tar.gz
xine-lib-d2db0f3bbdc81aae2c316751daf1d53b42a3e6a0.tar.bz2
- sync ffmpeg to cvs (sorry Mike it still doesn't decode your teststream --
something must be broken at ffmpeg, also happens with mplayer) - added priority sorted lists, now autoprobing should work again. - fixed infinite loop in plugin loader. obs: latest ffmpeg contains ppc optimizations, someone will have to enable these though. CVS patchset: 2676 CVS date: 2002/09/16 21:49:34
Diffstat (limited to 'src/libffmpeg/libavcodec/ppc')
-rw-r--r--src/libffmpeg/libavcodec/ppc/Makefile.am46
-rw-r--r--src/libffmpeg/libavcodec/ppc/dsputil_altivec.c143
-rw-r--r--src/libffmpeg/libavcodec/ppc/dsputil_altivec.h5
-rw-r--r--src/libffmpeg/libavcodec/ppc/dsputil_ppc.c20
-rw-r--r--src/libffmpeg/libavcodec/ppc/libavcodec_ppc_dummy.c2
5 files changed, 216 insertions, 0 deletions
diff --git a/src/libffmpeg/libavcodec/ppc/Makefile.am b/src/libffmpeg/libavcodec/ppc/Makefile.am
new file mode 100644
index 000000000..34d885c6d
--- /dev/null
+++ b/src/libffmpeg/libavcodec/ppc/Makefile.am
@@ -0,0 +1,46 @@
+##
+## Process this file with automake to produce Makefile.in
+##
+
+#CFLAGS = @CFLAGS@ @LIBFFMPEG_CFLAGS@
+
+# we must not use CFLAGS here, gcc optimizations produce
+# bad code if we do so.
+CFLAGS = -O2 $(LIBFFMPEG_CFLAGS)
+
+ASFLAGS =
+
+LIBTOOL = $(SHELL) $(top_builddir)/libtool-nofpic
+
+noinst_LTLIBRARIES = libavcodec_ppc.la
+
+libavcodec_ppc_src = dsputil_altivec.c dsputil_ppc.c
+libavcodec_ppc_dummy = libavcodec_ppc_dummy.c
+
+EXTRA_DIST = $(libavcodec_ppc_src) $(libavcodec_ppc_dummy)
+
+if ARCH_POWERPC
+ppc_modules = $(libavcodec_ppc_src)
+endif
+
+
+libavcodec_ppc_la_SOURCES = $(ppc_modules) $(libavcodec_ppc_dummy)
+
+noinst_HEADERS = dsputil_altivec.h
+
+.s.lo:
+ $(ASCOMPILE) -o $@ `test -f $< || echo '$(srcdir)/'`$<
+
+debug:
+ @$(MAKE) CFLAGS="$(DEBUG_CFLAGS) $(LIBFFMPEG_CFLAGS)"
+
+install-debug: debug
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+mostlyclean-generic:
+ -rm -f *~ \#* .*~ .\#*
+
+maintainer-clean-generic:
+ -@echo "This command is intended for maintainers to use;"
+ -@echo "it deletes files that may require special tools to rebuild."
+ -rm -f Makefile.in
diff --git a/src/libffmpeg/libavcodec/ppc/dsputil_altivec.c b/src/libffmpeg/libavcodec/ppc/dsputil_altivec.c
new file mode 100644
index 000000000..18d9d27a4
--- /dev/null
+++ b/src/libffmpeg/libavcodec/ppc/dsputil_altivec.c
@@ -0,0 +1,143 @@
+#include "../dsputil.h"
+
+#if CONFIG_DARWIN
+#include <sys/sysctl.h>
+#endif
+
+int pix_abs16x16_altivec(uint8_t *pix1, uint8_t *pix2, int line_size);
+int pix_abs8x8_altivec(uint8_t *pix1, uint8_t *pix2, int line_size);
+int pix_sum_altivec(UINT8 * pix, int line_size);
+
+int has_altivec(void);
+
+int pix_abs16x16_altivec(uint8_t *pix1, uint8_t *pix2, int line_size)
+{
+ int i, s;
+ vector unsigned char perm1, perm2, *pix1v, *pix2v;
+ vector unsigned char t1, t2, t3,t4, t5;
+ vector unsigned int sad, zero;
+ vector signed int sumdiffs;
+
+ zero = (vector unsigned int) (0);
+ sad = (vector unsigned int) (0);
+
+
+ for(i=0;i<16;i++) {
+ /* Read potentially unaligned pixels into t1 and t2 */
+ perm1 = vec_lvsl(0, pix1);
+ pix1v = (vector unsigned char *) pix1;
+ perm2 = vec_lvsl(0, pix2);
+ pix2v = (vector unsigned char *) pix2;
+ t1 = vec_perm(pix1v[0], pix1v[1], perm1);
+ t2 = vec_perm(pix2v[0], pix2v[1], perm2);
+
+ /* Calculate a sum of abs differences vector */
+ t3 = vec_max(t1, t2);
+ t4 = vec_min(t1, t2);
+ t5 = vec_sub(t3, t4);
+
+ /* Add each 4 pixel group together and put 4 results into sad */
+ sad = vec_sum4s(t5, sad);
+
+ pix1 += line_size;
+ pix2 += line_size;
+ }
+
+ /* Sum up the four partial sums, and put the result into s */
+ sumdiffs = vec_sums((vector signed int) sad, (vector signed int) zero);
+ sumdiffs = vec_splat(sumdiffs, 3);
+ vec_ste(sumdiffs, 0, &s);
+
+ return s;
+}
+
+int pix_abs8x8_altivec(uint8_t *pix1, uint8_t *pix2, int line_size)
+{
+ int i, s;
+ vector unsigned char perm1, perm2, permclear, *pix1v, *pix2v;
+ vector unsigned char t1, t2, t3,t4, t5;
+ vector unsigned int sad, zero;
+ vector signed int sumdiffs;
+
+ zero = (vector unsigned int) (0);
+ sad = (vector unsigned int) (0);
+ permclear = (vector unsigned char) (255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0);
+
+ for(i=0;i<8;i++) {
+ /* Read potentially unaligned pixels into t1 and t2
+ Since we're reading 16 pixels, and actually only want 8,
+ mask out the last 8 pixels. The 0s don't change the sum. */
+ perm1 = vec_lvsl(0, pix1);
+ pix1v = (vector unsigned char *) pix1;
+ perm2 = vec_lvsl(0, pix2);
+ pix2v = (vector unsigned char *) pix2;
+ t1 = vec_and(vec_perm(pix1v[0], pix1v[1], perm1), permclear);
+ t2 = vec_and(vec_perm(pix2v[0], pix2v[1], perm2), permclear);
+
+ /* Calculate a sum of abs differences vector */
+ t3 = vec_max(t1, t2);
+ t4 = vec_min(t1, t2);
+ t5 = vec_sub(t3, t4);
+
+ /* Add each 4 pixel group together and put 4 results into sad */
+ sad = vec_sum4s(t5, sad);
+
+ pix1 += line_size;
+ pix2 += line_size;
+ }
+
+ /* Sum up the four partial sums, and put the result into s */
+ sumdiffs = vec_sums((vector signed int) sad, (vector signed int) zero);
+ sumdiffs = vec_splat(sumdiffs, 3);
+ vec_ste(sumdiffs, 0, &s);
+
+ return s;
+}
+
+int pix_sum_altivec(UINT8 * pix, int line_size)
+{
+
+ vector unsigned char perm, *pixv;
+ vector unsigned char t1;
+ vector unsigned int sad, zero;
+ vector signed int sumdiffs;
+
+ int s, i;
+
+ zero = (vector unsigned int) (0);
+ sad = (vector unsigned int) (0);
+
+ for (i = 0; i < 16; i++) {
+ /* Read the potentially unaligned 16 pixels into t1 */
+ perm = vec_lvsl(0, pix);
+ pixv = (vector unsigned char *) pix;
+ t1 = vec_perm(pixv[0], pixv[1], perm);
+
+ /* Add each 4 pixel group together and put 4 results into sad */
+ sad = vec_sum4s(t1, sad);
+
+ pix += line_size;
+ }
+
+ /* Sum up the four partial sums, and put the result into s */
+ sumdiffs = vec_sums((vector signed int) sad, (vector signed int) zero);
+ sumdiffs = vec_splat(sumdiffs, 3);
+ vec_ste(sumdiffs, 0, &s);
+
+ return s;
+}
+
+int has_altivec(void)
+{
+#if CONFIG_DARWIN
+ 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) return (has_vu != 0);
+#endif
+ return 0;
+}
diff --git a/src/libffmpeg/libavcodec/ppc/dsputil_altivec.h b/src/libffmpeg/libavcodec/ppc/dsputil_altivec.h
new file mode 100644
index 000000000..42c373e76
--- /dev/null
+++ b/src/libffmpeg/libavcodec/ppc/dsputil_altivec.h
@@ -0,0 +1,5 @@
+extern int pix_abs16x16_altivec(uint8_t *pix1, uint8_t *pix2, int line_size);
+extern int pix_abs8x8_altivec(uint8_t *pix1, uint8_t *pix2, int line_size);
+extern int pix_sum_altivec(UINT8 * pix, int line_size);
+
+extern int has_altivec(void);
diff --git a/src/libffmpeg/libavcodec/ppc/dsputil_ppc.c b/src/libffmpeg/libavcodec/ppc/dsputil_ppc.c
new file mode 100644
index 000000000..1311cc61b
--- /dev/null
+++ b/src/libffmpeg/libavcodec/ppc/dsputil_ppc.c
@@ -0,0 +1,20 @@
+#include "../../config.h"
+#include "../dsputil.h"
+
+#ifdef HAVE_ALTIVEC
+#include "dsputil_altivec.h"
+#endif
+
+void dsputil_init_ppc(void)
+{
+#if HAVE_ALTIVEC
+ if (has_altivec()) {
+ pix_abs16x16 = pix_abs16x16_altivec;
+ pix_abs8x8 = pix_abs8x8_altivec;
+ pix_sum = pix_sum_altivec;
+ } else
+#endif
+ {
+ /* Non-AltiVec PPC optimisations here */
+ }
+}
diff --git a/src/libffmpeg/libavcodec/ppc/libavcodec_ppc_dummy.c b/src/libffmpeg/libavcodec/ppc/libavcodec_ppc_dummy.c
new file mode 100644
index 000000000..506a55beb
--- /dev/null
+++ b/src/libffmpeg/libavcodec/ppc/libavcodec_ppc_dummy.c
@@ -0,0 +1,2 @@
+
+char libavcodec_ppc_dummy;