[FFmpeg-cvslog] x86: mpegvideoenc: Split optimizations off into a separate file

Diego Biurrun git at videolan.org
Fri Aug 24 14:44:32 CEST 2012


ffmpeg | branch: master | Diego Biurrun <diego at biurrun.de> | Mon Aug 13 13:11:38 2012 +0200| [d211547dddf9deeb34b7dda9cd80b86f3f5cd07a] | committer: Diego Biurrun

x86: mpegvideoenc: Split optimizations off into a separate file

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=d211547dddf9deeb34b7dda9cd80b86f3f5cd07a
---

 libavcodec/mpegvideo.h                             |    1 +
 libavcodec/mpegvideo_enc.c                         |    3 +
 libavcodec/x86/Makefile                            |    1 +
 libavcodec/x86/mpegvideo_mmx.c                     |   63 -------------
 libavcodec/x86/mpegvideoenc.c                      |   96 ++++++++++++++++++++
 ...ideo_mmx_template.c => mpegvideoenc_template.c} |    0
 6 files changed, 101 insertions(+), 63 deletions(-)

diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h
index 80fa0fa..850681b 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 4101094..aeafb4d 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 bb4d4a7..d843bc9 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 46ed30a..720deb3 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 at mail.ru>
  * h263, mpeg1, mpeg2 dequantizer & draw_edges by Michael Niedermayer <michaelni at 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 0000000..5949a63
--- /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
similarity index 100%
rename from libavcodec/x86/mpegvideo_mmx_template.c
rename to libavcodec/x86/mpegvideoenc_template.c



More information about the ffmpeg-cvslog mailing list