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

📄 errenc.cpp

📁 网络MPEG4IP流媒体开发源代码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
				}			}			}	}	for(iMBnum = iVPMBnum, pmbmd = m_rgmbmd+iVPMBnum, pmv = m_rgmv+iVPMBnum*PVOP_MV_PER_REF_PER_MB;			iMBnum <= iVPlastMBnum; iMBnum++, pmbmd++, pmv+=PVOP_MV_PER_REF_PER_MB) {		if (pmbmd->m_bSkip || pmbmd -> m_rgTranspStatus [0] == ALL)			continue;		iMBX = iMBnum % m_iNumMBX;		iMBY = iMBnum / m_iNumMBX;#ifdef __TRACE_AND_STATS_		m_pbitstrmOut->trace (CSite (iMBX, iMBY), "TextureTcoef_MB_X_Y");#endif // __TRACE_AND_STATS_		if (pmbmd->m_dctMd == INTRA || pmbmd->m_dctMd == INTRAQ)	{			UInt iBlk = 0;			for (iBlk = Y_BLOCK1; iBlk <= V_BLOCK; iBlk++) {				UInt nBits = 0;#ifdef __TRACE_AND_STATS_				m_pbitstrmOut->trace (iBlk, "BLK_NO");#endif // __TRACE_AND_STATS_				if (iBlk < U_BLOCK)					if (pmbmd -> m_rgTranspStatus [iBlk] == ALL) continue;////				Int* rgiCoefQ = m_rgpiCoefQ [iBlk - 1];				Int* rgiCoefQ = iCoefQ_DP [iMBnum][iBlk - 1];#ifdef __TRACE_AND_STATS_				m_pbitstrmOut->trace (rgiCoefQ, BLOCK_SQUARE_SIZE, "BLK_QUANTIZED_COEF");#endif // __TRACE_AND_STATS_				Int iCoefStart;				if (pmbmd->m_bCodeDcAsAc != TRUE)	{					iCoefStart = 1;				} else {					iCoefStart = 0;				}				if (pmbmd->getCodedBlockPattern ((BlockNum) iBlk))	{					Int* rgiZigzag = grgiStandardZigzag;					if (pmbmd->m_bACPrediction)							rgiZigzag = (pmbmd->m_preddir [iBlk - 1] == HORIZONTAL) ? grgiVerticalZigzag : grgiHorizontalZigzag;					if( m_volmd.bReversibleVlc == TRUE )						nBits += sendTCOEFIntraRVLC (rgiCoefQ, iCoefStart, rgiZigzag, FALSE);					else						nBits += sendTCOEFIntra (rgiCoefQ, iCoefStart, rgiZigzag);				}				switch (iBlk) {				case U_BLOCK: 					m_statsVP->nBitsCr += nBits;					break;				case V_BLOCK: 					m_statsVP->nBitsCb += nBits;					break;				default:					m_statsVP->nBitsY += nBits;				}			}			} else {			UInt nBits, iBlk = 0;			for (iBlk = Y_BLOCK1; iBlk <= V_BLOCK; iBlk++) {#ifdef __TRACE_AND_STATS_				m_pbitstrmOut->trace (iBlk, "BLK_NO");#endif // __TRACE_AND_STATS_				if (iBlk < U_BLOCK)					if (pmbmd -> m_rgTranspStatus [iBlk] == ALL) continue;				if (pmbmd->getCodedBlockPattern ((BlockNum) iBlk))	{////					Int* rgiCoefQ = m_rgpiCoefQ [iBlk - 1];					Int* rgiCoefQ = iCoefQ_DP [iMBnum][iBlk - 1];#ifdef __TRACE_AND_STATS_					m_pbitstrmOut->trace (rgiCoefQ, BLOCK_SQUARE_SIZE, "BLK_QUANTIZED_COEF");#endif // __TRACE_AND_STATS_					if( m_volmd.bReversibleVlc == TRUE )						nBits = sendTCOEFInterRVLC (rgiCoefQ, 0, grgiStandardZigzag, FALSE);					else						nBits = sendTCOEFInter (rgiCoefQ, 0, grgiStandardZigzag);					switch (iBlk) {					case U_BLOCK: 						m_statsVP->nBitsCr += nBits;						break;					case V_BLOCK: 						m_statsVP->nBitsCb += nBits;						break;					default:						m_statsVP->nBitsY += nBits;					}				}			}			}	}}Void CVideoObjectEncoder::encodeNSForIVOP_WithShape_DP (){	assert( m_volmd.bDataPartitioning );	assert( m_vopmd.vopPredType==IVOP );	assert( m_volmd.fAUsage == ONE_BIT && m_volmd.bShapeOnly == FALSE );	assert(m_volmd.nBits==8);	//in case the IVOP is used as an ref for direct mode	memset (m_rgmv, 0, m_iNumMB * PVOP_MV_PER_REF_PER_MB * sizeof (CMotionVector));//#ifdef __SHARP_FIX_	memset (m_rgmvBY, 0, m_iNumMB * sizeof (CMotionVector));//#endif	Int iMBX, iMBY;	CMBMode* pmbmd = m_rgmbmd;	Int iQPPrev = m_vopmd.intStepI;	//initialization	Int iVPCounter = m_statsVOP.total();	Int iVPtotal;	m_iVPMBnum = 0;	CStatistics m_statsVP;	// DCT coefficient buffer for Data Partitioning mode	Int*** iCoefQ_DP = new Int** [m_iNumMB];	// Set not to output but count bitstream//	m_pbitstrmOut->SetDontSendBits(TRUE);	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* ppxlcRefBUV = (PixelC*) m_pvopcRefQ1->pixelsBUV () + m_iStartInRefToCurrRctUV;	PixelC *ppxlcRefA = (PixelC*) m_pvopcRefQ1->pixelsA () + m_iStartInRefToCurrRctY;	PixelC* ppxlcOrigY = (PixelC*) m_pvopcOrig->pixelsBoundY ();	PixelC* ppxlcOrigU = (PixelC*) m_pvopcOrig->pixelsBoundU ();	PixelC* ppxlcOrigV = (PixelC*) m_pvopcOrig->pixelsBoundV ();	PixelC* ppxlcOrigBY = (PixelC*) m_pvopcOrig->pixelsBoundBY ();	PixelC* ppxlcOrigA = (PixelC*) m_pvopcOrig->pixelsBoundA ();	Bool bRestartDelayedQP = TRUE;	for (iMBY = 0; iMBY < m_iNumMBY; iMBY++) {		PixelC* ppxlcRefMBY  = ppxlcRefY;		PixelC* ppxlcRefMBU  = ppxlcRefU;		PixelC* ppxlcRefMBV  = ppxlcRefV;		PixelC* ppxlcRefMBBY = ppxlcRefBY;		PixelC* ppxlcRefMBBUV = ppxlcRefBUV;		PixelC* ppxlcRefMBA  = ppxlcRefA;		PixelC* ppxlcOrigMBY = ppxlcOrigY;		PixelC* ppxlcOrigMBU = ppxlcOrigU;		PixelC* ppxlcOrigMBV = ppxlcOrigV;		PixelC* ppxlcOrigMBBY = ppxlcOrigBY;		PixelC* ppxlcOrigMBA = ppxlcOrigA;		for (iMBX = 0; iMBX < m_iNumMBX; iMBX++) {#ifdef __TRACE_AND_STATS_			m_pbitstrmOut->trace (CSite (iMBX, iMBY), "MB_X_Y");#endif // __TRACE_AND_STATS_			pmbmd->m_stepSize = iQPPrev + pmbmd->m_intStepDelta;			if(bRestartDelayedQP)				pmbmd->m_stepSizeDelayed = pmbmd->m_stepSize;			else				pmbmd->m_stepSizeDelayed = iQPPrev;			Int iVPlastMBnum = iMBY * m_iNumMBX + iMBX;			// shape bitstream is set to shape cache			m_pbitstrmShapeMBOut = m_pbitstrmShape_DP[iVPlastMBnum];			m_statsMB.reset ();			pmbmd->m_bSkip = FALSE;	//reset for direct mode 			pmbmd->m_bPadded=FALSE;			copyToCurrBuffWithShape (				ppxlcOrigMBY, ppxlcOrigMBU, ppxlcOrigMBV, 				ppxlcOrigMBBY, ppxlcOrigMBA,				m_iFrameWidthY, m_iFrameWidthUV			);			downSampleBY (m_ppxlcCurrMBBY, m_ppxlcCurrMBBUV); // downsample original BY now for LPE padding (using original shape)			decideTransparencyStatus (pmbmd, m_ppxlcCurrMBBY);			if (pmbmd -> m_rgTranspStatus [0] == PARTIAL) {				LPEPadding (pmbmd);				m_statsMB.nBitsShape += codeIntraShape (ppxlcRefMBBY, pmbmd, iMBX, iMBY);				downSampleBY (m_ppxlcCurrMBBY, m_ppxlcCurrMBBUV);				decideTransparencyStatus (pmbmd, m_ppxlcCurrMBBY); // need to modify it a little (NONE block won't change)			}			else				m_statsMB.nBitsShape += codeIntraShape (ppxlcRefMBBY, pmbmd, iMBX, iMBY);			if(m_volmd.bShapeOnly == FALSE) {//				// Set not to output but count bitstream				m_pbitstrmOut->SetDontSendBits(TRUE);				if (pmbmd -> m_rgTranspStatus [0] != ALL) {					pmbmd->m_stepSize = iQPPrev + pmbmd->m_intStepDelta;					bRestartDelayedQP = FALSE;					Int iQuantMax = (1<<m_volmd.uiQuantPrecision) - 1;					assert (pmbmd->m_stepSize <= iQuantMax && pmbmd->m_stepSize > 0);					iQPPrev = pmbmd->m_stepSize;					if (pmbmd->m_intStepDelta == 0)						pmbmd->m_dctMd = INTRA;					else						pmbmd->m_dctMd = INTRAQ;					quantizeTextureIntraMB (iMBX, iMBY, pmbmd, ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, ppxlcRefMBA);					codeMBTextureHeadOfIVOP (pmbmd);					sendDCTCoefOfIntraMBTexture (pmbmd);						// MC padding					if (pmbmd -> m_rgTranspStatus [0] == PARTIAL)						mcPadCurrMB (ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, ppxlcRefMBA);					padNeighborTranspMBs (						iMBX, iMBY,						pmbmd,						ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, ppxlcRefMBA					);				}				else {					padCurrAndTopTranspMBFromNeighbor (						iMBX, iMBY,						pmbmd,						ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, ppxlcRefMBA					);				}//				// Set to output bitstream				m_pbitstrmOut->SetDontSendBits(FALSE);			}			// copy DCT coefficient to buffer			iCoefQ_DP[iVPlastMBnum] = new Int* [6];			Int iBlk;			for (iBlk = 0; iBlk < 6; iBlk++) {				iCoefQ_DP [iVPlastMBnum] [iBlk] = new Int [BLOCK_SQUARE_SIZE];				for( Int t = 0; t < BLOCK_SQUARE_SIZE; t++ )					iCoefQ_DP[iVPlastMBnum][iBlk][t] = m_rgpiCoefQ[iBlk][t];			}			ppxlcRefMBA += MB_SIZE;			ppxlcOrigMBBY += MB_SIZE;			ppxlcOrigMBA += MB_SIZE;			pmbmd++;#ifdef __TRACE_AND_STATS_			m_statsVOP   += m_statsMB;#endif // __TRACE_AND_STATS_			ppxlcRefMBY  += MB_SIZE;			ppxlcRefMBU  += BLOCK_SIZE;			ppxlcRefMBV  += BLOCK_SIZE;			ppxlcRefMBBY += MB_SIZE;			ppxlcRefMBBUV += BLOCK_SIZE;			ppxlcOrigMBY += MB_SIZE;			ppxlcOrigMBU += BLOCK_SIZE;			ppxlcOrigMBV += BLOCK_SIZE;			iVPtotal = (int) m_statsVOP.total() - iVPCounter;			if( iVPtotal > m_volmd.bVPBitTh || iVPlastMBnum == m_iNumMB-1 /* last MB in a VOP */) {				// Set to output bitstream				m_pbitstrmOut->SetDontSendBits(FALSE);				// encode video packet				iVPCounter = m_statsVOP.total();				m_statsVP.reset();				if( m_iVPMBnum > 0 )				{					m_statsVP.nBitsHead = codeVideoPacketHeader (m_rgmbmd[m_iVPMBnum].m_stepSize);					bRestartDelayedQP = TRUE;				}				DataPartitioningMotionCoding(m_iVPMBnum, iVPlastMBnum, &m_statsVP, iCoefQ_DP);				m_pbitstrmOut -> putBits (DC_MARKER, NUMBITS_DP_DC_MARKER, "DC_marker");				m_statsVP.nBitsHead += NUMBITS_DP_DC_MARKER;				DataPartitioningTextureCoding(m_iVPMBnum, iVPlastMBnum, &m_statsVP, iCoefQ_DP);				assert( iVPtotal + m_statsVP.nBitsHead ==  m_statsVP.total() );				m_iVPMBnum = iVPlastMBnum + 1;			}		}				MacroBlockMemory** ppmbmTemp = m_rgpmbmAbove;		m_rgpmbmAbove = m_rgpmbmCurr;		m_rgpmbmCurr  = ppmbmTemp;		ppxlcRefY  += m_iFrameWidthYxMBSize;		ppxlcRefA  += m_iFrameWidthYxMBSize;		ppxlcRefU  += m_iFrameWidthUVxBlkSize;		ppxlcRefV  += m_iFrameWidthUVxBlkSize;		ppxlcRefBY += m_iFrameWidthYxMBSize;		ppxlcRefBUV += m_iFrameWidthUVxBlkSize;		ppxlcOrigY += m_iFrameWidthYxMBSize;		ppxlcOrigBY += m_iFrameWidthYxMBSize;		ppxlcOrigA += m_iFrameWidthYxMBSize;		ppxlcOrigU += m_iFrameWidthUVxBlkSize;		ppxlcOrigV += m_iFrameWidthUVxBlkSize;	}	// delete CoefQ_DP	for( Int iMB = 0; iMB < m_iNumMB; iMB++ )  {		for (Int iBlk = 0; iBlk < 6; iBlk++) {			delete [] iCoefQ_DP [iMB] [iBlk];		}		delete [] iCoefQ_DP[iMB];	}	delete [] iCoefQ_DP;	// restore normal output stream	m_pbitstrmShapeMBOut = m_pbitstrmOut;	// Set to output bitstream	m_pbitstrmOut->SetDontSendBits(FALSE);}Void CVideoObjectEncoder::encodeNSForPVOP_WithShape_DP (){	assert( m_volmd.bDataPartitioning );	assert( m_vopmd.vopPredType==PVOP );	assert( m_volmd.fAUsage == ONE_BIT && m_volmd.bShapeOnly == FALSE );	assert(m_volmd.nBits==8);	Int iMBX, iMBY;	motionEstPVOP_WithShape ();	// Rate Control	if (m_uiRateControl == RC_MPEG4) {		Double Ec = m_iMAD / (Double) (m_iNumMBY * m_iNumMBX * 16 * 16);		m_statRC.setMad (Ec);		if (m_statRC.noCodedFrame () >= RC_START_RATE_CONTROL) {			UInt newQStep = m_statRC.updateQuanStepsize ();				m_vopmd.intStepDiff = newQStep - m_vopmd.intStep;	// DQUANT			m_vopmd.intStep = newQStep;		}		cout << "\t" << "Q:" << "\t\t\t" << m_vopmd.intStep << "\n";		m_statRC.setQc (m_vopmd.intStep);	}	CoordI y = m_rctCurrVOPY.top; 	CMBMode* pmbmd = m_rgmbmd;	Int iQPPrev = m_vopmd.intStep;	Int iQPPrevAlpha = m_vopmd.intStepPAlpha;	CMotionVector* pmv = m_rgmv;	CMotionVector* pmvBY = m_rgmvBY;	Int iVPCounter = m_statsVOP.total();	Int iVPtotal;	m_iVPMBnum = 0;	CStatistics m_statsVP;	// DCT coefficient buffer for Data Partitioning mode	Int*** iCoefQ_DP = new Int** [m_iNumMB];	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* ppxlcRefBUV = (PixelC*) m_pvopcRefQ1->pixelsBUV () + m_iStartInRefToCurrRctUV;	PixelC *ppxlcRefA = (PixelC*) m_pvopcRefQ1->pixelsA () + m_iStartInRefToCurrRctY;			PixelC* ppxlcOrigY = (PixelC*) m_pvopcOrig->pixelsBoundY ();	PixelC* ppxlcOrigU = (PixelC*) m_pvopcOrig->pixelsBoundU ();	PixelC* ppxlcOrigV = (PixelC*) m_pvopcOrig->pixelsBoundV ();	PixelC* ppxlcOrigBY = (PixelC*) m_pvopcOrig->pixelsBoundBY ();	PixelC* ppxlcOrigA = (PixelC*) m_pvopcOrig->pixelsBoundA ();// Added for error resilient mode by Toshiba(1997-11-14)	Bool bCodeVPHeaderNext = FALSE;		// needed only for OBMC	Int	iTempVPMBnum = 0;	Int iCounter;// End Toshiba(1997-11-14)	Bool bRestartDelayedQP = TRUE;	for (iMBY = 0; iMBY < m_iNumMBY; iMBY++, y += MB_SIZE) {		PixelC* ppxlcRefMBY = ppxlcRefY;		PixelC* ppxlcRefMBU = ppxlcRefU;		PixelC* ppxlcRefMBV = ppxlcRefV;		PixelC* ppxlcRefMBBY = ppxlcRefBY;		PixelC* ppxlcRefMBBUV = ppxlcRefBUV;		PixelC* ppxlcRefMBA = ppxlcRefA;		PixelC* ppxlcOrigMBY = ppxlcOrigY;		PixelC* ppxlcOrigMBU = ppxlcOrigU;		PixelC* ppxlcOrigMBV = ppxlcOrigV;		PixelC* ppxlcOrigMBBY = ppxlcOrigBY;		PixelC* ppxlcOrigMBA = ppxlcOrigA;		CoordI x = m_rctCurrVOPY.left;#ifdef __TRACE_AND_STATS_		m_statsMB.reset ();#endif // __TRACE_AND_STATS_		// initiate advance shape coding		// shape bitstream is set to shape cache		m_pbitstrmShapeMBOut = m_pbitstrmShape_DP[iMBY * m_iNumMBX];//		pmbmd->m_bPadded=FALSE;// Added for error resilient mode by Toshiba(1997-11-14)		// The following operation is needed only for OBMC//		if( bCodeVPHeaderNext ) {//			iTempVPMBnum  = m_iVPMBnum;//			m_iVPMBnum = VPMBnum(0, iMBY);//		}// End Toshiba(1997-11-14)		copyToCurrBuffJustShape (ppxlcOrigMBBY, m_iFrameWidthY);		// Modified for error resilient mode by Toshiba(1997-11-14)		ShapeMode shpmdColocatedMB;		if(m_vopmd.bShapeCodingType) {			shpmdColocatedMB = m_rgmbmdRef [				min (max (0, iMBY), m_iNumMBYRef - 1) * m_iNumMBXRef].m_shpmd;			encodePVOPMBJustShape(ppxlcRefMBBY, pmbmd, shpmdColocatedMB, pmv, pmvBY, x, y, 0, iMBY);		}		else {			m_statsMB.nBitsShape += codeIntraShape (ppxlcRefMBBY, pmbmd, 0, iMBY);			decideTransparencyStatus (pmbmd, m_ppxlcCurrMBBY); 		}//		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)	{			pmbmd->m_stepSize = iQPPrev + pmbmd->m_intStepDelta;#ifdef __TRACE_AND_STATS_			m_pbitstrmOut->trace (CSite (iMBX, iMBY), "MB_X_Y (Texture)");			// shape quantization part			m_statsMB.reset ();#endif // __TRACE_AND_STATS_			Int iVPlastMBnum = iMBY * m_iNumMBX + iMBX;			pmbmd->m_bPadded=FALSE;			if(iMBX<m_iNumMBX-1)			{				// shape bitstream is set to shape cache

⌨️ 快捷键说明

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