📄 macroblock.cpp
字号:
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 + -