summaryrefslogtreecommitdiff
path: root/libavcodec
diff options
context:
space:
mode:
authorDiego Biurrun <diego@biurrun.de>2012-08-13 13:11:38 +0200
committerDiego Biurrun <diego@biurrun.de>2012-08-24 02:23:16 +0200
commitd211547dddf9deeb34b7dda9cd80b86f3f5cd07a (patch)
treef9295bda1276cba5bff5221556211d91fa8c5547 /libavcodec
parent26ce9aec03d925b1ff4beaea462252ad1d7d2c61 (diff)
x86: mpegvideoenc: Split optimizations off into a separate file
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/mpegvideo.h1
-rw-r--r--libavcodec/mpegvideo_enc.c3
-rw-r--r--libavcodec/x86/Makefile1
-rw-r--r--libavcodec/x86/mpegvideo_mmx.c63
-rw-r--r--libavcodec/x86/mpegvideoenc.c96
-rw-r--r--libavcodec/x86/mpegvideoenc_template.c (renamed from libavcodec/x86/mpegvideo_mmx_template.c)0
6 files changed, 101 insertions, 63 deletions
diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h
index 80fa0fa1bd..850681b1e6 100644
--- a/libavcodec/mpegvideo.h
+++ b/libavcodec/mpegvideo.h
@@ -756,6 +756,7 @@ int ff_MPV_encode_init(AVCodecContext *avctx);
int ff_MPV_encode_end(AVCodecContext *avctx);
int ff_MPV_encode_picture(AVCodecContext *avctx, AVPacket *pkt,
const AVFrame *frame, int *got_packet);
+void ff_MPV_encode_init_x86(MpegEncContext *s);
void ff_MPV_common_init_mmx(MpegEncContext *s);
void ff_MPV_common_init_axp(MpegEncContext *s);
void ff_MPV_common_init_mmi(MpegEncContext *s);
diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c
index 4101094b27..aeafb4d1ef 100644
--- a/libavcodec/mpegvideo_enc.c
+++ b/libavcodec/mpegvideo_enc.c
@@ -784,6 +784,9 @@ av_cold int ff_MPV_encode_init(AVCodecContext *avctx)
if (ff_MPV_common_init(s) < 0)
return -1;
+ if (ARCH_X86)
+ ff_MPV_encode_init_x86(s);
+
if (!s->dct_quantize)
s->dct_quantize = ff_dct_quantize_c;
if (!s->denoise_dct)
diff --git a/libavcodec/x86/Makefile b/libavcodec/x86/Makefile
index bb4d4a7a1e..d843bc9074 100644
--- a/libavcodec/x86/Makefile
+++ b/libavcodec/x86/Makefile
@@ -23,6 +23,7 @@ MMX-OBJS-$(CONFIG_H264PRED) += x86/h264_intrapred_init.o
MMX-OBJS-$(CONFIG_LPC) += x86/lpc_mmx.o
MMX-OBJS-$(CONFIG_MPEGAUDIODSP) += x86/mpegaudiodec_mmx.o
MMX-OBJS-$(CONFIG_MPEGVIDEO) += x86/mpegvideo_mmx.o
+MMX-OBJS-$(CONFIG_MPEGVIDEOENC) += x86/mpegvideoenc.o
MMX-OBJS-$(CONFIG_PNG_DECODER) += x86/pngdsp_init.o
MMX-OBJS-$(CONFIG_PRORES_DECODER) += x86/proresdsp_init.o
MMX-OBJS-$(CONFIG_RV30_DECODER) += x86/rv34dsp_init.o
diff --git a/libavcodec/x86/mpegvideo_mmx.c b/libavcodec/x86/mpegvideo_mmx.c
index 46ed30a76d..720deb39b8 100644
--- a/libavcodec/x86/mpegvideo_mmx.c
+++ b/libavcodec/x86/mpegvideo_mmx.c
@@ -1,7 +1,4 @@
/*
- * The simplest mpeg encoder (well, it was the simplest!)
- * Copyright (c) 2000,2001 Fabrice Bellard
- *
* Optimized for ia32 CPUs by Nick Kurshev <nickols_k@mail.ru>
* h263, mpeg1, mpeg2 dequantizer & draw_edges by Michael Niedermayer <michaelni@gmx.at>
*
@@ -31,9 +28,6 @@
#if HAVE_INLINE_ASM
-extern uint16_t ff_inv_zigzag_direct16[64];
-
-
static void dct_unquantize_h263_intra_mmx(MpegEncContext *s,
DCTELEM *block, int n, int qscale)
{
@@ -588,46 +582,6 @@ static void denoise_dct_sse2(MpegEncContext *s, DCTELEM *block){
);
}
-#if HAVE_SSSE3
-#define HAVE_SSSE3_BAK
-#endif
-#undef HAVE_SSSE3
-#define HAVE_SSSE3 0
-
-#undef HAVE_SSE2
-#undef HAVE_MMXEXT
-#define HAVE_SSE2 0
-#define HAVE_MMXEXT 0
-#define RENAME(a) a ## _MMX
-#define RENAMEl(a) a ## _mmx
-#include "mpegvideo_mmx_template.c"
-
-#undef HAVE_MMXEXT
-#define HAVE_MMXEXT 1
-#undef RENAME
-#undef RENAMEl
-#define RENAME(a) a ## _MMX2
-#define RENAMEl(a) a ## _mmx2
-#include "mpegvideo_mmx_template.c"
-
-#undef HAVE_SSE2
-#define HAVE_SSE2 1
-#undef RENAME
-#undef RENAMEl
-#define RENAME(a) a ## _SSE2
-#define RENAMEl(a) a ## _sse2
-#include "mpegvideo_mmx_template.c"
-
-#ifdef HAVE_SSSE3_BAK
-#undef HAVE_SSSE3
-#define HAVE_SSSE3 1
-#undef RENAME
-#undef RENAMEl
-#define RENAME(a) a ## _SSSE3
-#define RENAMEl(a) a ## _sse2
-#include "mpegvideo_mmx_template.c"
-#endif
-
#endif /* HAVE_INLINE_ASM */
void ff_MPV_common_init_mmx(MpegEncContext *s)
@@ -636,8 +590,6 @@ void ff_MPV_common_init_mmx(MpegEncContext *s)
int mm_flags = av_get_cpu_flags();
if (mm_flags & AV_CPU_FLAG_MMX) {
- const int dct_algo = s->avctx->dct_algo;
-
s->dct_unquantize_h263_intra = dct_unquantize_h263_intra_mmx;
s->dct_unquantize_h263_inter = dct_unquantize_h263_inter_mmx;
s->dct_unquantize_mpeg1_intra = dct_unquantize_mpeg1_intra_mmx;
@@ -651,21 +603,6 @@ void ff_MPV_common_init_mmx(MpegEncContext *s)
} else {
s->denoise_dct= denoise_dct_mmx;
}
-
- if(dct_algo==FF_DCT_AUTO || dct_algo==FF_DCT_MMX){
-#if HAVE_SSSE3
- if(mm_flags & AV_CPU_FLAG_SSSE3){
- s->dct_quantize= dct_quantize_SSSE3;
- } else
-#endif
- if(mm_flags & AV_CPU_FLAG_SSE2){
- s->dct_quantize= dct_quantize_SSE2;
- } else if (mm_flags & AV_CPU_FLAG_MMXEXT) {
- s->dct_quantize= dct_quantize_MMX2;
- } else {
- s->dct_quantize= dct_quantize_MMX;
- }
- }
}
#endif /* HAVE_INLINE_ASM */
}
diff --git a/libavcodec/x86/mpegvideoenc.c b/libavcodec/x86/mpegvideoenc.c
new file mode 100644
index 0000000000..5949a63c45
--- /dev/null
+++ b/libavcodec/x86/mpegvideoenc.c
@@ -0,0 +1,96 @@
+/*
+ * The simplest mpeg encoder (well, it was the simplest!)
+ * Copyright (c) 2000,2001 Fabrice Bellard
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/cpu.h"
+#include "libavutil/x86/asm.h"
+#include "libavcodec/avcodec.h"
+#include "libavcodec/dsputil.h"
+#include "libavcodec/mpegvideo.h"
+#include "dsputil_mmx.h"
+
+#if HAVE_INLINE_ASM
+
+extern uint16_t ff_inv_zigzag_direct16[64];
+
+#if HAVE_SSSE3
+#define HAVE_SSSE3_BAK
+#endif
+#undef HAVE_SSSE3
+#define HAVE_SSSE3 0
+
+#undef HAVE_SSE2
+#undef HAVE_MMXEXT
+#define HAVE_SSE2 0
+#define HAVE_MMXEXT 0
+#define RENAME(a) a ## _MMX
+#define RENAMEl(a) a ## _mmx
+#include "mpegvideoenc_template.c"
+
+#undef HAVE_MMXEXT
+#define HAVE_MMXEXT 1
+#undef RENAME
+#undef RENAMEl
+#define RENAME(a) a ## _MMX2
+#define RENAMEl(a) a ## _mmx2
+#include "mpegvideoenc_template.c"
+
+#undef HAVE_SSE2
+#define HAVE_SSE2 1
+#undef RENAME
+#undef RENAMEl
+#define RENAME(a) a ## _SSE2
+#define RENAMEl(a) a ## _sse2
+#include "mpegvideoenc_template.c"
+
+#ifdef HAVE_SSSE3_BAK
+#undef HAVE_SSSE3
+#define HAVE_SSSE3 1
+#undef RENAME
+#undef RENAMEl
+#define RENAME(a) a ## _SSSE3
+#define RENAMEl(a) a ## _sse2
+#include "mpegvideoenc_template.c"
+#endif
+
+#endif /* HAVE_INLINE_ASM */
+
+void ff_MPV_encode_init_x86(MpegEncContext *s)
+{
+#if HAVE_INLINE_ASM
+ int mm_flags = av_get_cpu_flags();
+ const int dct_algo = s->avctx->dct_algo;
+
+ if (dct_algo == FF_DCT_AUTO || dct_algo == FF_DCT_MMX) {
+#if HAVE_SSSE3
+ if (mm_flags & AV_CPU_FLAG_SSSE3) {
+ s->dct_quantize = dct_quantize_SSSE3;
+ } else
+#endif
+ if (mm_flags & AV_CPU_FLAG_SSE2) {
+ s->dct_quantize = dct_quantize_SSE2;
+ } else if (mm_flags & AV_CPU_FLAG_MMXEXT) {
+ s->dct_quantize = dct_quantize_MMX2;
+ } else {
+ s->dct_quantize = dct_quantize_MMX;
+ }
+ }
+#endif /* HAVE_INLINE_ASM */
+}
diff --git a/libavcodec/x86/mpegvideo_mmx_template.c b/libavcodec/x86/mpegvideoenc_template.c
index 195298d8f3..195298d8f3 100644
--- a/libavcodec/x86/mpegvideo_mmx_template.c
+++ b/libavcodec/x86/mpegvideoenc_template.c