上一篇介绍了实际进行滤波的函数,本篇主要介绍,去方块滤波这边的函数调用关系。先看几个定义:
//! 两个函数指针,第一个是bS=1~3时调用的,第二个是bS=4时调用的。
typedef void (*x264_deblock_inter_t)( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 );
typedef void (*x264_deblock_intra_t)( uint8_t *pix, int stride, int alpha, int beta );
typedef struct
{
x264_deblock_inter_t deblock_v_luma;
x264_deblock_inter_t deblock_h_luma;
x264_deblock_inter_t deblock_v_chroma;
x264_deblock_inter_t deblock_h_chroma;
x264_deblock_intra_t deblock_v_luma_intra;
x264_deblock_intra_t deblock_h_luma_intra;
x264_deblock_intra_t deblock_v_chroma_intra;
x264_deblock_intra_t deblock_h_chroma_intra;
} x264_deblock_function_t; //!< 定义存放一组去方块滤波的函数的结构体
接下来是去方块滤波的初始化工作:
void x264_deblock_init( int cpu, x264_deblock_function_t *pf )
{
//!< 为函数指针指定适当的函数入口地址
pf->deblock_v_luma = deblock_v_luma_c;
pf->deblock_h_luma = deblock_h_luma_c;
pf->deblock_v_chroma = deblock_v_chroma_c;
pf->deblock_h_chroma = deblock_h_chroma_c;
pf->deblock_v_luma_intra = deblock_v_luma_intra_c;
pf->deblock_h_luma_intra = deblock_h_luma_intra_c;
pf->deblock_v_chroma_intra = deblock_v_chroma_intra_c;
pf->deblock_h_chroma_intra = deblock_h_chroma_intra_c;
#ifdef HAVE_MMX
if( cpu&X264_CPU_MMXEXT )
{
pf->deblock_v_chroma = x264_deblock_v_chroma_mmxext;
pf->deblock_h_chroma = x264_deblock_h_chroma_mmxext;
pf->deblock_v_chroma_intra = x264_deblock_v_chroma_intra_mmxext;
pf->deblock_h_chroma_intra = x264_deblock_h_chroma_intra_mmxext;
#ifdef ARCH_X86
pf->deblock_v_luma = x264_deblock_v_luma_mmxext;
pf->deblock_h_luma = x264_deblock_h_luma_mmxext;
pf->deblock_v_luma_intra = x264_deblock_v_luma_intra_mmxext;
pf->deblock_h_luma_intra = x264_deblock_h_luma_intra_mmxext;
#endif
if( (cpu&X264_CPU_SSE2) && !(cpu&X264_CPU_STACK_MOD4) )
{
pf->deblock_v_luma = x264_deblock_v_luma_sse2;
pf->deblock_h_luma = x264_deblock_h_luma_sse2;
pf->deblock_v_luma_intra = x264_deblock_v_luma_intra_sse2;
pf->deblock_h_luma_intra = x264_deblock_h_luma_intra_sse2;
}
}
#endif
#ifdef ARCH_PPC
if( cpu&X264_CPU_ALTIVEC )
{
pf->deblock_v_luma = x264_deblock_v_luma_altivec;
pf->deblock_h_luma = x264_deblock_h_luma_altivec;
}
#endif // ARCH_PPC
}
在代码中,这个函数可以认为是去方块滤波的顶层函数了:
static void x264_fdec_filter_row( x264_t *h, int mb_y )
{
/* mb_y is the mb to be encoded next, not the mb to be filtered here */
int b_hpel = h->fdec->