📄 block.cpp
字号:
pPred[i*8+j] = Clip((Dpie+7*hpie+7*Hpie+xxpie+64)>>7); } } } else if(dy==3 && dx==1) //p { for(i=0; i<8; i++) { for(j=0; j<8; j++) { int Hpiepie = *(pbRefY + max(0,min(iImgHeight-1, refY+i+1))*iImgWidth + max(0, min(iImgWidth-1, refX+j))) * 64; int aapie = - (*(pbRefY + max(0, min(iImgHeight-1, refY+i-1))*iImgWidth + max(0, min(iImgWidth-1, refX+j-1)))) + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i-1))*iImgWidth + max(0, min(iImgWidth-1, refX+j )))) + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i-1))*iImgWidth + max(0, min(iImgWidth-1, refX+j+1)))) - (*(pbRefY + max(0, min(iImgHeight-1, refY+i-1))*iImgWidth + max(0, min(iImgWidth-1, refX+j+2)))); int bpie = - (*(pbRefY + max(0, min(iImgHeight-1, refY+i ))*iImgWidth + max(0, min(iImgWidth-1, refX+j-1)))) + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i ))*iImgWidth + max(0, min(iImgWidth-1, refX+j )))) + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i ))*iImgWidth + max(0, min(iImgWidth-1, refX+j+1)))) - (*(pbRefY + max(0, min(iImgHeight-1, refY+i ))*iImgWidth + max(0, min(iImgWidth-1, refX+j+2)))); int spie = - (*(pbRefY + max(0, min(iImgHeight-1, refY+i+1))*iImgWidth + max(0, min(iImgWidth-1, refX+j-1)))) + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i+1))*iImgWidth + max(0, min(iImgWidth-1, refX+j )))) + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i+1))*iImgWidth + max(0, min(iImgWidth-1, refX+j+1)))) - (*(pbRefY + max(0, min(iImgHeight-1, refY+i+1))*iImgWidth + max(0, min(iImgWidth-1, refX+j+2)))); int ddpie = - (*(pbRefY + max(0, min(iImgHeight-1, refY+i+2))*iImgWidth + max(0, min(iImgWidth-1, refX+j-1)))) + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i+2))*iImgWidth + max(0, min(iImgWidth-1, refX+j )))) + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i+2))*iImgWidth + max(0, min(iImgWidth-1, refX+j+1)))) - (*(pbRefY + max(0, min(iImgHeight-1, refY+i+2))*iImgWidth + max(0, min(iImgWidth-1, refX+j+2)))); int jpie = -aapie + 5*bpie + 5*spie - ddpie; pPred[i*8+j] = Clip((jpie+Hpiepie+64)>>7); } } } else if(dy==3 && dx==2) //q { for(i=0; i<8; i++) { for(j=0; j<8; j++) { int aapie = - (*(pbRefY + max(0, min(iImgHeight-1, refY+i-1))*iImgWidth + max(0, min(iImgWidth-1, refX+j-1)))) + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i-1))*iImgWidth + max(0, min(iImgWidth-1, refX+j )))) + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i-1))*iImgWidth + max(0, min(iImgWidth-1, refX+j+1)))) - (*(pbRefY + max(0, min(iImgHeight-1, refY+i-1))*iImgWidth + max(0, min(iImgWidth-1, refX+j+2)))); int bpie = - (*(pbRefY + max(0, min(iImgHeight-1, refY+i ))*iImgWidth + max(0, min(iImgWidth-1, refX+j-1)))) + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i ))*iImgWidth + max(0, min(iImgWidth-1, refX+j )))) + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i ))*iImgWidth + max(0, min(iImgWidth-1, refX+j+1)))) - (*(pbRefY + max(0, min(iImgHeight-1, refY+i ))*iImgWidth + max(0, min(iImgWidth-1, refX+j+2)))); int spie = - (*(pbRefY + max(0, min(iImgHeight-1, refY+i+1))*iImgWidth + max(0, min(iImgWidth-1, refX+j-1)))) + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i+1))*iImgWidth + max(0, min(iImgWidth-1, refX+j )))) + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i+1))*iImgWidth + max(0, min(iImgWidth-1, refX+j+1)))) - (*(pbRefY + max(0, min(iImgHeight-1, refY+i+1))*iImgWidth + max(0, min(iImgWidth-1, refX+j+2)))); int ddpie = - (*(pbRefY + max(0, min(iImgHeight-1, refY+i+2))*iImgWidth + max(0, min(iImgWidth-1, refX+j-1)))) + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i+2))*iImgWidth + max(0, min(iImgWidth-1, refX+j )))) + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i+2))*iImgWidth + max(0, min(iImgWidth-1, refX+j+1)))) - (*(pbRefY + max(0, min(iImgHeight-1, refY+i+2))*iImgWidth + max(0, min(iImgWidth-1, refX+j+2)))); int xxpie = - (*(pbRefY + max(0, min(iImgHeight-1, refY+i+3))*iImgWidth + max(0, min(iImgWidth-1, refX+j-1)))) + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i+3))*iImgWidth + max(0, min(iImgWidth-1, refX+j )))) + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i+3))*iImgWidth + max(0, min(iImgWidth-1, refX+j+1)))) - (*(pbRefY + max(0, min(iImgHeight-1, refY+i+3))*iImgWidth + max(0, min(iImgWidth-1, refX+j+2)))); int jpie = -aapie + 5*bpie + 5*spie - ddpie; int jxxpie = -bpie + 5*spie + 5*ddpie - xxpie; int qpie = bpie*8 + 7*jpie + 7*spie*8 + jxxpie; pPred[i*8+j] = Clip((qpie + 512)>>10); } } } else if(dx==3 && dy==3) //r { for(i=0; i<8; i++) { for(j=0; j<8; j++) { int Ipiepie = *(pbRefY + max(0,min(iImgHeight-1, refY+i+1))*iImgWidth + max(0, min(iImgWidth-1, refX+j+1))) * 64; int aapie = - (*(pbRefY + max(0, min(iImgHeight-1, refY+i-1))*iImgWidth + max(0, min(iImgWidth-1, refX+j-1)))) + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i-1))*iImgWidth + max(0, min(iImgWidth-1, refX+j )))) + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i-1))*iImgWidth + max(0, min(iImgWidth-1, refX+j+1)))) - (*(pbRefY + max(0, min(iImgHeight-1, refY+i-1))*iImgWidth + max(0, min(iImgWidth-1, refX+j+2)))); int bpie = - (*(pbRefY + max(0, min(iImgHeight-1, refY+i ))*iImgWidth + max(0, min(iImgWidth-1, refX+j-1)))) + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i ))*iImgWidth + max(0, min(iImgWidth-1, refX+j )))) + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i ))*iImgWidth + max(0, min(iImgWidth-1, refX+j+1)))) - (*(pbRefY + max(0, min(iImgHeight-1, refY+i ))*iImgWidth + max(0, min(iImgWidth-1, refX+j+2)))); int spie = - (*(pbRefY + max(0, min(iImgHeight-1, refY+i+1))*iImgWidth + max(0, min(iImgWidth-1, refX+j-1)))) + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i+1))*iImgWidth + max(0, min(iImgWidth-1, refX+j )))) + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i+1))*iImgWidth + max(0, min(iImgWidth-1, refX+j+1)))) - (*(pbRefY + max(0, min(iImgHeight-1, refY+i+1))*iImgWidth + max(0, min(iImgWidth-1, refX+j+2)))); int ddpie = - (*(pbRefY + max(0, min(iImgHeight-1, refY+i+2))*iImgWidth + max(0, min(iImgWidth-1, refX+j-1)))) + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i+2))*iImgWidth + max(0, min(iImgWidth-1, refX+j )))) + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i+2))*iImgWidth + max(0, min(iImgWidth-1, refX+j+1)))) - (*(pbRefY + max(0, min(iImgHeight-1, refY+i+2))*iImgWidth + max(0, min(iImgWidth-1, refX+j+2)))); int xxpie = - (*(pbRefY + max(0, min(iImgHeight-1, refY+i+3))*iImgWidth + max(0, min(iImgWidth-1, refX+j-1)))) + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i+3))*iImgWidth + max(0, min(iImgWidth-1, refX+j )))) + 5* (*(pbRefY + max(0, min(iImgHeight-1, refY+i+3))*iImgWidth + max(0, min(iImgWidth-1, refX+j+1)))) - (*(pbRefY + max(0, min(iImgHeight-1, refY+i+3))*iImgWidth + max(0, min(iImgWidth-1, refX+j+2)))); int jpie = -aapie + 5*bpie + 5*spie - ddpie; pPred[i*8+j] = Clip((jpie+Ipiepie+64)>>7); } } } }/* * Function: 16x16 chroma block prediction. */void GetChromaBlock16x16( const AVS_BYTE* pbRefUV, AVS_INT iUVx, AVS_INT iUVy, AVS_INT iUVWidth, AVS_INT iUVHeight, MOTIONVECTOR* pMv, AVS_BYTE* pPred){ AVS_INT dx = (iUVx*8 + pMv->x)&7; AVS_INT dy = (iUVy*8 + pMv->y)&7; AVS_INT refX = (iUVx*8 + pMv->x - dx)/8; AVS_INT refY = (iUVy*8 + pMv->y - dy)/8; AVS_INT DX = 8-dx; AVS_INT DY = 8-dy; AVS_INT DXDY = DX*DY; AVS_INT dxDY = dx*DY; AVS_INT DXdy = DX*dy; AVS_INT dxdy = dx*dy; AVS_INT i,j; for(i=0; i<8; i++) { for(j=0; j<8; j++) { pPred[i*8+j] = Clip((DXDY*pbRefUV[max(0, min(refY+i,iUVHeight-1))*iUVWidth + max(0, min(refX+j,iUVWidth-1))] + dxDY*pbRefUV[max(0, min(refY+i,iUVHeight-1))*iUVWidth + max(0, min(refX+j+1,iUVWidth-1))] + DXdy*pbRefUV[max(0, min(refY+i+1,iUVHeight-1))*iUVWidth + max(0, min(refX+j,iUVWidth-1))] + dxdy*pbRefUV[max(0, min(refY+i+1,iUVHeight-1))*iUVWidth + max(0, min(refX+j+1,iUVWidth-1))] + 32)>>6); } }}/* * Function: 16x8 chroma block prediction. */void GetChromaBlock16x8(const AVS_BYTE* pbRefUV, AVS_INT iUVx, AVS_INT iUVy, AVS_INT iUVWidth, AVS_INT iUVHeight, MOTIONVECTOR* pMv, AVS_BYTE* pPred){ AVS_INT dx = (iUVx*8 + pMv->x)&7; AVS_INT dy = (iUVy*8 + pMv->y)&7; AVS_INT refX = (iUVx*8 + pMv->x - dx)/8; AVS_INT refY = (iUVy*8 + pMv->y - dy)/8; AVS_INT DX = 8-dx; AVS_INT DY = 8-dy; AVS_INT DXDY = DX*DY; AVS_INT dxDY = dx*DY; AVS_INT DXdy = DX*dy; AVS_INT dxdy = dx*dy; AVS_INT i,j; for(i=0; i<4; i++) { for(j=0; j<8; j++) { pPred[i*8+j] = Clip((DXDY*pbRefUV[max(0, min(refY+i,iUVHeight-1))*iUVWidth + max(0, min(refX+j,iUVWidth-1))] + dxDY*pbRefUV[max(0, min(refY+i,iUVHeight-1))*iUVWidth + max(0, min(refX+j+1,iUVWidth-1))] + DXdy*pbRefUV[max(0, min(refY+i+1,iUVHeight-1))*iUVWidth + max(0, min(refX+j,iUVWidth-1))] + dxdy*pbRefUV[max(0, min(refY+i+1,iUVHeight-1))*iUVWidth + max(0, min(refX+j+1,iUVWidth-1))] + 32)>>6); } }}/* * Function: 8x16 chroma block prediction. */void GetChromaBlock8x16(const AVS_BYTE* pbRefUV, AVS_INT iUVx, AVS_INT iUVy, AVS_INT iUVWidth, AVS_INT iUVHeight, MOTIONVECTOR* pMv, AVS_BYTE* pPred){ AVS_INT dx = (iUVx*8 + pMv->x)&7; AVS_INT dy = (iUVy*8 + pMv->y)&7; AVS_INT refX = (iUVx*8 + pMv->x - dx)/8; AVS_INT refY = (iUVy*8 + pMv->y - dy)/8; AVS_INT DX = 8-dx; AVS_INT DY = 8-dy; AVS_INT DXDY = DX*DY; AVS_INT dxDY = dx*DY; AVS_INT DXdy = DX*dy; AVS_INT dxdy = dx*dy; AVS_INT i,j; for(i=0; i<8; i++) { for(j=0; j<4; j++) { pPred[i*8+j] = Clip((DXDY*pbRefUV[max(0, min(refY+i,iUVHeight-1))*iUVWidth + max(0, min(refX+j,iUVWidth-1))] + dxDY*pbRefUV[max(0, min(refY+i,iUVHeight-1))*iUVWidth + max(0, min(refX+j+1,iUVWidth-1))] + DXdy*pbRefUV[max(0, min(refY+i+1,iUVHeight-1))*iUVWidth + max(0, min(refX+j,iUVWidth-1))] + dxdy*pbRefUV[max(0, min(refY+i+1,iUVHeight-1))*iUVWidth + max(0, min(refX+j+1,iUVWidth-1))] + 32)>>6); } }}/* * Function: 8x8 chroma block prediction. */void GetChromaBlock8x8(const AVS_BYTE* pbRefUV, AVS_INT iUVx, AVS_INT iUVy, AVS_INT iUVWidth, AVS_INT iUVHeight, MOTIONVECTOR* pMv, AVS_BYTE* pPred){ AVS_INT dx = (iUVx*8 + pMv->x)&7; AVS_INT dy = (iUVy*8 + pMv->y)&7; AVS_INT refX = (iUVx*8 + pMv->x - dx)/8; AVS_INT refY = (iUVy*8 + pMv->y - dy)/8; AVS_INT DX = 8-dx; AVS_INT DY = 8-dy; AVS_INT DXDY = DX*DY; AVS_INT dxDY = dx*DY; AVS_INT DXdy = DX*dy; AVS_INT dxdy = dx*dy; AVS_INT i,j; for(i=0; i<4; i++) { for(j=0; j<4; j++) { pPred[i*8+j] = Clip((DXDY*pbRefUV[max(0, min(refY+i,iUVHeight-1))*iUVWidth + max(0, min(refX+j,iUVWidth-1))] + dxDY*pbRefUV[max(0, min(refY+i,iUVHeight-1))*iUVWidth + max(0, min(refX+j+1,iUVWidth-1))] + DXdy*pbRefUV[max(0, min(refY+i+1,iUVHeight-1))*iUVWidth + max(0, min(refX+j,iUVWidth-1))] + dxdy*pbRefUV[max(0, min(refY+i+1,iUVHeight-1))*iUVWidth + max(0, min(refX+j+1,iUVWidth-1))] + 32)>>6); } }}/** * Function: Reconstruct 8x8 block. * -重构图像值等于预测值加上残差系数 */void ReconB8(AVS_BYTE* pDst, AVS_INT iImgWidth, AVS_BYTE* pPred, AVS_SHORT* pCoef){ AVS_BYTE* pDst1 = pDst; AVS_BYTE* pSrc0 = pPred; AVS_SHORT* pSrc1 = pCoef; AVS_INT i,j; for(i=0; i<8; i++) { for(j=0; j<8; j++) { int val = (*pSrc0++) + (*pSrc1++); *(pDst1++) = Clip(val); } pDst1 += iImgWidth-8; }}/** * Function: Copy single 8x8 block. * 主要用于cbp为0,对应块没有残差值的时候,直接拷贝预测值到重构图像中 */void CopyB8(AVS_BYTE* pDst, AVS_INT iStride, AVS_BYTE* pSrc){ AVS_INT i; for (i = 0; i < 8; i++) { *((AVS_INT *) pDst + 0) = *((AVS_INT *) pSrc); *((AVS_INT *) pDst + 1) = *((AVS_INT *) pSrc + 1); pSrc += 8; pDst += iStride; }}/************************************************************************//* 函数功能:求平均值 *//* - 主要是用与双向预测中求前后向预测值的平均值,也可以用做求 *//* 其他的平均值 *//* *//* - C语言代码课支持各种块形状,MMX代码只支持8x32, 8x8, 8x4, *//* 4x8, 4x4块形状 *//************************************************************************/void AverageB8x(AVS_BYTE* pDst, AVS_BYTE* pSrc, AVS_INT iHeight, AVS_INT iWidth){ AVS_INT i, j; for (i = 0; i < iHeight; i++) { for (j = 0; j < iWidth; j++) { *(pDst) = (*(pDst) + *(pSrc) + 1) / 2; pDst++; pSrc++; } pSrc += 8 - iWidth; pDst += 8 - iWidth; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -