diff options
author | Ronald S. Bultje <rsbultje@gmail.com> | 2014-02-16 13:30:50 -0500 |
---|---|---|
committer | Clément Bœsch <u@pkh.me> | 2014-02-17 13:39:00 +0100 |
commit | fdb093c4e43c2145f344c41bbe9a3d1e613c5709 (patch) | |
tree | bd1734167eb99fa141664d688cc802622ca848c0 /libavcodec/x86/vp9dsp_init.c | |
parent | 38a08e0aea0255e8a960bd5d6b21104c889f27f2 (diff) |
vp9/x86: intra prediction SIMD.
Partially based on h264_intrapred. (I hope to eventually merge these
two intrapred implementations back together.)
Diffstat (limited to 'libavcodec/x86/vp9dsp_init.c')
-rw-r--r-- | libavcodec/x86/vp9dsp_init.c | 73 |
1 files changed, 72 insertions, 1 deletions
diff --git a/libavcodec/x86/vp9dsp_init.c b/libavcodec/x86/vp9dsp_init.c index adcd6941c0..011e13d9da 100644 --- a/libavcodec/x86/vp9dsp_init.c +++ b/libavcodec/x86/vp9dsp_init.c @@ -202,6 +202,49 @@ lpf_funcs(88, 16, avx); #undef lpf_funcs +#define ipred_func(size, type, opt) \ +void ff_vp9_ipred_##type##_##size##x##size##_##opt(uint8_t *dst, ptrdiff_t stride, \ + const uint8_t *l, const uint8_t *a) + +#define ipred_funcs(type, opt) \ +ipred_func(4, type, opt); \ +ipred_func(8, type, opt); \ +ipred_func(16, type, opt); \ +ipred_func(32, type, opt) + +ipred_funcs(dc, ssse3); +ipred_funcs(dc_left, ssse3); +ipred_funcs(dc_top, ssse3); + +#undef ipred_funcs + +ipred_func(8, v, mmx); +ipred_func(16, v, sse2); +ipred_func(32, v, sse2); + +#define ipred_func_set(size, type, opt1, opt2) \ +ipred_func(size, type, opt1); \ +ipred_func(size, type, opt2) + +#define ipred_funcs(type, opt1, opt2) \ +ipred_func(4, type, opt1); \ +ipred_func_set(8, type, opt1, opt2); \ +ipred_func_set(16, type, opt1, opt2); \ +ipred_func_set(32, type, opt1, opt2) + +ipred_funcs(h, ssse3, avx); +ipred_funcs(tm, ssse3, avx); +ipred_funcs(dl, ssse3, avx); +ipred_funcs(dr, ssse3, avx); +ipred_funcs(hu, ssse3, avx); +ipred_funcs(hd, ssse3, avx); +ipred_funcs(vl, ssse3, avx); +ipred_funcs(vr, ssse3, avx); + +#undef ipred_funcs +#undef ipred_func_set +#undef ipred_func + #endif /* HAVE_YASM */ av_cold void ff_vp9dsp_init_x86(VP9DSPContext *dsp) @@ -215,7 +258,6 @@ av_cold void ff_vp9dsp_init_x86(VP9DSPContext *dsp) dsp->mc[idx1][FILTER_8TAP_SHARP ][idx2][0][0] = \ dsp->mc[idx1][FILTER_BILINEAR ][idx2][0][0] = ff_##type##sz##_##opt - #define init_subpel1(idx1, idx2, idxh, idxv, sz, dir, type, opt) \ dsp->mc[idx1][FILTER_8TAP_SMOOTH ][idx2][idxh][idxv] = type##_8tap_smooth_##sz##dir##_##opt; \ dsp->mc[idx1][FILTER_8TAP_REGULAR][idx2][idxh][idxv] = type##_8tap_regular_##sz##dir##_##opt; \ @@ -248,6 +290,25 @@ av_cold void ff_vp9dsp_init_x86(VP9DSPContext *dsp) } \ } while (0) +#define init_ipred(tx, sz, opt) do { \ + dsp->intra_pred[tx][HOR_PRED] = ff_vp9_ipred_h_##sz##x##sz##_##opt; \ + dsp->intra_pred[tx][DIAG_DOWN_LEFT_PRED] = ff_vp9_ipred_dl_##sz##x##sz##_##opt; \ + dsp->intra_pred[tx][DIAG_DOWN_RIGHT_PRED] = ff_vp9_ipred_dr_##sz##x##sz##_##opt; \ + dsp->intra_pred[tx][HOR_DOWN_PRED] = ff_vp9_ipred_hd_##sz##x##sz##_##opt; \ + dsp->intra_pred[tx][VERT_LEFT_PRED] = ff_vp9_ipred_vl_##sz##x##sz##_##opt; \ + dsp->intra_pred[tx][HOR_UP_PRED] = ff_vp9_ipred_hu_##sz##x##sz##_##opt; \ + if (ARCH_X86_64 || tx != TX_32X32) { \ + dsp->intra_pred[tx][VERT_RIGHT_PRED] = ff_vp9_ipred_vr_##sz##x##sz##_##opt; \ + dsp->intra_pred[tx][TM_VP8_PRED] = ff_vp9_ipred_tm_##sz##x##sz##_##opt; \ + } \ +} while (0) +#define init_dc_ipred(tx, sz, opt) do { \ + init_ipred(tx, sz, opt); \ + dsp->intra_pred[tx][DC_PRED] = ff_vp9_ipred_dc_##sz##x##sz##_##opt; \ + dsp->intra_pred[tx][LEFT_DC_PRED] = ff_vp9_ipred_dc_left_##sz##x##sz##_##opt; \ + dsp->intra_pred[tx][TOP_DC_PRED] = ff_vp9_ipred_dc_top_##sz##x##sz##_##opt; \ +} while (0) + if (EXTERNAL_MMX(cpu_flags)) { init_fpel(4, 0, 4, put, mmx); init_fpel(3, 0, 8, put, mmx); @@ -255,6 +316,7 @@ av_cold void ff_vp9dsp_init_x86(VP9DSPContext *dsp) dsp->itxfm_add[4 /* lossless */][ADST_DCT] = dsp->itxfm_add[4 /* lossless */][DCT_ADST] = dsp->itxfm_add[4 /* lossless */][ADST_ADST] = ff_vp9_iwht_iwht_4x4_add_mmx; + dsp->intra_pred[TX_8X8][VERT_PRED] = ff_vp9_ipred_v_8x8_mmx; } if (EXTERNAL_MMXEXT(cpu_flags)) { @@ -273,6 +335,8 @@ av_cold void ff_vp9dsp_init_x86(VP9DSPContext *dsp) init_fpel(1, 1, 32, avg, sse2); init_fpel(0, 1, 64, avg, sse2); init_lpf(sse2); + dsp->intra_pred[TX_16X16][VERT_PRED] = ff_vp9_ipred_v_16x16_sse2; + dsp->intra_pred[TX_32X32][VERT_PRED] = ff_vp9_ipred_v_32x32_sse2; } if (EXTERNAL_SSSE3(cpu_flags)) { @@ -297,6 +361,10 @@ av_cold void ff_vp9dsp_init_x86(VP9DSPContext *dsp) dsp->itxfm_add[TX_32X32][DCT_DCT] = ff_vp9_idct_idct_32x32_add_ssse3; } init_lpf(ssse3); + init_dc_ipred(TX_4X4, 4, ssse3); + init_dc_ipred(TX_8X8, 8, ssse3); + init_dc_ipred(TX_16X16, 16, ssse3); + init_dc_ipred(TX_32X32, 32, ssse3); } if (EXTERNAL_AVX(cpu_flags)) { @@ -315,6 +383,9 @@ av_cold void ff_vp9dsp_init_x86(VP9DSPContext *dsp) dsp->itxfm_add[TX_32X32][DCT_DCT] = ff_vp9_idct_idct_32x32_add_avx; } init_lpf(avx); + init_ipred(TX_8X8, 8, avx); + init_ipred(TX_16X16, 16, avx); + init_ipred(TX_32X32, 32, avx); } #undef init_fpel |