1.SAD即绝对误差和(sum of absolute differences),应用非常广泛,是一种测量两个图像块的差异的最简单的办法。顾名思义,其公式为:
2.为什么要优化SAD
SAD在视频编解码中用处非常广泛,
1. intra预测中选择最佳划分,最佳预测方向
2. inter预测中选择最佳划分,运动搜索中对搜索结果的评判。
3. 作为rdo公式的失真项
那为什么要优化sad呢?试想一下,每个宏块在进行intra预测的时候,会由16x16 8x8 4x4四类划分,4x4和8x8分别都有9中预测模式,每一种预测模式都要计算其sad。如果把每一种分块的模式都走完,sad的调用次数将是非常可观的。实际上sad或其类似算法satd,ssd是整个编码算法中调用次数最多算法。
3.SIMD中的SAD
还好在intel的多媒体指令中,提供了sad的专用指令,可见sad的重要性。mmx和xmm中都提供了sad指令。一条指令可以做8个像素,或者更多像素的sad,大大提高了sad的运算效率。
4.SAD在x264中的实现代码可以在sad-a.asm中找到,下面对一些代码进行简单注释
;=============================================================================
; SAD MMX
;=============================================================================
;两行16像素的sad,结果累加存入mm0中,参考8x8和4x4的代码分析
%macro SAD_INC_2x16P 0
movq mm1, [r0]
movq mm2, [r0+8]
movq mm3, [r0+r1]
movq mm4, [r0+r1+8]
psadbw mm1, [r2]
psadbw