AV1的tpl_model是AV1的一个c文件,包含了一系列函数,其主要目的是为了利用lookahead design记录每个块的一些数据,包括失真等,在实际编码时利用这些数据建立模型,调整QP或者lambda以取得更好的编码性能。相关方面的论文是:
《A Temporal Dependency Model for Rate-Distortion Optimization in Video Coding》
这篇论文虽然是在VP9上实现的,但AV1里也有相应的代码,其模型的主要来源是x264上的MBTree:
《A novel macroblock-tree algorithm for high-performance optimization of dependent video coding in H.264/AVC》
其主要目的就是通过计算原始帧块之间的失真,来估计失真对后续块的影响,并以此为依据,对块的QP或者lambda进行重新调整。
对于具体的函数,函数的入口在 av1_encode_strategy中,当 oxcf->pass == 2 以及cpi->twopass.gf_group.index == 1 && cpi->oxcf.enable_tpl_model时,会进入tpl_model。cpi->twopass.gf_group.index为1意味着函数当前正编码rPOC为16的帧,以第一个GOP为例子的话,就是第16帧。
首先是,av1_configure_buffer_updates 对帧的参考帧类型进行更新。
其次是,av1_set_frame_size对buffer和帧的大小进行初始化。
然后从av1_tpl_setup_stats开始重要的计算
init_gop_frames_for_tpl 主要就是把GOP内的buffer初始化,如果需要的话。这个版本会扩展到下个GOP的起始两帧
init_tpl_stats主要是初始化存储tpl_model数据的结构体指针
mc_flow_dispenser(cpi, gf_picture, frame_idx)为主要函数,可以说是帧级的入口
void av1_tpl_setup_stats(AV1_COMP *cpi,
const EncodeFrameInput *const frame_input) {
YV12_BUFFER_CONFIG *gf_pic