diff options
Diffstat (limited to 'libavcodec/h264dsp.c')
-rw-r--r-- | libavcodec/h264dsp.c | 112 |
1 files changed, 69 insertions, 43 deletions
diff --git a/libavcodec/h264dsp.c b/libavcodec/h264dsp.c index 2a2072b147..04c6ea6df4 100644 --- a/libavcodec/h264dsp.c +++ b/libavcodec/h264dsp.c @@ -29,53 +29,79 @@ #include "avcodec.h" #include "h264dsp.h" +#define BIT_DEPTH 8 #include "h264dsp_internal.h" +#undef BIT_DEPTH -void ff_h264dsp_init(H264DSPContext *c) -{ - c->h264_idct_add= ff_h264_idct_add_c; - c->h264_idct8_add= ff_h264_idct8_add_c; - c->h264_idct_dc_add= ff_h264_idct_dc_add_c; - c->h264_idct8_dc_add= ff_h264_idct8_dc_add_c; - c->h264_idct_add16 = ff_h264_idct_add16_c; - c->h264_idct8_add4 = ff_h264_idct8_add4_c; - c->h264_idct_add8 = ff_h264_idct_add8_c; - c->h264_idct_add16intra= ff_h264_idct_add16intra_c; - c->h264_luma_dc_dequant_idct= ff_h264_luma_dc_dequant_idct_c; - c->h264_chroma_dc_dequant_idct= ff_h264_chroma_dc_dequant_idct_c; +#define BIT_DEPTH 9 +#include "h264dsp_internal.h" +#undef BIT_DEPTH + +#define BIT_DEPTH 10 +#include "h264dsp_internal.h" +#undef BIT_DEPTH - c->weight_h264_pixels_tab[0]= weight_h264_pixels16x16_c; - c->weight_h264_pixels_tab[1]= weight_h264_pixels16x8_c; - c->weight_h264_pixels_tab[2]= weight_h264_pixels8x16_c; - c->weight_h264_pixels_tab[3]= weight_h264_pixels8x8_c; - c->weight_h264_pixels_tab[4]= weight_h264_pixels8x4_c; - c->weight_h264_pixels_tab[5]= weight_h264_pixels4x8_c; - c->weight_h264_pixels_tab[6]= weight_h264_pixels4x4_c; - c->weight_h264_pixels_tab[7]= weight_h264_pixels4x2_c; - c->weight_h264_pixels_tab[8]= weight_h264_pixels2x4_c; - c->weight_h264_pixels_tab[9]= weight_h264_pixels2x2_c; - c->biweight_h264_pixels_tab[0]= biweight_h264_pixels16x16_c; - c->biweight_h264_pixels_tab[1]= biweight_h264_pixels16x8_c; - c->biweight_h264_pixels_tab[2]= biweight_h264_pixels8x16_c; - c->biweight_h264_pixels_tab[3]= biweight_h264_pixels8x8_c; - c->biweight_h264_pixels_tab[4]= biweight_h264_pixels8x4_c; - c->biweight_h264_pixels_tab[5]= biweight_h264_pixels4x8_c; - c->biweight_h264_pixels_tab[6]= biweight_h264_pixels4x4_c; - c->biweight_h264_pixels_tab[7]= biweight_h264_pixels4x2_c; - c->biweight_h264_pixels_tab[8]= biweight_h264_pixels2x4_c; - c->biweight_h264_pixels_tab[9]= biweight_h264_pixels2x2_c; +void ff_h264dsp_init(H264DSPContext *c, const int bit_depth) +{ +#undef FUNC +#define FUNC(a, depth) a ## _ ## depth ## _c - c->h264_v_loop_filter_luma= h264_v_loop_filter_luma_c; - c->h264_h_loop_filter_luma= h264_h_loop_filter_luma_c; - c->h264_v_loop_filter_luma_intra= h264_v_loop_filter_luma_intra_c; - c->h264_h_loop_filter_luma_intra= h264_h_loop_filter_luma_intra_c; - c->h264_v_loop_filter_chroma= h264_v_loop_filter_chroma_c; - c->h264_h_loop_filter_chroma= h264_h_loop_filter_chroma_c; - c->h264_v_loop_filter_chroma_intra= h264_v_loop_filter_chroma_intra_c; - c->h264_h_loop_filter_chroma_intra= h264_h_loop_filter_chroma_intra_c; +#define H264_DSP(depth) \ + c->h264_idct_add = FUNC(ff_h264_idct_add , depth);\ + c->h264_idct8_add = FUNC(ff_h264_idct8_add , depth);\ + c->h264_idct_dc_add = FUNC(ff_h264_idct_dc_add , depth);\ + c->h264_idct8_dc_add = FUNC(ff_h264_idct8_dc_add , depth);\ + c->h264_idct_add16 = FUNC(ff_h264_idct_add16 , depth);\ + c->h264_idct8_add4 = FUNC(ff_h264_idct8_add4 , depth);\ + c->h264_idct_add8 = FUNC(ff_h264_idct_add8 , depth);\ + c->h264_idct_add16intra = FUNC(ff_h264_idct_add16intra , depth);\ + c->h264_luma_dc_dequant_idct = FUNC(ff_h264_luma_dc_dequant_idct , depth);\ + c->h264_chroma_dc_dequant_idct = FUNC(ff_h264_chroma_dc_dequant_idct , depth);\ +\ + c->weight_h264_pixels_tab[0] = FUNC( weight_h264_pixels16x16 , depth);\ + c->weight_h264_pixels_tab[1] = FUNC( weight_h264_pixels16x8 , depth);\ + c->weight_h264_pixels_tab[2] = FUNC( weight_h264_pixels8x16 , depth);\ + c->weight_h264_pixels_tab[3] = FUNC( weight_h264_pixels8x8 , depth);\ + c->weight_h264_pixels_tab[4] = FUNC( weight_h264_pixels8x4 , depth);\ + c->weight_h264_pixels_tab[5] = FUNC( weight_h264_pixels4x8 , depth);\ + c->weight_h264_pixels_tab[6] = FUNC( weight_h264_pixels4x4 , depth);\ + c->weight_h264_pixels_tab[7] = FUNC( weight_h264_pixels4x2 , depth);\ + c->weight_h264_pixels_tab[8] = FUNC( weight_h264_pixels2x4 , depth);\ + c->weight_h264_pixels_tab[9] = FUNC( weight_h264_pixels2x2 , depth);\ + c->biweight_h264_pixels_tab[0] = FUNC(biweight_h264_pixels16x16 , depth);\ + c->biweight_h264_pixels_tab[1] = FUNC(biweight_h264_pixels16x8 , depth);\ + c->biweight_h264_pixels_tab[2] = FUNC(biweight_h264_pixels8x16 , depth);\ + c->biweight_h264_pixels_tab[3] = FUNC(biweight_h264_pixels8x8 , depth);\ + c->biweight_h264_pixels_tab[4] = FUNC(biweight_h264_pixels8x4 , depth);\ + c->biweight_h264_pixels_tab[5] = FUNC(biweight_h264_pixels4x8 , depth);\ + c->biweight_h264_pixels_tab[6] = FUNC(biweight_h264_pixels4x4 , depth);\ + c->biweight_h264_pixels_tab[7] = FUNC(biweight_h264_pixels4x2 , depth);\ + c->biweight_h264_pixels_tab[8] = FUNC(biweight_h264_pixels2x4 , depth);\ + c->biweight_h264_pixels_tab[9] = FUNC(biweight_h264_pixels2x2 , depth);\ +\ + c->h264_v_loop_filter_luma = FUNC(h264_v_loop_filter_luma , depth);\ + c->h264_h_loop_filter_luma = FUNC(h264_h_loop_filter_luma , depth);\ + c->h264_v_loop_filter_luma_intra = FUNC(h264_v_loop_filter_luma_intra , depth);\ + c->h264_h_loop_filter_luma_intra = FUNC(h264_h_loop_filter_luma_intra , depth);\ + c->h264_v_loop_filter_chroma = FUNC(h264_v_loop_filter_chroma , depth);\ + c->h264_h_loop_filter_chroma = FUNC(h264_h_loop_filter_chroma , depth);\ + c->h264_v_loop_filter_chroma_intra = FUNC(h264_v_loop_filter_chroma_intra, depth);\ + c->h264_h_loop_filter_chroma_intra = FUNC(h264_h_loop_filter_chroma_intra, depth);\ c->h264_loop_filter_strength= NULL; - if (ARCH_ARM) ff_h264dsp_init_arm(c); - if (HAVE_ALTIVEC) ff_h264dsp_init_ppc(c); - if (HAVE_MMX) ff_h264dsp_init_x86(c); + switch (bit_depth) { + case 9: + H264_DSP(9); + break; + case 10: + H264_DSP(10); + break; + default: + H264_DSP(8); + break; + } + + if (ARCH_ARM) ff_h264dsp_init_arm(c, bit_depth); + if (HAVE_ALTIVEC) ff_h264dsp_init_ppc(c, bit_depth); + if (HAVE_MMX) ff_h264dsp_init_x86(c, bit_depth); } |