openh264在做运动估计之前是要先check一下skip模式,判断当前宏块是否为skip模式首先要判断两个条件:
(1)当前帧的参考图片是P帧,并且当前宏块在参考图片中的同位块是skip模式或者Background模式;
(2)当前宏块相邻的左边、上边、左上和右上宏块至少有一个存在并且是skip模式。
若满足这两个条件中的一个就继续向下执行,否则当前宏块一定不会是skip模式。
接下来的过程为:
1、预测skip模式的SAD值(iSadPredSkip):根据左边、上边、左上、右上相邻宏块是否存在、是否是skip模式来确定。
(1)如果左边宏块存在并且是skip模式,其他相邻宏块不存在,则iSadPredSkip值取左边宏块的SAD值,即iSadPredSkip=sadLeft;
(2)若相邻宏块都存在(左上、右上相邻块可以存在一个),当右上宏块存在的时候就不判断左上宏块,否则使用左上宏块;若右上和左上宏块都存在,就用右上宏块,那么有以下几种情况:
- 若只有左边相邻宏块是skip模式,则iSadPredSkip值取左边宏块的SAD值,即iSadPredSkip=sadLeft;
- 若只有上边相邻宏块是skip模式,则iSadPredSkip值取上边宏块的SAD值,即iSadPredSkip=sadTop;
- 若只有左上或者右上相邻宏块是skip模式,则iSadPredSkip值取左上或者右上宏块的SAD值,即iSadPredSkip=sadTopRight or sadTopLeft;
- 若相邻宏块至少有两个为skip模式,则iSadPredSkip值取它们的中值。
2、预测skip模式的MV(sMvp):
(1)若左边、上边相邻宏块都不存在,或者存在一个且其Mv为0,或者两个都存在且MV都为0,则sMvp等于0;
(2)若左边、上边相邻宏块都存在,且Mv都不为0,左上、右上相邻宏块取一个做参考,右上宏块存在就用右上宏块,右上宏块不存在时用左上宏块,则sMvp取三种相邻宏块MV的中值。
3、计算sMvp对应的参考宏块和当前宏块之间的亮度和色度sad值,sadCostMb,若
(sadCostMb=0 )|| (sadCostMb < iSadPredSkip) ||
(参考图片是P帧 && 参考图片中同位块的类型是skip模式 && sadCostMb 小于参考图片中同位块的skipSad值),
则当前宏块就可判断为skip模式;
若不满足上述条件,则对当前宏块进行DCT变换,得到变换系数,对Y、U、V三个分量的变换系数进行量化,若量化后系数全为0,则当前宏块就可判定为skip模式。