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

📄 pred.cpp

📁 avs decoder sources, added a command line sample
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		BlockDistanceC = BlockDistanceD;		RefIdxC = RefIdxD;		if(RefIdxA !=-1 && RefIdxB == -1 && RefIdxC == -1)		{			MVEPred = mvA;		}		else if(RefIdxA == -1 && RefIdxB != -1 && RefIdxC == -1)		{			MVEPred = mvB;		}		else if(RefIdxA ==-1 && RefIdxB == -1 && RefIdxC != -1)		{			MVEPred = mvC;		}		else		{			if(RefIdxA == pMbInfo[dwMbIndex].dwMbReferenceIndex[2])  			{				MVEPred = mvA;			}			else			{				MVEPred = ScalePredMv(&mvA, &mvB, &mvC, iBlockDistance, BlockDistanceA, BlockDistanceB, BlockDistanceC);			}		}        	}	mvE.x = MVEPred.x + pMbInfo[dwMbIndex].iMvDiffX[dwSubMb]; 	mvE.y = MVEPred.y + pMbInfo[dwMbIndex].iMvDiffY[dwSubMb];	mvBw.x = -((mvE.x * iBlockDistanceBw * (512/iBlockDistance)+256) >> 9);	mvBw.y = -((mvE.y * iBlockDistanceBw * (512/iBlockDistance)+256) >> 9);	for(AVS_INT block=0; block<2; block++)	{		//预测补偿		pMbInfo[dwMbIndex].mv[block+dwSubMb*2] = mvE;		pMbInfo[dwMbIndex].mvBw[block+dwSubMb*2] = mvBw;		pMbInfo[dwMbIndex].iBlockDistance[block+dwSubMb*2] = iBlockDistance;		pMbInfo[dwMbIndex].iBlockDistanceBw[block+dwSubMb*2] = iBlockDistanceBw;		AVS_INT iImgWidth = dwMbWidth*16;		AVS_INT iImgHeight = dwMbHeight*16;		AVS_INT iImgX = (dwMbIndex%dwMbWidth)*16 + ((block+dwSubMb*2)%2)*8;		AVS_INT iImgY = (dwMbIndex/dwMbWidth)*16 + ((block+dwSubMb*2)/2)*8;		//插值,得到4个8x8预测块		GetBlock(&(pMbInfo[dwMbIndex].mv[ block+dwSubMb*2]),iImgX, iImgY, iImgWidth, iImgHeight, ppRefFrame[idxFw]->y, pPred+(block+dwSubMb*2)*64);		GetBlock(&(pMbInfo[dwMbIndex].mvBw[ block+dwSubMb*2]),iImgX, iImgY, iImgWidth, iImgHeight, ppRefFrame[idxBw]->y, &(PredBw[0][0][0])+(block+dwSubMb*2)*64);		// average		AVS_BYTE* pDst = pPred+(block+dwSubMb*2)*64;		AVS_BYTE* pSrc = &(PredBw[0][0][0])+(block+dwSubMb*2)*64;		AverageB8x(pDst, pSrc, 8, 8);	}    	return AVS_NOERROR;}static AVS_HRESULT InterPredLuma8x16(		MBINFO* pMbInfo, AVS_INT dwMbIndex, 		const AVS_BYTE* pbRefY, 		AVS_INT dwMbWidth, AVS_INT dwMbHeight, 		AVS_INT iBlockDistance, 		AVS_INT dwSubMb, AVS_INT dirBw, 		AVS_BYTE* pPred){	AVS_BOOL A_BlockAvailable = FALSE;	AVS_BOOL B_BlockAvailable = FALSE;	AVS_BOOL C_BlockAvailable = FALSE;	AVS_BOOL D_BlockAvailable = FALSE;	AVS_INT  BlockDistanceA;	AVS_INT  BlockDistanceB;	AVS_INT  BlockDistanceC;	AVS_INT  BlockDistanceD;	AVS_INT  RefIdxA = -1;	AVS_INT  RefIdxB = -1;	AVS_INT  RefIdxC = -1;	AVS_INT  RefIdxD = -1;	MOTIONVECTOR mvA, mvB, mvC, mvD, mvE;	MOTIONVECTOR MVEPred;	AVS_INT MbX = dwMbIndex%dwMbWidth;	AVS_INT MbY = dwMbIndex/dwMbWidth;	if(dwSubMb == 0)	{//左块		if(MbY>0)			B_BlockAvailable = TRUE;		if(MbX>0)			A_BlockAvailable = TRUE;		if(MbY>0)			C_BlockAvailable = TRUE;		if(MbY>0)			C_BlockAvailable = TRUE;		if(MbX>0 && MbY>0)			D_BlockAvailable = TRUE;		if(!A_BlockAvailable || pMbInfo[dwMbIndex-1].dwMbType == I_8x8 ||				(pMbInfo[dwMbIndex-1].predDir[1] != pMbInfo[dwMbIndex].predDir[0] &&				 pMbInfo[dwMbIndex-1].predDir[1] != PREDDIRSYM))		{			mvA.x = mvA.y = 0;			BlockDistanceA = 1;			RefIdxA = -1;		}		else		{			if(!dirBw)			{				mvA = pMbInfo[dwMbIndex-1].mv[1];				BlockDistanceA = pMbInfo[dwMbIndex-1].iBlockDistance[1];				RefIdxA = pMbInfo[dwMbIndex-1].dwMbReferenceIndex[1];			}			else			{				mvA = pMbInfo[dwMbIndex-1].mvBw[1];				BlockDistanceA = pMbInfo[dwMbIndex-1].iBlockDistanceBw[1];				RefIdxA = pMbInfo[dwMbIndex-1].dwMbReferenceIndexBw[1];			}		}		if(!B_BlockAvailable || pMbInfo[dwMbIndex-dwMbWidth].dwMbType == I_8x8 ||				(pMbInfo[dwMbIndex-dwMbWidth].predDir[2] != pMbInfo[dwMbIndex].predDir[0] &&				 pMbInfo[dwMbIndex-dwMbWidth].predDir[2] != PREDDIRSYM))		{			mvB.x = mvB.y = 0;			BlockDistanceB = 1;			RefIdxB = -1;		}		else		{			if(!dirBw)			{				mvB = pMbInfo[dwMbIndex-dwMbWidth].mv[2];				BlockDistanceB = pMbInfo[dwMbIndex-dwMbWidth].iBlockDistance[2];				RefIdxB = pMbInfo[dwMbIndex-dwMbWidth].dwMbReferenceIndex[2];			}			else			{				mvB = pMbInfo[dwMbIndex-dwMbWidth].mvBw[2];				BlockDistanceB = pMbInfo[dwMbIndex-dwMbWidth].iBlockDistanceBw[2];				RefIdxB = pMbInfo[dwMbIndex-dwMbWidth].dwMbReferenceIndexBw[2];			}		}		if(!D_BlockAvailable || pMbInfo[dwMbIndex-dwMbWidth-1].dwMbType == I_8x8 ||				(pMbInfo[dwMbIndex-dwMbWidth-1].predDir[3] != pMbInfo[dwMbIndex].predDir[0] &&				 pMbInfo[dwMbIndex-dwMbWidth-1].predDir[3] != PREDDIRSYM))		{			mvD.x = mvD.y = 0;			BlockDistanceD = 1;			RefIdxD = -1;		}		else		{			if(!dirBw)			{				mvD = pMbInfo[dwMbIndex-dwMbWidth-1].mv[3];				BlockDistanceD = pMbInfo[dwMbIndex-dwMbWidth-1].iBlockDistance[3];				RefIdxD = pMbInfo[dwMbIndex-dwMbWidth-1].dwMbReferenceIndex[3];			}			else			{				mvD = pMbInfo[dwMbIndex-dwMbWidth-1].mvBw[3];				BlockDistanceD = pMbInfo[dwMbIndex-dwMbWidth-1].iBlockDistanceBw[3];				RefIdxD = pMbInfo[dwMbIndex-dwMbWidth-1].dwMbReferenceIndexBw[3];			}		}		if(!C_BlockAvailable)		{			mvC = mvD;			BlockDistanceC = BlockDistanceD;			RefIdxC = RefIdxD;		}		else if(pMbInfo[dwMbIndex-dwMbWidth].dwMbType == I_8x8 ||				(pMbInfo[dwMbIndex-dwMbWidth].predDir[3] != pMbInfo[dwMbIndex].predDir[0] &&				 pMbInfo[dwMbIndex-dwMbWidth].predDir[3] != PREDDIRSYM))		{			mvC.x = mvC.y = 0;			BlockDistanceC = 1;			RefIdxC = -1;		}		else		{			if(!dirBw)			{				mvC = pMbInfo[dwMbIndex-dwMbWidth].mv[3];				BlockDistanceC = pMbInfo[dwMbIndex-dwMbWidth].iBlockDistance[3];				RefIdxC = pMbInfo[dwMbIndex-dwMbWidth].dwMbReferenceIndex[3];			}			else			{				mvC = pMbInfo[dwMbIndex-dwMbWidth].mvBw[3];				BlockDistanceC = pMbInfo[dwMbIndex-dwMbWidth].iBlockDistanceBw[3];				RefIdxC = pMbInfo[dwMbIndex-dwMbWidth].dwMbReferenceIndexBw[3];			}		}		if(RefIdxA !=-1 && RefIdxB == -1 && RefIdxC == -1)		{			MVEPred = mvA;		}		else if(RefIdxA == -1 && RefIdxB != -1 && RefIdxC == -1)		{			MVEPred = mvB;		}		else if(RefIdxA ==-1 && RefIdxB == -1 && RefIdxC != -1)		{			MVEPred = mvC;		}		else		{    			if((!dirBw && RefIdxA == pMbInfo[dwMbIndex].dwMbReferenceIndex[0]) ||					(dirBw && RefIdxA == pMbInfo[dwMbIndex].dwMbReferenceIndexBw[0]))			{				MVEPred = mvA; 			}			else			{				MVEPred = ScalePredMv(&mvA, &mvB, &mvC, iBlockDistance, BlockDistanceA, BlockDistanceB, BlockDistanceC);			}		}	}	else	{//右块		A_BlockAvailable = TRUE;		if(MbY>0)			B_BlockAvailable = TRUE;		if(MbY>0)			D_BlockAvailable = TRUE;		if(MbY>0 && MbX<dwMbWidth-1)			C_BlockAvailable = TRUE;		if(!A_BlockAvailable || 				(pMbInfo[dwMbIndex].predDir[0] != pMbInfo[dwMbIndex].predDir[1]&&				 pMbInfo[dwMbIndex].predDir[0] != PREDDIRSYM))		{			mvA.x = mvA.y = 0;			BlockDistanceA = 1;			RefIdxA = -1;		}		else		{			if(!dirBw)			{				mvA = pMbInfo[dwMbIndex].mv[0];				BlockDistanceA = pMbInfo[dwMbIndex].iBlockDistance[0];				RefIdxA = pMbInfo[dwMbIndex].dwMbReferenceIndex[0];			}			else			{				mvA = pMbInfo[dwMbIndex].mvBw[0];				BlockDistanceA = pMbInfo[dwMbIndex].iBlockDistanceBw[0];				RefIdxA = pMbInfo[dwMbIndex].dwMbReferenceIndexBw[0];			}		}		if(!B_BlockAvailable || pMbInfo[dwMbIndex-dwMbWidth].dwMbType == I_8x8 ||				(pMbInfo[dwMbIndex-dwMbWidth].predDir[3] != pMbInfo[dwMbIndex].predDir[1] &&				 pMbInfo[dwMbIndex-dwMbWidth].predDir[3] != PREDDIRSYM))		{			mvB.x = mvB.y = 0;			BlockDistanceB = 1;			RefIdxB = -1;		}		else		{			if(!dirBw)			{				mvB = pMbInfo[dwMbIndex-dwMbWidth].mv[3];				BlockDistanceB = pMbInfo[dwMbIndex-dwMbWidth].iBlockDistance[3];				RefIdxB = pMbInfo[dwMbIndex-dwMbWidth].dwMbReferenceIndex[3];			}			else			{				mvB = pMbInfo[dwMbIndex-dwMbWidth].mvBw[3];				BlockDistanceB = pMbInfo[dwMbIndex-dwMbWidth].iBlockDistanceBw[3];				RefIdxB = pMbInfo[dwMbIndex-dwMbWidth].dwMbReferenceIndexBw[3];			}		}		if(!D_BlockAvailable || pMbInfo[dwMbIndex-dwMbWidth].dwMbType == I_8x8 ||				(pMbInfo[dwMbIndex-dwMbWidth].predDir[2] != pMbInfo[dwMbIndex].predDir[1] &&				 pMbInfo[dwMbIndex-dwMbWidth].predDir[2] != PREDDIRSYM))		{			mvD.x = mvD.y = 0;			BlockDistanceD = 1;			RefIdxD = -1;		}		else		{			if(!dirBw)			{				mvD = pMbInfo[dwMbIndex-dwMbWidth].mv[2];				BlockDistanceD = pMbInfo[dwMbIndex-dwMbWidth].iBlockDistance[2];				RefIdxD = pMbInfo[dwMbIndex-dwMbWidth].dwMbReferenceIndex[2];			}			else			{				mvD = pMbInfo[dwMbIndex-dwMbWidth].mvBw[2];				BlockDistanceD = pMbInfo[dwMbIndex-dwMbWidth].iBlockDistanceBw[2];				RefIdxD = pMbInfo[dwMbIndex-dwMbWidth].dwMbReferenceIndexBw[2];			}		}		if(!C_BlockAvailable)		{			mvC = mvD;			BlockDistanceC = BlockDistanceD;			RefIdxC = RefIdxD;		}		else if(pMbInfo[dwMbIndex-dwMbWidth+1].dwMbType == I_8x8 ||				(pMbInfo[dwMbIndex-dwMbWidth+1].predDir[2] != pMbInfo[dwMbIndex].predDir[1] &&				 pMbInfo[dwMbIndex-dwMbWidth+1].predDir[2] != PREDDIRSYM))		{			mvC.x = mvC.y = 0;			BlockDistanceC = 1;			RefIdxC = -1;		}		else		{			if(!dirBw)			{				mvC = pMbInfo[dwMbIndex-dwMbWidth+1].mv[2]; 				BlockDistanceC = pMbInfo[dwMbIndex-dwMbWidth+1].iBlockDistance[2];				RefIdxC = pMbInfo[dwMbIndex-dwMbWidth+1].dwMbReferenceIndex[2];			}			else			{				mvC = pMbInfo[dwMbIndex-dwMbWidth+1].mvBw[2]; 				BlockDistanceC = pMbInfo[dwMbIndex-dwMbWidth+1].iBlockDistanceBw[2];				RefIdxC = pMbInfo[dwMbIndex-dwMbWidth+1].dwMbReferenceIndexBw[2];			}		}		if(RefIdxA !=-1 && RefIdxB == -1 && RefIdxC == -1)		{			MVEPred = mvA;		}		else if(RefIdxA == -1 && RefIdxB != -1 && RefIdxC == -1)		{			MVEPred = mvB;		}		else if(RefIdxA ==-1 && RefIdxB == -1 && RefIdxC != -1)		{			MVEPred = mvC;		}		else		{    			if((!dirBw && RefIdxC == pMbInfo[dwMbIndex].dwMbReferenceIndex[1]) ||					(dirBw && RefIdxC == pMbInfo[dwMbIndex].dwMbReferenceIndexBw[1]) )			{				MVEPred = mvC;			}			else			{				MVEPred = ScalePredMv(&mvA, &mvB, &mvC, iBlockDistance, BlockDistanceA, BlockDistanceB, BlockDistanceC);			}		}	}	mvE.x = MVEPred.x + pMbInfo[dwMbIndex].iMvDiffX[dwSubMb];	mvE.y = MVEPred.y + pMbInfo[dwMbIndex].iMvDiffY[dwSubMb];	//预测补偿	if(dwSubMb == 0)	{		if(!dirBw)		{			pMbInfo[dwMbIndex].mv[0] = pMbInfo[dwMbIndex].mv[2] = mvE;			pMbInfo[dwMbIndex].iBlockDistance[0] = pMbInfo[dwMbIndex].iBlockDistance[2] = iBlockDistance;		}		else		{			pMbInfo[dwMbIndex].mvBw[0] = pMbInfo[dwMbIndex].mvBw[2] = mvE;			pMbInfo[dwMbIndex].iBlockDistanceBw[0] = pMbInfo[dwMbIndex].iBlockDistanceBw[2] = iBlockDistance;		}		AVS_INT iImgWidth = dwMbWidth*16;		AVS_INT iImgHeight = dwMbHeight*16;		AVS_INT iImgX = (dwMbIndex%dwMbWidth)*16; 		AVS_INT iImgY = (dwMbIndex/dwMbWidth)*16;		if(!dirBw)		{			GetBlock(&(pMbInfo[dwMbIndex].mv[0]),iImgX, iImgY, iImgWidth, iImgHeight, pbRefY, pPred);			iImgX = (dwMbIndex%dwMbWidth)*16; 			iImgY = (dwMbIndex/dwMbWidth)*16+8;			GetBlock(&(pMbInfo[dwMbIndex].mv[2]),iImgX, iImgY, iImgWidth, iImgHeight, pbRefY, pPred+2*64);		}		else		{			GetBlock(&(pMbInfo[dwMbIndex].mvBw[0]),iImgX, iImgY, iImgWidth, iImgHeight, pbRefY, pPred);			iImgX = (dwMbIndex%dwMbWidth)*16; 			iImgY = (dwMbIndex/dwMbWidth)*16+8;			GetBlock(&(pMbInfo[dwMbIndex].mvBw[2]),iImgX, iImgY, iImgWidth, iImgHeight, pbRefY, pPred+2*64);		}	}	else	{		if(!dirBw)		{			pMbInfo[dwMbIndex].mv[1] = pMbInfo[dwMbIndex].mv[3] = mvE;			pMbInfo[dwMbIndex].iBlockDistance[1] = pMbInfo[dwMbIndex].iBlockDistance[3] = iBlockDistance;		}		else		{			pMbInfo[dwMbIndex].mvBw[1] = pMbInfo[dwMbIndex].mvBw[3] = mvE;			pMbInfo[dwMbIndex].iBlockDistanceBw[1] = pMbInfo[dwMbIndex].iBlockDistanceBw[3] = iBlockDistance;		}		AVS_INT iImgWidth = dwMbWidth*16;		AVS_INT iImgHeight = dwMbHeight*16;		AVS_INT iImgX = (dwMbIndex%dwMbWidth)*16+8; 		AVS_INT iImgY = (dwMbIndex/dwMbWidth)*16;		if(!dirBw)		{			GetBlock(&(pMbInfo[dwMbIndex].mv[1]),iImgX, iImgY, iImgWidth, iImgHeight, pbRefY, pPred+64);			iImgX = (dwMbIndex%dwMbWidth)*16+8; 			iImgY = (dwMbIndex/dwMbWidth)*16+8;			GetBlock(&(pMbInfo[dwMbIndex].mv[3]),iImgX, iImgY, iImgWidth, iImgHeight, pbRefY, pPred+3*64);		}		else		{			GetBlock(&(pMbInfo[dwMbIndex].mvBw[1]),iImgX, iImgY, iImgWidth, iImgHeight, pbRefY, pPred+64);			iImgX = (dwMbIndex%dwMbWidth)*16+8; 			iImgY = (dwMbIndex/dwMbWidth)*16+8;			GetBlock(&(pMbInfo[dwMbIndex].mvBw[3]),iImgX, iImgY, iImgWidth, iImgHeight, pbRefY, pPred+3*64);		}	}	return AVS_NOERROR;}static AVS_HRESULT InterPredLumaSym8x16(MBINFO* pMbInfo, AVS_DWORD dwMbIndex, const VIDEODATA** ppRefFrame,AVS_DWORD dwRefNum, AVS_DWORD dwMbWidth, AVS_DWORD dwMbHeight, AVS_DWORD dwCurrDistanceIndex, AVS_DWORD dwSubMb, AVS_BYTE* pPred){	AVS_BOOL A_BlockAvailable = FALSE;	AVS_BOOL B_BlockAvailable = FALSE;	AVS_BOOL C_BlockAvailable = FALSE;	AVS_BOOL D_BlockAvailable = FALSE;	AVS_INT  BlockDistanceA;	AVS_INT  BlockDistanceB;	AVS_INT  BlockDistanceC;	AVS_INT  BlockDistanceD;	AVS_INT  RefIdxA = -1;	AVS_INT  RefIdxB = -1;	AVS_INT  RefIdxC = -1;	AVS_INT  RefIdxD = -1;	MOTIONVECTOR mvA, mvB, mvC, mvD, mvE, mvBw;	MOTIONVECTOR MVEPred;	AVS_INT MbX = dwMbIndex%dwMbWidth;	AVS_INT MbY = dwMbIndex/dwMbWidth;	AVS_INT idxBw = 0;	AVS_INT idxFw = 1;	AVS_INT dirBw = 1;	AVS_BYTE PredBw[4][8][8];	AVS_INT iBlockDistance = ((dwCurrDistanceIndex - ppRefFrame[idxFw]->dwDistanceIndex)+512)%512;	AVS_INT iBlockDistanceBw = ((ppRefFrame[idxBw]->dwDistanceIndex - dwCurrDistanceIndex)+512)%512;	if(dwSubMb == 0)	{//左块		if(MbY>0)			B_BlockAvailable = TRUE;		if(MbX>0)			A_BlockAvailable = TRUE;		if(MbY>0)			C_BlockAvailable = TRUE;		if(MbX>0 && MbY>0)			D_BlockAvailable = TRUE;		if(!A_BlockAvailable || pMbInfo[dwMbIndex-1].dwMbType == I_8x8 ||				pMbInfo[dwMbIndex-1].predDir[1] == PR

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -