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

📄 vopmbenc.cpp

📁 网络MPEG4IP流媒体开发源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
			if (m_vopmd.bInterlace) initMergedMode (pmbmd);			// End of Hyundai(1998-5-9)*/			if(m_volmd.bShapeOnly==FALSE)			{				pmbmd->m_stepSizeDelayed = iQPPrev;				if (pmbmd -> m_rgTranspStatus [0] != ALL) {					// need to copy binary shape too since curr buff is future shape					copyToCurrBuffWithShape(ppxlcOrigMBY, ppxlcOrigMBU, ppxlcOrigMBV,						ppxlcRefMBBY, ppxlcOrigMBA, m_iFrameWidthY, m_iFrameWidthUV);					downSampleBY (m_ppxlcCurrMBBY, m_ppxlcCurrMBBUV);					encodePVOPMBTextureWithShape(ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV,						ppxlcRefMBA, pmbmd, pmv, iMBX, iMBY, x, y, iQPPrev, iQPPrevAlpha,						bRestartDelayedQP);					// Added for field based MC padding by Hyundai(1998-5-9)					if (!m_vopmd.bInterlace) { 						if (pmbmd -> m_rgTranspStatus [0] == PARTIAL)							mcPadCurrMB (ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, ppxlcRefMBA);						padNeighborTranspMBs (							iMBX, iMBY,							pmbmd,							ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, ppxlcRefMBA						);					}					// End of Hyundai(1998-5-9)				}				else {					// Added for field based MC padding by Hyundai(1998-5-9)					if (!m_vopmd.bInterlace) { 						padCurrAndTopTranspMBFromNeighbor (							iMBX, iMBY,							pmbmd,							ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, ppxlcRefMBA						);					}					// End of Hyundai(1998-5-9)				}			}			pmbmd++;			pmv += PVOP_MV_PER_REF_PER_MB;			pmvBY++;			ppxlcRefMBBY += MB_SIZE;			ppxlcRefMBA += MB_SIZE;			ppxlcOrigMBBY += MB_SIZE;			ppxlcOrigMBA += MB_SIZE;#ifdef __TRACE_AND_STATS_			m_statsVOP += m_statsMB;#endif // __TRACE_AND_STATS_			ppxlcRefMBY += MB_SIZE;			ppxlcRefMBU += BLOCK_SIZE;			ppxlcRefMBV += BLOCK_SIZE;			ppxlcOrigMBY += MB_SIZE;			ppxlcOrigMBU += BLOCK_SIZE;			ppxlcOrigMBV += BLOCK_SIZE;		}		MacroBlockMemory** ppmbmTemp = m_rgpmbmAbove;		m_rgpmbmAbove = m_rgpmbmCurr;		m_rgpmbmCurr  = ppmbmTemp;		ppxlcRefY += m_iFrameWidthYxMBSize;		ppxlcRefU += m_iFrameWidthUVxBlkSize;		ppxlcRefV += m_iFrameWidthUVxBlkSize;		ppxlcRefBY += m_iFrameWidthYxMBSize;		ppxlcRefA += m_iFrameWidthYxMBSize;				ppxlcOrigY += m_iFrameWidthYxMBSize;		ppxlcOrigBY += m_iFrameWidthYxMBSize;		ppxlcOrigA += m_iFrameWidthYxMBSize;		ppxlcOrigU += m_iFrameWidthUVxBlkSize;		ppxlcOrigV += m_iFrameWidthUVxBlkSize;	}	// Added for field based MC padding by Hyundai(1998-5-9)        if (m_vopmd.bInterlace && m_volmd.bShapeOnly == FALSE)                fieldBasedMCPadding (field_pmbmd, m_pvopcRefQ1);	// End of Hyundai(1998-5-9)	// restore normal output stream	m_pbitstrmShapeMBOut = m_pbitstrmOut;}Void CVideoObjectEncoder::encodeNSForBVOP (){	motionEstBVOP ();		CoordI y = 0; 	CMBMode* pmbmd = m_rgmbmd;	CMotionVector* pmv = m_rgmv;	CMotionVector* pmvBackward = m_rgmvBackward;	const CMBMode* pmbmdRef = m_rgmbmdRef;			//MB mode in ref frame for direct mode	const CMotionVector* pmvRef = m_rgmvRef;		//MV in ref frame for direct mode	PixelC* ppxlcCurrQY = (PixelC*) m_pvopcCurrQ->pixelsY () + m_iStartInRefToCurrRctY;	PixelC* ppxlcCurrQU = (PixelC*) m_pvopcCurrQ->pixelsU () + m_iStartInRefToCurrRctUV;	PixelC* ppxlcCurrQV = (PixelC*) m_pvopcCurrQ->pixelsV () + m_iStartInRefToCurrRctUV;		PixelC* ppxlcOrigY = (PixelC*) m_pvopcOrig->pixelsBoundY ();	PixelC* ppxlcOrigU = (PixelC*) m_pvopcOrig->pixelsBoundU ();	PixelC* ppxlcOrigV = (PixelC*) m_pvopcOrig->pixelsBoundV ();	// MB rate control	//Int iIndexofQ = 0;	//Int rgiQ [4] = {-2, 0, 0, 2};	// -----		Int iQPPrev = m_vopmd.intStepB;	Int iMBX, iMBY, iMB = 0;	Int iMaxQP = (1<<m_volmd.uiQuantPrecision)-1; // NBIT	for (iMBY = 0; iMBY < m_iNumMBY; iMBY++, y += MB_SIZE) {		PixelC* ppxlcCurrQMBY = ppxlcCurrQY;		PixelC* ppxlcCurrQMBU = ppxlcCurrQU;		PixelC* ppxlcCurrQMBV = ppxlcCurrQV;		PixelC* ppxlcOrigMBY = ppxlcOrigY;		PixelC* ppxlcOrigMBU = ppxlcOrigU;		PixelC* ppxlcOrigMBV = ppxlcOrigV;		CoordI x = 0;		m_vctForwardMvPredBVOP[0].x  = m_vctForwardMvPredBVOP[0].y  = 0;		m_vctBackwardMvPredBVOP[0].x = m_vctBackwardMvPredBVOP[0].y = 0;		m_vctForwardMvPredBVOP[1].x  = m_vctForwardMvPredBVOP[1].y  = 0;		m_vctBackwardMvPredBVOP[1].x = m_vctBackwardMvPredBVOP[1].y = 0;		for (iMBX = 0; iMBX < m_iNumMBX; iMBX++, x += MB_SIZE, iMB++)	{#ifdef __TRACE_AND_STATS_			m_pbitstrmOut->trace (CSite (iMBX, iMBY), "MB_X_Y");			// shape quantization part			m_statsMB.reset ();#endif // __TRACE_AND_STATS_			pmbmd->m_intStepDelta = 0;			// MB rate control			if (m_uiRateControl>=RC_TM5) {				int k = m_tm5rc.tm5rc_calc_mquant(iMB, m_statsVOP.total());				// special case for BVOP copied from MoMuSys				if (k > iQPPrev) {					if (iQPPrev+2 <= iMaxQP) pmbmd->m_intStepDelta = 2;				} else if (k < iQPPrev) {					if (iQPPrev-2 > 0) pmbmd->m_intStepDelta = -2;				}			}#ifdef _MBQP_CHANGE_			if (!pmbmd->m_bColocatedMBSkip && pmbmd->m_mbType != DIRECT) {				iIndexofQ = (iIndexofQ + 1) % 4;				pmbmd->m_dctMd = INTERQ;				pmbmd->m_intStepDelta = rgiQ [iIndexofQ];				Int iQuantMax = (1<<m_volmd.uiQuantPrecision) - 1;				if ((iQPPrev + pmbmd->m_intStepDelta) > iQuantMax)					pmbmd->m_intStepDelta = 0;				if ((iQPPrev + pmbmd->m_intStepDelta) <= 0)					pmbmd->m_intStepDelta = 0;			}			// -----#endif //_MBQP_CHANGE_			pmbmd->m_stepSize = iQPPrev + pmbmd->m_intStepDelta;/* NBIT: change 31 to iMaxQP			assert (pmbmd->m_stepSize <= 31 && pmbmd->m_stepSize > 0);*/			assert (pmbmd->m_stepSize <= iMaxQP && pmbmd->m_stepSize > 0);			if ( m_volmd.bVPBitTh >= 0) {				Int iCounter = m_pbitstrmOut -> getCounter();				if( iCounter - m_iVPCounter > m_volmd.bVPBitTh ) {					// reset DQ to use QP in VP header					pmbmd->m_intStepDelta = 0;					if (pmbmd ->m_dctMd == INTERQ)						pmbmd->m_dctMd = INTER;					iQPPrev = pmbmd->m_stepSize;					codeVideoPacketHeader (iMBX, iMBY, pmbmd->m_stepSize);	// video packet header					m_iVPCounter = iCounter;					//reset MV predictor					m_vctForwardMvPredBVOP[0].x  = m_vctForwardMvPredBVOP[0].y  = 0;					m_vctBackwardMvPredBVOP[0].x = m_vctBackwardMvPredBVOP[0].y = 0;					m_vctForwardMvPredBVOP[1].x  = m_vctForwardMvPredBVOP[1].y  = 0;					m_vctBackwardMvPredBVOP[1].x = m_vctBackwardMvPredBVOP[1].y = 0;				}			}			if (pmbmd->m_bColocatedMBSkip &&			(m_volmd.volType == BASE_LAYER || (m_volmd.volType == ENHN_LAYER && m_vopmd.iRefSelectCode == 3 && m_volmd.iEnhnType == 0)))			{ // don't need to send any bit for this mode				copyFromRefToCurrQ (					m_pvopcRefQ0,					x, y, 					ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, NULL				);			}			else {				copyToCurrBuff (ppxlcOrigMBY, ppxlcOrigMBU, ppxlcOrigMBV, m_iFrameWidthY, m_iFrameWidthUV); 				encodeBVOPMB (					ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV,					pmbmd, pmv, pmvBackward,					pmbmdRef, pmvRef,					iMBX, iMBY,					x, y				);				if (pmbmd->getCodedBlockPattern (U_BLOCK) ||					pmbmd->getCodedBlockPattern (V_BLOCK) ||					pmbmd->getCodedBlockPattern (Y_BLOCK1) ||					pmbmd->getCodedBlockPattern (Y_BLOCK2) ||					pmbmd->getCodedBlockPattern (Y_BLOCK3) ||					pmbmd->getCodedBlockPattern (Y_BLOCK4))					iQPPrev = pmbmd->m_stepSize;			}			pmbmd++;			pmv         += BVOP_MV_PER_REF_PER_MB;			pmvBackward += BVOP_MV_PER_REF_PER_MB;			pmvRef      += PVOP_MV_PER_REF_PER_MB;			pmbmdRef++;			m_statsVOP += m_statsMB;			ppxlcCurrQMBY += MB_SIZE;			ppxlcCurrQMBU += BLOCK_SIZE;			ppxlcCurrQMBV += BLOCK_SIZE;			ppxlcOrigMBY += MB_SIZE;			ppxlcOrigMBU += BLOCK_SIZE;			ppxlcOrigMBV += BLOCK_SIZE;		}		ppxlcCurrQY += m_iFrameWidthYxMBSize;		ppxlcCurrQU += m_iFrameWidthUVxBlkSize;		ppxlcCurrQV += m_iFrameWidthUVxBlkSize;				ppxlcOrigY += m_iFrameWidthYxMBSize;		ppxlcOrigU += m_iFrameWidthUVxBlkSize;		ppxlcOrigV += m_iFrameWidthUVxBlkSize;	}}Void CVideoObjectEncoder::encodeNSForBVOP_WithShape (){	motionEstBVOP_WithShape ();	// decide prediction direction for shape	if(m_bCodedFutureRef==FALSE)		m_vopmd.fShapeBPredDir = B_FORWARD;	else	{		if(m_tFutureRef - m_t >= m_t - m_tPastRef)			m_vopmd.fShapeBPredDir = B_FORWARD;		else			m_vopmd.fShapeBPredDir = B_BACKWARD;	}	Int iQPPrev = m_vopmd.intStepB;	Int iQPPrevAlpha = m_vopmd.intStepBAlpha;	if (m_uiRateControl>=RC_TM5) iQPPrev = m_tm5rc.tm5rc_start_mb();	CoordI y = m_rctCurrVOPY.top; 	CMBMode*	   pmbmd = m_rgmbmd;	// Added for field based MC padding by Hyundai(1998-5-9)	CMBMode* field_pmbmd = m_rgmbmd;	// End of Hyundai(1998-5-9)	CMotionVector* pmv = m_rgmv;	CMotionVector* pmvBackward = m_rgmvBackward;	CMotionVector* pmvBY = m_rgmvBY;	PixelC* ppxlcCurrQY = (PixelC*) m_pvopcCurrQ->pixelsY () + m_iStartInRefToCurrRctY;	PixelC* ppxlcCurrQU = (PixelC*) m_pvopcCurrQ->pixelsU () + m_iStartInRefToCurrRctUV;	PixelC* ppxlcCurrQV = (PixelC*) m_pvopcCurrQ->pixelsV () + m_iStartInRefToCurrRctUV;	PixelC* ppxlcCurrQBY = (PixelC*) m_pvopcCurrQ->pixelsBY () + m_iStartInRefToCurrRctY;	PixelC *ppxlcCurrQA = NULL, * ppxlcOrigA = NULL;		PixelC* ppxlcOrigY = (PixelC*) m_pvopcOrig->pixelsBoundY ();	PixelC* ppxlcOrigU = (PixelC*) m_pvopcOrig->pixelsBoundU ();	PixelC* ppxlcOrigV = (PixelC*) m_pvopcOrig->pixelsBoundV ();	PixelC* ppxlcOrigBY = (PixelC*) m_pvopcOrig->pixelsBoundBY ();	if (m_volmd.fAUsage == EIGHT_BIT) {		ppxlcCurrQA = (PixelC*) m_pvopcCurrQ->pixelsA () + m_iStartInRefToCurrRctY;		ppxlcOrigA = (PixelC*) m_pvopcOrig->pixelsBoundA ();	}	Int iMBX, iMBY, iMB = 0;	const CMBMode* pmbmdRef;	const CMotionVector* pmvRef;	for (iMBY = 0; iMBY < m_iNumMBY; iMBY++, y += MB_SIZE) {		PixelC* ppxlcCurrQMBY = ppxlcCurrQY;		PixelC* ppxlcCurrQMBU = ppxlcCurrQU;		PixelC* ppxlcCurrQMBV = ppxlcCurrQV;		PixelC* ppxlcCurrQMBBY = ppxlcCurrQBY;		PixelC* ppxlcCurrQMBA = ppxlcCurrQA;		PixelC* ppxlcOrigMBY = ppxlcOrigY;		PixelC* ppxlcOrigMBU = ppxlcOrigU;		PixelC* ppxlcOrigMBV = ppxlcOrigV;		PixelC* ppxlcOrigMBBY = ppxlcOrigBY;		PixelC* ppxlcOrigMBA = ppxlcOrigA;		CoordI x = m_rctCurrVOPY.left;		m_vctForwardMvPredBVOP[0].x  = m_vctForwardMvPredBVOP[0].y  = 0;		m_vctBackwardMvPredBVOP[0].x = m_vctBackwardMvPredBVOP[0].y = 0;		m_vctForwardMvPredBVOP[1].x  = m_vctForwardMvPredBVOP[1].y  = 0;		m_vctBackwardMvPredBVOP[1].x = m_vctBackwardMvPredBVOP[1].y = 0;		Int iMaxQP = (1<<m_volmd.uiQuantPrecision)-1; // NBIT		for (iMBX = 0; iMBX < m_iNumMBX; iMBX++, x += MB_SIZE, iMB++)	{			pmbmd->m_intStepDelta = 0;	//sharp added this			pmbmd->m_bPadded=FALSE;			// shape quantization part			m_statsMB.reset ();// Modified for error resilience mode by Toshiba(1998-1-16)			pmbmd->m_stepSize = m_vopmd.intStepB;			// MB rate control  -- should this be here??????			if (m_uiRateControl>=RC_TM5) {				int k = m_tm5rc.tm5rc_calc_mquant(iMB, m_statsVOP.total());				// special case for BVOP copied from MoMuSys				if (k > iQPPrev) {					if (iQPPrev+2 <= iMaxQP) pmbmd->m_intStepDelta = 2;				} else if (k < iQPPrev) {					if (iQPPrev-2 > 0) pmbmd->m_intStepDelta = -2;				}			}			if ( m_volmd.bVPBitTh >= 0) {				Int iCounter = m_pbitstrmOut -> getCounter();				if( iCounter - m_iVPCounter > m_volmd.bVPBitTh ) {//					// reset DQ to use QP in VP header//					pmbmd->m_intStepDelta = 0;//					if (pmbmd ->m_dctMd == INTERQ)//						pmbmd->m_dctMd = INTER;//					iQPPrev = pmbmd->m_stepSize;					codeVideoPacketHeader (iMBX, iMBY, pmbmd->m_stepSize);	// video packet header					m_iVPCounter = iCounter;					//reset MV predictor					m_vctForwardMvPredBVOP[0].x  = m_vctForwardMvPredBVOP[0].y  = 0;					m_vctBackwardMvPredBVOP[0].x = m_vctBackwardMvPredBVOP[0].y = 0;					m_vctForwardMvPredBVOP[1].x  = m_vctForwardMvPredBVOP[1].y  = 0;					m_vctBackwardMvPredBVOP[1].x = m_vctBackwardMvPredBVOP[1].y = 0;				}			}// End Toshiba(1998-1-16)			findColocatedMB (iMBX, iMBY,  pmbmdRef, pmvRef);			ShapeMode shpmdColocatedMB;			if(m_vopmd.fShapeBPredDir==B_FORWARD)				shpmdColocatedMB = m_rgshpmd [min (max (0, iMBX), m_iRefShpNumMBX - 1) 					+ min (max (0, iMBY), m_iRefShpNumMBY - 1) * m_iRefShpNumMBX];			else				shpmdColocatedMB = m_rgmbmdRef [min (max (0, iMBX), m_iNumMBXRef - 1)					+ min (max (0, iMBY), m_iNumMBYRef - 1) * m_iNumMBXRef].m_shpmd;			if (pmbmd->m_bColocatedMBSkip &&			(m_volmd.volType == BASE_LAYER || (m_volmd.volType == ENHN_LAYER && m_vopmd.iRefSelectCode == 3 && m_volmd.iEnhnType == 0)))			{ // don't need to send any bit for this mode				copyToCurrBuffJustShape( ppxlcOrigMBBY, m_iFrameWidthY );				m_statsMB.nBitsShape += codeInterShape (					ppxlcCurrQMBBY,					m_vopmd.fShapeBPredDir==B_FORWARD ? m_pvopcRefQ0 : m_pvopcRefQ1,					pmbmd, shpmdColocatedMB,					NULL, pmvBY,					x, y, 					iMBX, iMBY				);				downSampleBY (m_ppxlcCurrMBBY, m_ppxlcCurrMBBUV);				decideTransparencyStatus (pmbmd, m_ppxlcCurrMBBY); // change pmbmd to inter if all transparent				/*BBM// Added for Boundary by Hyundai(1998-5-9)				if (m_vopmd.bInterlace) initMergedMode (pmbmd);				// End of Hyundai(1998-5-9)*/				// reset motion vectors to zero because of skip				memset (pmv, 0, BVOP_MV_PER_REF_PER_MB * sizeof (CMotionVector));				memset (pmvBackward, 0, BVOP_MV_PER_REF_PER_MB * sizeof (CMotionVector));				if (m_volmd.fAUsage == EIGHT_BIT)					copyAlphaFromRefToCurrQ(m_pvopcRefQ0, x, y, ppxlcCurrQMBA, &m_rctRefVOPY0);				copyFromRefToCurrQ(					m_pvopcRefQ0,					x, y, 					ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, &m_rctRefVOPY0				);			}			else {				copyToCurrBuffWithShape (					ppxlcOrigMBY, ppxlcOrigMBU, ppxlcOrigMBV, 					ppxlcOrigMBBY, ppxlcOrigMBA,					m_iFrameWidthY, m_iFrameWidthUV				);				encodeBVOPMB_WithShape (					ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, ppxlcCurrQMBA, ppxlcCurrQMBBY,					pmbmd, pmv,	pmvBackward,					pmvBY, shpmdColocatedMB,					pmbmdRef, pmvRef,					iMBX, iMBY,					x, y, iQPPrev, iQPPrevAlpha				);			}			//padding of bvop is necessary for temporal scalability: bvop in base layer is used for prediction in enhancement layer			if(m_volmd.bShapeOnly == FALSE)	{				// Added for field based MC padding by Hyundai(1998-5-9)				if (!m_vopmd.bInterlace) {					if (pmbmd -> m_rgTranspStatus [0] != ALL) {						if (pmbmd -> m_rgTranspStatus [0] == PARTIAL)							mcPadCurrMB (ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, ppxlcCurrQMBA);						padNeighborTranspMBs (							iMBX, iMBY,							pmbmd,							ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, ppxlcCurrQMBA						);					}					else {						padCurrAndTopTranspMBFromNeighbor (							iMBX, iMBY,							pmbmd,							ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, ppxlcCurrQMBA						); 					}				}				// End of Hyundai(1998-5-9)			}			pmvBY++;			pmbmd++;			pmv         += BVOP_MV_PER_REF_PER_MB;			pmvBackward += BVOP_MV_PER_REF_PER_MB;			m_statsVOP += m_statsMB;			ppxlcCurrQMBY += MB_SIZE;			ppxlcCurrQMBU += BLOCK_SIZE;			ppxlcCurrQMBV += BLOCK_SIZE;			ppxlcCurrQMBBY += MB_SIZE;			ppxlcCurrQMBA += MB_SIZE;			ppxlcOrigMBY += MB_SIZE;			ppxlcOrigMBU += BLOCK_SIZE;			ppxlcOrigMBV += BLOCK_SIZE;			ppxlcOrigMBBY += MB_SIZE;			ppxlcOrigMBA += MB_SIZE;		}		ppxlcCurrQY += m_iFrameWidthYxMBSize;		ppxlcCurrQU += m_iFrameWidthUVxBlkSize;		ppxlcCurrQV += m_iFrameWidthUVxBlkSize;		ppxlcCurrQBY += m_iFrameWidthYxMBSize;		ppxlcCurrQA += m_iFrameWidthYxMBSize;				ppxlcOrigY += m_iFrameWidthYxMBSize;		ppxlcOrigU += m_iFrameWidthUVxBlkSize;		ppxlcOrigV += m_iFrameWidthUVxBlkSize;		ppxlcOrigBY += m_iFrameWidthYxMBSize;		ppxlcOrigA += m_iFrameWidthYxMBSize;	}	// Added for field based MC padding by Hyundai(1998-5-9)        if (m_vopmd.bInterlace && m_volmd.bShapeOnly == FALSE)                fieldBasedMCPadding (field_pmbmd, m_pvopcCurrQ);	// End of Hyundai(1998-5-9)}

⌨️ 快捷键说明

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