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

📄 macroblock.cpp

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