diff x86/h264dsp_mmx.c @ 11951:afee30fe8c26 libavcodec

16x16 and 8x8c x86 SIMD intra pred functions for VP8 and H.264
author darkshikari
date Fri, 25 Jun 2010 18:25:49 +0000
parents 953d0c2d2c0a
children 65470eea7561
line wrap: on
line diff
--- a/x86/h264dsp_mmx.c	Fri Jun 25 18:14:07 2010 +0000
+++ b/x86/h264dsp_mmx.c	Fri Jun 25 18:25:49 2010 +0000
@@ -19,6 +19,7 @@
  */
 
 #include "dsputil_mmx.h"
+#include "libavcodec/h264pred.h"
 
 DECLARE_ALIGNED(8, static const uint64_t, ff_pb_3_1  ) = 0x0103010301030103ULL;
 DECLARE_ALIGNED(8, static const uint64_t, ff_pb_7_3  ) = 0x0307030703070307ULL;
@@ -2322,3 +2323,77 @@
 H264_WEIGHT( 4, 4)
 H264_WEIGHT( 4, 2)
 
+void ff_pred16x16_vertical_mmx     (uint8_t *src, int stride);
+void ff_pred16x16_vertical_sse     (uint8_t *src, int stride);
+void ff_pred16x16_horizontal_mmx   (uint8_t *src, int stride);
+void ff_pred16x16_horizontal_mmxext(uint8_t *src, int stride);
+void ff_pred16x16_horizontal_ssse3 (uint8_t *src, int stride);
+void ff_pred16x16_dc_mmx           (uint8_t *src, int stride);
+void ff_pred16x16_dc_mmxext        (uint8_t *src, int stride);
+void ff_pred16x16_dc_sse           (uint8_t *src, int stride);
+void ff_pred16x16_dc_sse2          (uint8_t *src, int stride);
+void ff_pred16x16_dc_ssse3         (uint8_t *src, int stride);
+void ff_pred16x16_tm_vp8_mmx       (uint8_t *src, int stride);
+void ff_pred16x16_tm_vp8_mmxext    (uint8_t *src, int stride);
+void ff_pred16x16_tm_vp8_sse2      (uint8_t *src, int stride);
+void ff_pred8x8_dc_rv40_mmx        (uint8_t *src, int stride);
+void ff_pred8x8_dc_rv40_mmxext     (uint8_t *src, int stride);
+void ff_pred8x8_vertical_mmx       (uint8_t *src, int stride);
+void ff_pred8x8_horizontal_mmx     (uint8_t *src, int stride);
+void ff_pred8x8_horizontal_mmxext  (uint8_t *src, int stride);
+void ff_pred8x8_horizontal_ssse3   (uint8_t *src, int stride);
+void ff_pred8x8_tm_vp8_mmx         (uint8_t *src, int stride);
+void ff_pred8x8_tm_vp8_mmxext      (uint8_t *src, int stride);
+void ff_pred8x8_tm_vp8_sse2        (uint8_t *src, int stride);
+void ff_pred8x8_tm_vp8_ssse3      (uint8_t *src, int stride);
+
+void ff_h264_pred_init_x86(H264PredContext *h, int codec_id)
+{
+#if HAVE_YASM
+    if (mm_flags & FF_MM_MMX) {
+        h->pred16x16[VERT_PRED8x8] = ff_pred16x16_vertical_mmx;
+        h->pred16x16[HOR_PRED8x8 ] = ff_pred16x16_horizontal_mmx;
+        h->pred16x16[DC_PRED8x8  ] = ff_pred16x16_dc_mmx;
+        h->pred8x8  [VERT_PRED8x8] = ff_pred8x8_vertical_mmx;
+        h->pred8x8  [HOR_PRED8x8 ] = ff_pred8x8_horizontal_mmx;
+        if (codec_id == CODEC_ID_VP8) {
+            h->pred16x16[PLANE_PRED8x8] = ff_pred16x16_tm_vp8_mmx;
+            h->pred8x8  [DC_PRED8x8   ] = ff_pred8x8_dc_rv40_mmx;
+            h->pred8x8  [PLANE_PRED8x8] = ff_pred8x8_tm_vp8_mmx;
+        }
+    }
+
+    if (mm_flags & FF_MM_MMXEXT) {
+        h->pred16x16[HOR_PRED8x8 ] = ff_pred16x16_horizontal_mmxext;
+        h->pred16x16[DC_PRED8x8  ] = ff_pred16x16_dc_mmxext;
+        h->pred8x8  [HOR_PRED8x8 ] = ff_pred8x8_horizontal_mmxext;
+        if (codec_id == CODEC_ID_VP8) {
+            h->pred16x16[PLANE_PRED8x8] = ff_pred16x16_tm_vp8_mmxext;
+            h->pred8x8  [DC_PRED8x8   ] = ff_pred8x8_dc_rv40_mmxext;
+            h->pred8x8  [PLANE_PRED8x8] = ff_pred8x8_tm_vp8_mmxext;
+        }
+    }
+
+    if (mm_flags & FF_MM_SSE) {
+        h->pred16x16[VERT_PRED8x8] = ff_pred16x16_vertical_sse;
+        h->pred16x16[DC_PRED8x8  ] = ff_pred16x16_dc_sse;
+    }
+
+    if (mm_flags & FF_MM_SSE2) {
+        h->pred16x16[DC_PRED8x8  ] = ff_pred16x16_dc_sse2;
+        if (codec_id == CODEC_ID_VP8) {
+            h->pred16x16[PLANE_PRED8x8] = ff_pred16x16_tm_vp8_sse2;
+            h->pred8x8  [PLANE_PRED8x8] = ff_pred8x8_tm_vp8_sse2;
+        }
+    }
+
+    if (mm_flags & FF_MM_SSSE3) {
+        h->pred16x16[HOR_PRED8x8 ] = ff_pred16x16_horizontal_ssse3;
+        h->pred16x16[DC_PRED8x8  ] = ff_pred16x16_dc_ssse3;
+        h->pred8x8  [HOR_PRED8x8 ] = ff_pred8x8_horizontal_ssse3;
+        if (codec_id == CODEC_ID_VP8) {
+            h->pred8x8  [PLANE_PRED8x8] = ff_pred8x8_tm_vp8_ssse3;
+        }
+    }
+#endif
+}