运动补偿MC——motionCompensation
(1) iPartIdx >= 0,对索引为iPartIdx的PU进行操作
1)不使用VSP
a.对某一参考列表list0或list1(单向),判断是否进行加权预测。
b.对某一参考列表list0和list1(双向),判断是否SPIVMP
I)进行SPIVMP
II)只考虑时域上的预测。 调用xCheckIdenticalMotion,判断pcCU在list0和list1中的mv相同。若相同,则调用xPredInterUni,进行前向预测;若不同,调用xPredInterBi,进行双向预测。
2)使用VSP
调用xCheckIdenticalMotion,判断pcCU在list0和list1中的mv相同。若相同,调用xPredInterUniVSP;若不同,调用xPredInterBiVSP。
(2) iPartIdx ==-1,对CU中所有的PU进行操作。。操作方法与(1)的内容完全一致
Void TComPrediction::motionCompensation ( TComDataCU* pcCU, TComYuv* pcYuvPred, RefPicList eRefPicList, Int iPartIdx )
{
Int iWidth;
Int iHeight;
UInt uiPartAddr;
const TComSlice *pSlice = pcCU->getSlice();
const SliceType sliceType = pSlice->getSliceType();
const TComPPS &pps = *(pSlice->getPPS());
if ( iPartIdx >= 0 )//iPartIdx为PU在CU中的索引,对索引为iPartIdx的PU进行操作
{
pcCU->getPartIndexAndSize( iPartIdx, uiPartAddr, iWidth, iHeight );
#if NH_3D_VSP
if ( pcCU->getVSPFlag(uiPartAddr) == 0)//不使用VSP
{
#endif
if ( eRefPicList != REF_PIC_LIST_X )//对某一参考列表