📄 block.cpp
字号:
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);
}
}
}
}
/************************************************************************/
/* 函数功能:16x16色度块插值预测 */
/************************************************************************/
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);
}
}
}
/************************************************************************/
/* 函数功能:16x8色度块预测 */
/************************************************************************/
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);
}
}
}
/************************************************************************/
/* 函数功能:8x16色度块预测 */
/************************************************************************/
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);
}
}
}
/************************************************************************/
/* 函数功能:8x8色度块预测 */
/************************************************************************/
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);
}
}
}
/************************************************************************/
/* 函数功能: 重构8x8块 */
/* -重构图像值等于预测值加上残差系数 */
/************************************************************************/
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;
}
}
/************************************************************************/
/* 函数功能:拷贝一个8x8块 */
/* -主要用于cbp为0,对应块没有残差值的时候,直接拷贝预测值 */
/* 到重构图像中 */
/************************************************************************/
void CopyB8(AVS_BYTE* pDst, AVS_INT iStride, AVS_BYTE* pSrc)
{
AVS_INT i;
for(i=0; i<8; i++)
{
//memcpy(pDst, pSrc, 8);
*((AVS_INT*)pDst) = *((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 + -