简介
题目: 基于分层判断的 x264 快速模式选择算法
原文: https://www.nstl.gov.cn/paper_detail.html?id=77880ade9a55b3cc527192010242d90e
级别: EI
年份: 2010 年
机构: 上海交通大学
结论: 相比较 HEX 运动搜索算法,平均节省27%的编码时间,质量和码率的变化可忽略不计。
资源下载: https://download.csdn.net/download/yanceyxin/88036641?spm=1001.2014.3001.5503
论文解读
核心原理
○ x264 采用了灵活而精细的模式判断算法,在几乎不损失压缩性能的前提下较穷举法提速明显,算法基于如下思想设计:若大尺寸模式预测性能良好,则小尺寸模式极有可能导致更大的编码代价,因此判断过程可被跳过,反之,若小尺寸模式预测性能良好,则大尺寸模式可被跳过,将上述关系称为尺寸单调性原理;基于此,x264 首先对 P16x16 和 P8x8 进行判断,利用上述 2 种模式编码代价的相对关系确定宏块适合大尺寸模式编码还是小尺寸模式编码,进而指导其余模式的选择过程。
大致步骤:
■ 若空域邻块存在 skip 块,进行 skip 模式判断,若通过,采用 skip 模式,提前终止;
■ p16x16 判断,若残差足够小,且运动向量 M 与邻块相近,进行 skip 模式判断,若通过,采用 skip 模式,提前终止;
■ p8x8 帧间预测;
■ 若 Cp8x8 < Cp16x16,采用 Psub8x8 模式对 P8x8 模式进行优化;
■ 若 Cp8x8 + Cmv(tr) + Cmv(dl) < Cp16x16,进行 P16x8、P8x16 判断;(这块跟最新 x264代码里不太一样,应该是Cp8x8 < Cp16x16)+ Cmv(tr) + Cmv(dl)),其中Cmv(tr)与Cmv(dl)分别代表右上/左下位置子宏块运动矢量的编码代价;
■ 进行 I16x16 判断,若 2Cinter < CI16x16 且 b=1,则不再进行更小的 I8x8 和 I4x4 判断,终止;(这块跟最新 x264代码里不太一样,x264 里是直接跳转到 intra 里,进行 i16x16、i8x8、i4x4 顺序判断)
■ 进行 I4x4 判断;
■ 选择最佳模式;
x264 的快速模式选择算法存在的冗余:
■ 帧内宏块在很多视频序列中占有客观的比重,如果能够提前检测出来适合帧内编码的宏块,就可以省去帧间模式判断的冗余过程;
■ p8x8 耗费计算资源显著,且出现的概率有限,针对 p8x8 的不必要的判断过程将带来大量的计算冗余;
■ Psub8x8 耗费计算资源显著,适度提高改模式被跳过的概率能够提升编码速度;
分层判断改进模式选择
■ 对于帧间预测,令 P16x16、skip 为主要模式,其余为辅助模式,,对于帧内预测,令 I16x16 为主要模式,其余辅助模式(原文忽略了 I8x8 模式);主要模式保证基本压缩质量,辅助模式起到编码性能优化作用;
■ 模式判断先对主要模式进行展开,之后由主要模式的判断结果构建若干判断条件,决定是否跳过各个辅助模式;
帧间辅助模式失效条件:
● 为了在主要模式判断结果的基础上提前识别处不适合帧间编码的宏块,从而跳过其余帧间模式的判断过程;
● 帧间主辅模式均采用运动估计进行预测,辅模式的优越性仅仅来自更小的预测尺寸,但二者代价相近;因此结论,帧间预测时,主要模式能够为最优辅助模式的编码代价提供基本的估计;
● 当帧间主要模式的编码代价显著大于帧内主要模式时,帧间辅助模式编码代价大于帧内模式的概率也很高,此时帧间辅助模式失效,可跳过判断;
● 当视频内容剧烈变化时,当前宏块 P16x16 编码代价较之时域邻块的 p16x16 编码代价将产生较大上升,此时采用帧内预测更有优势;
● 其次,帧内宏块往往具有空域连续性,邻块采用帧内模式较多时当前块采用帧内模式编码的概率也较高;
帧间主要模式有效条件:
● 为了在帧间主要模式判断基础上提前识别出适合采用 P16x16 模式编码的宏块,从而跳过其余帧间模式的判断过程,依据尺寸单调性原理,该条件可以通过门限运算实现;
● P16x16 编码代价小于某门限,认为主要模式良好,跳过辅助模式集合检验过程;
● 利用上公式 1 得到时域邻块,以其最终编码代价作为当前宏块的提前终止门限,其中 x、y 表示当前宏块的坐标,xref、yref 表示参考帧内时域邻块的坐标,Mx、My 表示当前宏块运动矢量在 x、y 方向的分量;
● 考虑公式 1 的存在的优化余地,增加公式 3 来判断是否发生突变的界定条件
具体的门限计算步骤:
○ 由公式 1 找到时域参考宏块,若公式 3 满足,将其最佳帧间编码代价加入统计列表;
○ 若正左/左上/正上/右上侧邻块存在,且公式 3 满足,讲起最佳帧间编码代价加入统计列表;
○ 求取统计列表中参考代价均值 Ce,若当前宏块没被提供任何门限参考信息,设置 Ce=0;
○ 若 Ce < 16SAD(QP),则 Ce = Ce + 12SAD(QP);(此步骤应对较小门限时进行修正调整)
○ 存储当前最优帧间编码代价,为下一帧门限计算提供参考依据;
改进的帧间辅助模式选择算法:
● 对 x264 原有的算法进行继承,为了提高 Psub8x8 模式被跳过的概率,先对 p16x8/p8x16 进行检验,以其结果指导 Psub8x8 的判断过程;
● 帧间辅助模式选择过程:
○ P8x8 帧间预测;
○ 若 Cp8x8 + Cmv(tr) + Cmv(dl) < Cp16x16,进行 P16x8、P8x16 判断;(这块跟代码里不太一样,应该是Cp8x8 < Cp16x16)+ Cmv(tr) + Cmv(dl)),其中Cmv(tr)与Cmv(dl)分别代表右上/左下位置子宏块运动矢量的编码代价;
○ 若 min(Cp8x8,Cp16x8,Cp8x16)= Cp8x8,采用 Psub8x8 对 P8x8 进行优化;
算法全局概览
应用到 B 切片
● 因为 B slice 一般在 rtc 中应用较少,具体不介绍,可参考原文;