* commit 'ac4b32df71bd932838043a4838b86d11e169707f':
On2 VP7 decoder
Conflicts:
Changelog
libavcodec/arm/h264pred_init_arm.c
libavcodec/arm/vp8dsp.h
libavcodec/arm/vp8dsp_init_arm.c
libavcodec/arm/vp8dsp_init_armv6.c
libavcodec/arm/vp8dsp_init_neon.c
libavcodec/avcodec.h
libavcodec/h264pred.c
libavcodec/version.h
libavcodec/vp8.c
libavcodec/vp8.h
libavcodec/vp8data.h
libavcodec/vp8dsp.c
libavcodec/vp8dsp.h
libavcodec/x86/h264_intrapred_init.c
libavcodec/x86/vp8dsp_init.c
See: 89f2f5dbd7 and others
Merged-by: Michael Niedermayer <michaelni@gmx.at>
tags/n2.3
| @@ -32,6 +32,7 @@ OBJS-$(CONFIG_MLP_DECODER) += arm/mlpdsp_init_arm.o | |||
| OBJS-$(CONFIG_VC1_DECODER) += arm/vc1dsp_init_arm.o | |||
| OBJS-$(CONFIG_VORBIS_DECODER) += arm/vorbisdsp_init_arm.o | |||
| OBJS-$(CONFIG_VP6_DECODER) += arm/vp6dsp_init_arm.o | |||
| OBJS-$(CONFIG_VP7_DECODER) += arm/vp8dsp_init_arm.o | |||
| OBJS-$(CONFIG_VP8_DECODER) += arm/vp8dsp_init_arm.o | |||
| OBJS-$(CONFIG_RV30_DECODER) += arm/rv34dsp_init_arm.o | |||
| OBJS-$(CONFIG_RV40_DECODER) += arm/rv34dsp_init_arm.o \ | |||
| @@ -56,6 +57,9 @@ ARMV6-OBJS-$(CONFIG_HPELDSP) += arm/hpeldsp_init_armv6.o \ | |||
| ARMV6-OBJS-$(CONFIG_MPEGAUDIODSP) += arm/mpegaudiodsp_fixed_armv6.o | |||
| ARMV6-OBJS-$(CONFIG_MLP_DECODER) += arm/mlpdsp_armv6.o | |||
| ARMV6-OBJS-$(CONFIG_VP7_DECODER) += arm/vp8_armv6.o \ | |||
| arm/vp8dsp_init_armv6.o \ | |||
| arm/vp8dsp_armv6.o | |||
| ARMV6-OBJS-$(CONFIG_VP8_DECODER) += arm/vp8_armv6.o \ | |||
| arm/vp8dsp_init_armv6.o \ | |||
| arm/vp8dsp_armv6.o | |||
| @@ -103,5 +107,7 @@ NEON-OBJS-$(CONFIG_VC1_DECODER) += arm/vc1dsp_init_neon.o \ | |||
| arm/vc1dsp_neon.o | |||
| NEON-OBJS-$(CONFIG_VORBIS_DECODER) += arm/vorbisdsp_neon.o | |||
| NEON-OBJS-$(CONFIG_VP6_DECODER) += arm/vp6dsp_neon.o | |||
| NEON-OBJS-$(CONFIG_VP7_DECODER) += arm/vp8dsp_init_neon.o \ | |||
| arm/vp8dsp_neon.o | |||
| NEON-OBJS-$(CONFIG_VP8_DECODER) += arm/vp8dsp_init_neon.o \ | |||
| arm/vp8dsp_neon.o | |||
| @@ -60,7 +60,8 @@ static av_cold void h264_pred_init_neon(H264PredContext *h, int codec_id, | |||
| if (codec_id != AV_CODEC_ID_VP7 && codec_id != AV_CODEC_ID_VP8) | |||
| h->pred8x8[PLANE_PRED8x8] = ff_pred8x8_plane_neon; | |||
| h->pred8x8[DC_128_PRED8x8 ] = ff_pred8x8_128_dc_neon; | |||
| if (codec_id != AV_CODEC_ID_RV40 && codec_id != AV_CODEC_ID_VP7 && codec_id != AV_CODEC_ID_VP8) { | |||
| if (codec_id != AV_CODEC_ID_RV40 && codec_id != AV_CODEC_ID_VP7 && | |||
| codec_id != AV_CODEC_ID_VP8) { | |||
| h->pred8x8[DC_PRED8x8 ] = ff_pred8x8_dc_neon; | |||
| h->pred8x8[LEFT_DC_PRED8x8] = ff_pred8x8_left_dc_neon; | |||
| h->pred8x8[TOP_DC_PRED8x8 ] = ff_pred8x8_top_dc_neon; | |||
| @@ -77,7 +78,8 @@ static av_cold void h264_pred_init_neon(H264PredContext *h, int codec_id, | |||
| h->pred16x16[LEFT_DC_PRED8x8] = ff_pred16x16_left_dc_neon; | |||
| h->pred16x16[TOP_DC_PRED8x8 ] = ff_pred16x16_top_dc_neon; | |||
| h->pred16x16[DC_128_PRED8x8 ] = ff_pred16x16_128_dc_neon; | |||
| if (codec_id != AV_CODEC_ID_SVQ3 && codec_id != AV_CODEC_ID_RV40 && codec_id != AV_CODEC_ID_VP7 && codec_id != AV_CODEC_ID_VP8) | |||
| if (codec_id != AV_CODEC_ID_SVQ3 && codec_id != AV_CODEC_ID_RV40 && | |||
| codec_id != AV_CODEC_ID_VP7 && codec_id != AV_CODEC_ID_VP8) | |||
| h->pred16x16[PLANE_PRED8x8 ] = ff_pred16x16_plane_neon; | |||
| #endif // HAVE_NEON | |||
| } | |||
| @@ -21,8 +21,10 @@ | |||
| #include "libavcodec/vp8dsp.h" | |||
| void ff_vp8dsp_init_armv6(VP8DSPContext *dsp, int vp7); | |||
| void ff_vp8dsp_init_neon(VP8DSPContext *dsp, int vp7); | |||
| void ff_vp78dsp_init_armv6(VP8DSPContext *dsp); | |||
| void ff_vp78dsp_init_neon(VP8DSPContext *dsp); | |||
| void ff_vp8dsp_init_armv6(VP8DSPContext *dsp); | |||
| void ff_vp8dsp_init_neon(VP8DSPContext *dsp); | |||
| #define VP8_LF_Y(hv, inner, opt) \ | |||
| void ff_vp8_##hv##_loop_filter16##inner##_##opt(uint8_t *dst, \ | |||
| @@ -23,12 +23,22 @@ | |||
| #include "libavcodec/vp8dsp.h" | |||
| #include "vp8dsp.h" | |||
| av_cold void ff_vp8dsp_init_arm(VP8DSPContext *dsp, int vp7) | |||
| av_cold void ff_vp78dsp_init_arm(VP8DSPContext *dsp) | |||
| { | |||
| int cpu_flags = av_get_cpu_flags(); | |||
| if (have_armv6(cpu_flags)) | |||
| ff_vp8dsp_init_armv6(dsp, vp7); | |||
| ff_vp78dsp_init_armv6(dsp); | |||
| if (have_neon(cpu_flags)) | |||
| ff_vp8dsp_init_neon(dsp, vp7); | |||
| ff_vp78dsp_init_neon(dsp); | |||
| } | |||
| av_cold void ff_vp8dsp_init_arm(VP8DSPContext *dsp) | |||
| { | |||
| int cpu_flags = av_get_cpu_flags(); | |||
| if (have_armv6(cpu_flags)) | |||
| ff_vp8dsp_init_armv6(dsp); | |||
| if (have_neon(cpu_flags)) | |||
| ff_vp8dsp_init_neon(dsp); | |||
| } | |||
| @@ -40,31 +40,8 @@ VP8_BILIN(16, armv6); | |||
| VP8_BILIN(8, armv6); | |||
| VP8_BILIN(4, armv6); | |||
| av_cold void ff_vp8dsp_init_armv6(VP8DSPContext *dsp, int vp7) | |||
| av_cold void ff_vp78dsp_init_armv6(VP8DSPContext *dsp) | |||
| { | |||
| if (!vp7) { | |||
| dsp->vp8_luma_dc_wht = ff_vp8_luma_dc_wht_armv6; | |||
| dsp->vp8_luma_dc_wht_dc = ff_vp8_luma_dc_wht_dc_armv6; | |||
| dsp->vp8_idct_add = ff_vp8_idct_add_armv6; | |||
| dsp->vp8_idct_dc_add = ff_vp8_idct_dc_add_armv6; | |||
| dsp->vp8_idct_dc_add4y = ff_vp8_idct_dc_add4y_armv6; | |||
| dsp->vp8_idct_dc_add4uv = ff_vp8_idct_dc_add4uv_armv6; | |||
| dsp->vp8_v_loop_filter16y = ff_vp8_v_loop_filter16_armv6; | |||
| dsp->vp8_h_loop_filter16y = ff_vp8_h_loop_filter16_armv6; | |||
| dsp->vp8_v_loop_filter8uv = ff_vp8_v_loop_filter8uv_armv6; | |||
| dsp->vp8_h_loop_filter8uv = ff_vp8_h_loop_filter8uv_armv6; | |||
| dsp->vp8_v_loop_filter16y_inner = ff_vp8_v_loop_filter16_inner_armv6; | |||
| dsp->vp8_h_loop_filter16y_inner = ff_vp8_h_loop_filter16_inner_armv6; | |||
| dsp->vp8_v_loop_filter8uv_inner = ff_vp8_v_loop_filter8uv_inner_armv6; | |||
| dsp->vp8_h_loop_filter8uv_inner = ff_vp8_h_loop_filter8uv_inner_armv6; | |||
| dsp->vp8_v_loop_filter_simple = ff_vp8_v_loop_filter16_simple_armv6; | |||
| dsp->vp8_h_loop_filter_simple = ff_vp8_h_loop_filter16_simple_armv6; | |||
| } | |||
| dsp->put_vp8_epel_pixels_tab[0][0][0] = ff_put_vp8_pixels16_armv6; | |||
| dsp->put_vp8_epel_pixels_tab[0][0][2] = ff_put_vp8_epel16_h6_armv6; | |||
| dsp->put_vp8_epel_pixels_tab[0][2][0] = ff_put_vp8_epel16_v6_armv6; | |||
| @@ -120,3 +97,27 @@ av_cold void ff_vp8dsp_init_armv6(VP8DSPContext *dsp, int vp7) | |||
| dsp->put_vp8_bilinear_pixels_tab[2][2][1] = ff_put_vp8_bilin4_hv_armv6; | |||
| dsp->put_vp8_bilinear_pixels_tab[2][2][2] = ff_put_vp8_bilin4_hv_armv6; | |||
| } | |||
| av_cold void ff_vp8dsp_init_armv6(VP8DSPContext *dsp) | |||
| { | |||
| dsp->vp8_luma_dc_wht = ff_vp8_luma_dc_wht_armv6; | |||
| dsp->vp8_luma_dc_wht_dc = ff_vp8_luma_dc_wht_dc_armv6; | |||
| dsp->vp8_idct_add = ff_vp8_idct_add_armv6; | |||
| dsp->vp8_idct_dc_add = ff_vp8_idct_dc_add_armv6; | |||
| dsp->vp8_idct_dc_add4y = ff_vp8_idct_dc_add4y_armv6; | |||
| dsp->vp8_idct_dc_add4uv = ff_vp8_idct_dc_add4uv_armv6; | |||
| dsp->vp8_v_loop_filter16y = ff_vp8_v_loop_filter16_armv6; | |||
| dsp->vp8_h_loop_filter16y = ff_vp8_h_loop_filter16_armv6; | |||
| dsp->vp8_v_loop_filter8uv = ff_vp8_v_loop_filter8uv_armv6; | |||
| dsp->vp8_h_loop_filter8uv = ff_vp8_h_loop_filter8uv_armv6; | |||
| dsp->vp8_v_loop_filter16y_inner = ff_vp8_v_loop_filter16_inner_armv6; | |||
| dsp->vp8_h_loop_filter16y_inner = ff_vp8_h_loop_filter16_inner_armv6; | |||
| dsp->vp8_v_loop_filter8uv_inner = ff_vp8_v_loop_filter8uv_inner_armv6; | |||
| dsp->vp8_h_loop_filter8uv_inner = ff_vp8_h_loop_filter8uv_inner_armv6; | |||
| dsp->vp8_v_loop_filter_simple = ff_vp8_v_loop_filter16_simple_armv6; | |||
| dsp->vp8_h_loop_filter_simple = ff_vp8_h_loop_filter16_simple_armv6; | |||
| } | |||
| @@ -39,30 +39,8 @@ VP8_BILIN(16, neon); | |||
| VP8_BILIN(8, neon); | |||
| VP8_BILIN(4, neon); | |||
| av_cold void ff_vp8dsp_init_neon(VP8DSPContext *dsp, int vp7) | |||
| av_cold void ff_vp78dsp_init_neon(VP8DSPContext *dsp) | |||
| { | |||
| if (!vp7) { | |||
| dsp->vp8_luma_dc_wht = ff_vp8_luma_dc_wht_neon; | |||
| dsp->vp8_idct_add = ff_vp8_idct_add_neon; | |||
| dsp->vp8_idct_dc_add = ff_vp8_idct_dc_add_neon; | |||
| dsp->vp8_idct_dc_add4y = ff_vp8_idct_dc_add4y_neon; | |||
| dsp->vp8_idct_dc_add4uv = ff_vp8_idct_dc_add4uv_neon; | |||
| dsp->vp8_v_loop_filter16y = ff_vp8_v_loop_filter16_neon; | |||
| dsp->vp8_h_loop_filter16y = ff_vp8_h_loop_filter16_neon; | |||
| dsp->vp8_v_loop_filter8uv = ff_vp8_v_loop_filter8uv_neon; | |||
| dsp->vp8_h_loop_filter8uv = ff_vp8_h_loop_filter8uv_neon; | |||
| dsp->vp8_v_loop_filter16y_inner = ff_vp8_v_loop_filter16_inner_neon; | |||
| dsp->vp8_h_loop_filter16y_inner = ff_vp8_h_loop_filter16_inner_neon; | |||
| dsp->vp8_v_loop_filter8uv_inner = ff_vp8_v_loop_filter8uv_inner_neon; | |||
| dsp->vp8_h_loop_filter8uv_inner = ff_vp8_h_loop_filter8uv_inner_neon; | |||
| dsp->vp8_v_loop_filter_simple = ff_vp8_v_loop_filter16_simple_neon; | |||
| dsp->vp8_h_loop_filter_simple = ff_vp8_h_loop_filter16_simple_neon; | |||
| } | |||
| dsp->put_vp8_epel_pixels_tab[0][0][0] = ff_put_vp8_pixels16_neon; | |||
| dsp->put_vp8_epel_pixels_tab[0][0][2] = ff_put_vp8_epel16_h6_neon; | |||
| dsp->put_vp8_epel_pixels_tab[0][2][0] = ff_put_vp8_epel16_v6_neon; | |||
| @@ -116,3 +94,26 @@ av_cold void ff_vp8dsp_init_neon(VP8DSPContext *dsp, int vp7) | |||
| dsp->put_vp8_bilinear_pixels_tab[2][2][1] = ff_put_vp8_bilin4_hv_neon; | |||
| dsp->put_vp8_bilinear_pixels_tab[2][2][2] = ff_put_vp8_bilin4_hv_neon; | |||
| } | |||
| av_cold void ff_vp8dsp_init_neon(VP8DSPContext *dsp) | |||
| { | |||
| dsp->vp8_luma_dc_wht = ff_vp8_luma_dc_wht_neon; | |||
| dsp->vp8_idct_add = ff_vp8_idct_add_neon; | |||
| dsp->vp8_idct_dc_add = ff_vp8_idct_dc_add_neon; | |||
| dsp->vp8_idct_dc_add4y = ff_vp8_idct_dc_add4y_neon; | |||
| dsp->vp8_idct_dc_add4uv = ff_vp8_idct_dc_add4uv_neon; | |||
| dsp->vp8_v_loop_filter16y = ff_vp8_v_loop_filter16_neon; | |||
| dsp->vp8_h_loop_filter16y = ff_vp8_h_loop_filter16_neon; | |||
| dsp->vp8_v_loop_filter8uv = ff_vp8_v_loop_filter8uv_neon; | |||
| dsp->vp8_h_loop_filter8uv = ff_vp8_h_loop_filter8uv_neon; | |||
| dsp->vp8_v_loop_filter16y_inner = ff_vp8_v_loop_filter16_inner_neon; | |||
| dsp->vp8_h_loop_filter16y_inner = ff_vp8_h_loop_filter16_inner_neon; | |||
| dsp->vp8_v_loop_filter8uv_inner = ff_vp8_v_loop_filter8uv_inner_neon; | |||
| dsp->vp8_h_loop_filter8uv_inner = ff_vp8_h_loop_filter8uv_inner_neon; | |||
| dsp->vp8_v_loop_filter_simple = ff_vp8_v_loop_filter16_simple_neon; | |||
| dsp->vp8_h_loop_filter_simple = ff_vp8_h_loop_filter16_simple_neon; | |||
| } | |||
| @@ -290,6 +290,7 @@ enum AVCodecID { | |||
| AV_CODEC_ID_BRENDER_PIX_DEPRECATED, | |||
| AV_CODEC_ID_PAF_VIDEO_DEPRECATED, | |||
| AV_CODEC_ID_EXR_DEPRECATED, | |||
| AV_CODEC_ID_VP7_DEPRECATED, | |||
| AV_CODEC_ID_BRENDER_PIX= MKBETAG('B','P','I','X'), | |||
| AV_CODEC_ID_Y41P = MKBETAG('Y','4','1','P'), | |||
| @@ -420,7 +420,7 @@ av_cold void ff_h264_pred_init(H264PredContext *h, int codec_id, | |||
| #define H264_PRED(depth) \ | |||
| if(codec_id != AV_CODEC_ID_RV40){\ | |||
| if(codec_id == AV_CODEC_ID_VP7 || codec_id == AV_CODEC_ID_VP8) {\ | |||
| if (codec_id == AV_CODEC_ID_VP7 || codec_id == AV_CODEC_ID_VP8) {\ | |||
| h->pred4x4[VERT_PRED ]= FUNCD(pred4x4_vertical_vp8);\ | |||
| h->pred4x4[HOR_PRED ]= FUNCD(pred4x4_horizontal_vp8);\ | |||
| } else {\ | |||
| @@ -440,7 +440,7 @@ av_cold void ff_h264_pred_init(H264PredContext *h, int codec_id, | |||
| } else\ | |||
| h->pred4x4[VERT_LEFT_PRED ]= FUNCC(pred4x4_vertical_left , depth);\ | |||
| h->pred4x4[HOR_UP_PRED ]= FUNCC(pred4x4_horizontal_up , depth);\ | |||
| if(codec_id != AV_CODEC_ID_VP7 && codec_id != AV_CODEC_ID_VP8) {\ | |||
| if (codec_id != AV_CODEC_ID_VP7 && codec_id != AV_CODEC_ID_VP8) {\ | |||
| h->pred4x4[LEFT_DC_PRED ]= FUNCC(pred4x4_left_dc , depth);\ | |||
| h->pred4x4[TOP_DC_PRED ]= FUNCC(pred4x4_top_dc , depth);\ | |||
| } else {\ | |||
| @@ -498,7 +498,8 @@ av_cold void ff_h264_pred_init(H264PredContext *h, int codec_id, | |||
| }\ | |||
| } else\ | |||
| h->pred8x8[PLANE_PRED8x8]= FUNCD(pred8x8_tm_vp8);\ | |||
| if(codec_id != AV_CODEC_ID_RV40 && codec_id != AV_CODEC_ID_VP7 && codec_id != AV_CODEC_ID_VP8){\ | |||
| if (codec_id != AV_CODEC_ID_RV40 && codec_id != AV_CODEC_ID_VP7 && \ | |||
| codec_id != AV_CODEC_ID_VP8) {\ | |||
| if (chroma_format_idc <= 1) {\ | |||
| h->pred8x8[DC_PRED8x8 ]= FUNCC(pred8x8_dc , depth);\ | |||
| h->pred8x8[LEFT_DC_PRED8x8]= FUNCC(pred8x8_left_dc , depth);\ | |||
| @@ -13,6 +13,7 @@ OBJS-$(CONFIG_VP3DSP) += ppc/vp3dsp_altivec.o | |||
| OBJS-$(CONFIG_VC1_DECODER) += ppc/vc1dsp_altivec.o | |||
| OBJS-$(CONFIG_VORBIS_DECODER) += ppc/vorbisdsp_altivec.o | |||
| OBJS-$(CONFIG_VP7_DECODER) += ppc/vp8dsp_altivec.o | |||
| OBJS-$(CONFIG_VP8_DECODER) += ppc/vp8dsp_altivec.o | |||
| ALTIVEC-OBJS-$(CONFIG_DSPUTIL) += ppc/dsputil_altivec.o \ | |||
| @@ -311,7 +311,8 @@ static void put_vp8_pixels16_altivec(uint8_t *dst, ptrdiff_t dstride, uint8_t *s | |||
| #endif /* HAVE_ALTIVEC */ | |||
| av_cold void ff_vp8dsp_init_ppc(VP8DSPContext *c) | |||
| av_cold void ff_vp78dsp_init_ppc(VP8DSPContext *c) | |||
| { | |||
| #if HAVE_ALTIVEC | |||
| if (!(av_get_cpu_flags() & AV_CPU_FLAG_ALTIVEC)) | |||
| @@ -2687,6 +2687,7 @@ static enum AVCodecID remap_deprecated_codec_id(enum AVCodecID id) | |||
| case AV_CODEC_ID_PAF_VIDEO_DEPRECATED : return AV_CODEC_ID_PAF_VIDEO; | |||
| case AV_CODEC_ID_WEBP_DEPRECATED: return AV_CODEC_ID_WEBP; | |||
| case AV_CODEC_ID_HEVC_DEPRECATED: return AV_CODEC_ID_HEVC; | |||
| case AV_CODEC_ID_VP7_DEPRECATED : return AV_CODEC_ID_VP7; | |||
| default : return id; | |||
| } | |||
| } | |||
| @@ -30,7 +30,7 @@ | |||
| #define LIBAVCODEC_VERSION_MAJOR 55 | |||
| #define LIBAVCODEC_VERSION_MINOR 56 | |||
| #define LIBAVCODEC_VERSION_MICRO 107 | |||
| #define LIBAVCODEC_VERSION_MICRO 108 | |||
| #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ | |||
| LIBAVCODEC_VERSION_MINOR, \ | |||
| @@ -30,8 +30,7 @@ | |||
| #include "vp8.h" | |||
| #include "h264pred.h" | |||
| static const uint8_t vp7_pred4x4_mode[] = | |||
| { | |||
| static const uint8_t vp7_pred4x4_mode[] = { | |||
| [DC_PRED8x8] = DC_PRED, | |||
| [VERT_PRED8x8] = TM_VP8_PRED, | |||
| [HOR_PRED8x8] = TM_VP8_PRED, | |||
| @@ -59,9 +58,9 @@ static const int8_t vp8_pred16x16_tree_inter[4][2] = { | |||
| { -PLANE_PRED8x8, -MODE_I4x4 }, // '110', '111' | |||
| }; | |||
| typedef struct { | |||
| int8_t yoffset; | |||
| int8_t xoffset; | |||
| typedef struct VP7MVPred { | |||
| int8_t yoffset; | |||
| int8_t xoffset; | |||
| uint8_t subblock; | |||
| uint8_t score; | |||
| } VP7MVPred; | |||
| @@ -147,7 +146,9 @@ static const uint8_t vp8_mbsplit_prob[3] = { | |||
| 110, 111, 150 | |||
| }; | |||
| static const uint8_t vp7_submv_prob[3] = { 180, 162, 25 }; | |||
| static const uint8_t vp7_submv_prob[3] = { | |||
| 180, 162, 25 | |||
| }; | |||
| static const uint8_t vp8_submv_prob[5][3] = { | |||
| { 147, 136, 18 }, | |||
| @@ -161,7 +162,7 @@ static const uint8_t vp8_pred16x16_prob_intra[4] = { | |||
| 145, 156, 163, 128 | |||
| }; | |||
| static const uint8_t vp8_pred16x16_prob_inter[4] = { | |||
| 112, 86, 140, 37 | |||
| 112, 86, 140, 37 | |||
| }; | |||
| static const int8_t vp8_pred4x4_tree[9][2] = { | |||
| @@ -708,7 +709,7 @@ static const uint8_t vp8_token_update_probs[4][8][3][NUM_DCT_TOKENS - 1] = { | |||
| }; | |||
| // fixme: copied from h264data.h | |||
| static const uint8_t zigzag_scan[16] = { | |||
| static const uint8_t zigzag_scan[16]={ | |||
| 0 + 0 * 4, 1 + 0 * 4, 0 + 1 * 4, 0 + 2 * 4, | |||
| 1 + 1 * 4, 2 + 0 * 4, 3 + 0 * 4, 2 + 1 * 4, | |||
| 1 + 2 * 4, 0 + 3 * 4, 1 + 3 * 4, 2 + 2 * 4, | |||
| @@ -771,59 +772,67 @@ static const uint8_t vp8_mv_default_prob[2][19] = { | |||
| }; | |||
| static const uint8_t vp7_feature_value_size[2][4] = { | |||
| {7, 6, 0, 8}, | |||
| {7, 6, 0, 5}, | |||
| { 7, 6, 0, 8 }, | |||
| { 7, 6, 0, 5 }, | |||
| }; | |||
| static const int8_t vp7_feature_index_tree[4][2] = | |||
| { | |||
| { 1, 2 }, | |||
| { -0, -1 }, // '00', '01' | |||
| { -2, -3 }, // '10', '11' | |||
| { 1, 2 }, | |||
| { -0, -1 }, // '00', '01' | |||
| { -2, -3 }, // '10', '11' | |||
| }; | |||
| static const uint16_t vp7_ydc_qlookup[] = { | |||
| 4, 4, 5, 6, 6, 7, 8, 8, 9, 10, 11, 12, 13, 14, 15, 16, | |||
| 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 31, | |||
| 32, 33, 33, 34, 35, 36, 36, 37, 38, 39, 39, 40, 41, 41, 42, 43, | |||
| 43, 44, 45, 45, 46, 47, 48, 48, 49, 50, 51, 52, 53, 53, 54, 56, | |||
| 57, 58, 59, 60, 62, 63, 65, 66, 68, 70, 72, 74, 76, 79, 81, 84, | |||
| 87, 90, 93, 96, 100, 104, 108, 112, 116, 121, 126, 131, 136, 142, 148, 154, | |||
| 160, 167, 174, 182, 189, 198, 206, 215, 224, 234, 244, 254, 265, 277, 288, 301, | |||
| 313, 327, 340, 355, 370, 385, 401, 417, 434, 452, 470, 489, 509, 529, 550, 572, | |||
| 4, 4, 5, 6, 6, 7, 8, 8, 9, 10, 11, 12, 13, 14, 15, | |||
| 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, | |||
| 30, 31, 32, 33, 33, 34, 35, 36, 36, 37, 38, 39, 39, 40, 41, | |||
| 41, 42, 43, 43, 44, 45, 45, 46, 47, 48, 48, 49, 50, 51, 52, | |||
| 53, 53, 54, 56, 57, 58, 59, 60, 62, 63, 65, 66, 68, 70, 72, | |||
| 74, 76, 79, 81, 84, 87, 90, 93, 96, 100, 104, 108, 112, 116, 121, | |||
| 126, 131, 136, 142, 148, 154, 160, 167, 174, 182, 189, 198, 206, 215, 224, | |||
| 234, 244, 254, 265, 277, 288, 301, 313, 327, 340, 355, 370, 385, 401, 417, | |||
| 434, 452, 470, 489, 509, 529, 550, 572, | |||
| }; | |||
| static const uint16_t vp7_yac_qlookup[] = { | |||
| 4, 4, 5, 5, 6, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, | |||
| 19, 20, 22, 23, 25, 26, 28, 29, 31, 32, 34, 35, 37, 38, 40, 41, | |||
| 42, 44, 45, 46, 48, 49, 50, 51, 53, 54, 55, 56, 57, 58, 59, 61, | |||
| 62, 63, 64, 65, 67, 68, 69, 70, 72, 73, 75, 76, 78, 80, 82, 84, | |||
| 86, 88, 91, 93, 96, 99, 102, 105, 109, 112, 116, 121, 125, 130, 135, 140, | |||
| 146, 152, 158, 165, 172, 180, 188, 196, 205, 214, 224, 234, 245, 256, 268, 281, | |||
| 294, 308, 322, 337, 353, 369, 386, 404, 423, 443, 463, 484, 506, 529, 553, 578, | |||
| 604, 631, 659, 688, 718, 749, 781, 814, 849, 885, 922, 960, 1000, 1041, 1083, 1127, | |||
| 4, 4, 5, 5, 6, 6, 7, 8, 9, 10, 11, 12, 13, 15, | |||
| 16, 17, 19, 20, 22, 23, 25, 26, 28, 29, 31, 32, 34, 35, | |||
| 37, 38, 40, 41, 42, 44, 45, 46, 48, 49, 50, 51, 53, 54, | |||
| 55, 56, 57, 58, 59, 61, 62, 63, 64, 65, 67, 68, 69, 70, | |||
| 72, 73, 75, 76, 78, 80, 82, 84, 86, 88, 91, 93, 96, 99, | |||
| 102, 105, 109, 112, 116, 121, 125, 130, 135, 140, 146, 152, 158, 165, | |||
| 172, 180, 188, 196, 205, 214, 224, 234, 245, 256, 268, 281, 294, 308, | |||
| 322, 337, 353, 369, 386, 404, 423, 443, 463, 484, 506, 529, 553, 578, | |||
| 604, 631, 659, 688, 718, 749, 781, 814, 849, 885, 922, 960, 1000, 1041, | |||
| 1083, 1127, | |||
| }; | |||
| static const uint16_t vp7_y2dc_qlookup[] = { | |||
| 7, 9, 11, 13, 15, 17, 19, 21, 23, 26, 28, 30, 33, 35, 37, 39, | |||
| 42, 44, 46, 48, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 70, 72, | |||
| 74, 75, 77, 78, 80, 81, 83, 84, 85, 87, 88, 89, 90, 92, 93, 94, | |||
| 95, 96, 97, 99, 100, 101, 102, 104, 105, 106, 108, 109, 111, 113, 114, 116, | |||
| 118, 120, 123, 125, 128, 131, 134, 137, 140, 144, 148, 152, 156, 161, 166, 171, | |||
| 176, 182, 188, 195, 202, 209, 217, 225, 234, 243, 253, 263, 274, 285, 297, 309, | |||
| 322, 336, 350, 365, 381, 397, 414, 432, 450, 470, 490, 511, 533, 556, 579, 604, | |||
| 630, 656, 684, 713, 742, 773, 805, 838, 873, 908, 945, 983, 1022, 1063, 1105, 1148, | |||
| 7, 9, 11, 13, 15, 17, 19, 21, 23, 26, 28, 30, 33, 35, | |||
| 37, 39, 42, 44, 46, 48, 51, 53, 55, 57, 59, 61, 63, 65, | |||
| 67, 69, 70, 72, 74, 75, 77, 78, 80, 81, 83, 84, 85, 87, | |||
| 88, 89, 90, 92, 93, 94, 95, 96, 97, 99, 100, 101, 102, 104, | |||
| 105, 106, 108, 109, 111, 113, 114, 116, 118, 120, 123, 125, 128, 131, | |||
| 134, 137, 140, 144, 148, 152, 156, 161, 166, 171, 176, 182, 188, 195, | |||
| 202, 209, 217, 225, 234, 243, 253, 263, 274, 285, 297, 309, 322, 336, | |||
| 350, 365, 381, 397, 414, 432, 450, 470, 490, 511, 533, 556, 579, 604, | |||
| 630, 656, 684, 713, 742, 773, 805, 838, 873, 908, 945, 983, 1022, 1063, | |||
| 1105, 1148, | |||
| }; | |||
| static const uint16_t vp7_y2ac_qlookup[] = { | |||
| 7, 9, 11, 13, 16, 18, 21, 24, 26, 29, 32, 35, 38, 41, 43, 46, | |||
| 49, 52, 55, 58, 61, 64, 66, 69, 72, 74, 77, 79, 82, 84, 86, 88, | |||
| 91, 93, 95, 97, 98, 100, 102, 104, 105, 107, 109, 110, 112, 113, 115, 116, | |||
| 117, 119, 120, 122, 123, 125, 127, 128, 130, 132, 134, 136, 138, 141, 143, 146, | |||
| 149, 152, 155, 158, 162, 166, 171, 175, 180, 185, 191, 197, 204, 210, 218, 226, | |||
| 234, 243, 252, 262, 273, 284, 295, 308, 321, 335, 350, 365, 381, 398, 416, 435, | |||
| 455, 476, 497, 520, 544, 569, 595, 622, 650, 680, 711, 743, 776, 811, 848, 885, | |||
| 925, 965, 1008, 1052, 1097, 1144, 1193, 1244, 1297, 1351, 1407, 1466, 1526, 1588, 1652, 1719, | |||
| 7, 9, 11, 13, 16, 18, 21, 24, 26, 29, 32, 35, | |||
| 38, 41, 43, 46, 49, 52, 55, 58, 61, 64, 66, 69, | |||
| 72, 74, 77, 79, 82, 84, 86, 88, 91, 93, 95, 97, | |||
| 98, 100, 102, 104, 105, 107, 109, 110, 112, 113, 115, 116, | |||
| 117, 119, 120, 122, 123, 125, 127, 128, 130, 132, 134, 136, | |||
| 138, 141, 143, 146, 149, 152, 155, 158, 162, 166, 171, 175, | |||
| 180, 185, 191, 197, 204, 210, 218, 226, 234, 243, 252, 262, | |||
| 273, 284, 295, 308, 321, 335, 350, 365, 381, 398, 416, 435, | |||
| 455, 476, 497, 520, 544, 569, 595, 622, 650, 680, 711, 743, | |||
| 776, 811, 848, 885, 925, 965, 1008, 1052, 1097, 1144, 1193, 1244, | |||
| 1297, 1351, 1407, 1466, 1526, 1588, 1652, 1719, | |||
| }; | |||
| #endif /* AVCODEC_VP8DATA_H */ | |||
| @@ -31,21 +31,23 @@ | |||
| #include "mathops.h" | |||
| #include "vp8dsp.h" | |||
| #define MK_IDCT_DC_ADD4_C(name) \ | |||
| static void name ## _idct_dc_add4uv_c(uint8_t *dst, int16_t block[4][16], ptrdiff_t stride)\ | |||
| {\ | |||
| name ## _idct_dc_add_c(dst + stride * 0 + 0, block[0], stride);\ | |||
| name ## _idct_dc_add_c(dst + stride * 0 + 4, block[1], stride);\ | |||
| name ## _idct_dc_add_c(dst + stride * 4 + 0, block[2], stride);\ | |||
| name ## _idct_dc_add_c(dst + stride * 4 + 4, block[3], stride);\ | |||
| }\ | |||
| \ | |||
| static void name ## _idct_dc_add4y_c(uint8_t *dst, int16_t block[4][16], ptrdiff_t stride)\ | |||
| {\ | |||
| name ## _idct_dc_add_c(dst + 0, block[0], stride);\ | |||
| name ## _idct_dc_add_c(dst + 4, block[1], stride);\ | |||
| name ## _idct_dc_add_c(dst + 8, block[2], stride);\ | |||
| name ## _idct_dc_add_c(dst + 12, block[3], stride);\ | |||
| #define MK_IDCT_DC_ADD4_C(name) \ | |||
| static void name ## _idct_dc_add4uv_c(uint8_t *dst, int16_t block[4][16], \ | |||
| ptrdiff_t stride) \ | |||
| { \ | |||
| name ## _idct_dc_add_c(dst + stride * 0 + 0, block[0], stride); \ | |||
| name ## _idct_dc_add_c(dst + stride * 0 + 4, block[1], stride); \ | |||
| name ## _idct_dc_add_c(dst + stride * 4 + 0, block[2], stride); \ | |||
| name ## _idct_dc_add_c(dst + stride * 4 + 4, block[3], stride); \ | |||
| } \ | |||
| \ | |||
| static void name ## _idct_dc_add4y_c(uint8_t *dst, int16_t block[4][16], \ | |||
| ptrdiff_t stride) \ | |||
| { \ | |||
| name ## _idct_dc_add_c(dst + 0, block[0], stride); \ | |||
| name ## _idct_dc_add_c(dst + 4, block[1], stride); \ | |||
| name ## _idct_dc_add_c(dst + 8, block[2], stride); \ | |||
| name ## _idct_dc_add_c(dst + 12, block[3], stride); \ | |||
| } | |||
| #if CONFIG_VP7_DECODER | |||
| @@ -113,10 +115,14 @@ static void vp7_idct_add_c(uint8_t *dst, int16_t block[16], ptrdiff_t stride) | |||
| b1 = (tmp[i + 0] - tmp[i + 8]) * 23170; | |||
| c1 = tmp[i + 4] * 12540 - tmp[i + 12] * 30274; | |||
| d1 = tmp[i + 4] * 30274 + tmp[i + 12] * 12540; | |||
| dst[0 * stride + i] = av_clip_uint8(dst[0 * stride + i] + ((a1 + d1 + 0x20000) >> 18)); | |||
| dst[3 * stride + i] = av_clip_uint8(dst[3 * stride + i] + ((a1 - d1 + 0x20000) >> 18)); | |||
| dst[1 * stride + i] = av_clip_uint8(dst[1 * stride + i] + ((b1 + c1 + 0x20000) >> 18)); | |||
| dst[2 * stride + i] = av_clip_uint8(dst[2 * stride + i] + ((b1 - c1 + 0x20000) >> 18)); | |||
| dst[0 * stride + i] = av_clip_uint8(dst[0 * stride + i] + | |||
| ((a1 + d1 + 0x20000) >> 18)); | |||
| dst[3 * stride + i] = av_clip_uint8(dst[3 * stride + i] + | |||
| ((a1 - d1 + 0x20000) >> 18)); | |||
| dst[1 * stride + i] = av_clip_uint8(dst[1 * stride + i] + | |||
| ((b1 + c1 + 0x20000) >> 18)); | |||
| dst[2 * stride + i] = av_clip_uint8(dst[2 * stride + i] + | |||
| ((b1 - c1 + 0x20000) >> 18)); | |||
| } | |||
| } | |||
| @@ -130,12 +136,12 @@ static void vp7_idct_dc_add_c(uint8_t *dst, int16_t block[16], ptrdiff_t stride) | |||
| dst[1] = av_clip_uint8(dst[1] + dc); | |||
| dst[2] = av_clip_uint8(dst[2] + dc); | |||
| dst[3] = av_clip_uint8(dst[3] + dc); | |||
| dst += stride; | |||
| dst += stride; | |||
| } | |||
| } | |||
| MK_IDCT_DC_ADD4_C(vp7) | |||
| #endif | |||
| #endif /* CONFIG_VP7_DECODER */ | |||
| // TODO: Maybe add dequant | |||
| #if CONFIG_VP8_DECODER | |||
| @@ -235,7 +241,7 @@ static void vp8_idct_dc_add_c(uint8_t *dst, int16_t block[16], ptrdiff_t stride) | |||
| } | |||
| MK_IDCT_DC_ADD4_C(vp8) | |||
| #endif | |||
| #endif /* CONFIG_VP8_DECODER */ | |||
| // because I like only having two parameters to pass functions... | |||
| #define LOAD_PIXELS \ | |||
| @@ -251,7 +257,7 @@ MK_IDCT_DC_ADD4_C(vp8) | |||
| #define clip_int8(n) (cm[n + 0x80] - 0x80) | |||
| static av_always_inline void filter_common(uint8_t *p, ptrdiff_t stride, | |||
| int is4tap, int vpn) | |||
| int is4tap, int is_vp7) | |||
| { | |||
| LOAD_PIXELS | |||
| int a, f1, f2; | |||
| @@ -268,7 +274,7 @@ static av_always_inline void filter_common(uint8_t *p, ptrdiff_t stride, | |||
| // since that's what libvpx does. | |||
| f1 = FFMIN(a + 4, 127) >> 3; | |||
| if (vpn == 7) | |||
| if (is_vp7) | |||
| f2 = f1 - ((a & 7) == 4); | |||
| else | |||
| f2 = FFMIN(a + 3, 127) >> 3; | |||
| @@ -280,19 +286,33 @@ static av_always_inline void filter_common(uint8_t *p, ptrdiff_t stride, | |||
| // only used for _inner on blocks without high edge variance | |||
| if (!is4tap) { | |||
| a = (f1 + 1) >> 1; | |||
| a = (f1 + 1) >> 1; | |||
| p[-2 * stride] = cm[p1 + a]; | |||
| p[ 1 * stride] = cm[q1 - a]; | |||
| } | |||
| } | |||
| static av_always_inline int vp7_simple_limit(uint8_t *p, ptrdiff_t stride, int flim) | |||
| static av_always_inline void vp7_filter_common(uint8_t *p, ptrdiff_t stride, | |||
| int is4tap) | |||
| { | |||
| filter_common(p, stride, is4tap, IS_VP7); | |||
| } | |||
| static av_always_inline void vp8_filter_common(uint8_t *p, ptrdiff_t stride, | |||
| int is4tap) | |||
| { | |||
| filter_common(p, stride, is4tap, IS_VP8); | |||
| } | |||
| static av_always_inline int vp7_simple_limit(uint8_t *p, ptrdiff_t stride, | |||
| int flim) | |||
| { | |||
| LOAD_PIXELS | |||
| return FFABS(p0-q0) <= flim; | |||
| return FFABS(p0 - q0) <= flim; | |||
| } | |||
| static av_always_inline int vp8_simple_limit(uint8_t *p, ptrdiff_t stride, int flim) | |||
| static av_always_inline int vp8_simple_limit(uint8_t *p, ptrdiff_t stride, | |||
| int flim) | |||
| { | |||
| LOAD_PIXELS | |||
| return 2 * FFABS(p0 - q0) + (FFABS(p1 - q1) >> 1) <= flim; | |||
| @@ -302,18 +322,16 @@ static av_always_inline int vp8_simple_limit(uint8_t *p, ptrdiff_t stride, int f | |||
| * E - limit at the macroblock edge | |||
| * I - limit for interior difference | |||
| */ | |||
| #define NORMAL_LIMIT(vpn) \ | |||
| static av_always_inline int vp ## vpn ## _normal_limit(uint8_t *p, ptrdiff_t stride, \ | |||
| int E, int I)\ | |||
| { \ | |||
| LOAD_PIXELS \ | |||
| return vp ## vpn ## _simple_limit(p, stride, E) && \ | |||
| FFABS(p3 - p2) <= I && \ | |||
| FFABS(p2 - p1) <= I && \ | |||
| FFABS(p1 - p0) <= I && \ | |||
| FFABS(q3 - q2) <= I && \ | |||
| FFABS(q2 - q1) <= I && \ | |||
| FFABS(q1 - q0) <= I; \ | |||
| #define NORMAL_LIMIT(vpn) \ | |||
| static av_always_inline int vp ## vpn ## _normal_limit(uint8_t *p, \ | |||
| ptrdiff_t stride, \ | |||
| int E, int I) \ | |||
| { \ | |||
| LOAD_PIXELS \ | |||
| return vp ## vpn ## _simple_limit(p, stride, E) && \ | |||
| FFABS(p3 - p2) <= I && FFABS(p2 - p1) <= I && \ | |||
| FFABS(p1 - p0) <= I && FFABS(q3 - q2) <= I && \ | |||
| FFABS(q2 - q1) <= I && FFABS(q1 - q0) <= I; \ | |||
| } | |||
| NORMAL_LIMIT(7) | |||
| @@ -350,90 +368,89 @@ static av_always_inline void filter_mbedge(uint8_t *p, ptrdiff_t stride) | |||
| #define LOOP_FILTER(vpn, dir, size, stridea, strideb, maybe_inline) \ | |||
| static maybe_inline \ | |||
| void vp ## vpn ## _ ## dir ## _loop_filter ## size ## _c(uint8_t *dst, \ | |||
| ptrdiff_t stride, \ | |||
| int flim_E, int flim_I, \ | |||
| int hev_thresh) \ | |||
| void vpn ## _ ## dir ## _loop_filter ## size ## _c(uint8_t *dst, \ | |||
| ptrdiff_t stride, \ | |||
| int flim_E, int flim_I, \ | |||
| int hev_thresh) \ | |||
| { \ | |||
| int i; \ | |||
| for (i = 0; i < size; i++) \ | |||
| if (vp ## vpn ## _normal_limit(dst + i * stridea, strideb, flim_E, flim_I)) { \ | |||
| if (vpn ## _normal_limit(dst + i * stridea, strideb, \ | |||
| flim_E, flim_I)) { \ | |||
| if (hev(dst + i * stridea, strideb, hev_thresh)) \ | |||
| filter_common(dst + i * stridea, strideb, 1, vpn); \ | |||
| vpn ## _filter_common(dst + i * stridea, strideb, 1); \ | |||
| else \ | |||
| filter_mbedge(dst + i * stridea, strideb); \ | |||
| } \ | |||
| } \ | |||
| \ | |||
| static maybe_inline \ | |||
| void vp ## vpn ## _ ## dir ## _loop_filter ## size ## _inner_c(uint8_t *dst, \ | |||
| ptrdiff_t stride, \ | |||
| int flim_E, int flim_I, \ | |||
| int hev_thresh) \ | |||
| void vpn ## _ ## dir ## _loop_filter ## size ## _inner_c(uint8_t *dst, \ | |||
| ptrdiff_t stride, \ | |||
| int flim_E, \ | |||
| int flim_I, \ | |||
| int hev_thresh) \ | |||
| { \ | |||
| int i; \ | |||
| for (i = 0; i < size; i++) \ | |||
| if (vp ## vpn ## _normal_limit(dst + i * stridea, strideb, flim_E, flim_I)) { \ | |||
| if (vpn ## _normal_limit(dst + i * stridea, strideb, \ | |||
| flim_E, flim_I)) { \ | |||
| int hv = hev(dst + i * stridea, strideb, hev_thresh); \ | |||
| if (hv) \ | |||
| filter_common(dst + i * stridea, strideb, 1, vpn); \ | |||
| vpn ## _filter_common(dst + i * stridea, strideb, 1); \ | |||
| else \ | |||
| filter_common(dst + i * stridea, strideb, 0, vpn); \ | |||
| vpn ## _filter_common(dst + i * stridea, strideb, 0); \ | |||
| } \ | |||
| } | |||
| #define UV_LOOP_FILTER(vpn, dir, stridea, strideb) \ | |||
| LOOP_FILTER(vpn, dir, 8, stridea, strideb, av_always_inline) \ | |||
| static void vp ## vpn ## _ ## dir ## _loop_filter8uv_c(uint8_t *dstU, uint8_t *dstV, \ | |||
| ptrdiff_t stride, int fE, \ | |||
| int fI, int hev_thresh)\ | |||
| {\ | |||
| vp ## vpn ## _ ## dir ## _loop_filter8_c(dstU, stride, fE, fI, hev_thresh);\ | |||
| vp ## vpn ## _ ## dir ## _loop_filter8_c(dstV, stride, fE, fI, hev_thresh);\ | |||
| }\ | |||
| static void vp ## vpn ## _ ## dir ## _loop_filter8uv_inner_c(uint8_t *dstU, \ | |||
| uint8_t *dstV, \ | |||
| ptrdiff_t stride, int fE, \ | |||
| int fI, int hev_thresh) \ | |||
| {\ | |||
| vp ## vpn ## _ ## dir ## _loop_filter8_inner_c(dstU, stride, fE, fI, hev_thresh);\ | |||
| vp ## vpn ## _ ## dir ## _loop_filter8_inner_c(dstV, stride, fE, fI, hev_thresh);\ | |||
| #define UV_LOOP_FILTER(vpn, dir, stridea, strideb) \ | |||
| LOOP_FILTER(vpn, dir, 8, stridea, strideb, av_always_inline) \ | |||
| static void vpn ## _ ## dir ## _loop_filter8uv_c(uint8_t *dstU, \ | |||
| uint8_t *dstV, \ | |||
| ptrdiff_t stride, int fE, \ | |||
| int fI, int hev_thresh) \ | |||
| { \ | |||
| vpn ## _ ## dir ## _loop_filter8_c(dstU, stride, fE, fI, hev_thresh); \ | |||
| vpn ## _ ## dir ## _loop_filter8_c(dstV, stride, fE, fI, hev_thresh); \ | |||
| } \ | |||
| \ | |||
| static void vpn ## _ ## dir ## _loop_filter8uv_inner_c(uint8_t *dstU, \ | |||
| uint8_t *dstV, \ | |||
| ptrdiff_t stride, \ | |||
| int fE, int fI, \ | |||
| int hev_thresh) \ | |||
| { \ | |||
| vpn ## _ ## dir ## _loop_filter8_inner_c(dstU, stride, fE, fI, \ | |||
| hev_thresh); \ | |||
| vpn ## _ ## dir ## _loop_filter8_inner_c(dstV, stride, fE, fI, \ | |||
| hev_thresh); \ | |||
| } | |||
| #define LOOP_FILTER_SIMPLE(vpn) \ | |||
| static void vp ## vpn ## _v_loop_filter_simple_c(uint8_t *dst, ptrdiff_t stride, int flim)\ | |||
| {\ | |||
| int i;\ | |||
| \ | |||
| for (i = 0; i < 16; i++)\ | |||
| if (vp ## vpn ## _simple_limit(dst + i, stride, flim))\ | |||
| filter_common(dst + i, stride, 1, vpn);\ | |||
| }\ | |||
| \ | |||
| static void vp ## vpn ## _h_loop_filter_simple_c(uint8_t *dst, ptrdiff_t stride, int flim)\ | |||
| {\ | |||
| int i;\ | |||
| \ | |||
| for (i = 0; i < 16; i++)\ | |||
| if (vp ## vpn ## _simple_limit(dst + i * stride, 1, flim))\ | |||
| filter_common(dst + i * stride, 1, 1, vpn);\ | |||
| #define LOOP_FILTER_SIMPLE(vpn) \ | |||
| static void vpn ## _v_loop_filter_simple_c(uint8_t *dst, ptrdiff_t stride, \ | |||
| int flim) \ | |||
| { \ | |||
| int i; \ | |||
| for (i = 0; i < 16; i++) \ | |||
| if (vpn ## _simple_limit(dst + i, stride, flim)) \ | |||
| vpn ## _filter_common(dst + i, stride, 1); \ | |||
| } \ | |||
| \ | |||
| static void vpn ## _h_loop_filter_simple_c(uint8_t *dst, ptrdiff_t stride, \ | |||
| int flim) \ | |||
| { \ | |||
| int i; \ | |||
| for (i = 0; i < 16; i++) \ | |||
| if (vpn ## _simple_limit(dst + i * stride, 1, flim)) \ | |||
| vpn ## _filter_common(dst + i * stride, 1, 1); \ | |||
| } | |||
| #if CONFIG_VP7_DECODER | |||
| LOOP_FILTER(7, v, 16, 1, stride,) | |||
| LOOP_FILTER(7, h, 16, stride, 1,) | |||
| UV_LOOP_FILTER(7, v, 1, stride) | |||
| UV_LOOP_FILTER(7, h, stride, 1) | |||
| LOOP_FILTER_SIMPLE(7) | |||
| #endif | |||
| #if CONFIG_VP8_DECODER | |||
| LOOP_FILTER(8, v, 16, 1, stride,) | |||
| LOOP_FILTER(8, h, 16, stride, 1,) | |||
| UV_LOOP_FILTER(8, v, 1, stride) | |||
| UV_LOOP_FILTER(8, h, stride, 1) | |||
| LOOP_FILTER_SIMPLE(8) | |||
| #endif | |||
| #define LOOP_FILTERS(vpn) \ | |||
| LOOP_FILTER(vpn, v, 16, 1, stride, ) \ | |||
| LOOP_FILTER(vpn, h, 16, stride, 1, ) \ | |||
| UV_LOOP_FILTER(vpn, v, 1, stride) \ | |||
| UV_LOOP_FILTER(vpn, h, stride, 1) \ | |||
| LOOP_FILTER_SIMPLE(vpn) \ | |||
| static const uint8_t subpel_filters[7][6] = { | |||
| { 0, 6, 123, 12, 1, 0 }, | |||
| @@ -622,7 +639,7 @@ VP8_BILINEAR(16) | |||
| VP8_BILINEAR(8) | |||
| VP8_BILINEAR(4) | |||
| #define VP8_MC_FUNC(IDX, SIZE) \ | |||
| #define VP78_MC_FUNC(IDX, SIZE) \ | |||
| dsp->put_vp8_epel_pixels_tab[IDX][0][0] = put_vp8_pixels ## SIZE ## _c; \ | |||
| dsp->put_vp8_epel_pixels_tab[IDX][0][1] = put_vp8_epel ## SIZE ## _h4_c; \ | |||
| dsp->put_vp8_epel_pixels_tab[IDX][0][2] = put_vp8_epel ## SIZE ## _h6_c; \ | |||
| @@ -633,8 +650,8 @@ VP8_BILINEAR(4) | |||
| dsp->put_vp8_epel_pixels_tab[IDX][2][1] = put_vp8_epel ## SIZE ## _h4v6_c; \ | |||
| dsp->put_vp8_epel_pixels_tab[IDX][2][2] = put_vp8_epel ## SIZE ## _h6v6_c | |||
| #define VP8_BILINEAR_MC_FUNC(IDX, SIZE) \ | |||
| dsp->put_vp8_bilinear_pixels_tab[IDX][0][0] = put_vp8_pixels ## SIZE ## _c; \ | |||
| #define VP78_BILINEAR_MC_FUNC(IDX, SIZE) \ | |||
| dsp->put_vp8_bilinear_pixels_tab[IDX][0][0] = put_vp8_pixels ## SIZE ## _c; \ | |||
| dsp->put_vp8_bilinear_pixels_tab[IDX][0][1] = put_vp8_bilinear ## SIZE ## _h_c; \ | |||
| dsp->put_vp8_bilinear_pixels_tab[IDX][0][2] = put_vp8_bilinear ## SIZE ## _h_c; \ | |||
| dsp->put_vp8_bilinear_pixels_tab[IDX][1][0] = put_vp8_bilinear ## SIZE ## _v_c; \ | |||
| @@ -644,48 +661,79 @@ VP8_BILINEAR(4) | |||
| dsp->put_vp8_bilinear_pixels_tab[IDX][2][1] = put_vp8_bilinear ## SIZE ## _hv_c; \ | |||
| dsp->put_vp8_bilinear_pixels_tab[IDX][2][2] = put_vp8_bilinear ## SIZE ## _hv_c | |||
| av_cold void ff_vp8dsp_init(VP8DSPContext *dsp, int vp7) | |||
| av_cold void ff_vp78dsp_init(VP8DSPContext *dsp) | |||
| { | |||
| #if CONFIG_VP7_DECODER && CONFIG_VP8_DECODER | |||
| #define VPX(f) vp7 ? vp7_ ## f : vp8_ ## f | |||
| #elif CONFIG_VP7_DECODER | |||
| #define VPX(f) vp7_ ## f | |||
| #else // CONFIG_VP8_DECODER | |||
| #define VPX(f) vp8_ ## f | |||
| #endif | |||
| dsp->vp8_luma_dc_wht = VPX(luma_dc_wht_c); | |||
| dsp->vp8_luma_dc_wht_dc = VPX(luma_dc_wht_dc_c); | |||
| dsp->vp8_idct_add = VPX(idct_add_c); | |||
| dsp->vp8_idct_dc_add = VPX(idct_dc_add_c); | |||
| dsp->vp8_idct_dc_add4y = VPX(idct_dc_add4y_c); | |||
| dsp->vp8_idct_dc_add4uv = VPX(idct_dc_add4uv_c); | |||
| dsp->vp8_v_loop_filter16y = VPX(v_loop_filter16_c); | |||
| dsp->vp8_h_loop_filter16y = VPX(h_loop_filter16_c); | |||
| dsp->vp8_v_loop_filter8uv = VPX(v_loop_filter8uv_c); | |||
| dsp->vp8_h_loop_filter8uv = VPX(h_loop_filter8uv_c); | |||
| dsp->vp8_v_loop_filter16y_inner = VPX(v_loop_filter16_inner_c); | |||
| dsp->vp8_h_loop_filter16y_inner = VPX(h_loop_filter16_inner_c); | |||
| dsp->vp8_v_loop_filter8uv_inner = VPX(v_loop_filter8uv_inner_c); | |||
| dsp->vp8_h_loop_filter8uv_inner = VPX(h_loop_filter8uv_inner_c); | |||
| dsp->vp8_v_loop_filter_simple = VPX(v_loop_filter_simple_c); | |||
| dsp->vp8_h_loop_filter_simple = VPX(h_loop_filter_simple_c); | |||
| VP8_MC_FUNC(0, 16); | |||
| VP8_MC_FUNC(1, 8); | |||
| VP8_MC_FUNC(2, 4); | |||
| VP8_BILINEAR_MC_FUNC(0, 16); | |||
| VP8_BILINEAR_MC_FUNC(1, 8); | |||
| VP8_BILINEAR_MC_FUNC(2, 4); | |||
| VP78_MC_FUNC(0, 16); | |||
| VP78_MC_FUNC(1, 8); | |||
| VP78_MC_FUNC(2, 4); | |||
| VP78_BILINEAR_MC_FUNC(0, 16); | |||
| VP78_BILINEAR_MC_FUNC(1, 8); | |||
| VP78_BILINEAR_MC_FUNC(2, 4); | |||
| if (ARCH_ARM) | |||
| ff_vp8dsp_init_arm(dsp, vp7); | |||
| ff_vp78dsp_init_arm(dsp); | |||
| if (ARCH_PPC) | |||
| ff_vp8dsp_init_ppc(dsp); | |||
| ff_vp78dsp_init_ppc(dsp); | |||
| if (ARCH_X86) | |||
| ff_vp78dsp_init_x86(dsp); | |||
| } | |||
| #if CONFIG_VP7_DECODER | |||
| LOOP_FILTERS(vp7) | |||
| av_cold void ff_vp7dsp_init(VP8DSPContext *dsp) | |||
| { | |||
| dsp->vp8_luma_dc_wht = vp7_luma_dc_wht_c; | |||
| dsp->vp8_luma_dc_wht_dc = vp7_luma_dc_wht_dc_c; | |||
| dsp->vp8_idct_add = vp7_idct_add_c; | |||
| dsp->vp8_idct_dc_add = vp7_idct_dc_add_c; | |||
| dsp->vp8_idct_dc_add4y = vp7_idct_dc_add4y_c; | |||
| dsp->vp8_idct_dc_add4uv = vp7_idct_dc_add4uv_c; | |||
| dsp->vp8_v_loop_filter16y = vp7_v_loop_filter16_c; | |||
| dsp->vp8_h_loop_filter16y = vp7_h_loop_filter16_c; | |||
| dsp->vp8_v_loop_filter8uv = vp7_v_loop_filter8uv_c; | |||
| dsp->vp8_h_loop_filter8uv = vp7_h_loop_filter8uv_c; | |||
| dsp->vp8_v_loop_filter16y_inner = vp7_v_loop_filter16_inner_c; | |||
| dsp->vp8_h_loop_filter16y_inner = vp7_h_loop_filter16_inner_c; | |||
| dsp->vp8_v_loop_filter8uv_inner = vp7_v_loop_filter8uv_inner_c; | |||
| dsp->vp8_h_loop_filter8uv_inner = vp7_h_loop_filter8uv_inner_c; | |||
| dsp->vp8_v_loop_filter_simple = vp7_v_loop_filter_simple_c; | |||
| dsp->vp8_h_loop_filter_simple = vp7_h_loop_filter_simple_c; | |||
| } | |||
| #endif /* CONFIG_VP7_DECODER */ | |||
| #if CONFIG_VP8_DECODER | |||
| LOOP_FILTERS(vp8) | |||
| av_cold void ff_vp8dsp_init(VP8DSPContext *dsp) | |||
| { | |||
| dsp->vp8_luma_dc_wht = vp8_luma_dc_wht_c; | |||
| dsp->vp8_luma_dc_wht_dc = vp8_luma_dc_wht_dc_c; | |||
| dsp->vp8_idct_add = vp8_idct_add_c; | |||
| dsp->vp8_idct_dc_add = vp8_idct_dc_add_c; | |||
| dsp->vp8_idct_dc_add4y = vp8_idct_dc_add4y_c; | |||
| dsp->vp8_idct_dc_add4uv = vp8_idct_dc_add4uv_c; | |||
| dsp->vp8_v_loop_filter16y = vp8_v_loop_filter16_c; | |||
| dsp->vp8_h_loop_filter16y = vp8_h_loop_filter16_c; | |||
| dsp->vp8_v_loop_filter8uv = vp8_v_loop_filter8uv_c; | |||
| dsp->vp8_h_loop_filter8uv = vp8_h_loop_filter8uv_c; | |||
| dsp->vp8_v_loop_filter16y_inner = vp8_v_loop_filter16_inner_c; | |||
| dsp->vp8_h_loop_filter16y_inner = vp8_h_loop_filter16_inner_c; | |||
| dsp->vp8_v_loop_filter8uv_inner = vp8_v_loop_filter8uv_inner_c; | |||
| dsp->vp8_h_loop_filter8uv_inner = vp8_h_loop_filter8uv_inner_c; | |||
| dsp->vp8_v_loop_filter_simple = vp8_v_loop_filter_simple_c; | |||
| dsp->vp8_h_loop_filter_simple = vp8_h_loop_filter_simple_c; | |||
| if (ARCH_ARM) | |||
| ff_vp8dsp_init_arm(dsp); | |||
| if (ARCH_X86) | |||
| ff_vp8dsp_init_x86(dsp, vp7); | |||
| ff_vp8dsp_init_x86(dsp); | |||
| } | |||
| #endif /* CONFIG_VP8_DECODER */ | |||
| @@ -88,9 +88,18 @@ void ff_put_vp8_pixels8_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride, | |||
| void ff_put_vp8_pixels4_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride, | |||
| int h, int x, int y); | |||
| void ff_vp8dsp_init(VP8DSPContext *c, int vp7); | |||
| void ff_vp8dsp_init_x86(VP8DSPContext *c, int vp7); | |||
| void ff_vp8dsp_init_arm(VP8DSPContext *c, int vp7); | |||
| void ff_vp8dsp_init_ppc(VP8DSPContext *c); | |||
| void ff_vp7dsp_init(VP8DSPContext *c); | |||
| void ff_vp78dsp_init(VP8DSPContext *c); | |||
| void ff_vp78dsp_init_arm(VP8DSPContext *c); | |||
| void ff_vp78dsp_init_ppc(VP8DSPContext *c); | |||
| void ff_vp78dsp_init_x86(VP8DSPContext *c); | |||
| void ff_vp8dsp_init(VP8DSPContext *c); | |||
| void ff_vp8dsp_init_arm(VP8DSPContext *c); | |||
| void ff_vp8dsp_init_x86(VP8DSPContext *c); | |||
| #define IS_VP7 1 | |||
| #define IS_VP8 0 | |||
| #endif /* AVCODEC_VP8DSP_H */ | |||
| @@ -231,7 +231,8 @@ av_cold void ff_h264_pred_init_x86(H264PredContext *h, int codec_id, | |||
| h->pred4x4 [VERT_RIGHT_PRED ] = ff_pred4x4_vertical_right_8_mmxext; | |||
| h->pred4x4 [HOR_DOWN_PRED ] = ff_pred4x4_horizontal_down_8_mmxext; | |||
| h->pred4x4 [DC_PRED ] = ff_pred4x4_dc_8_mmxext; | |||
| if (codec_id == AV_CODEC_ID_VP7 || codec_id == AV_CODEC_ID_VP8 || codec_id == AV_CODEC_ID_H264) { | |||
| if (codec_id == AV_CODEC_ID_VP7 || codec_id == AV_CODEC_ID_VP8 || | |||
| codec_id == AV_CODEC_ID_H264) { | |||
| h->pred4x4 [DIAG_DOWN_LEFT_PRED] = ff_pred4x4_down_left_8_mmxext; | |||
| } | |||
| if (codec_id == AV_CODEC_ID_SVQ3 || codec_id == AV_CODEC_ID_H264) { | |||
| @@ -315,44 +315,18 @@ DECLARE_LOOP_FILTER(sse4) | |||
| c->put_vp8_bilinear_pixels_tab[IDX][2][2] = ff_put_vp8_bilinear ## SIZE ## _hv_ ## OPT | |||
| av_cold void ff_vp8dsp_init_x86(VP8DSPContext* c, int vp7) | |||
| av_cold void ff_vp78dsp_init_x86(VP8DSPContext *c) | |||
| { | |||
| #if HAVE_YASM | |||
| int cpu_flags = av_get_cpu_flags(); | |||
| if (EXTERNAL_MMX(cpu_flags)) { | |||
| if (!vp7) { | |||
| c->vp8_idct_dc_add = ff_vp8_idct_dc_add_mmx; | |||
| c->vp8_idct_dc_add4uv = ff_vp8_idct_dc_add4uv_mmx; | |||
| } | |||
| #if ARCH_X86_32 | |||
| if (!vp7) { | |||
| c->vp8_idct_dc_add4y = ff_vp8_idct_dc_add4y_mmx; | |||
| c->vp8_idct_add = ff_vp8_idct_add_mmx; | |||
| c->vp8_luma_dc_wht = ff_vp8_luma_dc_wht_mmx; | |||
| } | |||
| c->put_vp8_epel_pixels_tab[0][0][0] = | |||
| c->put_vp8_bilinear_pixels_tab[0][0][0] = ff_put_vp8_pixels16_mmx; | |||
| #endif | |||
| c->put_vp8_epel_pixels_tab[1][0][0] = | |||
| c->put_vp8_bilinear_pixels_tab[1][0][0] = ff_put_vp8_pixels8_mmx; | |||
| #if ARCH_X86_32 | |||
| if (!vp7) { | |||
| c->vp8_v_loop_filter_simple = ff_vp8_v_loop_filter_simple_mmx; | |||
| c->vp8_h_loop_filter_simple = ff_vp8_h_loop_filter_simple_mmx; | |||
| c->vp8_v_loop_filter16y_inner = ff_vp8_v_loop_filter16y_inner_mmx; | |||
| c->vp8_h_loop_filter16y_inner = ff_vp8_h_loop_filter16y_inner_mmx; | |||
| c->vp8_v_loop_filter8uv_inner = ff_vp8_v_loop_filter8uv_inner_mmx; | |||
| c->vp8_h_loop_filter8uv_inner = ff_vp8_h_loop_filter8uv_inner_mmx; | |||
| c->vp8_v_loop_filter16y = ff_vp8_v_loop_filter16y_mbedge_mmx; | |||
| c->vp8_h_loop_filter16y = ff_vp8_h_loop_filter16y_mbedge_mmx; | |||
| c->vp8_v_loop_filter8uv = ff_vp8_v_loop_filter8uv_mbedge_mmx; | |||
| c->vp8_h_loop_filter8uv = ff_vp8_h_loop_filter8uv_mbedge_mmx; | |||
| } | |||
| #endif | |||
| } | |||
| /* note that 4-tap width=16 functions are missing because w=16 | |||
| @@ -365,29 +339,10 @@ av_cold void ff_vp8dsp_init_x86(VP8DSPContext* c, int vp7) | |||
| VP8_MC_FUNC(1, 8, mmxext); | |||
| VP8_BILINEAR_MC_FUNC(0, 16, mmxext); | |||
| VP8_BILINEAR_MC_FUNC(1, 8, mmxext); | |||
| if (!vp7) { | |||
| c->vp8_v_loop_filter_simple = ff_vp8_v_loop_filter_simple_mmxext; | |||
| c->vp8_h_loop_filter_simple = ff_vp8_h_loop_filter_simple_mmxext; | |||
| c->vp8_v_loop_filter16y_inner = ff_vp8_v_loop_filter16y_inner_mmxext; | |||
| c->vp8_h_loop_filter16y_inner = ff_vp8_h_loop_filter16y_inner_mmxext; | |||
| c->vp8_v_loop_filter8uv_inner = ff_vp8_v_loop_filter8uv_inner_mmxext; | |||
| c->vp8_h_loop_filter8uv_inner = ff_vp8_h_loop_filter8uv_inner_mmxext; | |||
| c->vp8_v_loop_filter16y = ff_vp8_v_loop_filter16y_mbedge_mmxext; | |||
| c->vp8_h_loop_filter16y = ff_vp8_h_loop_filter16y_mbedge_mmxext; | |||
| c->vp8_v_loop_filter8uv = ff_vp8_v_loop_filter8uv_mbedge_mmxext; | |||
| c->vp8_h_loop_filter8uv = ff_vp8_h_loop_filter8uv_mbedge_mmxext; | |||
| } | |||
| #endif | |||
| } | |||
| if (EXTERNAL_SSE(cpu_flags)) { | |||
| if (!vp7) { | |||
| c->vp8_idct_add = ff_vp8_idct_add_sse; | |||
| c->vp8_luma_dc_wht = ff_vp8_luma_dc_wht_sse; | |||
| } | |||
| c->put_vp8_epel_pixels_tab[0][0][0] = | |||
| c->put_vp8_bilinear_pixels_tab[0][0][0] = ff_put_vp8_pixels16_sse; | |||
| } | |||
| @@ -397,64 +352,114 @@ av_cold void ff_vp8dsp_init_x86(VP8DSPContext* c, int vp7) | |||
| VP8_MC_FUNC(1, 8, sse2); | |||
| VP8_BILINEAR_MC_FUNC(0, 16, sse2); | |||
| VP8_BILINEAR_MC_FUNC(1, 8, sse2); | |||
| } | |||
| if (!vp7) { | |||
| c->vp8_v_loop_filter_simple = ff_vp8_v_loop_filter_simple_sse2; | |||
| if (EXTERNAL_SSSE3(cpu_flags)) { | |||
| VP8_LUMA_MC_FUNC(0, 16, ssse3); | |||
| VP8_MC_FUNC(1, 8, ssse3); | |||
| VP8_MC_FUNC(2, 4, ssse3); | |||
| VP8_BILINEAR_MC_FUNC(0, 16, ssse3); | |||
| VP8_BILINEAR_MC_FUNC(1, 8, ssse3); | |||
| VP8_BILINEAR_MC_FUNC(2, 4, ssse3); | |||
| } | |||
| #endif /* HAVE_YASM */ | |||
| } | |||
| c->vp8_v_loop_filter16y_inner = ff_vp8_v_loop_filter16y_inner_sse2; | |||
| c->vp8_v_loop_filter8uv_inner = ff_vp8_v_loop_filter8uv_inner_sse2; | |||
| av_cold void ff_vp8dsp_init_x86(VP8DSPContext *c) | |||
| { | |||
| #if HAVE_YASM | |||
| int cpu_flags = av_get_cpu_flags(); | |||
| c->vp8_v_loop_filter16y = ff_vp8_v_loop_filter16y_mbedge_sse2; | |||
| c->vp8_v_loop_filter8uv = ff_vp8_v_loop_filter8uv_mbedge_sse2; | |||
| } | |||
| if (EXTERNAL_MMX(cpu_flags)) { | |||
| c->vp8_idct_dc_add = ff_vp8_idct_dc_add_mmx; | |||
| c->vp8_idct_dc_add4uv = ff_vp8_idct_dc_add4uv_mmx; | |||
| #if ARCH_X86_32 | |||
| c->vp8_idct_dc_add4y = ff_vp8_idct_dc_add4y_mmx; | |||
| c->vp8_idct_add = ff_vp8_idct_add_mmx; | |||
| c->vp8_luma_dc_wht = ff_vp8_luma_dc_wht_mmx; | |||
| c->vp8_v_loop_filter_simple = ff_vp8_v_loop_filter_simple_mmx; | |||
| c->vp8_h_loop_filter_simple = ff_vp8_h_loop_filter_simple_mmx; | |||
| c->vp8_v_loop_filter16y_inner = ff_vp8_v_loop_filter16y_inner_mmx; | |||
| c->vp8_h_loop_filter16y_inner = ff_vp8_h_loop_filter16y_inner_mmx; | |||
| c->vp8_v_loop_filter8uv_inner = ff_vp8_v_loop_filter8uv_inner_mmx; | |||
| c->vp8_h_loop_filter8uv_inner = ff_vp8_h_loop_filter8uv_inner_mmx; | |||
| c->vp8_v_loop_filter16y = ff_vp8_v_loop_filter16y_mbedge_mmx; | |||
| c->vp8_h_loop_filter16y = ff_vp8_h_loop_filter16y_mbedge_mmx; | |||
| c->vp8_v_loop_filter8uv = ff_vp8_v_loop_filter8uv_mbedge_mmx; | |||
| c->vp8_h_loop_filter8uv = ff_vp8_h_loop_filter8uv_mbedge_mmx; | |||
| #endif | |||
| } | |||
| if (EXTERNAL_SSE2(cpu_flags)) { | |||
| if (!vp7) { | |||
| c->vp8_idct_dc_add4y = ff_vp8_idct_dc_add4y_sse2; | |||
| /* note that 4-tap width=16 functions are missing because w=16 | |||
| * is only used for luma, and luma is always a copy or sixtap. */ | |||
| if (EXTERNAL_MMXEXT(cpu_flags)) { | |||
| #if ARCH_X86_32 | |||
| c->vp8_v_loop_filter_simple = ff_vp8_v_loop_filter_simple_mmxext; | |||
| c->vp8_h_loop_filter_simple = ff_vp8_h_loop_filter_simple_mmxext; | |||
| c->vp8_v_loop_filter16y_inner = ff_vp8_v_loop_filter16y_inner_mmxext; | |||
| c->vp8_h_loop_filter16y_inner = ff_vp8_h_loop_filter16y_inner_mmxext; | |||
| c->vp8_v_loop_filter8uv_inner = ff_vp8_v_loop_filter8uv_inner_mmxext; | |||
| c->vp8_h_loop_filter8uv_inner = ff_vp8_h_loop_filter8uv_inner_mmxext; | |||
| c->vp8_v_loop_filter16y = ff_vp8_v_loop_filter16y_mbedge_mmxext; | |||
| c->vp8_h_loop_filter16y = ff_vp8_h_loop_filter16y_mbedge_mmxext; | |||
| c->vp8_v_loop_filter8uv = ff_vp8_v_loop_filter8uv_mbedge_mmxext; | |||
| c->vp8_h_loop_filter8uv = ff_vp8_h_loop_filter8uv_mbedge_mmxext; | |||
| #endif | |||
| } | |||
| c->vp8_h_loop_filter_simple = ff_vp8_h_loop_filter_simple_sse2; | |||
| if (EXTERNAL_SSE(cpu_flags)) { | |||
| c->vp8_idct_add = ff_vp8_idct_add_sse; | |||
| c->vp8_luma_dc_wht = ff_vp8_luma_dc_wht_sse; | |||
| } | |||
| if (HAVE_SSE2_EXTERNAL && cpu_flags & (AV_CPU_FLAG_SSE2 | AV_CPU_FLAG_SSE2SLOW)) { | |||
| c->vp8_v_loop_filter_simple = ff_vp8_v_loop_filter_simple_sse2; | |||
| c->vp8_h_loop_filter16y_inner = ff_vp8_h_loop_filter16y_inner_sse2; | |||
| c->vp8_h_loop_filter8uv_inner = ff_vp8_h_loop_filter8uv_inner_sse2; | |||
| c->vp8_v_loop_filter16y_inner = ff_vp8_v_loop_filter16y_inner_sse2; | |||
| c->vp8_v_loop_filter8uv_inner = ff_vp8_v_loop_filter8uv_inner_sse2; | |||
| c->vp8_h_loop_filter16y = ff_vp8_h_loop_filter16y_mbedge_sse2; | |||
| c->vp8_h_loop_filter8uv = ff_vp8_h_loop_filter8uv_mbedge_sse2; | |||
| } | |||
| c->vp8_v_loop_filter16y = ff_vp8_v_loop_filter16y_mbedge_sse2; | |||
| c->vp8_v_loop_filter8uv = ff_vp8_v_loop_filter8uv_mbedge_sse2; | |||
| } | |||
| if (EXTERNAL_SSSE3(cpu_flags)) { | |||
| VP8_LUMA_MC_FUNC(0, 16, ssse3); | |||
| VP8_MC_FUNC(1, 8, ssse3); | |||
| VP8_MC_FUNC(2, 4, ssse3); | |||
| VP8_BILINEAR_MC_FUNC(0, 16, ssse3); | |||
| VP8_BILINEAR_MC_FUNC(1, 8, ssse3); | |||
| VP8_BILINEAR_MC_FUNC(2, 4, ssse3); | |||
| if (EXTERNAL_SSE2(cpu_flags)) { | |||
| c->vp8_idct_dc_add4y = ff_vp8_idct_dc_add4y_sse2; | |||
| if (!vp7) { | |||
| c->vp8_v_loop_filter_simple = ff_vp8_v_loop_filter_simple_ssse3; | |||
| c->vp8_h_loop_filter_simple = ff_vp8_h_loop_filter_simple_ssse3; | |||
| c->vp8_h_loop_filter_simple = ff_vp8_h_loop_filter_simple_sse2; | |||
| c->vp8_v_loop_filter16y_inner = ff_vp8_v_loop_filter16y_inner_ssse3; | |||
| c->vp8_h_loop_filter16y_inner = ff_vp8_h_loop_filter16y_inner_ssse3; | |||
| c->vp8_v_loop_filter8uv_inner = ff_vp8_v_loop_filter8uv_inner_ssse3; | |||
| c->vp8_h_loop_filter8uv_inner = ff_vp8_h_loop_filter8uv_inner_ssse3; | |||
| c->vp8_h_loop_filter16y_inner = ff_vp8_h_loop_filter16y_inner_sse2; | |||
| c->vp8_h_loop_filter8uv_inner = ff_vp8_h_loop_filter8uv_inner_sse2; | |||
| c->vp8_v_loop_filter16y = ff_vp8_v_loop_filter16y_mbedge_ssse3; | |||
| c->vp8_h_loop_filter16y = ff_vp8_h_loop_filter16y_mbedge_ssse3; | |||
| c->vp8_v_loop_filter8uv = ff_vp8_v_loop_filter8uv_mbedge_ssse3; | |||
| c->vp8_h_loop_filter8uv = ff_vp8_h_loop_filter8uv_mbedge_ssse3; | |||
| } | |||
| c->vp8_h_loop_filter16y = ff_vp8_h_loop_filter16y_mbedge_sse2; | |||
| c->vp8_h_loop_filter8uv = ff_vp8_h_loop_filter8uv_mbedge_sse2; | |||
| } | |||
| if (EXTERNAL_SSSE3(cpu_flags)) { | |||
| c->vp8_v_loop_filter_simple = ff_vp8_v_loop_filter_simple_ssse3; | |||
| c->vp8_h_loop_filter_simple = ff_vp8_h_loop_filter_simple_ssse3; | |||
| c->vp8_v_loop_filter16y_inner = ff_vp8_v_loop_filter16y_inner_ssse3; | |||
| c->vp8_h_loop_filter16y_inner = ff_vp8_h_loop_filter16y_inner_ssse3; | |||
| c->vp8_v_loop_filter8uv_inner = ff_vp8_v_loop_filter8uv_inner_ssse3; | |||
| c->vp8_h_loop_filter8uv_inner = ff_vp8_h_loop_filter8uv_inner_ssse3; | |||
| c->vp8_v_loop_filter16y = ff_vp8_v_loop_filter16y_mbedge_ssse3; | |||
| c->vp8_h_loop_filter16y = ff_vp8_h_loop_filter16y_mbedge_ssse3; | |||
| c->vp8_v_loop_filter8uv = ff_vp8_v_loop_filter8uv_mbedge_ssse3; | |||
| c->vp8_h_loop_filter8uv = ff_vp8_h_loop_filter8uv_mbedge_ssse3; | |||
| } | |||
| if (EXTERNAL_SSE4(cpu_flags)) { | |||
| if (!vp7) { | |||
| c->vp8_idct_dc_add = ff_vp8_idct_dc_add_sse4; | |||
| c->vp8_idct_dc_add = ff_vp8_idct_dc_add_sse4; | |||
| c->vp8_h_loop_filter_simple = ff_vp8_h_loop_filter_simple_sse4; | |||
| c->vp8_h_loop_filter16y = ff_vp8_h_loop_filter16y_mbedge_sse4; | |||
| c->vp8_h_loop_filter8uv = ff_vp8_h_loop_filter8uv_mbedge_sse4; | |||
| } | |||
| c->vp8_h_loop_filter_simple = ff_vp8_h_loop_filter_simple_sse4; | |||
| c->vp8_h_loop_filter16y = ff_vp8_h_loop_filter16y_mbedge_sse4; | |||
| c->vp8_h_loop_filter8uv = ff_vp8_h_loop_filter8uv_mbedge_sse4; | |||
| } | |||
| #endif /* HAVE_YASM */ | |||
| } | |||