summaryrefslogtreecommitdiff
path: root/src/libffmpeg
diff options
context:
space:
mode:
authorJuergen Keil <jkeil@users.sourceforge.net>2001-08-31 14:32:24 +0000
committerJuergen Keil <jkeil@users.sourceforge.net>2001-08-31 14:32:24 +0000
commit0bfbbc13906c4ca2c8d28aa22803a2594a9634b1 (patch)
treeeaa4ba0f94ea230865705de18315afcf94d8a405 /src/libffmpeg
parent2d3f4a1d87de306103990f1c8690d4e997e45db3 (diff)
downloadxine-lib-0bfbbc13906c4ca2c8d28aa22803a2594a9634b1.tar.gz
xine-lib-0bfbbc13906c4ca2c8d28aa22803a2594a9634b1.tar.bz2
Add mediaLib acceleration for UltarSPARCs to ffmpeg's libavcodec
CVS patchset: 531 CVS date: 2001/08/31 14:32:24
Diffstat (limited to 'src/libffmpeg')
-rw-r--r--src/libffmpeg/libavcodec/Makefile.am10
-rw-r--r--src/libffmpeg/libavcodec/dsputil.c52
-rw-r--r--src/libffmpeg/libavcodec/dsputil.h26
-rw-r--r--src/libffmpeg/libavcodec/dsputil_mlib.c136
-rw-r--r--src/libffmpeg/libavcodec/idct_mlib.c38
5 files changed, 241 insertions, 21 deletions
diff --git a/src/libffmpeg/libavcodec/Makefile.am b/src/libffmpeg/libavcodec/Makefile.am
index 21a6452be..7a428a106 100644
--- a/src/libffmpeg/libavcodec/Makefile.am
+++ b/src/libffmpeg/libavcodec/Makefile.am
@@ -4,7 +4,7 @@
#CFLAGS = -D_FILE_OFFSET_BITS=64 @GLOBAL_CFLAGS@ -DCONFIG_DECODERS -DHAVE_AV_CONFIG_H
-CFLAGS = @GLOBAL_CFLAGS@ -DCONFIG_DECODERS -DHAVE_AV_CONFIG_H
+CFLAGS = @GLOBAL_CFLAGS@ @LIBFFMPEG_CFLAGS@ -DCONFIG_DECODERS -DHAVE_AV_CONFIG_H
LIBTOOL = $(SHELL) $(top_builddir)/libtool-nofpic
@@ -15,11 +15,15 @@ mmx_modules = mpegvideo_mmx.c sad_mmx.s dsputil_mmx.c idct_mmx.c
#mmx_modules = mpegvideo_mmx.c sad_mmx.s
endif
+if HAVE_MLIB
+mlib_modules = dsputil_mlib.c idct_mlib.c
+endif
+
libavcodec_la_SOURCES = dsputil.c fdctref.c jfdctfst.c mpeg12.c \
utils.c rv10.c h263.c jrevdct.c \
common.c h263dec.c msmpeg4.c \
mpegvideo.c mjpeg.c motion_est.c \
- $(mmx_modules)
+ $(mmx_modules) $(mlib_modules)
noinst_HEADERS = avcodec.h dsputil.h mpegvideo.h dsputil_mmx_avg.h\
@@ -27,7 +31,7 @@ noinst_HEADERS = avcodec.h dsputil.h mpegvideo.h dsputil_mmx_avg.h\
mpeg12data.h
debug:
- @$(MAKE) CFLAGS="@DEBUG_CFLAGS@ -DCONFIG_DECODERS -DHAVE_AV_CONFIG_H"
+ @$(MAKE) CFLAGS="@DEBUG_CFLAGS@ @LIBFFMPEG_CFLAGS@ -DCONFIG_DECODERS -DHAVE_AV_CONFIG_H"
install-debug: debug
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
diff --git a/src/libffmpeg/libavcodec/dsputil.c b/src/libffmpeg/libavcodec/dsputil.c
index abbca19da..da8b24941 100644
--- a/src/libffmpeg/libavcodec/dsputil.c
+++ b/src/libffmpeg/libavcodec/dsputil.c
@@ -413,6 +413,8 @@ void block_permute(INT16 *block)
void dsputil_init(void)
{
int i, j;
+ int use_permuted_mmx_idct;
+ int accel_dsputil;
for(i=0;i<256;i++) cropTbl[i + MAX_NEG_CROP] = i;
for(i=0;i<MAX_NEG_CROP;i++) {
@@ -435,22 +437,46 @@ void dsputil_init(void)
pix_abs16x16_xy2 = pix_abs16x16_xy2_c;
av_fdct = jpeg_fdct_ifast;
- /* permute for IDCT */
- for(i=0;i<64;i++) {
- j = zigzag_direct[i];
- zigzag_direct[i] = block_permute_op(j);
- j = ff_alternate_horizontal_scan[i];
- ff_alternate_horizontal_scan[i] = block_permute_op(j);
- j = ff_alternate_vertical_scan[i];
- ff_alternate_vertical_scan[i] = block_permute_op(j);
- }
- block_permute(default_intra_matrix);
- block_permute(default_non_intra_matrix);
+ use_permuted_mmx_idct = 1;
+ accel_dsputil = 0;
#ifdef HAVE_MMX
- dsputil_init_mmx();
+ if (!accel_dsputil) {
+ dsputil_init_mmx();
+ accel_dsputil = 1;
+ /* printf("AVCODEC: Using mmx idct\n"); */
+ }
#endif
#ifdef ARCH_ARMV4L
- dsputil_init_armv4l();
+ if (!accel_dsputil) {
+ dsputil_init_armv4l();
+ accel_dsputil = 1;
+ /* printf("AVCODEC: Using armv4l idct\n"); */
+ }
+#endif
+#ifdef HAVE_MLIB
+ if (!accel_dsputil) {
+ dsputil_init_mlib();
+ accel_dsputil = 1;
+ use_permuted_mmx_idct = 0;
+ /* printf("AVCODEC: Using mediaLib idct\n"); */
+ }
#endif
+ if (!accel_dsputil) {
+ /* printf("AVCODEC: Using C idct\n"); */
+ }
+
+ if (use_permuted_mmx_idct) {
+ /* permute for IDCT */
+ for(i=0;i<64;i++) {
+ j = zigzag_direct[i];
+ zigzag_direct[i] = block_permute_op(j);
+ j = ff_alternate_horizontal_scan[i];
+ ff_alternate_horizontal_scan[i] = block_permute_op(j);
+ j = ff_alternate_vertical_scan[i];
+ ff_alternate_vertical_scan[i] = block_permute_op(j);
+ }
+ block_permute(default_intra_matrix);
+ block_permute(default_non_intra_matrix);
+ }
}
diff --git a/src/libffmpeg/libavcodec/dsputil.h b/src/libffmpeg/libavcodec/dsputil.h
index 80a934ccd..1189747f3 100644
--- a/src/libffmpeg/libavcodec/dsputil.h
+++ b/src/libffmpeg/libavcodec/dsputil.h
@@ -103,20 +103,36 @@ void dsputil_init_mmx(void);
#elif defined(ARCH_ARMV4L)
-#define emms_c()
-
/* This is to use 4 bytes read to the IDCT pointers for some 'zero'
line ptimizations */
#define __align8 __attribute__ ((aligned (4)))
void dsputil_init_armv4l(void);
-#else
+#endif
+
+
+
+#if defined(HAVE_MLIB)
-#define emms_c()
+/* SPARC/VIS IDCT needs 8-byte aligned DCT blocks */
+#define __align8 __attribute__ ((aligned (8)))
+
+void dsputil_init_mlib(void);
+
+#endif /* HAVE_MLIB */
-#define __align8
+/*
+ * provide empty defaults, if the target specific accelerated dsputils did
+ * not define these:
+ */
+#ifndef __align8
+#define __align8
+#endif
+
+#ifndef emms_c
+#define emms_c()
#endif
#endif
diff --git a/src/libffmpeg/libavcodec/dsputil_mlib.c b/src/libffmpeg/libavcodec/dsputil_mlib.c
new file mode 100644
index 000000000..4be97d0c7
--- /dev/null
+++ b/src/libffmpeg/libavcodec/dsputil_mlib.c
@@ -0,0 +1,136 @@
+/*
+ * Sun mediaLib optimized DSP utils
+ * Copyright (c) 2001 Juergen Keil.
+ *
+ * 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
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "dsputil.h"
+
+#include <mlib_types.h>
+#include <mlib_status.h>
+#include <mlib_sys.h>
+#include <mlib_video.h>
+
+
+static void put_pixels_mlib (uint8_t * dest, const uint8_t * ref,
+ int stride, int height)
+{
+ assert(height == 16 || height == 8);
+ if (height == 16)
+ mlib_VideoCopyRef_U8_U8_8x16(dest, (uint8_t *)ref, stride);
+ else
+ mlib_VideoCopyRef_U8_U8_8x8 (dest, (uint8_t *)ref, stride);
+}
+
+static void put_pixels_x2_mlib (uint8_t * dest, const uint8_t * ref,
+ int stride, int height)
+{
+ assert(height == 16 || height == 8);
+ if (height == 16)
+ mlib_VideoInterpX_U8_U8_8x16(dest, (uint8_t *)ref, stride, stride);
+ else
+ mlib_VideoInterpX_U8_U8_8x8 (dest, (uint8_t *)ref, stride, stride);
+}
+
+static void put_pixels_y2_mlib (uint8_t * dest, const uint8_t * ref,
+ int stride, int height)
+{
+ assert(height == 16 || height == 8);
+ if (height == 16)
+ mlib_VideoInterpY_U8_U8_8x16(dest, (uint8_t *)ref, stride, stride);
+ else
+ mlib_VideoInterpY_U8_U8_8x8 (dest, (uint8_t *)ref, stride, stride);
+}
+
+static void put_pixels_xy2_mlib(uint8_t * dest, const uint8_t * ref,
+ int stride, int height)
+{
+ assert(height == 16 || height == 8);
+ if (height == 16)
+ mlib_VideoInterpXY_U8_U8_8x16(dest, (uint8_t *)ref, stride, stride);
+ else
+ mlib_VideoInterpXY_U8_U8_8x8 (dest, (uint8_t *)ref, stride, stride);
+}
+
+static void avg_pixels_mlib (uint8_t * dest, const uint8_t * ref,
+ int stride, int height)
+{
+ assert(height == 16 || height == 8);
+ if (height == 16)
+ mlib_VideoCopyRefAve_U8_U8_8x16(dest, (uint8_t *)ref, stride);
+ else
+ mlib_VideoCopyRefAve_U8_U8_8x8 (dest, (uint8_t *)ref, stride);
+}
+
+static void avg_pixels_x2_mlib (uint8_t * dest, const uint8_t * ref,
+ int stride, int height)
+{
+ assert(height == 16 || height == 8);
+ if (height == 16)
+ mlib_VideoInterpAveX_U8_U8_8x16(dest, (uint8_t *)ref, stride, stride);
+ else
+ mlib_VideoInterpAveX_U8_U8_8x8 (dest, (uint8_t *)ref, stride, stride);
+}
+
+static void avg_pixels_y2_mlib (uint8_t * dest, const uint8_t * ref,
+ int stride, int height)
+{
+ assert(height == 16 || height == 8);
+ if (height == 16)
+ mlib_VideoInterpAveY_U8_U8_8x16(dest, (uint8_t *)ref, stride, stride);
+ else
+ mlib_VideoInterpAveY_U8_U8_8x8 (dest, (uint8_t *)ref, stride, stride);
+}
+
+static void avg_pixels_xy2_mlib (uint8_t * dest, const uint8_t * ref,
+ int stride, int height)
+{
+ assert(height == 16 || height == 8);
+ if (height == 16)
+ mlib_VideoInterpAveXY_U8_U8_8x16(dest, (uint8_t *)ref, stride, stride);
+ else
+ mlib_VideoInterpAveXY_U8_U8_8x8 (dest, (uint8_t *)ref, stride, stride);
+}
+
+
+static void add_pixels_clamped_mlib(const DCTELEM *block, UINT8 *pixels, int line_size)
+{
+ mlib_VideoAddBlock_U8_S16(pixels, (mlib_s16 *)block, line_size);
+}
+
+
+extern void ff_fdct_mlib(DCTELEM *data);
+extern void ff_idct_mlib(DCTELEM *data);
+
+void dsputil_init_mlib(void)
+{
+ av_fdct = ff_fdct_mlib;
+ ff_idct = ff_idct_mlib;
+
+ put_pixels_tab[0] = put_pixels_mlib;
+ put_pixels_tab[1] = put_pixels_x2_mlib;
+ put_pixels_tab[2] = put_pixels_y2_mlib;
+ put_pixels_tab[3] = put_pixels_xy2_mlib;
+
+ avg_pixels_tab[0] = avg_pixels_mlib;
+ avg_pixels_tab[1] = avg_pixels_x2_mlib;
+ avg_pixels_tab[2] = avg_pixels_y2_mlib;
+ avg_pixels_tab[3] = avg_pixels_xy2_mlib;
+
+ put_no_rnd_pixels_tab[0] = put_pixels_mlib;
+
+ add_pixels_clamped = add_pixels_clamped_mlib;
+}
diff --git a/src/libffmpeg/libavcodec/idct_mlib.c b/src/libffmpeg/libavcodec/idct_mlib.c
new file mode 100644
index 000000000..63421273f
--- /dev/null
+++ b/src/libffmpeg/libavcodec/idct_mlib.c
@@ -0,0 +1,38 @@
+/*
+ * Sun mediaLib optimized DSP utils
+ * Copyright (c) 2001 Juergen Keil.
+ *
+ * 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
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+#include "dsputil.h"
+
+#include <mlib_types.h>
+#include <mlib_status.h>
+#include <mlib_sys.h>
+#include <mlib_video.h>
+
+
+void ff_idct_mlib(DCTELEM *data)
+{
+ mlib_VideoIDCT8x8_S16_S16 (data, data);
+}
+
+
+void ff_fdct_mlib(DCTELEM *data)
+{
+ mlib_VideoDCT8x8_S16_S16 (data, data);
+}