⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 block.cpp

📁 avs decoder sources, added a command line sample
💻 CPP
📖 第 1 页 / 共 3 页
字号:
				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 + -