📄 pred.cpp
字号:
AVS_BYTE* pPred){ AVS_BOOL A_BlockAvailable = FALSE; AVS_BOOL B_BlockAvailable = FALSE; AVS_BOOL C_BlockAvailable = FALSE; AVS_BOOL D_BlockAvailable = FALSE; AVS_INT BlockDistanceA=1; AVS_INT BlockDistanceB=1; AVS_INT BlockDistanceC=1; AVS_INT BlockDistanceD=1; AVS_INT RefIdxA = -1; AVS_INT RefIdxB = -1; AVS_INT RefIdxC = -1; AVS_INT RefIdxD = -1; MOTIONVECTOR mvA, mvB, mvC, mvD, mvE; MOTIONVECTOR MVEPred; AVS_INT MbX = dwMbIndex%dwMbWidth; AVS_INT MbY = dwMbIndex/dwMbWidth; if(dwSubMb == 0) {//上块 if(MbX > 0) A_BlockAvailable = TRUE; if(MbY>0 && MbX<dwMbWidth-1) C_BlockAvailable = TRUE; if(MbY>0) B_BlockAvailable = TRUE; if(MbX>0 && MbY>0) D_BlockAvailable = TRUE; if(!A_BlockAvailable || pMbInfo[dwMbIndex-1].dwMbType == I_8x8 || (pMbInfo[dwMbIndex-1].predDir[1] != pMbInfo[dwMbIndex].predDir[0] && pMbInfo[dwMbIndex-1].predDir[1] != PREDDIRSYM)) { mvA.x = mvA.y = 0; BlockDistanceA = 1; RefIdxA = -1; } else { if(!dirBw) { mvA = pMbInfo[dwMbIndex-1].mv[1]; BlockDistanceA = pMbInfo[dwMbIndex-1].iBlockDistance[1]; RefIdxA = pMbInfo[dwMbIndex-1].dwMbReferenceIndex[1]; } else { mvA = pMbInfo[dwMbIndex-1].mvBw[1]; BlockDistanceA = pMbInfo[dwMbIndex-1].iBlockDistanceBw[1]; RefIdxA = pMbInfo[dwMbIndex-1].dwMbReferenceIndexBw[1]; } } if(!B_BlockAvailable || pMbInfo[dwMbIndex-dwMbWidth].dwMbType == I_8x8 || (pMbInfo[dwMbIndex-dwMbWidth].predDir[2] != pMbInfo[dwMbIndex].predDir[0] && pMbInfo[dwMbIndex-dwMbWidth].predDir[2] != PREDDIRSYM)) { mvB.x = mvB.y = 0; BlockDistanceB = 1; RefIdxB = -1; } else { if(!dirBw) { mvB = pMbInfo[dwMbIndex-dwMbWidth].mv[2]; BlockDistanceB = pMbInfo[dwMbIndex-dwMbWidth].iBlockDistance[2]; RefIdxB = pMbInfo[dwMbIndex-dwMbWidth].dwMbReferenceIndex[2]; } else { mvB = pMbInfo[dwMbIndex-dwMbWidth].mvBw[2]; BlockDistanceB = pMbInfo[dwMbIndex-dwMbWidth].iBlockDistanceBw[2]; RefIdxB = pMbInfo[dwMbIndex-dwMbWidth].dwMbReferenceIndexBw[2]; } } if(!D_BlockAvailable || pMbInfo[dwMbIndex-dwMbWidth-1].dwMbType == I_8x8 || (pMbInfo[dwMbIndex-dwMbWidth-1].predDir[3] != pMbInfo[dwMbIndex].predDir[0] && pMbInfo[dwMbIndex-dwMbWidth-1].predDir[3] != PREDDIRSYM)) { mvD.x = mvD.y = 0; BlockDistanceD = 1; RefIdxD = -1; } else { if(!dirBw) { mvD = pMbInfo[dwMbIndex-dwMbWidth-1].mv[3]; BlockDistanceD = pMbInfo[dwMbIndex-dwMbWidth-1].iBlockDistance[3]; RefIdxD = pMbInfo[dwMbIndex-dwMbWidth-1].dwMbReferenceIndex[3]; } else { mvD = pMbInfo[dwMbIndex-dwMbWidth-1].mvBw[3]; BlockDistanceD = pMbInfo[dwMbIndex-dwMbWidth-1].iBlockDistanceBw[3]; RefIdxD = pMbInfo[dwMbIndex-dwMbWidth-1].dwMbReferenceIndexBw[3]; } } if(!C_BlockAvailable) { mvC = mvD; BlockDistanceC = BlockDistanceD; RefIdxC = RefIdxD; } else if(pMbInfo[dwMbIndex-dwMbWidth+1].dwMbType==I_8x8 || (pMbInfo[dwMbIndex-dwMbWidth+1].predDir[2]!=pMbInfo[dwMbIndex].predDir[0] && pMbInfo[dwMbIndex-dwMbWidth+1].predDir[2]!= PREDDIRSYM)) { mvC.x = mvC.y = 0; BlockDistanceC = 1; RefIdxC = -1; } else { if(!dirBw) { mvC = pMbInfo[dwMbIndex-dwMbWidth+1].mv[2]; BlockDistanceC = pMbInfo[dwMbIndex-dwMbWidth+1].iBlockDistance[2]; RefIdxC = pMbInfo[dwMbIndex-dwMbWidth+1].dwMbReferenceIndex[2]; } else { mvC = pMbInfo[dwMbIndex-dwMbWidth+1].mvBw[2]; BlockDistanceC = pMbInfo[dwMbIndex-dwMbWidth+1].iBlockDistanceBw[2]; RefIdxC = pMbInfo[dwMbIndex-dwMbWidth+1].dwMbReferenceIndexBw[2]; } } if(RefIdxA !=-1 && RefIdxB == -1 && RefIdxC == -1) { MVEPred = mvA; } else if(RefIdxA == -1 && RefIdxB != -1 && RefIdxC == -1) { MVEPred = mvB; } else if(RefIdxA ==-1 && RefIdxB == -1 && RefIdxC != -1) { MVEPred = mvC; } else { if((!dirBw && RefIdxB == pMbInfo[dwMbIndex].dwMbReferenceIndex[0]) ||(dirBw && RefIdxB == pMbInfo[dwMbIndex].dwMbReferenceIndexBw[0])) { MVEPred = mvB; } else { MVEPred = ScalePredMv(&mvA, &mvB, &mvC, iBlockDistance, BlockDistanceA, BlockDistanceB, BlockDistanceC); } } } else {//下块 if(MbX > 0) A_BlockAvailable = TRUE; B_BlockAvailable = TRUE; if(MbX>0) D_BlockAvailable = TRUE; if(!A_BlockAvailable || pMbInfo[dwMbIndex-1].dwMbType == I_8x8 || (pMbInfo[dwMbIndex-1].predDir[3] != pMbInfo[dwMbIndex].predDir[2] && pMbInfo[dwMbIndex-1].predDir[3] != PREDDIRSYM)) { mvA.x = mvA.y = 0; BlockDistanceA = 1; RefIdxA = -1; } else { if(!dirBw) { mvA = pMbInfo[dwMbIndex-1].mv[3]; BlockDistanceA = pMbInfo[dwMbIndex-1].iBlockDistance[3]; RefIdxA = pMbInfo[dwMbIndex-1].dwMbReferenceIndex[3]; } else { mvA = pMbInfo[dwMbIndex-1].mvBw[3]; BlockDistanceA = pMbInfo[dwMbIndex-1].iBlockDistanceBw[3]; RefIdxA = pMbInfo[dwMbIndex-1].dwMbReferenceIndexBw[3]; } } if(!B_BlockAvailable || (pMbInfo[dwMbIndex].predDir[0] != pMbInfo[dwMbIndex].predDir[2] && pMbInfo[dwMbIndex].predDir[0]!= PREDDIRSYM)) { mvB.x = mvB.y = 0; BlockDistanceB = 1; RefIdxB = -1; } else { if(!dirBw) { mvB = pMbInfo[dwMbIndex].mv[0]; BlockDistanceB = pMbInfo[dwMbIndex].iBlockDistance[0]; RefIdxB = pMbInfo[dwMbIndex].dwMbReferenceIndex[0]; } else { mvB = pMbInfo[dwMbIndex].mvBw[0]; BlockDistanceB = pMbInfo[dwMbIndex].iBlockDistanceBw[0]; RefIdxB = pMbInfo[dwMbIndex].dwMbReferenceIndexBw[0]; } } if(!D_BlockAvailable || pMbInfo[dwMbIndex-1].dwMbType == I_8x8 || (pMbInfo[dwMbIndex-1].predDir[1] != pMbInfo[dwMbIndex].predDir[2] && pMbInfo[dwMbIndex-1].predDir[1] != PREDDIRSYM)) { mvD.x = mvD.y = 0; BlockDistanceD = 1; RefIdxD = -1; } else { if(!dirBw) { mvD = pMbInfo[dwMbIndex-1].mv[1]; BlockDistanceD = pMbInfo[dwMbIndex-1].iBlockDistance[1]; RefIdxD = pMbInfo[dwMbIndex-1].dwMbReferenceIndex[1]; } else { mvD = pMbInfo[dwMbIndex-1].mvBw[1]; BlockDistanceD = pMbInfo[dwMbIndex-1].iBlockDistanceBw[1]; RefIdxD = pMbInfo[dwMbIndex-1].dwMbReferenceIndexBw[1]; } } mvC = mvD; BlockDistanceC = BlockDistanceD; RefIdxC = RefIdxD; if(RefIdxA !=-1 && RefIdxB == -1 && RefIdxC == -1) { MVEPred = mvA; } else if(RefIdxA == -1 && RefIdxB != -1 && RefIdxC == -1) { MVEPred = mvB; } else if(RefIdxA ==-1 && RefIdxB == -1 && RefIdxC != -1) { MVEPred = mvC; } else { if(!dirBw && RefIdxA == pMbInfo[dwMbIndex].dwMbReferenceIndex[2]) { MVEPred = mvA; } else if(dirBw && RefIdxA == pMbInfo[dwMbIndex].dwMbReferenceIndexBw[2]) { MVEPred = mvA; } else { MVEPred = ScalePredMv(&mvA, &mvB, &mvC, iBlockDistance, BlockDistanceA, BlockDistanceB, BlockDistanceC); } } } mvE.x = MVEPred.x + pMbInfo[dwMbIndex].iMvDiffX[dwSubMb]; mvE.y = MVEPred.y + pMbInfo[dwMbIndex].iMvDiffY[dwSubMb]; for(AVS_INT block=0; block<2; block++) { //预测补偿 if(!dirBw) pMbInfo[dwMbIndex].mv[block+dwSubMb*2] = mvE; else pMbInfo[dwMbIndex].mvBw[block+dwSubMb*2] = mvE; pMbInfo[dwMbIndex].iBlockDistance[block+dwSubMb*2] = iBlockDistance; if(dirBw) { pMbInfo[dwMbIndex].mvBw[block+dwSubMb*2] = mvE; pMbInfo[dwMbIndex].iBlockDistanceBw[block+dwSubMb*2] = iBlockDistance; } AVS_INT iImgWidth = dwMbWidth*16; AVS_INT iImgHeight = dwMbHeight*16; AVS_INT iImgX = (dwMbIndex%dwMbWidth)*16 + ((block+dwSubMb*2)%2)*8; AVS_INT iImgY = (dwMbIndex/dwMbWidth)*16 + ((block+dwSubMb*2)/2)*8; if(!dirBw) { GetBlock(&(pMbInfo[dwMbIndex].mv[block+dwSubMb*2]),iImgX, iImgY, iImgWidth, iImgHeight, pbRefY, pPred+block*64); } else { GetBlock(&(pMbInfo[dwMbIndex].mvBw[block+dwSubMb*2]),iImgX, iImgY, iImgWidth, iImgHeight, pbRefY, pPred+block*64); } } return AVS_NOERROR;}static AVS_HRESULT InterPredLumaSym16x8(MBINFO* pMbInfo, AVS_DWORD dwMbIndex, const VIDEODATA** ppRefFrame, AVS_DWORD dwRefNum, AVS_DWORD dwMbWidth, AVS_DWORD dwMbHeight, AVS_DWORD dwCurrDistanceIndex, AVS_DWORD dwSubMb, AVS_BYTE* pPred){ AVS_BOOL A_BlockAvailable = FALSE; AVS_BOOL B_BlockAvailable = FALSE; AVS_BOOL C_BlockAvailable = FALSE; AVS_BOOL D_BlockAvailable = FALSE; AVS_INT BlockDistanceA=1; AVS_INT BlockDistanceB=1; AVS_INT BlockDistanceC=1; AVS_INT BlockDistanceD=1; AVS_INT RefIdxA = -1; AVS_INT RefIdxB = -1; AVS_INT RefIdxC = -1; AVS_INT RefIdxD = -1; AVS_INT idxBw = 0; AVS_INT idxFw = 1; AVS_INT dirBw = 1; AVS_BYTE PredBw[4][8][8]; AVS_INT iBlockDistance = ((dwCurrDistanceIndex - ppRefFrame[idxFw]->dwDistanceIndex)+512)%512; AVS_INT iBlockDistanceBw = ((ppRefFrame[idxBw]->dwDistanceIndex - dwCurrDistanceIndex)+512)%512; MOTIONVECTOR mvA, mvB, mvC, mvD, mvE, mvBw; MOTIONVECTOR MVEPred; AVS_INT MbX = dwMbIndex%dwMbWidth; AVS_INT MbY = dwMbIndex/dwMbWidth; if(dwSubMb == 0) {//上块 if(MbX > 0) A_BlockAvailable = TRUE; if(MbY>0 && MbX<dwMbWidth-1) C_BlockAvailable = TRUE; if(MbY>0) B_BlockAvailable = TRUE; if(MbX>0 && MbY>0) D_BlockAvailable = TRUE; if(!A_BlockAvailable || pMbInfo[dwMbIndex-1].dwMbType == I_8x8 || (pMbInfo[dwMbIndex-1].predDir[1] == PREDDIRBWD)) { mvA.x = mvA.y = 0; BlockDistanceA = 1; RefIdxA = -1; } else { mvA = pMbInfo[dwMbIndex-1].mv[1]; BlockDistanceA = pMbInfo[dwMbIndex-1].iBlockDistance[1]; RefIdxA = pMbInfo[dwMbIndex-1].dwMbReferenceIndex[1]; } if(!B_BlockAvailable || pMbInfo[dwMbIndex-dwMbWidth].dwMbType == I_8x8 || (pMbInfo[dwMbIndex-dwMbWidth].predDir[2] == PREDDIRBWD)) { mvB.x = mvB.y = 0; BlockDistanceB = 1; RefIdxB = -1; } else { mvB = pMbInfo[dwMbIndex-dwMbWidth].mv[2]; BlockDistanceB = pMbInfo[dwMbIndex-dwMbWidth].iBlockDistance[2]; RefIdxB = pMbInfo[dwMbIndex-dwMbWidth].dwMbReferenceIndex[2]; } if(!D_BlockAvailable || pMbInfo[dwMbIndex-dwMbWidth-1].dwMbType == I_8x8 || (pMbInfo[dwMbIndex-dwMbWidth-1].predDir[3] == PREDDIRBWD)) { mvD.x = mvD.y = 0; BlockDistanceD = 1; RefIdxD = -1; } else { mvD = pMbInfo[dwMbIndex-dwMbWidth-1].mv[3]; BlockDistanceD = pMbInfo[dwMbIndex-dwMbWidth-1].iBlockDistance[3]; RefIdxD = pMbInfo[dwMbIndex-dwMbWidth-1].dwMbReferenceIndex[3]; } if(!C_BlockAvailable) { mvC = mvD; BlockDistanceC = BlockDistanceD; RefIdxC = RefIdxD; } else if(pMbInfo[dwMbIndex-dwMbWidth+1].dwMbType==I_8x8|| (pMbInfo[dwMbIndex-dwMbWidth+1].predDir[2] == PREDDIRBWD)) { mvC.x = mvC.y = 0; BlockDistanceC = 1; RefIdxC = -1; } else { mvC = pMbInfo[dwMbIndex-dwMbWidth+1].mv[2]; BlockDistanceC = pMbInfo[dwMbIndex-dwMbWidth+1].iBlockDistance[2]; RefIdxC = pMbInfo[dwMbIndex-dwMbWidth+1].dwMbReferenceIndex[2]; } if(RefIdxA !=-1 && RefIdxB == -1 && RefIdxC == -1) { MVEPred = mvA; } else if(RefIdxA == -1 && RefIdxB != -1 && RefIdxC == -1) { MVEPred = mvB; } else if(RefIdxA ==-1 && RefIdxB == -1 && RefIdxC != -1) { MVEPred = mvC; } else { if(RefIdxB == pMbInfo[dwMbIndex].dwMbReferenceIndex[0]) { MVEPred = mvB; } else { MVEPred = ScalePredMv(&mvA, &mvB, &mvC, iBlockDistance, BlockDistanceA, BlockDistanceB, BlockDistanceC); } } } else {//下块 if(MbX > 0) A_BlockAvailable = TRUE; B_BlockAvailable = TRUE; if(MbX>0) D_BlockAvailable = TRUE; if(!A_BlockAvailable || pMbInfo[dwMbIndex-1].dwMbType == I_8x8 || pMbInfo[dwMbIndex-1].predDir[3] == PREDDIRBWD) { mvA.x = mvA.y = 0; BlockDistanceA = 1; RefIdxA = -1; } else { mvA = pMbInfo[dwMbIndex-1].mv[3]; BlockDistanceA = pMbInfo[dwMbIndex-1].iBlockDistance[3]; RefIdxA = pMbInfo[dwMbIndex-1].dwMbReferenceIndex[3]; } if(!B_BlockAvailable || pMbInfo[dwMbIndex].predDir[0] == PREDDIRBWD) { mvB.x = mvB.y = 0; BlockDistanceB = 1; RefIdxB = -1; } else { mvB = pMbInfo[dwMbIndex].mv[0]; BlockDistanceB = pMbInfo[dwMbIndex].iBlockDistance[0]; RefIdxB = pMbInfo[dwMbIndex].dwMbReferenceIndex[0]; } if(!D_BlockAvailable || pMbInfo[dwMbIndex-1].dwMbType == I_8x8 || pMbInfo[dwMbIndex-1].predDir[1] == PREDDIRBWD) { mvD.x = mvD.y = 0; BlockDistanceD = 1; RefIdxD = -1; } else { mvD = pMbInfo[dwMbIndex-1].mv[1]; BlockDistanceD = pMbInfo[dwMbIndex-1].iBlockDistance[1]; RefIdxD = pMbInfo[dwMbIndex-1].dwMbReferenceIndex[1]; } mvC = mvD;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -