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

📄 sys_encoder_errenc.cpp

📁 完整的RTP RTSP代码库
💻 CPP
📖 第 1 页 / 共 5 页
字号:
#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 (iBlk))	{					Int* rgiZigzag = grgiStandardZigzag;					if (pmbmd->m_bACPrediction)							rgiZigzag = (pmbmd->m_preddir [iBlk - 1] == HORIZONTAL) ? grgiVerticalZigzag : grgiHorizontalZigzag;					// 09/19/99 HHI Schueuer: added for sadct					if (!m_volmd.bSadctDisable)						rgiZigzag = m_pscanSelector->select_DP (rgiZigzag, (pmbmd->m_rgTranspStatus[0] == PARTIAL), iBlk, iRowLength_DP[iMBnum]);					// end HHI					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;			// 09/19/99 HHI Schueuer			Int* scan = grgiStandardZigzag;			// end HHI			for (iBlk = Y_BLOCK1; iBlk <= V_BLOCK; iBlk++) {				// 09/19/99 HHI Schueuer				scan = grgiStandardZigzag;				// end HHI#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 (iBlk))	{					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.bSadctDisable) 						scan = m_pscanSelector->select_DP (scan, (pmbmd->m_rgTranspStatus[0] == PARTIAL), iBlk, iRowLength_DP[iMBnum]);					if( m_volmd.bReversibleVlc == TRUE )						nBits = sendTCOEFInterRVLC (rgiCoefQ, 0, scan, FALSE);					else						nBits = sendTCOEFInter (rgiCoefQ, 0, scan);					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 );	if(!(m_volmd.fAUsage == ONE_BIT && m_volmd.bShapeOnly == FALSE ))		fatal_error("Grayscale alpha mode cannot be used with data partitioning");	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(0);	// DCT coefficient buffer for Data Partitioning mode	Int*** iCoefQ_DP = new Int** [m_iNumMB];	// 09/17/99 HHI  Schueuer: buffer for rowlength needed by sadct	Int*** iRowLength_DP;	if (!m_volmd.bSadctDisable) 		iRowLength_DP =  new Int** [m_iNumMB];	else		iRowLength_DP = NULL;	// end HHI	// 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* ppxlcOrigY = (PixelC*) m_pvopcOrig->pixelsBoundY ();	PixelC* ppxlcOrigU = (PixelC*) m_pvopcOrig->pixelsBoundU ();	PixelC* ppxlcOrigV = (PixelC*) m_pvopcOrig->pixelsBoundV ();	PixelC* ppxlcOrigBY = (PixelC*) m_pvopcOrig->pixelsBoundBY ();	Bool bRestartDelayedQP = TRUE;	Int iMB = 0;	for (iMBY = 0; iMBY < m_iNumMBY; iMBY++) {		PixelC*  ppxlcRefMBY  = ppxlcRefY;		PixelC*  ppxlcRefMBU  = ppxlcRefU;		PixelC*  ppxlcRefMBV  = ppxlcRefV;		PixelC*  ppxlcRefMBBY = ppxlcRefBY;		PixelC*  ppxlcRefMBBUV = ppxlcRefBUV;		PixelC*  ppxlcOrigMBY = ppxlcOrigY;		PixelC*  ppxlcOrigMBU = ppxlcOrigU;		PixelC*  ppxlcOrigMBV = ppxlcOrigV;		PixelC*  ppxlcOrigMBBY = ppxlcOrigBY;		for (iMBX = 0; iMBX < m_iNumMBX; iMBX++, iMB++) {#ifdef __TRACE_AND_STATS_			m_pbitstrmOut->trace (CSite (iMBX, iMBY), "MB_X_Y");#endif // __TRACE_AND_STATS_			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_bMCSEL = FALSE; //reset for direct mode			pmbmd->m_bPadded = FALSE;			pmbmd->m_dctMd = INTRA;			// MB level rate control section			// here is where we calculate the delta QP			if (m_uiRateControl>=RC_TM5) {				// TM5 rate control				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_			}			copyToCurrBuffWithShape (				ppxlcOrigMBY, ppxlcOrigMBU, ppxlcOrigMBV, 				ppxlcOrigMBBY, NULL,				m_iFrameWidthY, m_iFrameWidthUV			);			decideTransparencyStatus (pmbmd, m_ppxlcCurrMBBY);			downSampleBY (m_ppxlcCurrMBBY, m_ppxlcCurrMBBUV, pmbmd); // downsample original BY now for LPE padding (using original shape)			if (pmbmd -> m_rgTranspStatus [0] == PARTIAL) {				LPEPadding (pmbmd);				m_statsMB.nBitsShape += codeIntraShape (ppxlcRefMBBY, pmbmd, iMBX, iMBY);				decideTransparencyStatus (pmbmd, m_ppxlcCurrMBBY); // need to modify it a little (NONE block won't change)				downSampleBY (m_ppxlcCurrMBBY, m_ppxlcCurrMBBUV, pmbmd);			}			else				m_statsMB.nBitsShape += codeIntraShape (ppxlcRefMBBY, pmbmd, iMBX, iMBY);			// Set not to output but count bitstream			m_pbitstrmOut->SetDontSendBits(TRUE);			if (pmbmd -> m_rgTranspStatus [0] != ALL) {				if (!m_volmd.bSadctDisable) 					deriveSADCTRowLengths (m_rgiCurrMBCoeffWidth, m_ppxlcCurrMBBY, m_ppxlcCurrMBBUV, pmbmd->m_rgTranspStatus);				setDCVLCMode(pmbmd, &bRestartDelayedQP);				// 09/17/99 HHI Schueuer				if (!m_volmd.bSadctDisable)  					quantizeTextureIntraMB (iMBX, iMBY, pmbmd, ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, NULL, m_ppxlcCurrMBBY, m_ppxlcCurrMBBUV);				else					quantizeTextureIntraMB (iMBX, iMBY, pmbmd, ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, NULL);				// end HHI				codeMBTextureHeadOfIVOP (pmbmd);				sendDCTCoefOfIntraMBTexture (pmbmd);				// MC padding				if (pmbmd -> m_rgTranspStatus [0] == PARTIAL)					mcPadCurrMB (ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, NULL);				padNeighborTranspMBs (					iMBX, iMBY,					pmbmd,					ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, NULL				);			}			else {				cancelQPUpdate(pmbmd);				padCurrAndTopTranspMBFromNeighbor (					iMBX, iMBY,					pmbmd,					ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, NULL				);			}//				// 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];			}			// 09/17/99 HHI  Schueuer: copy rowlength for sadct			if (!m_volmd.bSadctDisable) {				iRowLength_DP[iVPlastMBnum] = new Int* [11];				Int iBlk;				for (iBlk = ALL_Y_BLOCKS; iBlk < ALL_A_BLOCKS; iBlk++)					iRowLength_DP[iVPlastMBnum][iBlk] = 0;				if(pmbmd -> m_rgTranspStatus [0] != ALL) { 					for (iBlk = Y_BLOCK1; iBlk <= A_BLOCK4; iBlk++) {						iRowLength_DP [iVPlastMBnum][iBlk] = new Int [BLOCK_SIZE];						for ( Int t = 0; t < BLOCK_SIZE; t++)							iRowLength_DP [iVPlastMBnum][iBlk][t] = m_rgiCurrMBCoeffWidth[iBlk][t];					}				}			}			// end HHI			iQPPrev = pmbmd->m_stepSize;			ppxlcOrigMBBY += 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 - m_rgmbmd[m_iVPMBnum].m_intStepDelta);					}				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;				// 09/19/99 HHI Schueuer: added for sadct				if (!m_volmd.bSadctDisable) 					DataPartitioningTextureCoding(m_iVPMBnum, iVPlastMBnum, &m_statsVP, iCoefQ_DP, iRowLength_DP);				else					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;		ppxlcRefU  += m_iFrameWidthUVxBlkSize;		ppxlcRefV  += m_iFrameWidthUVxBlkSize;		ppxlcRefBY += m_iFrameWidthYxMBSize;		ppxlcRefBUV += m_iFrameWidthUVxBlkSize;		ppxlcOrigY += m_iFrameWidthYxMBSize;		ppxlcOrigBY += m_iFrameWidthYxMBSize;		ppxlcOrigU += m_iFrameWidthUVxBlkSize;		ppxlcOrigV += m_iFrameWidthUVxBlkSize;	}	// delete CoefQ_DP	for(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;	// 09/17/99 HHI  Schueuer: delete iRowLength _DP sadct	if (!m_volmd.bSadctDisable) {		for (Int iMB = 0; iMB < m_iNumMB; iMB++) {			for (Int iBlk = 0; iBlk < 11; iBlk++) 				delete [] iRowLength_DP[iMB][iBlk];			delete [] iRowLength_DP[iMB];		}		delete [] iRowLength_DP;	}	else {		delete []iRowLength_DP;	}	// end HHI;	// 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 || (m_uiSprite == 2 && m_vopmd.vopPredType==SPRITE) ); // GMC	if(!(m_volmd.fAUsage == ONE_BIT && m_volmd.bShapeOnly == FALSE ))		fatal_error("Grayscale alpha mode cannot be used with data partitioning");	assert(m_volmd.nBits==8);	Int iMBX, iMBY;	motionEstPVOP_WithShape ();	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;	Int iQPPrev = m_vopmd.intStep;	CMotionVector* pmv = m_rgmv;	CMotionVector* pmvBY = m_rgmvBY;	Int iVPCounter = m_statsVOP.total();	Int iVPtotal;	m_iVPMBnum = 0;	CStatistics m_statsVP(0);	// DCT coefficient buffer for Data Partitioning mode

⌨️ 快捷键说明

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