|
|
@ -2400,6 +2400,53 @@ QPEL_OP(put_ , ff_pw_16, _ , PUT_OP, mmx2) |
|
|
|
QPEL_OP(avg_ , ff_pw_16, _ , AVG_MMX2_OP, mmx2) |
|
|
|
QPEL_OP(avg_ , ff_pw_16, _ , AVG_MMX2_OP, mmx2) |
|
|
|
QPEL_OP(put_no_rnd_, ff_pw_15, _no_rnd_, PUT_OP, mmx2) |
|
|
|
QPEL_OP(put_no_rnd_, ff_pw_15, _no_rnd_, PUT_OP, mmx2) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/***********************************/ |
|
|
|
|
|
|
|
/* bilinear qpel: not compliant to any spec, only for -lavdopts fast */ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define QPEL_2TAP_XY(OPNAME, SIZE, MMX, XY, HPEL)\ |
|
|
|
|
|
|
|
static void OPNAME ## 2tap_qpel ## SIZE ## _mc ## XY ## _ ## MMX(uint8_t *dst, uint8_t *src, int stride){\
|
|
|
|
|
|
|
|
OPNAME ## pixels ## SIZE ## HPEL(dst, src, stride, SIZE);\
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
#define QPEL_2TAP_L3(OPNAME, SIZE, MMX, XY, S0, S1, S2)\ |
|
|
|
|
|
|
|
static void OPNAME ## 2tap_qpel ## SIZE ## _mc ## XY ## _ ## MMX(uint8_t *dst, uint8_t *src, int stride){\
|
|
|
|
|
|
|
|
OPNAME ## 2tap_qpel ## SIZE ## _l3_ ## MMX(dst, src+S0, stride, SIZE, S1, S2);\
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define QPEL_2TAP(OPNAME, SIZE, MMX)\ |
|
|
|
|
|
|
|
QPEL_2TAP_XY(OPNAME, SIZE, MMX, 20, _x2_ ## MMX)\
|
|
|
|
|
|
|
|
QPEL_2TAP_XY(OPNAME, SIZE, MMX, 02, _y2_ ## MMX)\
|
|
|
|
|
|
|
|
QPEL_2TAP_XY(OPNAME, SIZE, MMX, 22, _xy2_mmx)\
|
|
|
|
|
|
|
|
static const qpel_mc_func OPNAME ## 2tap_qpel ## SIZE ## _mc00_ ## MMX =\
|
|
|
|
|
|
|
|
OPNAME ## qpel ## SIZE ## _mc00_ ## MMX;\
|
|
|
|
|
|
|
|
static const qpel_mc_func OPNAME ## 2tap_qpel ## SIZE ## _mc21_ ## MMX =\
|
|
|
|
|
|
|
|
OPNAME ## 2tap_qpel ## SIZE ## _mc20_ ## MMX;\
|
|
|
|
|
|
|
|
static const qpel_mc_func OPNAME ## 2tap_qpel ## SIZE ## _mc12_ ## MMX =\
|
|
|
|
|
|
|
|
OPNAME ## 2tap_qpel ## SIZE ## _mc02_ ## MMX;\
|
|
|
|
|
|
|
|
static void OPNAME ## 2tap_qpel ## SIZE ## _mc32_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\
|
|
|
|
|
|
|
|
OPNAME ## pixels ## SIZE ## _y2_ ## MMX(dst, src+1, stride, SIZE);\
|
|
|
|
|
|
|
|
}\
|
|
|
|
|
|
|
|
static void OPNAME ## 2tap_qpel ## SIZE ## _mc23_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\
|
|
|
|
|
|
|
|
OPNAME ## pixels ## SIZE ## _x2_ ## MMX(dst, src+stride, stride, SIZE);\
|
|
|
|
|
|
|
|
}\
|
|
|
|
|
|
|
|
QPEL_2TAP_L3(OPNAME, SIZE, MMX, 10, 0, 1, 0)\
|
|
|
|
|
|
|
|
QPEL_2TAP_L3(OPNAME, SIZE, MMX, 30, 1, -1, 0)\
|
|
|
|
|
|
|
|
QPEL_2TAP_L3(OPNAME, SIZE, MMX, 01, 0, stride, 0)\
|
|
|
|
|
|
|
|
QPEL_2TAP_L3(OPNAME, SIZE, MMX, 03, stride, -stride, 0)\
|
|
|
|
|
|
|
|
QPEL_2TAP_L3(OPNAME, SIZE, MMX, 11, 0, stride, 1)\
|
|
|
|
|
|
|
|
QPEL_2TAP_L3(OPNAME, SIZE, MMX, 31, 1, stride, -1)\
|
|
|
|
|
|
|
|
QPEL_2TAP_L3(OPNAME, SIZE, MMX, 13, stride, -stride, 1)\
|
|
|
|
|
|
|
|
QPEL_2TAP_L3(OPNAME, SIZE, MMX, 33, stride+1, -stride, -1)\
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
QPEL_2TAP(put_, 16, mmx2) |
|
|
|
|
|
|
|
QPEL_2TAP(avg_, 16, mmx2) |
|
|
|
|
|
|
|
QPEL_2TAP(put_, 8, mmx2) |
|
|
|
|
|
|
|
QPEL_2TAP(avg_, 8, mmx2) |
|
|
|
|
|
|
|
QPEL_2TAP(put_, 16, 3dnow) |
|
|
|
|
|
|
|
QPEL_2TAP(avg_, 16, 3dnow) |
|
|
|
|
|
|
|
QPEL_2TAP(put_, 8, 3dnow) |
|
|
|
|
|
|
|
QPEL_2TAP(avg_, 8, 3dnow) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if 0 |
|
|
|
#if 0 |
|
|
|
static void just_return() { return; } |
|
|
|
static void just_return() { return; } |
|
|
|
#endif |
|
|
|
#endif |
|
|
@ -3276,6 +3323,11 @@ void dsputil_init_mmx(DSPContext* c, AVCodecContext *avctx) |
|
|
|
dspfunc(avg_h264_qpel, 0, 16); |
|
|
|
dspfunc(avg_h264_qpel, 0, 16); |
|
|
|
dspfunc(avg_h264_qpel, 1, 8); |
|
|
|
dspfunc(avg_h264_qpel, 1, 8); |
|
|
|
dspfunc(avg_h264_qpel, 2, 4); |
|
|
|
dspfunc(avg_h264_qpel, 2, 4); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
dspfunc(put_2tap_qpel, 0, 16); |
|
|
|
|
|
|
|
dspfunc(put_2tap_qpel, 1, 8); |
|
|
|
|
|
|
|
dspfunc(avg_2tap_qpel, 0, 16); |
|
|
|
|
|
|
|
dspfunc(avg_2tap_qpel, 1, 8); |
|
|
|
#undef dspfunc |
|
|
|
#undef dspfunc |
|
|
|
|
|
|
|
|
|
|
|
c->avg_h264_chroma_pixels_tab[0]= avg_h264_chroma_mc8_mmx2; |
|
|
|
c->avg_h264_chroma_pixels_tab[0]= avg_h264_chroma_mc8_mmx2; |
|
|
@ -3399,6 +3451,11 @@ void dsputil_init_mmx(DSPContext* c, AVCodecContext *avctx) |
|
|
|
dspfunc(avg_h264_qpel, 1, 8); |
|
|
|
dspfunc(avg_h264_qpel, 1, 8); |
|
|
|
dspfunc(avg_h264_qpel, 2, 4); |
|
|
|
dspfunc(avg_h264_qpel, 2, 4); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
dspfunc(put_2tap_qpel, 0, 16); |
|
|
|
|
|
|
|
dspfunc(put_2tap_qpel, 1, 8); |
|
|
|
|
|
|
|
dspfunc(avg_2tap_qpel, 0, 16); |
|
|
|
|
|
|
|
dspfunc(avg_2tap_qpel, 1, 8); |
|
|
|
|
|
|
|
|
|
|
|
c->avg_h264_chroma_pixels_tab[0]= avg_h264_chroma_mc8_3dnow; |
|
|
|
c->avg_h264_chroma_pixels_tab[0]= avg_h264_chroma_mc8_3dnow; |
|
|
|
c->avg_h264_chroma_pixels_tab[1]= avg_h264_chroma_mc4_3dnow; |
|
|
|
c->avg_h264_chroma_pixels_tab[1]= avg_h264_chroma_mc4_3dnow; |
|
|
|
} |
|
|
|
} |
|
|
|