x264源码分析-psy-rd参数

psy-rd:Psychovisual optimization strength for RDO:在rdo中使用psy算法(一种心理视觉模型)

这是两个参数:f_psy_rd (psy rdo 强度 0-10 i_subpel_refine >= 6 才有效 )和 f_psy_trellis (/* Psy trellis strength*/)

Psy Trellis量化,可以提高细节,但是会大幅度提高码率。

x264代码中使用这个参数的地方。

解析参数:

sscanf( value, "%f:%f", &p->analyse.f_psy_rd, &p->analyse.f_psy_trellis)//默认是不开启的

使用i_psy_rd 在计算宏块的satd的时候,乘以一个系数,这个系数是通过psy_rd计算得到的。

static inline int ssd_plane( x264_t *h, int size, int p, int x, int y )

{

    satd = (satd * h->mb.i_psy_rd * h->mb.i_psy_rd_lambda + 128) >> 8;

}

i_psy_rd_lambda 值得由来 ,

static void x264_mb_analyse_init_qp( x264_t *h, x264_mb_analysis_t *a, int qp )

{

        a->i_lambda = x264_lambda_tab[qp];//每一个qp对应一个拉姆达乘子

        h->mb.i_psy_rd_lambda = a->i_lambda;

}

/* lambda = pow(2,qp/6-2) */
const uint16_t x264_lambda_tab[QP_MAX_MAX+1] =
{
   1,   1,   1,   1,   1,   1,   1,   1, /*  0- 7 */
   1,   1,   1,   1,   1,   1,   1,   1, /*  8-15 */
   2,   2,   2,   2,   3,   3,   3,   4, /* 16-23 */
   4,   4,   5,   6,   6,   7,   8,   9, /* 24-31 */
  10,  11,  13,  14,  16,  18,  20,  23, /* 32-39 */
  25,  29,  32,  36,  40,  45,  51,  57, /* 40-47 */
  64,  72,  81,  91, 102, 114, 128, 144, /* 48-55 */
 161, 181, 203, 228, 256, 287, 323, 362, /* 56-63 */
 406, 456, 512, 575, 645, 724, 813, 912, /* 64-71 */
1024,1149,1290,1448,1625,1825,2048,2299, /* 72-79 */
2580,2896,                               /* 80-81 */

};

f_psy_trellis 的使用

参数转换为i_psy_trellis

h->mb.i_psy_trellis = h->param.analyse.i_trellis ? FIX8( h->param.analyse.f_psy_trellis / 4 ) : 0;//设置了trellis psy-rd才有效


ssd_plane()函数调用过程

x264_rd_cost_subpart()

x264_rd_cost_part()  

x264_mb_analyse_p_rd()   COST_MV_RD()  x264_me_refine_qpel_rd()

x264_macroblock_analyse()

总结上面就是两条调用路线

1 模式选择 2 7运动补偿计算

你可能感兴趣的:(音视频)