📄 macroblock.cpp
字号:
AVS_INT MbX = dwMbIndex%MbWidth; AVS_INT MbY = dwMbIndex/MbWidth; AVS_DWORD imgWidth = pStrmInfo->SeqInfo.dwWidth; AVS_DWORD imgHeight = pStrmInfo->SeqInfo.dwHeight; if(dwRefNum == 4) imgHeight >>= 1; AVS_INT uvWidth = imgWidth>>1; AVS_DWORD dwImgType = pStrmInfo->ImgInfo.dwImageType; AVS_DWORD iImgWidth = imgWidth; AVS_DWORD iUVWidth = uvWidth; AVS_BYTE* pbTopLeftY = pCurrFrame->y; AVS_BYTE* pbTopLeftU = pCurrFrame->u; AVS_BYTE* pbTopLeftV = pCurrFrame->v; AVS_BYTE Pred[4][8][8]; AVS_BYTE* pPred = &(Pred[0][0][0]); memset(pPred, 0, 4*64*sizeof(AVS_BYTE)); AVS_INT i, j; dwCurrDistanceIndex = pCurrFrame->dwDistanceIndex; InitOneMacroBlock(pMbInfo, dwMbIndex, dwRefNum); if(pMbInfo[dwMbIndex].dwMbType == I_8x8) //帧内预测模式 { //亮度预测,变换,重构 for(block=0; block<4; block++) { AVS_INT imgX = MbX*16+(block%2)*8; AVS_INT imgY = MbY*16+(block/2)*8; pMbInfo[dwMbIndex].predDir[block] = -1; IntraPredLuma(pMbInfo, pbTopLeftY, dwMbIndex, imgWidth, imgHeight, block, pPred+block*64, imgX, imgY); if(pMbInfo[dwMbIndex].dwCbp & (1<<block)) { inv_transform_B8(pLumaResidual+block*64); } ReconB8((pbTopLeftY+imgY*iImgWidth+imgX), iImgWidth, pPred+block*64, pLumaResidual+block*64); if(dwImgType!=B_IMG) { pBwRefInfo[dwMbIndex].mvRef[block].x = pBwRefInfo[dwMbIndex].mvRef[block].y = 0; pBwRefInfo[dwMbIndex].iBlockDistanceRef[block] = -1; pBwRefInfo[dwMbIndex].iDistanceIndexRef[block] = dwCurrDistanceIndex; } } //色度预测,变换,重构 AVS_INT uvX = MbX*8; AVS_INT uvY = MbY*8; IntraPredChroma(pMbInfo, pbTopLeftU, dwMbIndex, MbWidth, MbHeight, pPred, uvX, uvY); IntraPredChroma(pMbInfo, pbTopLeftV, dwMbIndex, MbWidth, MbHeight, pPred+64, uvX, uvY); if(pMbInfo[dwMbIndex].dwCbp & 0x10) { inv_transform_B8(pChromaResidual); ReconB8(pbTopLeftU+uvY*iUVWidth+uvX, iUVWidth, pPred, pChromaResidual); } else { CopyB8(pbTopLeftU+uvY*iUVWidth+uvX, iUVWidth, pPred); } if(pMbInfo[dwMbIndex].dwCbp & 0x20) { inv_transform_B8(pChromaResidual+64); ReconB8(pbTopLeftV+uvY*iUVWidth+uvX, iUVWidth, pPred+64, pChromaResidual+64); } else { CopyB8(pbTopLeftV+uvY*iUVWidth+uvX, iUVWidth, pPred+64); } if(dwImgType!=B_IMG) { pBwRefInfo[dwMbIndex].dwMbType = I_8x8; } } else { if(pMbInfo[dwMbIndex].dwMbType == P_Skip || pMbInfo[dwMbIndex].dwMbType == P_16x16 || pMbInfo[dwMbIndex].dwMbType == P_16x8 || pMbInfo[dwMbIndex].dwMbType == P_8x16 || pMbInfo[dwMbIndex].dwMbType == P_8x8 ) { InterPredLumaP(pMbInfo, dwMbIndex, ppRefFrame, MbWidth, MbHeight, dwCurrDistanceIndex, pBwRefInfo, pPred); for(block=0; block<4; block++) { AVS_INT imgX = MbX*16+(block%2)*8; AVS_INT imgY = MbY*16+(block/2)*8; if(pMbInfo[dwMbIndex].dwCbp & (1<<block)) { inv_transform_B8(pLumaResidual+block*64); ReconB8(pbTopLeftY+imgY*iImgWidth+imgX, iImgWidth, pPred+block*64, pLumaResidual+block*64); } else { CopyB8(pbTopLeftY+imgY*iImgWidth+imgX,iImgWidth, pPred+block*64); } } InterPredChormaP(pMbInfo, dwMbIndex, ppRefFrame, MbWidth, MbHeight, pPred); AVS_INT uvX = MbX*8; AVS_INT uvY = MbY*8; if(pMbInfo[dwMbIndex].dwCbp & 0x10) { inv_transform_B8(pChromaResidual); ReconB8(pbTopLeftU+uvY*iUVWidth+uvX, iUVWidth, pPred, pChromaResidual); } else { CopyB8(pbTopLeftU+uvY*iUVWidth+uvX, iUVWidth, pPred); } if(pMbInfo[dwMbIndex].dwCbp & 0x20) { inv_transform_B8(pChromaResidual+64); ReconB8(pbTopLeftV+uvY*iUVWidth+uvX, iUVWidth, pPred+64,pChromaResidual+64); } else { CopyB8(pbTopLeftV+uvY*iUVWidth+uvX, iUVWidth, pPred+64); } } else // B Frame { InterPredLumaB(pMbInfo, dwMbIndex, ppRefFrame, dwRefNum, MbWidth, MbHeight, dwCurrDistanceIndex, pStrmInfo->ImgInfo.bPictureStructure, pBwRefInfo, pPred); for(block=0; block<4; block++) { AVS_INT imgX = MbX*16+(block%2)*8; AVS_INT imgY = MbY*16+(block/2)*8; if(pMbInfo[dwMbIndex].dwCbp & (1<<block)) { inv_transform_B8(pLumaResidual+block*64); ReconB8(pbTopLeftY+imgY*iImgWidth+imgX, iImgWidth, pPred+block*64, pLumaResidual+block*64); } else { CopyB8(pbTopLeftY+imgY*iImgWidth+imgX,iImgWidth, pPred+block*64); } } InterPredChormaB(pMbInfo, dwMbIndex, ppRefFrame, dwRefNum, MbWidth, MbHeight, pBwRefInfo, pPred); AVS_INT uvX = MbX*8; AVS_INT uvY = MbY*8; if(pMbInfo[dwMbIndex].dwCbp & 0x10) { inv_transform_B8(pChromaResidual); ReconB8(pbTopLeftU+uvY*iUVWidth+uvX, iUVWidth, pPred, pChromaResidual); } else { CopyB8(pbTopLeftU+uvY*iUVWidth+uvX, iUVWidth, pPred); } if(pMbInfo[dwMbIndex].dwCbp & 0x20) { inv_transform_B8(pChromaResidual+64); ReconB8(pbTopLeftV+uvY*iUVWidth+uvX, iUVWidth, pPred+64, pChromaResidual+64); } else { CopyB8(pbTopLeftV+uvY*iUVWidth+uvX, iUVWidth, pPred+64); } } } return AVS_NOERROR;}void InitOneMacroBlock(MBINFO* pMbInfo, AVS_DWORD dwMbIndex, AVS_DWORD dwRefNum){ AVS_INT block, i; AVS_INT tmp; switch(pMbInfo[dwMbIndex].dwMbType) { case I_8x8: break; // P MB----------------------------------- case P_Skip: for(block=0; block<4; block++) { pMbInfo[dwMbIndex].predDir[block] = PREDDIRFWD; pMbInfo[dwMbIndex].dwMbReferenceIndex[block] = pMbInfo[dwMbIndex].dwMbReferenceIndex[0]; } break; case P_16x16: for(block=0; block<4; block++) { pMbInfo[dwMbIndex].predDir[block] = PREDDIRFWD; pMbInfo[dwMbIndex].dwMbReferenceIndex[block] = pMbInfo[dwMbIndex].dwMbReferenceIndex[0]; } break; case P_16x8: for(block=0; block<4; block++) pMbInfo[dwMbIndex].predDir[block] = PREDDIRFWD; pMbInfo[dwMbIndex].dwMbReferenceIndex[3] = pMbInfo[dwMbIndex].dwMbReferenceIndex[1]; pMbInfo[dwMbIndex].dwMbReferenceIndex[1] = pMbInfo[dwMbIndex].dwMbReferenceIndex[0]; pMbInfo[dwMbIndex].dwMbReferenceIndex[2] = pMbInfo[dwMbIndex].dwMbReferenceIndex[3]; break; case P_8x16: for(block=0; block<4; block++) pMbInfo[dwMbIndex].predDir[block] = PREDDIRFWD; pMbInfo[dwMbIndex].dwMbReferenceIndex[2] = pMbInfo[dwMbIndex].dwMbReferenceIndex[0]; pMbInfo[dwMbIndex].dwMbReferenceIndex[3] = pMbInfo[dwMbIndex].dwMbReferenceIndex[1]; break; case P_8x8: for(block=0; block<4; block++) pMbInfo[dwMbIndex].predDir[block] = PREDDIRFWD; break; // B MB---------------------------------------------- case B_Fwd_16x16: for(block=0; block<4; block++) { pMbInfo[dwMbIndex].predDir[block] = PREDDIRFWD; } break; case B_Fwd_Fwd_16x8: for(block=0; block<4; block++) { pMbInfo[dwMbIndex].predDir[block] = PREDDIRFWD; } break; case B_Fwd_Fwd_8x16: for(block=0; block<4; block++) { pMbInfo[dwMbIndex].predDir[block] = PREDDIRFWD; } break; case B_Skip: for(block=0; block<4; block++) { pMbInfo[dwMbIndex].predDir[block] = PREDDIRSYM; } break; case B_Direct_16x16: for(block=0; block<4; block++) { pMbInfo[dwMbIndex].predDir[block] = PREDDIRSYM; } break; case B_Sym_16x16: for(block=0; block<4; block++) { pMbInfo[dwMbIndex].predDir[block] = PREDDIRSYM; } break; case B_Sym_Sym_16x8: for(block=0; block<4; block++) { pMbInfo[dwMbIndex].predDir[block] = PREDDIRSYM; } break; case B_Sym_Sym_8x16: for(block=0; block<4; block++) { pMbInfo[dwMbIndex].predDir[block] = PREDDIRSYM; } break; case B_Bck_16x16: for(block=0; block<4; block++) { pMbInfo[dwMbIndex].predDir[block] = PREDDIRBWD; } break; case B_Bck_Bck_16x8: for(block=0; block<4; block++) { pMbInfo[dwMbIndex].predDir[block] = PREDDIRBWD; } break; case B_Bck_Bck_8x16: for(block=0; block<4; block++) { pMbInfo[dwMbIndex].predDir[block] = PREDDIRBWD; } break; case B_Fwd_Bck_16x8: for(block=0; block<2; block++) { pMbInfo[dwMbIndex].predDir[block] = PREDDIRFWD; pMbInfo[dwMbIndex].predDir[block+2] = PREDDIRBWD; } break; case B_Fwd_Bck_8x16: for(block=0; block<2; block++) { pMbInfo[dwMbIndex].predDir[block*2] = PREDDIRFWD; pMbInfo[dwMbIndex].predDir[block*2+1] = PREDDIRBWD; } break; case B_Bck_Fwd_16x8: for(block=0; block<2; block++) { pMbInfo[dwMbIndex].predDir[block] = PREDDIRBWD; pMbInfo[dwMbIndex].predDir[block+2] = PREDDIRFWD; } break; case B_Bck_Fwd_8x16: for(block=0; block<2; block++) { pMbInfo[dwMbIndex].predDir[block*2] = PREDDIRBWD; pMbInfo[dwMbIndex].predDir[block*2+1] = PREDDIRFWD; } break; case B_Fwd_Sym_16x8: for(block=0; block<2; block++) { pMbInfo[dwMbIndex].predDir[block] = PREDDIRFWD; pMbInfo[dwMbIndex].predDir[block+2] = PREDDIRSYM; } break; case B_Fwd_Sym_8x16: for(block=0; block<2; block++) { pMbInfo[dwMbIndex].predDir[block*2] = PREDDIRFWD; pMbInfo[dwMbIndex].predDir[block*2+1] = PREDDIRSYM; } break; case B_Bck_Sym_16x8: for(block=0; block<2; block++) { pMbInfo[dwMbIndex].predDir[block] = PREDDIRBWD; pMbInfo[dwMbIndex].predDir[block+2] = PREDDIRSYM; } break; case B_Bck_Sym_8x16: for(block=0; block<2; block++) { pMbInfo[dwMbIndex].predDir[block*2] = PREDDIRBWD; pMbInfo[dwMbIndex].predDir[block*2+1] = PREDDIRSYM; } break; case B_Sym_Fwd_16x8: for(block=0; block<2; block++) { pMbInfo[dwMbIndex].predDir[block] = PREDDIRSYM; pMbInfo[dwMbIndex].predDir[block+2] = PREDDIRFWD; } break; case B_Sym_Fwd_8x16: for(block=0; block<2; block++) { pMbInfo[dwMbIndex].predDir[block*2] = PREDDIRSYM; pMbInfo[dwMbIndex].predDir[block*2+1] = PREDDIRFWD; } break; case B_Sym_Bck_16x8: for(block=0; block<2; block++) { pMbInfo[dwMbIndex].predDir[block] = PREDDIRSYM; pMbInfo[dwMbIndex].predDir[block+2] = PREDDIRBWD; } break; case B_Sym_Bck_8x16: for(block=0; block<2; block++) { pMbInfo[dwMbIndex].predDir[block*2] = PREDDIRSYM; pMbInfo[dwMbIndex].predDir[block*2+1] = PREDDIRBWD; } break; case B_8x8: for(block=0; block<4; block++) { switch(pMbInfo[dwMbIndex].dwMbPartType[block]) { case SB_Direct_8x8: pMbInfo[dwMbIndex].predDir[block] = PREDDIRSYM; break; case SB_Fwd_8x8: pMbInfo[dwMbIndex].predDir[block] = PREDDIRFWD; break; case SB_Bck_8x8: pMbInfo[dwMbIndex].predDir[block] = PREDDIRBWD; break; case SB_Sym_8x8: pMbInfo[dwMbIndex].predDir[block] = PREDDIRSYM; break; } } break; default: break; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -