📄 pred.cpp
字号:
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(RefIdxA == pMbInfo[dwMbIndex].dwMbReferenceIndex[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]; mvBw.x = -((mvE.x * iBlockDistanceBw * (512/iBlockDistance)+256) >> 9); mvBw.y = -((mvE.y * iBlockDistanceBw * (512/iBlockDistance)+256) >> 9); for(AVS_INT block=0; block<2; block++) { //预测补偿 pMbInfo[dwMbIndex].mv[block+dwSubMb*2] = mvE; pMbInfo[dwMbIndex].mvBw[block+dwSubMb*2] = mvBw; pMbInfo[dwMbIndex].iBlockDistance[block+dwSubMb*2] = iBlockDistance; pMbInfo[dwMbIndex].iBlockDistanceBw[block+dwSubMb*2] = iBlockDistanceBw; 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; //插值,得到4个8x8预测块 GetBlock(&(pMbInfo[dwMbIndex].mv[ block+dwSubMb*2]),iImgX, iImgY, iImgWidth, iImgHeight, ppRefFrame[idxFw]->y, pPred+(block+dwSubMb*2)*64); GetBlock(&(pMbInfo[dwMbIndex].mvBw[ block+dwSubMb*2]),iImgX, iImgY, iImgWidth, iImgHeight, ppRefFrame[idxBw]->y, &(PredBw[0][0][0])+(block+dwSubMb*2)*64); // average AVS_BYTE* pDst = pPred+(block+dwSubMb*2)*64; AVS_BYTE* pSrc = &(PredBw[0][0][0])+(block+dwSubMb*2)*64; AverageB8x(pDst, pSrc, 8, 8); } return AVS_NOERROR;}static AVS_HRESULT InterPredLuma8x16( MBINFO* pMbInfo, AVS_INT dwMbIndex, const AVS_BYTE* pbRefY, AVS_INT dwMbWidth, AVS_INT dwMbHeight, AVS_INT iBlockDistance, AVS_INT dwSubMb, AVS_INT dirBw, 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; AVS_INT BlockDistanceB; AVS_INT BlockDistanceC; AVS_INT BlockDistanceD; 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(MbY>0) B_BlockAvailable = TRUE; if(MbX>0) A_BlockAvailable = TRUE; if(MbY>0) C_BlockAvailable = TRUE; if(MbY>0) C_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].dwMbType == I_8x8 || (pMbInfo[dwMbIndex-dwMbWidth].predDir[3] != pMbInfo[dwMbIndex].predDir[0] && pMbInfo[dwMbIndex-dwMbWidth].predDir[3] != PREDDIRSYM)) { mvC.x = mvC.y = 0; BlockDistanceC = 1; RefIdxC = -1; } else { if(!dirBw) { mvC = pMbInfo[dwMbIndex-dwMbWidth].mv[3]; BlockDistanceC = pMbInfo[dwMbIndex-dwMbWidth].iBlockDistance[3]; RefIdxC = pMbInfo[dwMbIndex-dwMbWidth].dwMbReferenceIndex[3]; } else { mvC = pMbInfo[dwMbIndex-dwMbWidth].mvBw[3]; BlockDistanceC = pMbInfo[dwMbIndex-dwMbWidth].iBlockDistanceBw[3]; RefIdxC = pMbInfo[dwMbIndex-dwMbWidth].dwMbReferenceIndexBw[3]; } } 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[0]) || (dirBw && RefIdxA == pMbInfo[dwMbIndex].dwMbReferenceIndexBw[0])) { MVEPred = mvA; } else { MVEPred = ScalePredMv(&mvA, &mvB, &mvC, iBlockDistance, BlockDistanceA, BlockDistanceB, BlockDistanceC); } } } else {//右块 A_BlockAvailable = TRUE; if(MbY>0) B_BlockAvailable = TRUE; if(MbY>0) D_BlockAvailable = TRUE; if(MbY>0 && MbX<dwMbWidth-1) C_BlockAvailable = TRUE; if(!A_BlockAvailable || (pMbInfo[dwMbIndex].predDir[0] != pMbInfo[dwMbIndex].predDir[1]&& pMbInfo[dwMbIndex].predDir[0] != PREDDIRSYM)) { mvA.x = mvA.y = 0; BlockDistanceA = 1; RefIdxA = -1; } else { if(!dirBw) { mvA = pMbInfo[dwMbIndex].mv[0]; BlockDistanceA = pMbInfo[dwMbIndex].iBlockDistance[0]; RefIdxA = pMbInfo[dwMbIndex].dwMbReferenceIndex[0]; } else { mvA = pMbInfo[dwMbIndex].mvBw[0]; BlockDistanceA = pMbInfo[dwMbIndex].iBlockDistanceBw[0]; RefIdxA = pMbInfo[dwMbIndex].dwMbReferenceIndexBw[0]; } } if(!B_BlockAvailable || pMbInfo[dwMbIndex-dwMbWidth].dwMbType == I_8x8 || (pMbInfo[dwMbIndex-dwMbWidth].predDir[3] != pMbInfo[dwMbIndex].predDir[1] && pMbInfo[dwMbIndex-dwMbWidth].predDir[3] != PREDDIRSYM)) { mvB.x = mvB.y = 0; BlockDistanceB = 1; RefIdxB = -1; } else { if(!dirBw) { mvB = pMbInfo[dwMbIndex-dwMbWidth].mv[3]; BlockDistanceB = pMbInfo[dwMbIndex-dwMbWidth].iBlockDistance[3]; RefIdxB = pMbInfo[dwMbIndex-dwMbWidth].dwMbReferenceIndex[3]; } else { mvB = pMbInfo[dwMbIndex-dwMbWidth].mvBw[3]; BlockDistanceB = pMbInfo[dwMbIndex-dwMbWidth].iBlockDistanceBw[3]; RefIdxB = pMbInfo[dwMbIndex-dwMbWidth].dwMbReferenceIndexBw[3]; } } if(!D_BlockAvailable || pMbInfo[dwMbIndex-dwMbWidth].dwMbType == I_8x8 || (pMbInfo[dwMbIndex-dwMbWidth].predDir[2] != pMbInfo[dwMbIndex].predDir[1] && pMbInfo[dwMbIndex-dwMbWidth].predDir[2] != PREDDIRSYM)) { mvD.x = mvD.y = 0; BlockDistanceD = 1; RefIdxD = -1; } else { if(!dirBw) { mvD = pMbInfo[dwMbIndex-dwMbWidth].mv[2]; BlockDistanceD = pMbInfo[dwMbIndex-dwMbWidth].iBlockDistance[2]; RefIdxD = pMbInfo[dwMbIndex-dwMbWidth].dwMbReferenceIndex[2]; } else { mvD = pMbInfo[dwMbIndex-dwMbWidth].mvBw[2]; BlockDistanceD = pMbInfo[dwMbIndex-dwMbWidth].iBlockDistanceBw[2]; RefIdxD = pMbInfo[dwMbIndex-dwMbWidth].dwMbReferenceIndexBw[2]; } } 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[1] && 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 && RefIdxC == pMbInfo[dwMbIndex].dwMbReferenceIndex[1]) || (dirBw && RefIdxC == pMbInfo[dwMbIndex].dwMbReferenceIndexBw[1]) ) { MVEPred = mvC; } 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]; //预测补偿 if(dwSubMb == 0) { if(!dirBw) { pMbInfo[dwMbIndex].mv[0] = pMbInfo[dwMbIndex].mv[2] = mvE; pMbInfo[dwMbIndex].iBlockDistance[0] = pMbInfo[dwMbIndex].iBlockDistance[2] = iBlockDistance; } else { pMbInfo[dwMbIndex].mvBw[0] = pMbInfo[dwMbIndex].mvBw[2] = mvE; pMbInfo[dwMbIndex].iBlockDistanceBw[0] = pMbInfo[dwMbIndex].iBlockDistanceBw[2] = iBlockDistance; } AVS_INT iImgWidth = dwMbWidth*16; AVS_INT iImgHeight = dwMbHeight*16; AVS_INT iImgX = (dwMbIndex%dwMbWidth)*16; AVS_INT iImgY = (dwMbIndex/dwMbWidth)*16; if(!dirBw) { GetBlock(&(pMbInfo[dwMbIndex].mv[0]),iImgX, iImgY, iImgWidth, iImgHeight, pbRefY, pPred); iImgX = (dwMbIndex%dwMbWidth)*16; iImgY = (dwMbIndex/dwMbWidth)*16+8; GetBlock(&(pMbInfo[dwMbIndex].mv[2]),iImgX, iImgY, iImgWidth, iImgHeight, pbRefY, pPred+2*64); } else { GetBlock(&(pMbInfo[dwMbIndex].mvBw[0]),iImgX, iImgY, iImgWidth, iImgHeight, pbRefY, pPred); iImgX = (dwMbIndex%dwMbWidth)*16; iImgY = (dwMbIndex/dwMbWidth)*16+8; GetBlock(&(pMbInfo[dwMbIndex].mvBw[2]),iImgX, iImgY, iImgWidth, iImgHeight, pbRefY, pPred+2*64); } } else { if(!dirBw) { pMbInfo[dwMbIndex].mv[1] = pMbInfo[dwMbIndex].mv[3] = mvE; pMbInfo[dwMbIndex].iBlockDistance[1] = pMbInfo[dwMbIndex].iBlockDistance[3] = iBlockDistance; } else { pMbInfo[dwMbIndex].mvBw[1] = pMbInfo[dwMbIndex].mvBw[3] = mvE; pMbInfo[dwMbIndex].iBlockDistanceBw[1] = pMbInfo[dwMbIndex].iBlockDistanceBw[3] = iBlockDistance; } AVS_INT iImgWidth = dwMbWidth*16; AVS_INT iImgHeight = dwMbHeight*16; AVS_INT iImgX = (dwMbIndex%dwMbWidth)*16+8; AVS_INT iImgY = (dwMbIndex/dwMbWidth)*16; if(!dirBw) { GetBlock(&(pMbInfo[dwMbIndex].mv[1]),iImgX, iImgY, iImgWidth, iImgHeight, pbRefY, pPred+64); iImgX = (dwMbIndex%dwMbWidth)*16+8; iImgY = (dwMbIndex/dwMbWidth)*16+8; GetBlock(&(pMbInfo[dwMbIndex].mv[3]),iImgX, iImgY, iImgWidth, iImgHeight, pbRefY, pPred+3*64); } else { GetBlock(&(pMbInfo[dwMbIndex].mvBw[1]),iImgX, iImgY, iImgWidth, iImgHeight, pbRefY, pPred+64); iImgX = (dwMbIndex%dwMbWidth)*16+8; iImgY = (dwMbIndex/dwMbWidth)*16+8; GetBlock(&(pMbInfo[dwMbIndex].mvBw[3]),iImgX, iImgY, iImgWidth, iImgHeight, pbRefY, pPred+3*64); } } return AVS_NOERROR;}static AVS_HRESULT InterPredLumaSym8x16(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; AVS_INT BlockDistanceB; AVS_INT BlockDistanceC; AVS_INT BlockDistanceD; AVS_INT RefIdxA = -1; AVS_INT RefIdxB = -1; AVS_INT RefIdxC = -1; AVS_INT RefIdxD = -1; MOTIONVECTOR mvA, mvB, mvC, mvD, mvE, mvBw; MOTIONVECTOR MVEPred; AVS_INT MbX = dwMbIndex%dwMbWidth; AVS_INT MbY = dwMbIndex/dwMbWidth; 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; if(dwSubMb == 0) {//左块 if(MbY>0) B_BlockAvailable = TRUE; if(MbX>0) A_BlockAvailable = TRUE; if(MbY>0) C_BlockAvailable = TRUE; if(MbX>0 && MbY>0) D_BlockAvailable = TRUE; if(!A_BlockAvailable || pMbInfo[dwMbIndex-1].dwMbType == I_8x8 || pMbInfo[dwMbIndex-1].predDir[1] == PR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -