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

📄 mcenc.cpp

📁 网络MPEG4IP流媒体开发源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	pmbmdLeftMb = NULL;	bIntraT = FALSE;	bIntraR = FALSE;	bIntraL = FALSE;	pmvCurrMb = pmv;	// assign values to bIntra[TRL] and pmv{TRL}Mb, when they are valid. 	if (!bTopBndry) {		pmbmdTopMb = pmbmd - m_iNumMBX; 		bIntraT = (pmbmdTopMb->m_dctMd == INTRA || pmbmdTopMb->m_dctMd == INTRAQ);		pmvTopMb = pmv - m_iNumOfTotalMVPerRow;	}	if (!bLeftBndry) {		pmbmdLeftMb = pmbmd - 1;		bIntraL = (pmbmdLeftMb->m_dctMd == INTRA || pmbmdLeftMb->m_dctMd == INTRAQ);		pmvLeftMb = pmv - PVOP_MV_PER_REF_PER_MB;	}	if (!bRightBndry) {		pmbmdRightMb = pmbmd + 1;		bIntraR = (pmbmdRightMb->m_dctMd == INTRA || pmbmdRightMb->m_dctMd == INTRAQ);		pmvRightMb = pmv + PVOP_MV_PER_REF_PER_MB;	}	UInt i;	// assign the neighboring blk's MVs to pmv[TBRLC] 	for (i = 1; i < 5; i++) {		if (pmbmd->m_rgTranspStatus [i] == ALL)			continue;		pmvC = pmvCurrMb + i;		switch (i) {			case 1:				if (pmbmd->m_rgTranspStatus [3] == ALL)					pmvB = pmvCurrMb + 1;				else					pmvB = pmvCurrMb + 3;								if (pmbmd->m_rgTranspStatus [2] == ALL)					pmvR = pmvCurrMb + 1; 					else					pmvR = pmvCurrMb + 2; 					if (bTopBndry || bIntraT || pmbmdTopMb->m_rgTranspStatus [3] == ALL)					pmvT = pmvCurrMb + 1;				else					pmvT = pmvTopMb + 3;				if (bLeftBndry || bIntraL || pmbmdLeftMb->m_rgTranspStatus [2] == ALL)					pmvL = pmvCurrMb + 1;				else					pmvL = pmvLeftMb + 2;				break;			case 2:				if (pmbmd->m_rgTranspStatus [4] == ALL)					pmvB = pmvCurrMb + 2;				else					pmvB = pmvCurrMb + 4;				if (pmbmd->m_rgTranspStatus [1] == ALL)					pmvL = pmvCurrMb + 2;				else					pmvL = pmvCurrMb + 1;				if (bTopBndry || bIntraT || pmbmdTopMb->m_rgTranspStatus [4] == ALL)					pmvT = pmvCurrMb + 2;				else					pmvT = pmvTopMb + 4;      					if (bRightBndry || bIntraR || pmbmdRightMb->m_rgTranspStatus [1] == ALL)					pmvR = pmvCurrMb + 2;				else					pmvR = pmvRightMb + 1;				break;			case 3:				if (pmbmd->m_rgTranspStatus [1] == ALL)					pmvT = pmvCurrMb + 3;  				else					pmvT = pmvCurrMb + 1;								pmvB = pmvCurrMb + 3; // use the current mv				if (pmbmd->m_rgTranspStatus [4] == ALL)					pmvR = pmvCurrMb + 3;				else					pmvR = pmvCurrMb + 4;				if (bLeftBndry || bIntraL || pmbmdLeftMb->m_rgTranspStatus [4] == ALL)					pmvL = pmvCurrMb + 3;				else					pmvL = pmvLeftMb + 4;				break;			case 4:				if (pmbmd->m_rgTranspStatus [2] == ALL)					pmvT = pmvCurrMb + 4;    					else					pmvT = pmvCurrMb + 2;								pmvB = pmvCurrMb + 4;				if (pmbmd->m_rgTranspStatus [3] == ALL)					pmvL = pmvCurrMb + 4;  					else					pmvL = pmvCurrMb + 3;								if (bRightBndry || bIntraR || pmbmdRightMb->m_rgTranspStatus [3] == ALL)					pmvR = pmvCurrMb + 4;				else					pmvR = pmvRightMb + 3;				break;			default:				assert (FALSE);			}		// Compute the top left corner's x,y coordinates of current block.		UInt dxc = (((i - 1) & 1) << 3); 		UInt dyc = (((i - 1) & 2) << 2);		UInt nxcY = (x + dxc) << 1; 		UInt nycY = (y + dyc) << 1; 		// Compute the corresponding positions on Ref frm, using 5 MVs.		CoordI xRefC = nxcY + pmvC->m_vctTrueHalfPel.x, yRefC = nycY + pmvC->m_vctTrueHalfPel.y;		CoordI xRefT = nxcY + pmvT->m_vctTrueHalfPel.x, yRefT = nycY + pmvT->m_vctTrueHalfPel.y;		CoordI xRefB = nxcY + pmvB->m_vctTrueHalfPel.x, yRefB = nycY + pmvB->m_vctTrueHalfPel.y;		CoordI xRefR = nxcY + pmvR->m_vctTrueHalfPel.x, yRefR = nycY + pmvR->m_vctTrueHalfPel.y;		CoordI xRefL = nxcY + pmvL->m_vctTrueHalfPel.x, yRefL = nycY + pmvL->m_vctTrueHalfPel.y;//		UInt nxcY = x + dxc; //  	UInt nycY = y + dyc; //		// Compute the corresponding positions on Ref frm, using 5 MVs.//		CoordI xRefC = ((nxcY + pmvC->iMVX) << 1) + pmvC->iHalfX, yRefC = ((nycY + pmvC->iMVY) << 1) + pmvC->iHalfY;//		CoordI xRefT = ((nxcY + pmvT->iMVX) << 1) + pmvT->iHalfX, yRefT = ((nycY + pmvT->iMVY) << 1) + pmvT->iHalfY;//		CoordI xRefB = ((nxcY + pmvB->iMVX) << 1) + pmvB->iHalfX, yRefB = ((nycY + pmvB->iMVY) << 1) + pmvB->iHalfY;//		CoordI xRefR = ((nxcY + pmvR->iMVX) << 1) + pmvR->iHalfX, yRefR = ((nycY + pmvR->iMVY) << 1) + pmvR->iHalfY;//		CoordI xRefL = ((nxcY + pmvL->iMVX) << 1) + pmvL->iHalfX, yRefL = ((nycY + pmvL->iMVY) << 1) + pmvL->iHalfY;		limitMVRangeToExtendedBBHalfPel (xRefC,yRefC,prctMVLimit,BLOCK_SIZE);		limitMVRangeToExtendedBBHalfPel (xRefT,yRefT,prctMVLimit,BLOCK_SIZE);		limitMVRangeToExtendedBBHalfPel (xRefB,yRefB,prctMVLimit,BLOCK_SIZE);		limitMVRangeToExtendedBBHalfPel (xRefR,yRefR,prctMVLimit,BLOCK_SIZE);		limitMVRangeToExtendedBBHalfPel (xRefL,yRefL,prctMVLimit,BLOCK_SIZE);		//PixelC* ppxlcPredY = ppxlcYMB + dxc + dyc * m_iWidthY;  // Starting of Pred. Frame		PixelC* ppxlcPred = m_ppxlcPredMBY + dxc + dyc * MB_SIZE;  // Starting of Pred. Frame		// 5 starting pos. in Zoomed Ref. Frames		// m_ppxlcRefZoom0Y +  (xRefC, yRefC);		const PixelC* ppxlcPrevZoomYC;		const PixelC* ppxlcPrevZoomYT;		const PixelC* ppxlcPrevZoomYB;		const PixelC* ppxlcPrevZoomYR;		const PixelC* ppxlcPrevZoomYL;		ppxlcPrevZoomYC = m_puciRefQZoom0->pixels () + 			(yRefC + EXPANDY_REF_FRAMEx2) * m_iFrameWidthZoomY +			xRefC + EXPANDY_REF_FRAMEx2;		ppxlcPrevZoomYT = m_puciRefQZoom0->pixels () + 			(yRefT + EXPANDY_REF_FRAMEx2) * m_iFrameWidthZoomY +			xRefT + EXPANDY_REF_FRAMEx2;		ppxlcPrevZoomYB = m_puciRefQZoom0->pixels () + 			(yRefB + EXPANDY_REF_FRAMEx2) * m_iFrameWidthZoomY +			xRefB + EXPANDY_REF_FRAMEx2;		ppxlcPrevZoomYR = m_puciRefQZoom0->pixels () + 			(yRefR + EXPANDY_REF_FRAMEx2) * m_iFrameWidthZoomY +			xRefR + EXPANDY_REF_FRAMEx2;		ppxlcPrevZoomYL = m_puciRefQZoom0->pixels () + 			(yRefL + EXPANDY_REF_FRAMEx2) * m_iFrameWidthZoomY +			xRefL + EXPANDY_REF_FRAMEx2;		UInt *pWghtC, *pWghtT, *pWghtB, *pWghtR, *pWghtL;		pWghtC = (UInt*) gWghtC;		pWghtT = (UInt*) gWghtT;		pWghtB = (UInt*) gWghtB;		pWghtR = (UInt*) gWghtR;		pWghtL = (UInt*) gWghtL;		for (UInt iy = 0; iy < BLOCK_SIZE; iy++) {			for (UInt ix = 0; ix < BLOCK_SIZE; ix++) {				*ppxlcPred++ = (					*ppxlcPrevZoomYC * *pWghtC++ + 					*ppxlcPrevZoomYT * *pWghtT++ + 					*ppxlcPrevZoomYB * *pWghtB++ + 					*ppxlcPrevZoomYR * *pWghtR++ + 					*ppxlcPrevZoomYL * *pWghtL++ + 4				) >> 3;				ppxlcPrevZoomYC += 2;				ppxlcPrevZoomYT += 2;				ppxlcPrevZoomYB += 2;				ppxlcPrevZoomYR += 2;				ppxlcPrevZoomYL += 2;			}			ppxlcPrevZoomYC += m_iFrameWidthZoomYx2Minus2Blk;			ppxlcPrevZoomYT += m_iFrameWidthZoomYx2Minus2Blk;			ppxlcPrevZoomYB += m_iFrameWidthZoomYx2Minus2Blk;			ppxlcPrevZoomYR += m_iFrameWidthZoomYx2Minus2Blk;			ppxlcPrevZoomYL += m_iFrameWidthZoomYx2Minus2Blk;			ppxlcPred += BLOCK_SIZE;		}	}}// for B-VOPVoid CVideoObjectEncoder::averagePredAndComputeErrorY(){	Int ic;	for (ic = 0; ic < MB_SQUARE_SIZE; ic++) {		m_ppxlcPredMBY [ic] = (m_ppxlcPredMBY [ic] + m_ppxlcPredMBBackY [ic] + 1) >> 1;		m_ppxliErrorMBY [ic] = m_ppxlcCurrMBY [ic] - m_ppxlcPredMBY [ic];	}}//INTERLACE//new changesVoid CVideoObjectEncoder::averagePredAndComputeErrorY_WithShape(){	Int ic;	for (ic = 0; ic < MB_SQUARE_SIZE; ic++) {		if (m_ppxlcCurrMBBY [ic] == transpValue)			m_ppxliErrorMBY [ic] = 0;		else {		m_ppxlcPredMBY [ic] = (m_ppxlcPredMBY [ic] + m_ppxlcPredMBBackY [ic] + 1) >> 1;		m_ppxliErrorMBY [ic] = m_ppxlcCurrMBY [ic] - m_ppxlcPredMBY [ic];		}	}}// new changes//INTERLACEVoid CVideoObjectEncoder::motionCompAndDiff_BVOP_MB (	const CMotionVector* pmvForward, const CMotionVector* pmvBackward, 	 CMBMode* pmbmd, 	CoordI x, CoordI y,	CRct *prctMVLimitForward,CRct *prctMVLimitBackward){    if (m_vopmd.bInterlace) {           // Should work for both progressive and interlaced, but keep                                        // original code for now due to differences in direct mode.   Bob Eifrig	    switch (pmbmd->m_mbType) {	    case FORWARD:		    motionCompOneBVOPReference(m_pvopcPredMB, FORWARD,  x, y, pmbmd, pmvForward, prctMVLimitForward);		    computeTextureError();		    break;	    case BACKWARD:		    motionCompOneBVOPReference(m_pvopcPredMB, BACKWARD, x, y, pmbmd, pmvBackward, prctMVLimitBackward);		    computeTextureError();		    break;	    case DIRECT:		    motionCompDirectMode(x, y, pmbmd,                &m_rgmvRef[(PVOP_MV_PER_REF_PER_MB*(x + m_iNumMBX * y)) / MB_SIZE],                prctMVLimitForward, prctMVLimitBackward,0);  // new change 02-19-99		    averagePredAndComputeErrorY();		    averagePredAndComputeErrorUV();		    break;	    case INTERPOLATE:		    motionCompOneBVOPReference(m_pvopcPredMB,     FORWARD,  x, y, pmbmd, pmvForward, prctMVLimitForward);		    motionCompOneBVOPReference(m_pvopcPredMBBack, BACKWARD, x, y, pmbmd, pmvBackward, prctMVLimitBackward);		    averagePredAndComputeErrorY();		    averagePredAndComputeErrorUV();		    break;	    }        return;    }	if (pmbmd->m_mbType == DIRECT || pmbmd->m_mbType == INTERPOLATE) { // Y is done when doing motion estimation		motionCompInterpAndError (pmvForward, pmvBackward, x, y,prctMVLimitForward,prctMVLimitBackward);		CoordI xRefUVForward, yRefUVForward;		mvLookupUVWithShape (pmbmd, pmvForward, xRefUVForward, yRefUVForward);		motionCompUV (m_ppxlcPredMBU, m_ppxlcPredMBV, m_pvopcRefQ0, x, y, xRefUVForward, yRefUVForward, 0, prctMVLimitForward);				CoordI xRefUVBackward, yRefUVBackward;		mvLookupUVWithShape (pmbmd, pmvBackward, xRefUVBackward, yRefUVBackward);		motionCompUV (m_ppxlcPredMBBackU, m_ppxlcPredMBBackV, m_pvopcRefQ1, x, y, xRefUVBackward, yRefUVBackward, 0, prctMVLimitBackward);		averagePredAndComputeErrorUV ();	}	else { 		const CMotionVector* pmv;		const PixelC* ppxlcRef; // point to left-top of the reference VOP		const PixelC* ppxlcRefZoom; // point to left-top of the reference VOP		const CVOPU8YUVBA* pvopcRef;		CRct *prctMVLimit;		if (pmbmd->m_mbType == FORWARD) { // Y is done when doing motion estimation			pmv = pmvForward;			pvopcRef = m_pvopcRefQ0;			ppxlcRef = m_pvopcRefQ0->pixelsY (); // point to left-top of the reference VOP			ppxlcRefZoom = m_puciRefQZoom0->pixels (); // point to left-top of the reference VOP			prctMVLimit=prctMVLimitForward;		}		else {			pmv = pmvBackward;			pvopcRef = m_pvopcRefQ1;			ppxlcRef = m_pvopcRefQ1->pixelsY (); // point to left-top of the reference VOP			ppxlcRefZoom = m_puciRefQZoom1->pixels (); // point to left-top of the reference VOP			prctMVLimit=prctMVLimitBackward;		}		CoordI xRefUV, yRefUV;		mvLookupUVWithShape (pmbmd, pmv, xRefUV, yRefUV);		motionCompEncY (ppxlcRef, ppxlcRefZoom, m_ppxlcPredMBY, MB_SIZE, pmv, x, y,prctMVLimit);		motionCompUV (m_ppxlcPredMBU, m_ppxlcPredMBV, pvopcRef, x, y, xRefUV, yRefUV, 0, prctMVLimit);		computeTextureError ();	}}Void CVideoObjectEncoder::motionCompAndDiff_BVOP_MB_WithShape (	const CMotionVector* pmvForward, const CMotionVector* pmvBackward, 	 CMBMode* pmbmd, 	CoordI x, CoordI y,	CRct *prctMVLimitForward,	CRct *prctMVLimitBackward){// INTERLACED// new changes    if (m_vopmd.bInterlace&&pmbmd->m_bFieldMV) {           // Should work for both progressive and interlaced, but keep                                        // original code for now due to differences in direct mode.   Bob Eifrig	    switch (pmbmd->m_mbType) {	    case FORWARD:

⌨️ 快捷键说明

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