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

📄 sys_encoder_errenc.cpp

📁 完整的RTP RTSP代码库
💻 CPP
📖 第 1 页 / 共 5 页
字号:
#endif // __TRACE_AND_STATS_			ppxlcRefMBY  += (MB_SIZE *m_iRRVScale);			ppxlcRefMBU  += (BLOCK_SIZE *m_iRRVScale);			ppxlcRefMBV  += (BLOCK_SIZE *m_iRRVScale);			ppxlcOrigMBY += (MB_SIZE *m_iRRVScale);			ppxlcOrigMBU += (BLOCK_SIZE *m_iRRVScale);			ppxlcOrigMBV += (BLOCK_SIZE *m_iRRVScale);			iVPtotal = (int) m_statsVOP.total() - iVPCounter;			iCurrMBPos	= (m_iRRVScale == 2) ? (2 *iMBX +1 +(2 *iMBY +1) *(2 *m_iNumMBX)) : ((iMBY *m_iNumMBX) +iMBX);			if( ((m_volmd.bNewpredEnable) && (m_volmd.bNewpredSegmentType == 0)) ?				(iCurrMBPos == g_pNewPredEnc->SliceTailMBA((iMBX *m_iRRVScale), (iMBY *m_iRRVScale))) : (iVPtotal>m_volmd.bVPBitTh || iVPlastMBnum==m_iNumMB-1))			{				// Set to output bitstream				m_pbitstrmOut->SetDontSendBits(FALSE);				// encode video packet				iVPCounter = m_statsVOP.total();				m_statsVP.reset();				iVideoPacketNumber ++;				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 (MOTION_MARKER, NUMBITS_DP_MOTION_MARKER, "motion_marker");				m_statsVP.nBitsHead += NUMBITS_DP_MOTION_MARKER;				DataPartitioningTextureCoding(m_iVPMBnum, iVPlastMBnum, &m_statsVP, iCoefQ_DP);				m_iVPMBnum = iVPlastMBnum + 1;				// Set not to output but count bitstream				m_pbitstrmOut->SetDontSendBits(TRUE);			}		}		MacroBlockMemory** ppmbmTemp = m_rgpmbmAbove;		m_rgpmbmAbove = m_rgpmbmCurr;		m_rgpmbmCurr  = ppmbmTemp;		ppxlcRefY += m_iFrameWidthYxMBSize;		ppxlcRefU += m_iFrameWidthUVxBlkSize;		ppxlcRefV += m_iFrameWidthUVxBlkSize;				ppxlcOrigY += m_iFrameWidthYxMBSize;		ppxlcOrigU += m_iFrameWidthUVxBlkSize;		ppxlcOrigV += m_iFrameWidthUVxBlkSize;	}// RRV insertion	if(m_vopmd.RRVmode.iRRVOnOff == 1)	{          ppxlcRefY	= (PixelC*) m_pvopcRefQ1->pixelsY () 			  + m_iStartInRefToCurrRctY;          ppxlcRefU = (PixelC*) m_pvopcRefQ1->pixelsU ()			  + m_iStartInRefToCurrRctUV;          ppxlcRefV = (PixelC*) m_pvopcRefQ1->pixelsV ()			  + m_iStartInRefToCurrRctUV;          filterCodedPictureForRRV(ppxlcRefY, ppxlcRefU, ppxlcRefV,								   m_ivolWidth, m_ivolHeight,								   m_iNumMBX,								   m_iNumMBY,								   m_iFrameWidthY, m_iFrameWidthUV);      }// ~RRV	// 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;	// Set to output bitstream	m_pbitstrmOut->SetDontSendBits(FALSE);// NEWPRED	// copy previous picture to reference picture memory because of output ordering	if(m_volmd.bNewpredEnable) {		for( int iSlice = 0; iSlice < g_pNewPredEnc->m_iNumSlice; iSlice++ ) {			int		iMBY = g_pNewPredEnc->NowMBA(iSlice)/((g_pNewPredEnc->getwidth())/MB_SIZE);			PixelC* RefpointY = (PixelC*) m_pvopcRefQ0->pixelsY () + (m_iStartInRefToCurrRctY-EXPANDY_REF_FRAME) + iMBY * MB_SIZE * m_rctRefFrameY.width;			PixelC* RefpointU = (PixelC*) m_pvopcRefQ0->pixelsU () + (m_iStartInRefToCurrRctUV-EXPANDUV_REF_FRAME) + iMBY * BLOCK_SIZE * m_rctRefFrameUV.width;			PixelC* RefpointV = (PixelC*) m_pvopcRefQ0->pixelsV () + (m_iStartInRefToCurrRctUV-EXPANDUV_REF_FRAME) + iMBY * BLOCK_SIZE * m_rctRefFrameUV.width;			g_pNewPredEnc->CopyNPtoPrev(iSlice, RefpointY, RefpointU, RefpointV);			}		repeatPadYOrA ((PixelC*) m_pvopcRefQ0->pixelsY () + m_iOffsetForPadY, m_pvopcRefQ0);		repeatPadUV (m_pvopcRefQ0);	}// ~NEWPRED	m_vopmd.intStep = newQStep;}Void CVideoObjectEncoder::DataPartitioningMotionCoding(Int iVPMBnum, Int iVPlastMBnum, CStatistics* m_statsVP, Int*** iCoefQ_DP){	assert( m_volmd.bDataPartitioning );	Int	iMBnum;	CMBMode* pmbmd;	CMotionVector* pmv = m_rgmv;	Int iMBX, iMBY;	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) {		iMBX = iMBnum % m_iNumMBX;		iMBY = iMBnum / m_iNumMBX;#ifdef __TRACE_AND_STATS_		m_pbitstrmOut->trace (CSite (iMBX, iMBY), "Motion_MB_X_Y");#endif // __TRACE_AND_STATS_		if( m_volmd.fAUsage != RECTANGLE ) {			m_statsVP->nBitsShape += dumpCachedShapeBits_DP(iMBnum);		}				if (pmbmd -> m_rgTranspStatus [0] != ALL) {			if( m_vopmd.vopPredType==PVOP || (m_uiSprite == 2 && m_vopmd.vopPredType == SPRITE)) { // GMC				m_pbitstrmOut->putBits (pmbmd->m_bSkip, 1, "MB_Skip");				m_statsVP->nBitsCOD++;// GMC			if(m_uiSprite == 2 && m_vopmd.vopPredType == SPRITE && pmbmd->m_bSkip == TRUE)				m_statsVP->nMCSELMB++;// ~GMC			}			//if(pmbmd->m_bSkip)			//	printf("(Skip)");			if (!pmbmd->m_bSkip) {				UInt CBPC = (pmbmd->getCodedBlockPattern (U_BLOCK) << 1)							| pmbmd->getCodedBlockPattern (V_BLOCK);															//per defintion of H.263's CBPC 				assert (CBPC >= 0 && CBPC <= 3);				Int iMBtype;								//per H.263's MBtype				Int iSymbol;				switch( m_vopmd.vopPredType ) {				case PVOP:					if (pmbmd->m_dctMd == INTRA || pmbmd->m_dctMd == INTRAQ)						iMBtype = pmbmd->m_dctMd + 3;					else						iMBtype = (pmbmd -> m_dctMd - 2) | pmbmd -> m_bhas4MVForward << 1;					assert (iMBtype >= 0 && iMBtype <= 4);#ifdef __TRACE_AND_STATS_					m_pbitstrmOut->trace (iMBtype, "MB_MBtype");					m_pbitstrmOut->trace (CBPC, "MB_CBPC");#endif // __TRACE_AND_STATS_					iSymbol = iMBtype * 4 + CBPC;					m_statsVP->nBitsMCBPC += m_pentrencSet->m_pentrencMCBPCinter->encodeSymbol (iSymbol, "MCBPC");					//printf("(%d:%d:%d)", iSymbol, pmbmd->m_bCodeDcAsAc, pmbmd->m_stepSize);					break;// GMC				case SPRITE:					if (pmbmd->m_dctMd == INTRA || pmbmd->m_dctMd == INTRAQ)						iMBtype = pmbmd->m_dctMd + 3;					else						iMBtype = (pmbmd -> m_dctMd - 2) | pmbmd -> m_bhas4MVForward << 1;					assert (iMBtype >= 0 && iMBtype <= 4);#ifdef __TRACE_AND_STATS_					m_pbitstrmOut->trace (iMBtype, "MB_MBtype");					m_pbitstrmOut->trace (CBPC, "MB_CBPC");#endif // __TRACE_AND_STATS_					m_statsVP->nBitsMCBPC += m_pentrencSet->m_pentrencMCBPCinter->encodeSymbol (iMBtype * 4 + CBPC, "MCBPC");					if((pmbmd->m_dctMd == INTER || pmbmd->m_dctMd == INTERQ) && (pmbmd -> m_bhas4MVForward == FALSE)){						m_pbitstrmOut->putBits (pmbmd->m_bMCSEL, 1, "MCSEL");						m_statsVP->nMCSELMB ++;						m_statsVP->nBitsMCSEL ++;					}					break;// ~GMC				case IVOP:					iSymbol = 4 * pmbmd->m_dctMd + CBPC;					assert (iSymbol >= 0 && iSymbol <= 7);			//send MCBPC#ifdef __TRACE_AND_STATS_					m_pbitstrmOut->trace (CBPC, "MB_CBPC");#endif // __TRACE_AND_STATS_					m_statsVP->nBitsMCBPC += m_pentrencSet->m_pentrencMCBPCintra->encodeSymbol (iSymbol, "MB_MCBPC");					//printf("(%d:%d:%d)", iSymbol, pmbmd->m_bCodeDcAsAc, pmbmd->m_stepSize);					break;				default:					assert(FALSE);				}				if ( m_vopmd.vopPredType == IVOP ) {					if( pmbmd->m_dctMd == INTRAQ) {						Int DQUANT = pmbmd->m_intStepDelta;			//send DQUANT						assert (DQUANT >= -2 && DQUANT <= 2);						if (DQUANT != 0) {								if (sign (DQUANT) == 1)								m_pbitstrmOut->putBits (DQUANT + 1, 2, "MB_DQUANT");							else								m_pbitstrmOut->putBits (-1 - DQUANT, 2, "MB_DQUANT");							m_statsVP->nBitsDQUANT += 2;						}					}				 							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 = iCoefQ_DP [iMBnum][iBlk - 1];#ifdef __TRACE_AND_STATS_						m_pbitstrmOut->trace (rgiCoefQ[0], "IntraDC");#endif // __TRACE_AND_STATS_						if (pmbmd->m_bCodeDcAsAc != TRUE)	{							nBits = sendIntraDC (rgiCoefQ, iBlk);						}						switch (iBlk) {						case U_BLOCK: 							m_statsVP->nBitsCr += nBits;							break;						case V_BLOCK: 							m_statsVP->nBitsCb += nBits;							break;						default:							m_statsVP->nBitsY += nBits;						}					}				}				if (pmbmd->m_dctMd != INTRA && pmbmd->m_dctMd != INTRAQ && !(m_uiSprite == 2 && m_vopmd.vopPredType == SPRITE && pmbmd -> m_bMCSEL)) { // GMC					if( m_volmd.fAUsage == RECTANGLE )						m_statsVP->nBitsMV += encodeMVVP (pmv, pmbmd, iMBX, iMBY);					else						m_statsVP->nBitsMV += encodeMVWithShape (pmv, pmbmd, iMBX, iMBY);				}			}		}	}}Void CVideoObjectEncoder::DataPartitioningTextureCoding(Int iVPMBnum, Int iVPlastMBnum, CStatistics* m_statsVP, Int*** iCoefQ_DP, Int*** iRowLength_DP){	assert( m_volmd.bDataPartitioning );	Int	iMBnum;	CMBMode* pmbmd;	CMotionVector* pmv = m_rgmv;	Int iMBX, iMBY;	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), "TextureHeader_MB_X_Y");#endif // __TRACE_AND_STATS_		Int CBPY = 0;		UInt cNonTrnspBlk = 0, iBlk;		for (iBlk = (UInt) Y_BLOCK1; iBlk <= (UInt) Y_BLOCK4; iBlk++) {			if (pmbmd->m_rgTranspStatus [iBlk] != ALL)					cNonTrnspBlk++;		}		UInt iBitPos = 1;		for (iBlk = (UInt) Y_BLOCK1; iBlk <= (UInt) Y_BLOCK4; iBlk++)	{			if (pmbmd->m_rgTranspStatus [iBlk] != ALL)	{				CBPY |= pmbmd->getCodedBlockPattern (iBlk) << (cNonTrnspBlk - iBitPos);				iBitPos++;			}		}		assert (CBPY >= 0 && CBPY <= 15);								//per defintion of H.263's CBPY 		if (m_volmd.fAUsage == RECTANGLE)			assert (cNonTrnspBlk==4); // Only all opaque is only supportedin DP mode at present		if (pmbmd->m_dctMd == INTRA || pmbmd->m_dctMd == INTRAQ)	{			m_pbitstrmOut->putBits (pmbmd->m_bACPrediction, 1, "MB_ACPRED");			m_statsVP->nBitsIntraPred++;#ifdef __TRACE_AND_STATS_			m_pbitstrmOut->trace (cNonTrnspBlk, "MB_NumNonTranspBlks");			m_pbitstrmOut->trace (CBPY, "MB_CBPY (I-style)");#endif // __TRACE_AND_STATS_			switch (cNonTrnspBlk) {			case 1:				m_statsVP->nBitsCBPY += m_pentrencSet->m_pentrencCBPY1->encodeSymbol (CBPY, "MB_CBPY1");				break;			case 2:				m_statsVP->nBitsCBPY += m_pentrencSet->m_pentrencCBPY2->encodeSymbol (CBPY, "MB_CBPY2");				break;			case 3:				m_statsVP->nBitsCBPY += m_pentrencSet->m_pentrencCBPY3->encodeSymbol (CBPY, "MB_CBPY3");				break;			case 4:				m_statsVP->nBitsCBPY += m_pentrencSet->m_pentrencCBPY->encodeSymbol (CBPY, "MB_CBPY");				break;			default:				assert (FALSE);			}			m_statsVP->nIntraMB++;		}		else {#ifdef __TRACE_AND_STATS_			m_pbitstrmOut->trace (cNonTrnspBlk, "MB_NumNonTranspBlks");			m_pbitstrmOut->trace (CBPY, "MB_CBPY (P-style)");#endif // __TRACE_AND_STATS_			switch (cNonTrnspBlk) {			case 1:				m_statsVP->nBitsCBPY += m_pentrencSet->m_pentrencCBPY1->encodeSymbol (1 - CBPY, "MB_CBPY1");				break;			case 2:				m_statsVP->nBitsCBPY += m_pentrencSet->m_pentrencCBPY2->encodeSymbol (3 - CBPY, "MB_CBPY2");				break;			case 3:				m_statsVP->nBitsCBPY += m_pentrencSet->m_pentrencCBPY3->encodeSymbol (7 - CBPY, "MB_CBPY3");				break;			case 4:				m_statsVP->nBitsCBPY += m_pentrencSet->m_pentrencCBPY->encodeSymbol (15 - CBPY, "MB_CBPY");				break;			default:				assert (FALSE);			}		}		if ( m_vopmd.vopPredType != IVOP &&				(pmbmd->m_dctMd == INTERQ || pmbmd->m_dctMd == INTRAQ)) {			Int DQUANT = pmbmd->m_intStepDelta;			//send DQUANT			assert (DQUANT >= -2 && DQUANT <= 2);			if (DQUANT != 0) {					if (sign (DQUANT) == 1)					m_pbitstrmOut->putBits (DQUANT + 1, 2, "MB_DQUANT");				else					m_pbitstrmOut->putBits (-1 - DQUANT, 2, "MB_DQUANT");				m_statsVP->nBitsDQUANT += 2;			}		}				 				if (m_vopmd.vopPredType	!= IVOP &&				(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 = iCoefQ_DP [iMBnum][iBlk - 1];#ifdef __TRACE_AND_STATS_				m_pbitstrmOut->trace (rgiCoefQ[0], "IntraDC");#endif // __TRACE_AND_STATS_				if (pmbmd->m_bCodeDcAsAc != TRUE)	{					nBits = sendIntraDC (rgiCoefQ, iBlk);				}				switch (iBlk) {				case U_BLOCK: 					m_statsVP->nBitsCr += nBits;					break;				case V_BLOCK: 					m_statsVP->nBitsCb += nBits;					break;				default:					m_statsVP->nBitsY += nBits;				}			}			}	}	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");

⌨️ 快捷键说明

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