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

📄 vopmbenc.cpp

📁 完整的RTP RTSP代码库
💻 CPP
📖 第 1 页 / 共 4 页
字号:
}Void CVideoObjectEncoder::encodeNSForPVOP_WithShape (){	Int iMBX, iMBY, iMB = 0;	motionEstPVOP_WithShape ();	// shape bitstream is set to shape cache	m_pbitstrmShapeMBOut = m_pbitstrmShape;	// Rate Control	UInt newQStep = m_vopmd.intStep; // for frame based rate control	// vopmd.intStep is updated at bottom of this function	// Rate Control	if (m_uiRateControl==RC_MPEG4) {		Double Ec = m_iMAD / (Double) (m_iNumMBY * m_iNumMBX * 16 * 16 * m_iRRVScale *m_iRRVScale);		m_statRC.setMad (Ec);		// calculate for next frame (should be this frame, but its too late to send vop qp!)		newQStep = m_statRC.updateQuanStepsize (m_vopmd.intStep);		// this is not the correct way to use rate control		m_statRC.setQc (m_vopmd.intStep);	}	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)	Int iQPPrev = m_vopmd.intStep;	//	Int iQPAlpha = m_vopmd.intStepPAlpha[0];	CMotionVector* pmv = m_rgmv;	CMotionVector* pmvBY = m_rgmvBY;//OBSS_SAIT_991015	if(m_volmd.volType == BASE_LAYER && m_volmd.bSpatialScalability) {		m_rgmvBaseBY = m_rgmvBY;		m_rctBase = m_rctCurrVOPY;	}	Int xIndex, yIndex;	xIndex = yIndex = 0;//OBSSFIX_MODE3    if( m_volmd.volType == ENHN_LAYER && (m_volmd.bSpatialScalability && m_volmd.iHierarchyType==0) &&      !(m_volmd.iEnhnType != 0 && m_volmd.iuseRefShape == 1)) {//	if(m_volmd.volType == ENHN_LAYER && (m_volmd.bSpatialScalability && m_volmd.iHierarchyType==0)) {//~OBSSFIX_MODE3		xIndex = (m_rctCurrVOPY.left - (m_rctBase.left*m_volmd.ihor_sampling_factor_n_shape/m_volmd.ihor_sampling_factor_m_shape) );			yIndex = (m_rctCurrVOPY.top - (m_rctBase.top*m_volmd.iver_sampling_factor_n_shape/m_volmd.iver_sampling_factor_m_shape) );				xIndex /= MB_SIZE;		yIndex /= MB_SIZE;	}//~OBSS_SAIT_991015	PixelC* ppxlcRefY = (PixelC*) m_pvopcRefQ1->pixelsY () + m_iStartInRefToCurrRctY;	PixelC* ppxlcRefU = (PixelC*) m_pvopcRefQ1->pixelsU () + m_iStartInRefToCurrRctUV;	PixelC* ppxlcRefV = (PixelC*) m_pvopcRefQ1->pixelsV () + m_iStartInRefToCurrRctUV;	PixelC* ppxlcRefBY = (PixelC*) m_pvopcRefQ1->pixelsBY () + m_iStartInRefToCurrRctY;	PixelC **pppxlcRefA = NULL, **pppxlcOrigA = 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 ();// MAC (SB) 26-Nov-99    PixelC** pppxlcRefMBA = NULL;    const PixelC** pppxlcOrigMBA = NULL;	if (m_volmd.fAUsage == EIGHT_BIT) {		pppxlcRefA = new PixelC* [m_volmd.iAuxCompCount];		pppxlcOrigA = new PixelC* [m_volmd.iAuxCompCount];		pppxlcRefMBA = new PixelC* [m_volmd.iAuxCompCount];		pppxlcOrigMBA = new const PixelC* [m_volmd.iAuxCompCount];		for(Int iAuxComp=0;iAuxComp<m_volmd.iAuxCompCount;iAuxComp++) {  			pppxlcRefA[iAuxComp]  = (PixelC*) m_pvopcRefQ1->pixelsA (iAuxComp) + m_iStartInRefToCurrRctY;	  		pppxlcOrigA[iAuxComp] = (PixelC*) m_pvopcOrig->pixelsBoundA (iAuxComp);		}	}// ~MAC	Bool bRestartDelayedQP = TRUE;// Added for error resilient mode by Toshiba(1997-11-14)	Bool bCodeVPHeaderNext = FALSE;		// needed only for OBMC	Int	iTempVPMBnum = 0;// End Toshiba(1997-11-14)	for (iMBY = 0; iMBY < m_iNumMBY; iMBY++, y += MB_SIZE) {		PixelC* ppxlcRefMBY = ppxlcRefY;		PixelC* ppxlcRefMBU = ppxlcRefU;		PixelC* ppxlcRefMBV = ppxlcRefV;		PixelC* ppxlcRefMBBY = ppxlcRefBY;		//PixelC* ppxlcRefMBA = ppxlcRefA;		PixelC* ppxlcOrigMBY = ppxlcOrigY;		PixelC* ppxlcOrigMBU = ppxlcOrigU;		PixelC* ppxlcOrigMBV = ppxlcOrigV;		PixelC* ppxlcOrigMBBY = ppxlcOrigBY;		//PixelC* ppxlcOrigMBA = ppxlcOrigA;		CoordI x = m_rctCurrVOPY.left;		if (m_volmd.fAUsage == EIGHT_BIT) {		  for(Int iAuxComp=0;iAuxComp<m_volmd.iAuxCompCount;iAuxComp++) {			pppxlcRefMBA[iAuxComp] = pppxlcRefA[iAuxComp];			pppxlcOrigMBA[iAuxComp] = pppxlcOrigA[iAuxComp];		  }		}#ifdef __TRACE_AND_STATS_		m_statsMB.reset ();#endif // __TRACE_AND_STATS_		// initiate advance shape coding        // Added for error resilient mode by Toshiba(1997-11-14)		// The following operation is needed only for OBMC		if ( m_volmd.bVPBitTh >= 0) {			Int iCounter = m_pbitstrmOut -> getCounter();			bCodeVPHeaderNext = iCounter - m_iVPCounter > m_volmd.bVPBitTh;			if( bCodeVPHeaderNext ) {				iTempVPMBnum  = m_iVPMBnum;				m_iVPMBnum = VPMBnum(0, iMBY);				m_iVPCounter = iCounter;			}		} else {			bCodeVPHeaderNext = FALSE;		}		copyToCurrBuffJustShape (ppxlcOrigMBBY, m_iFrameWidthY);		ShapeMode shpmdColocatedMB = UNKNOWN;		if(m_vopmd.bShapeCodingType) {			if(!(m_volmd.bSpatialScalability && m_volmd.iHierarchyType==0)){					shpmdColocatedMB = m_rgmbmdRef [					min (max (0, iMBY), m_iNumMBYRef - 1) * m_iNumMBXRef].m_shpmd;			}			else {				if(m_volmd.volType == BASE_LAYER)                       					shpmdColocatedMB = m_rgmbmdRef [min (max (0, iMBY), m_iNumMBYRef - 1) * m_iNumMBXRef].m_shpmd;                else if(m_volmd.volType == ENHN_LAYER && m_volmd.iEnhnType!=0 && m_volmd.iuseRefShape ==1 )       					shpmdColocatedMB = ALL_OPAQUE;                else if(m_volmd.volType == ENHN_LAYER){ // if SpatialScalability					shpmdColocatedMB = m_rgBaseshpmd [										min (max (0, (iMBY+yIndex)*m_volmd.iver_sampling_factor_m_shape/m_volmd.iver_sampling_factor_n_shape), (m_iNumMBBaseYRef-1)) * m_iNumMBBaseXRef];                				}			}			encodePVOPMBJustShape(ppxlcRefMBBY, pmbmd, shpmdColocatedMB, pmv, pmvBY, x, y, 0, iMBY);		}		else {			m_statsMB.nBitsShape += codeIntraShape (ppxlcRefMBBY, pmbmd, 0, iMBY);			decideTransparencyStatus (pmbmd, m_ppxlcCurrMBBY); 		}		// End Toshiba(1997-11-14)        // Added for error resilient mode by Toshiba(1997-11-14)		// The following operation is needed only for OBMC			if( bCodeVPHeaderNext )				m_iVPMBnum = iTempVPMBnum;        // End Toshiba(1997-11-14)				if(pmbmd->m_bhas4MVForward)			padMotionVectors(pmbmd,pmv);		for (iMBX = 0; iMBX < m_iNumMBX; iMBX++, x += MB_SIZE, iMB++)	{			// MB rate control			if (m_uiRateControl>=RC_TM5) 			{				updateQP(pmbmd, iQPPrev, m_tm5rc.tm5rc_calc_mquant(iMB, m_statsVOP.total()) );			}			else			{#ifdef _MBQP_CHANGE_						Int iDQuant = (rand() % 5) - 2;				updateQP(pmbmd, iQPPrev, iQPPrev + iDQuant);#else				// no change in step size, but still need to call...				updateQP(pmbmd, iQPPrev, iQPPrev);#endif //_MBQP_CHANGE_			}			if ( m_volmd.bVPBitTh >= 0) {				if( bCodeVPHeaderNext ) {					codeVideoPacketHeader (iMBX, iMBY, iQPPrev);	// video packet header					bRestartDelayedQP = TRUE;				}			} else {				bCodeVPHeaderNext = FALSE;			}            // End Toshiba(1997-11-14)			#ifdef __TRACE_AND_STATS_			m_pbitstrmOut->trace (CSite (iMBX, iMBY), "MB_X_Y (Texture)");			// shape quantization part			m_statsMB.reset ();#endif // __TRACE_AND_STATS_			pmbmd->m_bPadded=FALSE;			dumpCachedShapeBits();			if(iMBX<m_iNumMBX-1)			{                // Added for error resilient mode by Toshiba(1997-11-14)				// The following operation is needed only for OBMC				if ( m_volmd.bVPBitTh >= 0) {					Int iCounter = m_pbitstrmOut -> getCounter();					bCodeVPHeaderNext = iCounter - m_iVPCounter > m_volmd.bVPBitTh;					if( bCodeVPHeaderNext ) {						iTempVPMBnum  = m_iVPMBnum;						m_iVPMBnum = VPMBnum(iMBX+1, iMBY);						m_iVPCounter = iCounter;					}				} else {					bCodeVPHeaderNext = FALSE;				}                // End Toshiba(1997-11-14)				// code shape 1mb in advance				copyToCurrBuffJustShape (ppxlcOrigMBBY+MB_SIZE,m_iFrameWidthY);				// Modified for error resilient mode by Toshiba(1997-11-14)				if(m_vopmd.bShapeCodingType) {//OBSS_SAIT_991015					if(!(m_volmd.bSpatialScalability && m_volmd.iHierarchyType==0)){							shpmdColocatedMB = m_rgmbmdRef [							min (max (0, iMBX+1), m_iNumMBXRef-1) +  							min (max (0, iMBY), m_iNumMBYRef-1) * m_iNumMBXRef						].m_shpmd;					}					else {//OBSSFIX_MODE3						if(m_volmd.volType == BASE_LAYER)                       							shpmdColocatedMB = m_rgmbmdRef [								min (max (0, iMBX+1), m_iNumMBXRef-1) + 								min (max (0, iMBY), m_iNumMBYRef-1) * m_iNumMBXRef							].m_shpmd;						else if(m_volmd.volType == ENHN_LAYER && m_volmd.iEnhnType!=0 && m_volmd.iuseRefShape ==1 )       							shpmdColocatedMB = ALL_OPAQUE;						else if(m_volmd.volType == ENHN_LAYER){ // if SpatialScalability							shpmdColocatedMB = m_rgBaseshpmd [																																						min (max (0, ((iMBX+xIndex+1)*m_volmd.ihor_sampling_factor_m_shape/m_volmd.ihor_sampling_factor_n_shape)), (m_iNumMBBaseXRef-1)) +													min (max (0, (iMBY+yIndex)*m_volmd.iver_sampling_factor_m_shape/m_volmd.iver_sampling_factor_n_shape), (m_iNumMBBaseYRef-1)) * m_iNumMBBaseXRef];							}					}//~OBSS_SAIT_991015					encodePVOPMBJustShape(						ppxlcRefMBBY+MB_SIZE, pmbmd+1,						 shpmdColocatedMB, pmv + PVOP_MV_PER_REF_PER_MB,						 pmvBY+1, x+MB_SIZE, y,						 iMBX+1, iMBY					);				}				else {					m_statsMB.nBitsShape						+= codeIntraShape (							ppxlcRefMBBY+MB_SIZE,							pmbmd+1, iMBX+1, iMBY						);					decideTransparencyStatus (pmbmd+1,						 m_ppxlcCurrMBBY); 				}			    // End Toshiba(1997-11-14)                // Added for error resilient mode by Toshiba(1997-11-14)				// The following operation is needed only for OBMC				if( bCodeVPHeaderNext )					m_iVPMBnum = iTempVPMBnum;                // End Toshiba(1997-11-14)				// shape needs padded mvs ready for next mb				if((pmbmd+1)->m_bhas4MVForward)					padMotionVectors(pmbmd+1, pmv + PVOP_MV_PER_REF_PER_MB);			}			if(m_volmd.bShapeOnly==FALSE)			{				if (pmbmd -> m_rgTranspStatus [0] != ALL) {					// need to copy binary shape too since curr buff is future shape					copyToCurrBuffWithShape(ppxlcOrigMBY, ppxlcOrigMBU, ppxlcOrigMBV,						ppxlcRefMBBY, pppxlcOrigMBA, m_iFrameWidthY, m_iFrameWidthUV);					//Changed HHI 2000-04-11					downSampleBY (m_ppxlcCurrMBBY, m_ppxlcCurrMBBUV, pmbmd);					// HHI Schueuer: sadct					if (!m_volmd.bSadctDisable)	{										deriveSADCTRowLengths (m_rgiCurrMBCoeffWidth, m_ppxlcCurrMBBY, m_ppxlcCurrMBBUV, pmbmd->m_rgTranspStatus);						encodePVOPMBTextureWithShape(ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV,							pppxlcRefMBA, pmbmd, pmv, iMBX, iMBY, x, y,							&bRestartDelayedQP, m_ppxlcCurrMBBY, m_ppxlcCurrMBBUV );					}					else						encodePVOPMBTextureWithShape(ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV,							pppxlcRefMBA, pmbmd, pmv, iMBX, iMBY, x, y,							&bRestartDelayedQP);					// end HHI					// 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, pppxlcRefMBA);						padNeighborTranspMBs (							iMBX, iMBY,							pmbmd,							ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, pppxlcRefMBA						);					}					// End of Hyundai(1998-5-9)				}				else {					// all transparent so no update possible (set dquant=0)					cancelQPUpdate(pmbmd);										// Added for field based MC padding by Hyundai(1998-5-9)					if (!m_vopmd.bInterlace) { 						padCurrAndTopTranspMBFromNeighbor (							iMBX, iMBY,							pmbmd,							ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, pppxlcRefMBA						);					}					// End of Hyundai(1998-5-9)				}				iQPPrev = pmbmd->m_stepSize;			}			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;      if (m_volmd.fAUsage == EIGHT_BIT) {        for(Int iAuxComp=0;iAuxComp<m_volmd.iAuxCompCount;iAuxComp++) {          pppxlcRefMBA[iAuxComp] += MB_SIZE;          pppxlcOrigMBA[iAuxComp] += MB_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;    if (m_volmd.fAUsage == EIGHT_BIT) {      for(Int iAuxComp=0;iAuxComp<m_volmd.iAuxCompCount;iAuxComp++) {        pppxlcRefA[iAuxComp]  += m_iFrameWidthYxMBSize;        pppxlcOrigA[iAuxComp] += 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_pvopcRefQ1);  // End of Hyundai(1998-5-9)  //OBSS_SAIT_991015//OBSSFIX_MODE3   if((m_volmd.bSpatialScalability && m_volmd.iHierarchyType==0) && m_volmd.volType == ENHN_LAYER && !(m_volmd.iEnhnType != 0 && m_volmd.iuseRefShape == 1) ) { // if SpatialScalability// if((m_volmd.bSpatialScalability && m_volmd.iHierarchyType==0) && m_volmd.volType == ENHN_LAYER) {	// if SpatialScalability//~OBSSFIX_MODE3	 delete m_pvopcRefQ0->getPlane (BY_PLANE)->m_pbHorSamplingChk;	 delete m_pvopcRefQ0->getPlane (BY_PLANE)->m_pbVerSamplingChk;  }  //~OBSS_SAIT_991015  // MAC 	if (m_volmd.fAUsage == EIGHT_BIT) {    delete [] pppxlcRefA;    delete [] pppxlcOrigA;    delete [] pppxlcRefMBA;    delete [] pppxlcOrigMBA;  }  //~MAC	// restore normal output stream	m_pbitstrmShapeMBOut = m_pbitstrmOut;	// update the vop header qp if changed by rate control	m_vopmd.intStep = newQStep;}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 ();	Int iQPPrev = m_vopmd.intStepB;	Int iMBX, iMBY, iMB = 0;	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");

⌨️ 快捷键说明

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