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

📄 mc.cpp

📁 au1200 linux2.6.11 硬件解码mae驱动和maiplayer播放器源码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
			iRound++;			for (iy = 0; iy < MB_SIZE; iy+=2) {				ppxlcRefBot = ppxlcRef + iFieldStep;		//UPln -> pixels (xInt,yInt+1);				for (ix = 0; ix < MB_SIZE; ix++) {					ppxlcPred [ix] = (ppxlcRef [ix + 1] + ppxlcRef [ix] +						ppxlcRefBot [ix + 1] + ppxlcRefBot [ix] + iRound) >> 2;				}				ppxlcRef = ppxlcRefBot;				ppxlcPred += MB_SIZE*2;			}		}	}}Void CVideoObject::motionCompFieldUV (	PixelC* ppxlcPredMBU, PixelC* ppxlcPredMBV,								 const CVOPU8YUVBA* pvopcRef,								 CoordI x, CoordI y, 								 CoordI xRefUV, CoordI yRefUV,Int iRefFieldSelect,								 CRct* prctMVLimit, // added by Y.Suzuki for the extended bounding box support								 int nUVMVConfigSelect, int nDumpRef){	UInt ix, iy;	CoordI	maeXRefUV, maeYRefUV;// added by Y.Suzuki for the extended bounding box support	maeXRefUV = xRefUV;	maeYRefUV = yRefUV;	CoordI iTmpX = x + xRefUV;	CoordI iTmpY = y + yRefUV;	LIMITMVRANGETOEXTENDEDBBFULLPEL(&iTmpX, &iTmpY, prctMVLimit, MB_SIZE);	xRefUV = iTmpX - x;	yRefUV = iTmpY - y;// ~extended bounding box support	// delete by Hyundai for Microsoft and MoMusys alignment	//Int iPxLoc = ((((y + yRefUV) >> 1) & ~1) + EXPANDUV_REF_FRAME) * m_iFrameWidthUV + ((x + xRefUV) >> 1) + EXPANDUV_REF_FRAME;	// insert by Hyundai for Microsoft and MoMusys alignment	Int iPxLoc = (y/2 + ((yRefUV >> 1) & ~1) + EXPANDUV_REF_FRAME) * m_iFrameWidthUV + ((x + xRefUV) >> 1) + EXPANDUV_REF_FRAME;	const PixelC* ppxlcPrevU;	const PixelC* ppxlcPrevV;// HV For Travis	if (nFlipToRef == FLIP_TO_REF)	{#ifdef COPY_FRAME_FROM_CMODEL		ppxlcPrevU = pvopcRef->pixelsU () + iPxLoc + iRefFieldSelect*m_iFrameWidthUV;		ppxlcPrevV = pvopcRef->pixelsV () + iPxLoc + iRefFieldSelect*m_iFrameWidthUV;#else		if (m_ActiveRef == FORWARD_REFERENCES)		{			ppxlcPrevU = m_OOFFlipQ0_U + iPxLoc + iRefFieldSelect*m_iFrameWidthUV;			ppxlcPrevV = m_OOFFlipQ0_V + iPxLoc + iRefFieldSelect*m_iFrameWidthUV;		}		else if (m_ActiveRef == BACKWARD_REFERENCES)		{			ppxlcPrevU = m_OOFFlipQ1_U + iPxLoc + iRefFieldSelect*m_iFrameWidthUV;			ppxlcPrevV = m_OOFFlipQ1_V + iPxLoc + iRefFieldSelect*m_iFrameWidthUV;		}#endif	}	else	{		ppxlcPrevU = pvopcRef->pixelsU () + iPxLoc + iRefFieldSelect*m_iFrameWidthUV;		ppxlcPrevV = pvopcRef->pixelsV () + iPxLoc + iRefFieldSelect*m_iFrameWidthUV;	}// ~HV For Travis	Int iRound = 1 - m_vopmd.iRoundingControl;	Int iFieldStep = 2 * m_iFrameWidthUV;#ifdef DUAL_MODE	if (nBldOpt == USE_REF) {#ifdef MEMSET_ALL		memset(&gRefBlockChecks, 0, sizeof(REF_BLK_MV_CHECKERS));#endif		// The reference blocks for the Chroma blocks are being processed		// in 2 blocks each of size 8*4 bytes. But, here we need to dump		// only once in a double-sequence!!		if (1/*nDumpRef == DUMP_CHROMA_IC_BLKS*/) {			gRefBlockChecks.nActMVX   = xRefUV;			gRefBlockChecks.nActMVY   = yRefUV;			gRefBlockChecks.nMBType   = MBT_16x8;			gRefBlockChecks.nMBMode    = g_MAEWrapper->Get_MAEMB_mbmode ("CVideoObject::motionCompFieldUV", __LINE__, __FILE__);			gRefBlockChecks.nWidthY   = // assign both so don't break other code			gRefBlockChecks.nWidthUV  = iFieldStep;			// Intermediate Checking stuff for the Cb reference block 			// & Motion Vector with the Reference code			// ******************************************************			gRefBlockChecks.refblk    = (unsigned char *)(ppxlcPrevU);			gRefBlockChecks.nBlockNum = 5;			sprintf(gFileName, "%s%d%s", (m_vopmd.vopPredType == PVOP) ?  FILE_INTER_P_REF_BLOCKS_MV : FILE_INTER_B_REF_BLOCKS_MV, m_vopmd.iFrameNumber, gFileExt);			InterChecksForRefBlkAndMVOnInterlacedMB(&gRefBlockChecks, gFileName, FROM_MPEG4_REF_HPEL);			// Intermediate Checking stuff for the Cr reference block 			// & Motion Vector with the Reference code			// ******************************************************			gRefBlockChecks.refblk    = (unsigned char *)(ppxlcPrevV);			gRefBlockChecks.nBlockNum = 6;      // Same file name			// sprintf(gFileName, "%s%d%s", (m_vopmd.vopPredType == PVOP) ?  FILE_INTER_P_REF_BLOCKS_MV : FILE_INTER_B_REF_BLOCKS_MV, m_vopmd.iFrameNumber, gFileExt);			InterChecksForRefBlkAndMVOnInterlacedMB(&gRefBlockChecks, gFileName, FROM_MPEG4_REF_HPEL);		}#ifdef DUMP_REF_FRAME    if(!m_vopmd.bDumpRefFrameUV) {      // Process the U frame pointer now      // *******************************      unsigned char *ActualRefFrame = (unsigned char*)(pvopcRef->pixelsU () + (m_iFrameWidthUV * EXPANDUV_REF_FRAME) + EXPANDUV_REF_FRAME);        sprintf(gFileName, "%s%d%s", (m_vopmd.vopPredType == PVOP) ?  FILE_REF_FRAME_U_FOR_P : FILE_REF_FRAME_U_FOR_B, m_vopmd.iFrameNumber, gFileExt);      PrintRefFrame(ActualRefFrame, gFileName, EXPANDUV_REF_FRAMEx2, 		  g_MAEWrapper->Get_MAEReg_linesiz ("CVideoObject::motionCompFieldUV", __LINE__, __FILE__)/2, 		  g_MAEWrapper->Get_MAEReg_height ("CVideoObject::motionCompFieldUV", __LINE__, __FILE__)/2);#ifdef DUMP_OOF_REF_FRAME      sprintf(gFileName, "%s%d%s", (m_vopmd.vopPredType == PVOP) ?  FILE_OOF_REF_FRAME_U_FOR_P : FILE_OOF_REF_FRAME_U_FOR_B, m_vopmd.iFrameNumber, gFileExt);      PrintRefFrame((unsigned char*)pvopcRef->pixelsU(), gFileName, 0, 		  g_MAEWrapper->Get_MAEReg_linesiz ("CVideoObject::motionCompFieldUV", __LINE__, __FILE__)/2+EXPANDUV_REF_FRAMEx2, 		  g_MAEWrapper->Get_MAEReg_height ("CVideoObject::motionCompFieldUV", __LINE__, __FILE__)/2+EXPANDUV_REF_FRAMEx2);#endif        // Process the V frame pointer now      // *******************************      ActualRefFrame = (unsigned char*)(pvopcRef->pixelsV () + (m_iFrameWidthUV * EXPANDUV_REF_FRAME) + EXPANDUV_REF_FRAME);        sprintf(gFileName, "%s%d%s", (m_vopmd.vopPredType == PVOP) ?  FILE_REF_FRAME_V_FOR_P : FILE_REF_FRAME_V_FOR_B, m_vopmd.iFrameNumber, gFileExt);      PrintRefFrame(ActualRefFrame, gFileName, EXPANDUV_REF_FRAMEx2, 		  g_MAEWrapper->Get_MAEReg_linesiz ("CVideoObject::motionCompFieldUV", __LINE__, __FILE__)/2, 		  g_MAEWrapper->Get_MAEReg_height ("CVideoObject::motionCompFieldUV", __LINE__, __FILE__)/2);#ifdef DUMP_OOF_REF_FRAME      sprintf(gFileName, "%s%d%s", (m_vopmd.vopPredType == PVOP) ?  FILE_OOF_REF_FRAME_V_FOR_P : FILE_OOF_REF_FRAME_V_FOR_B, m_vopmd.iFrameNumber, gFileExt);      PrintRefFrame((unsigned char*)pvopcRef->pixelsV(), gFileName, 0, 		  g_MAEWrapper->Get_MAEReg_linesiz ("CVideoObject::motionCompFieldUV", __LINE__, __FILE__)/2+EXPANDUV_REF_FRAMEx2, 		  g_MAEWrapper->Get_MAEReg_height ("CVideoObject::motionCompFieldUV", __LINE__, __FILE__)/2+EXPANDUV_REF_FRAMEx2);#endif        // Set the flag so that we don't re-enter here for this frame      m_vopmd.bDumpRefFrameUV = TRUE;    }#endif		if (!(yRefUV & 2)) {			if (!(xRefUV & 1)) { //!bXSubPxl && !bYSubPxl				for (iy = 0; iy < BLOCK_SIZE; iy+=2) {					memcpy (ppxlcPredMBU, ppxlcPrevU, BLOCK_SIZE*sizeof(PixelC));					memcpy (ppxlcPredMBV, ppxlcPrevV, BLOCK_SIZE*sizeof(PixelC));					ppxlcPrevU += iFieldStep;					ppxlcPrevV += iFieldStep;					ppxlcPredMBU += 2*BLOCK_SIZE;					ppxlcPredMBV += 2*BLOCK_SIZE;				}			}			else { //bXSubPxl && !bYSubPxl				for (iy = 0; iy < BLOCK_SIZE; iy+=2) {					for (ix = 0; ix < BLOCK_SIZE; ix++) {						ppxlcPredMBU [ix] = (ppxlcPrevU [ix + 1] + ppxlcPrevU [ix] + iRound) >> 1;						ppxlcPredMBV [ix] = (ppxlcPrevV [ix + 1] + ppxlcPrevV [ix] + iRound) >> 1;					}					ppxlcPrevU += iFieldStep;					ppxlcPrevV += iFieldStep;					ppxlcPredMBU += 2*BLOCK_SIZE;					ppxlcPredMBV += 2*BLOCK_SIZE;				}			}		}		else {			const PixelC* ppxlcPrevUBot; 			const PixelC* ppxlcPrevVBot; 			if (!(xRefUV & 1)) { //!bXSubPxl&& bYSubPxl				for (iy = 0; iy < BLOCK_SIZE; iy+=2) {					ppxlcPrevUBot = ppxlcPrevU + iFieldStep;            //UPln -> pixels (xInt,yInt+1);					ppxlcPrevVBot = ppxlcPrevV + iFieldStep;            //VPln -> pixels (xInt,yInt+1);					for (ix = 0; ix < BLOCK_SIZE; ix++) {						ppxlcPredMBU [ix] = (ppxlcPrevU [ix] + ppxlcPrevUBot [ix] + iRound) >> 1;						ppxlcPredMBV [ix] = (ppxlcPrevV [ix] + ppxlcPrevVBot [ix] + iRound) >> 1;					}					ppxlcPredMBU += 2*BLOCK_SIZE;					ppxlcPredMBV += 2*BLOCK_SIZE;					ppxlcPrevU = ppxlcPrevUBot; 					ppxlcPrevV = ppxlcPrevVBot; 				}			}			else { // bXSubPxl && bYSubPxl				iRound++;				for (iy = 0; iy < BLOCK_SIZE; iy+=2) {					ppxlcPrevUBot = ppxlcPrevU + iFieldStep; //UPln -> pixels (xInt,yInt+1);					ppxlcPrevVBot = ppxlcPrevV + iFieldStep; //VPln -> pixels (xInt,yInt+1);					for (ix = 0; ix < BLOCK_SIZE; ix++) {						ppxlcPredMBU [ix] = (ppxlcPrevU [ix + 1] + ppxlcPrevU [ix] + 							ppxlcPrevUBot [ix + 1] + ppxlcPrevUBot [ix] + iRound) >> 2;						ppxlcPredMBV [ix] = (ppxlcPrevV [ix + 1] + ppxlcPrevV [ix] + 							ppxlcPrevVBot [ix + 1] + ppxlcPrevVBot [ix] + iRound) >> 2;					}					ppxlcPredMBU += 2*BLOCK_SIZE;					ppxlcPredMBV += 2*BLOCK_SIZE;					ppxlcPrevU = ppxlcPrevUBot; 					ppxlcPrevV = ppxlcPrevVBot; 				}			}		}	}	else if (nBldOpt == USE_MAE)#endif	{		// Store the chroma MV here		if ((m_vopmd.vopPredType == PVOP) && 			(g_MAEWrapper->Get_MAEMB_mbmode ("CVideoObject::motionCompFieldUV", __LINE__, __FILE__) != MBM_BIDIRECTIONAL))		{			// U & V Motion Vectors are already in Half-Pel			// units. So, lets just pass it down			// ********************************************			if (nUVMVConfigSelect == MAEMB_CONFIG_MV_UV) {				g_MAEWrapper->Set_MAEMB_mv_uv ((maeXRefUV << 16) | (maeYRefUV & 0x0000FFFF),					0, "CVideoObject::motionCompFieldUV", __LINE__, __FILE__);			}			else if (nUVMVConfigSelect == MAEMB_CONFIG_MV_UV1) {				g_MAEWrapper->Set_MAEMB_mv_uv1 ((maeXRefUV << 16) | (maeYRefUV & 0x0000FFFF),					0, "CVideoObject::motionCompFieldUV", __LINE__, __FILE__);			}			else {				// MAEMB_CONFIG_MV_NONE			}		}	}}// Called only in USE_MAE & Interalced modeVoid CVideoObject::Get_PVOP_YILMVs (	PixelC* ppxlcPredMB,	const PixelC* ppxlcRefLeftTop,	const CMotionVector* pmv, const CMBMode* pmbmd, 	Int imbX, Int imbY,	CoordI x, CoordI y,	Bool bSkipNonOBMC,	Bool bAlphaMB,	CRct *prctMVLimit) {	int MVX, MVY;	const CMotionVector* pmv16x8 = pmv+5;	if (bSkipNonOBMC)		return;	// Initialize some basic stuff	g_MAEWrapper->Set_MAEMB_mbmode(MBM_FORWARD,"CVideoObject::Get_PVOP_YILMVs",		__LINE__, __FILE__);	//	4 forward MVs only	g_MAEWrapper->Set_MAEMB_mbtype(MBT_16x8,"CVideoObject::Get_PVOP_YILMVs", 		__LINE__, __FILE__);	// ForwardTop Stuff	if(pmbmd->m_bForwardTop) 	{		pmv16x8++;		// Get the half-pel values		MVX = TRUEMVHALFPEL_X(pmv16x8);		MVY = TRUEMVHALFPEL_Y(pmv16x8);		// Use hpel		g_MAEWrapper->Set_MAEMB_mv ((MVX << 16) | ((MVY >> 1) & 0x0000FFFF),			0, "CVideoObject::Get_PVOP_YILMVs", __LINE__, __FILE__);		g_MAEWrapper->Set_MAEMB_mv ((MVX << 16) | ((MVY >> 1) & 0x0000FFFF),			1, "CVideoObject::Get_PVOP_YILMVs", __LINE__, __FILE__);		pmv16x8++;	}	// BackwardTop Stuff	else 	{		// Get the half-pel values		MVX = TRUEMVHALFPEL_X(pmv16x8);		MVY = TRUEMVHALFPEL_Y(pmv16x8);		// Use hpel		g_MAEWrapper->Set_MAEMB_mv ((MVX << 16) | ((MVY >> 1) & 0x0000FFFF),			0, "CVideoObject::Get_PVOP_YILMVs", __LINE__, __FILE__);		g_MAEWrapper->Set_MAEMB_mv ((MVX << 16) | ((MVY >> 1) & 0x0000FFFF),			1, "CVideoObject::Get_PVOP_YILMVs", __LINE__, __FILE__);		pmv16x8++;		pmv16x8++;	}	// ForwardBottom Stuff	if (pmbmd->m_bForwardBottom) 	{		pmv16x8++;		// Get the half-pel values		MVX = TRUEMVHALFPEL_X(pmv16x8);		MVY = TRUEMVHALFPEL_Y(pmv16x8);		// Use hpel		g_MAEWrapper->Set_MAEMB_mv ((MVX << 16) | ((MVY >> 1) & 0x0000FFFF),			2, "CVideoObject::Get_PVOP_YILMVs", __LINE__, __FILE__);		g_MAEWrapper->Set_MAEMB_mv ((MVX << 16) | ((MVY >> 1) & 0x0000FFFF),			3, "CVideoObject::Get_PVOP_YILMVs", __LINE__, __FILE__);	}	// BackwardBottom Stuff	else 	{		// Get the half-pel values		MVX = TRUEMVHALFPEL_X(pmv16x8);		MVY = TRUEMVHALFPEL_Y(pmv16x8);		// Use hpel		g_MAEWrapper->Set_MAEMB_mv ((MVX << 16) | ((MVY >> 1) & 0x0000FFFF),			2, "CVideoObject::Get_PVOP_YILMVs", __LINE__, __FILE__);		g_MAEWrapper->Set_MAEMB_mv ((MVX << 16) | ((MVY >> 1) & 0x0000FFFF),			3, "CVideoObject::Get_PVOP_YILMVs", __LINE__, __FILE__);	}	// Set the ft & fb fields here	g_MAEWrapper->Set_MAEMB_ft ((pmbmd->m_bForwardTop ? 0 : 1),	  "CVideoObjectDecoder::Get_PVOP_YILMVs", __LINE__, __FILE__);	g_MAEWrapper->Set_MAEMB_fb ((pmbmd->m_bForwardBottom ? 0 : 1),	  "CVideoObjectDecoder::Get_PVOP_YILMVs", __LINE__, __FILE__);	// Now that we have all MVs, lets check if any of these go Out-Of-Frame 	// If so, since MAE constructs the OOF differently	// it will fail to get the correct Reference-Blocks & hence fail 	// MotionComp. For such MBs, we will NOT invoke MAE at all.	if(g_MAEWrapper->CheckForOOFYFields(imbY))	{		nFlipToRef = FLIP_TO_REF;		nBldOpt = USE_REF;	}}Void CVideoObject::Get_PVOP_UVILMVs (	PixelC* ppxlcPredMBU, PixelC* ppxlcPredMBV,								 const CVOPU8YUVBA* pvopcRef,								 Int imbX, Int imbY, 								 CoordI x, CoordI y, 								 CoordI xRefUV, CoordI yRefUV,Int iRefFieldSelect,								 CRct* prctMVLimit, // added by Y.Suzuki for the extended bounding box support								 int nUVMVConfigSelect, int nDumpRef){// added by Y.Suzuki for the extended bounding box support	CoordI iTmpX = x + xRefUV;	CoordI iTmpY = y + yRefUV;	LIMITMVRANGETOEXTENDEDBBFULLPEL(&iTmpX, &iTmpY, prctMVLimit, MB_SIZE);	xRefUV = iTmpX - x;	yRefUV = iTmpY - y;// ~extended bounding box support	// delete by Hyundai for Microsoft and MoMusys alignment	//Int iPxLoc = ((((y + yRefUV) >> 1) & ~1) + EXPANDUV_REF_FRAME) * m_iFrameWidthUV + ((x + xRefUV) >> 1) + EXPANDUV_REF_FRAME;	// insert by Hyundai for Microsoft and MoMusys alignment	Int iPxLoc = (y/2 + ((yRefUV >> 1) & ~1) + EXPANDUV_REF_FRAME) * m_iFrameWidthUV + ((x + xRefUV) >> 1) + EXPANDUV_REF_FRAME;	const PixelC* ppxlcPrevU = pvopcRef->pixelsU () + iPxLoc + iRefFieldSelect*m_iFrameWidthUV;	const PixelC* ppxlcPrevV = pvopcRef->pixelsV () + iPxLoc + iRefFieldSelect*m_iFrameWidthUV;	Int iRound = 1 - m_vopmd.iRoundingControl;	Int iFieldStep = 2 * m_iFrameWidthUV;	// Store the chroma MV here	if ((m_vopmd.vopPredType == PVOP) && 		(g_MAEWrapper->Get_MAEMB_mbmode ("CVideoObject::motionCompFieldUV", __LINE__, __FILE__) != MBM_BIDIRECTIONAL))	{		// U & V Motion Vectors are already in Half-Pel		// units. So, lets just pass it down		// ********************************************		if (nUVMVConfigSelect == MAEMB_CONFIG_MV_UV) 		{			g_MAEWrapper->Set_MAEMB_mv_uv ((xRefUV << 16) | ((yRefUV >> 1)  & 0x0000FFFF),				0, "CVideoObject::motionCompFieldUV", __LINE__, __FILE__);		}		else if (nUVMVConfigSelect == MAEMB_CONFIG_MV_UV1) {			g_MAEWrapper->Set_MAEMB_mv_uv1 ((xRefUV << 16) | ((yRefUV >> 1)  & 0x0000FFFF),				0, "CVideoObject::motionCompFieldUV", __LINE__, __FILE__);		}		else 		{			// MAEMB_CONFIG_MV_NONE		}	}	// Now that we have all MVs, lets check if any of these go Out-Of-Frame 	// If so, since MAE constructs the OOF differently	// it will fail to get the correct Reference-Blocks & hence fail 	// MotionComp. For such MBs, we will NOT invoke MAE at all.	if (nUVMVConfigSelect == MAEMB_CONFIG_MV_UV1) // Call the checker after we fill in both uv & uv1 array elements	{		if(g_MAEWrapper->CheckForOOFUVFields(imbY))		{			nFlipToRef = FLIP_TO_REF;			nBldOpt = USE_REF;		}	}}#endif

⌨️ 快捷键说明

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