首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

x264往方块滤波函数解析(三)

2012-12-23 
x264去方块滤波函数解析(三)去方块滤波查表时需要用到的几个数组:/* Deblocking filter */static const ui

x264去方块滤波函数解析(三)

去方块滤波查表时需要用到的几个数组:

/* Deblocking filter */static const uint8_t i_alpha_table[52+12*2] ={     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,     0,  0,  0,  0,  0,  0,  4,  4,  5,  6,     7,  8,  9, 10, 12, 13, 15, 17, 20, 22,    25, 28, 32, 36, 40, 45, 50, 56, 63, 71,    80, 90,101,113,127,144,162,182,203,226,   255,255,   255,255,255,255,255,255,255,255,255,255,255,255,}; //!< α的值,根据indexA来索引static const uint8_t i_beta_table[52+12*2] ={     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,     0,  0,  0,  0,  0,  0,  2,  2,  2,  3,     3,  3,  3,  4,  4,  4,  6,  6,  7,  7,     8,  8,  9,  9, 10, 10, 11, 11, 12, 12,    13, 13, 14, 14, 15, 15, 16, 16, 17, 17,    18, 18,    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,}; //!< β的值,根据indexB来索引static const int8_t i_tc0_table[52+12*2][4] ={    {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 },    {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 },    {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 },    {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 },    {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 0 }, {-1, 0, 0, 1 },    {-1, 0, 0, 1 }, {-1, 0, 0, 1 }, {-1, 0, 0, 1 }, {-1, 0, 1, 1 }, {-1, 0, 1, 1 }, {-1, 1, 1, 1 },    {-1, 1, 1, 1 }, {-1, 1, 1, 1 }, {-1, 1, 1, 1 }, {-1, 1, 1, 2 }, {-1, 1, 1, 2 }, {-1, 1, 1, 2 },    {-1, 1, 1, 2 }, {-1, 1, 2, 3 }, {-1, 1, 2, 3 }, {-1, 2, 2, 3 }, {-1, 2, 2, 4 }, {-1, 2, 3, 4 },    {-1, 2, 3, 4 }, {-1, 3, 3, 5 }, {-1, 3, 4, 6 }, {-1, 3, 4, 6 }, {-1, 4, 5, 7 }, {-1, 4, 5, 8 },    {-1, 4, 6, 9 }, {-1, 5, 7,10 }, {-1, 6, 8,11 }, {-1, 6, 8,13 }, {-1, 7,10,14 }, {-1, 8,11,16 },    {-1, 9,12,18 }, {-1,10,13,20 }, {-1,11,15,23 }, {-1,13,17,25 },    {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 },    {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 }, {-1,13,17,25 },}; //!< tC的值,根据indexA和bS的值来索引,bS=0时,索引值为-1,即表示不滤波#define alpha_table(x) i_alpha_table[(x)+12]#define beta_table(x)  i_beta_table[(x)+12]#define tc0_table(x)   i_tc0_table[(x)+12]

以下两个函数会被在上一篇文章末尾提到的DEBLOCK_DIR这个宏被展开后所调用:

//!< bS=1~3时的滤波static inline void deblock_edge( x264_t *h, uint8_t *pix1, uint8_t *pix2, int i_stride, uint8_t bS[4], int i_qp, int b_chroma, x264_deblock_inter_t pf_inter ){    const int index_a = i_qp + h->sh.i_alpha_c0_offset;    const int alpha = alpha_table(index_a);    const int beta  = beta_table(i_qp + h->sh.i_beta_offset);    int8_t tc[4];    if( !alpha || !beta )        return;    tc[0] = tc0_table(index_a)[bS[0]] + b_chroma;    tc[1] = tc0_table(index_a)[bS[1]] + b_chroma;    tc[2] = tc0_table(index_a)[bS[2]] + b_chroma;    tc[3] = tc0_table(index_a)[bS[3]] + b_chroma;    pf_inter( pix1, i_stride, alpha, beta, tc );    if( b_chroma )        pf_inter( pix2, i_stride, alpha, beta, tc );}//!< bS=4时的滤波static inline void deblock_edge_intra( x264_t *h, uint8_t *pix1, uint8_t *pix2, int i_stride, uint8_t bS[4], int i_qp, int b_chroma, x264_deblock_intra_t pf_intra ){    const int alpha = alpha_table(i_qp + h->sh.i_alpha_c0_offset);    const int beta  = beta_table(i_qp + h->sh.i_beta_offset);    if( !alpha || !beta )        return;    pf_intra( pix1, i_stride, alpha, beta );    if( b_chroma )        pf_intra( pix2, i_stride, alpha, beta );}


函数的功能不复杂,就是简单的查表获得相应的参数值,然后通过函数指针(x264_deblock_init函数中被初始化过)调用合适的滤波函数(在关于去方块滤波的第一篇文章中所介绍的)进行实际的滤波。

热点排行