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运动补偿计算