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

📄 sys_encoder_vopseenc.cpp

📁 完整的RTP RTSP代码库
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	// m_pfdct = new CFwdBlockDCT(volmd.nBits);	// B-VOP MB buffer	m_puciDirectPredMB = new CU8Image (CRct (0, 0, MB_SIZE, MB_SIZE));	m_puciInterpPredMB = new CU8Image (CRct (0, 0, MB_SIZE, MB_SIZE));	m_ppxlcDirectPredMBY = (PixelC*) m_puciDirectPredMB->pixels (); 	m_ppxlcInterpPredMBY = (PixelC*) m_puciInterpPredMB->pixels (); 	m_piiDirectErrorMB = new CIntImage (CRct (0, 0, MB_SIZE, MB_SIZE)); 	m_piiInterpErrorMB = new CIntImage (CRct (0, 0, MB_SIZE, MB_SIZE)); 	m_ppxliDirectErrorMBY = (PixelI*) m_piiDirectErrorMB->pixels (); 	m_ppxliInterpErrorMBY = (PixelI*) m_piiInterpErrorMB->pixels (); 	// with shape	if (m_volmd.fAUsage != RECTANGLE) {		m_rgiSubBlkIndx16x16 = computeShapeSubBlkIndex (4, 16);		m_rgiSSubBlkIndx16x16 = computeShapeSubBlkIndex (2, 16);		m_rgiSubBlkIndx18x18 = computeShapeSubBlkIndex (4, 18);		m_rgiSubBlkIndx20x20 = computeShapeSubBlkIndex (4, 20);		m_rgiPxlIndx12x12 = new Int [8 * 8];				Int* piPxl = m_rgiPxlIndx12x12;		UInt i, j;		for (i = 2; i < 10; i++)			for (j = 2; j < 10; j++)				*piPxl++ = i * 12 + j;		m_rgiPxlIndx8x8 = new Int [4 * 4];				piPxl = m_rgiPxlIndx8x8;		for (i = 2; i < 6; i++)			for (j = 2; j < 6; j++)				*piPxl++ = i * 8 + j;	}	// NEWPRED	if(m_volmd.bNewpredEnable) {		g_pNewPredEnc->SetObject(					m_iNumBitsTimeIncr,					iSessionWidth,						iSessionHeight,					uiVOId,					m_volmd.cNewpredRefName,					m_volmd.cNewpredSlicePoint,					m_volmd.bNewpredSegmentType,					m_volmd.fAUsage,					m_volmd.bShapeOnly,					m_pvopcRefQ0,					m_pvopcRefQ1,					m_rctRefFrameY,						m_rctRefFrameUV		);	}// ~NEWPRED	m_statsVOL.reset ();	if(m_volmd.bCodeSequenceHead)		codeSequenceHead ();	codeVOHead ();	codeVOLHead (iSessionWidth, iSessionHeight);//, rctSprite);	// Added for error resilient mode by Toshiba(1997-11-14): Moved (1998-1-16)	g_iMaxHeading = MAXHEADING_ERR;	g_iMaxMiddle = MAXMIDDLE_ERR;	g_iMaxTrailing = MAXTRAILING_ERR;	// End Toshiba(1997-11-14)	m_statsVOL.nBitsStuffing += m_pbitstrmOut->flush ();	m_statRC.resetSkipMode ();	m_rgdSNR = (m_volmd.fAUsage == EIGHT_BIT) ? new Double [3+m_volmd.iAuxCompCount] : new Double [3];	// some fixed variables		m_iFrameWidthZoomY = m_iFrameWidthY * 2;	m_iFrameWidthZoomUV = m_iFrameWidthUV * 2;	m_iFrameWidthZoomYx2Minus2MB = m_iFrameWidthY * 2 * 2 - 2 * MB_SIZE;	m_iFrameWidthZoomYx2Minus2Blk = m_iFrameWidthY * 2 * 2 - 2 * BLOCK_SIZE;// RRV insertion	Int iScale	= (m_vopmd.RRVmode.iOnOff == 1) ? (2) : (1);// ~RRV 	if (m_volmd.fAUsage == RECTANGLE) {		m_rctCurrVOPY = CRct (0, 0, iSessionWidthRound, iSessionHeightRound);		m_pvopcOrig->setBoundRct (m_rctCurrVOPY);		m_rctCurrVOPUV = m_rctCurrVOPY.downSampleBy2 ();				m_rctRefVOPY0 = m_rctCurrVOPY;// RRV modification		m_rctRefVOPY0.expand (EXPANDY_REFVOP *iScale);//		m_rctRefVOPY0.expand (EXPANDY_REFVOP);// ~RRV		m_rctRefVOPUV0 = m_rctRefVOPY0.downSampleBy2 ();				m_rctRefVOPY1 = m_rctRefVOPY0;		m_rctRefVOPUV1 = m_rctRefVOPUV0;				m_rctRefVOPZoom0 = m_rctRefVOPY0.upSampleBy2 ();		m_rctRefVOPZoom1 = m_rctRefVOPY1.upSampleBy2 ();		m_pvopcRefOrig0->setBoundRct (m_rctRefVOPY0);		m_pvopcRefOrig1->setBoundRct (m_rctRefVOPY1);	if ((m_uiSprite == 0) || (m_uiSprite == 2) || ((m_uiSprite == 1) && (m_sptMode == BASIC_SPRITE)) ) // GMC		computeVOLConstMembers (); // these VOP members are the same for all frames	}//OBSS_SAIT_991015	else if(m_volmd.fAUsage == ONE_BIT && m_volmd.volType == ENHN_LAYER) {		m_rctCurrVOPY = CRct (0, 0, iSessionWidthRound, iSessionHeightRound);		m_pvopcOrig->setBoundRct (m_rctCurrVOPY);		m_rctCurrVOPUV = m_rctCurrVOPY.downSampleBy2 ();				m_rctRefVOPY0 = m_rctCurrVOPY;		m_rctRefVOPY0.expand (EXPANDY_REFVOP);		m_rctRefVOPUV0 = m_rctRefVOPY0.downSampleBy2 ();				m_rctRefVOPY1 = m_rctRefVOPY0;		m_rctRefVOPUV1 = m_rctRefVOPUV0;				m_rctRefVOPZoom0 = m_rctRefVOPY0.upSampleBy2 ();		m_rctRefVOPZoom1 = m_rctRefVOPY1.upSampleBy2 ();		m_pvopcRefOrig0->setBoundRct (m_rctRefVOPY0);		m_pvopcRefOrig1->setBoundRct (m_rctRefVOPY1);	}//~OBSS_SAIT_991015	m_vopmd.SpriteXmitMode = STOP ;	    // tentative solution for indicating the first Sprite VOP    // tentativeFirstSpriteVop = 0;	// Open motion vector file if used	m_pchMVFileName = pchMVFileName;	if (m_iMVFileUsage == iMVFileUsage) {		m_fMVFile = fopen(m_pchMVFileName, (m_iMVFileUsage == 1) ? "r" : "w");		assert(m_fMVFile != NULL);		m_iMVLineNo = 0;	}}// for back/forward shapeCVideoObjectEncoder::CVideoObjectEncoder (	UInt uiVOId, 	VOLMode& volmd, 	VOPMode& vopmd,	Int iSessionWidth,	Int iSessionHeight) :  CVideoObject (),    m_statsVOL(volmd.iAuxCompCount),  m_statsVOP(volmd.iAuxCompCount),  m_statsMB (volmd.iAuxCompCount){  m_pvopcOrig = NULL;  m_rgiSubBlkIndx16x16 =NULL;  m_rgiSSubBlkIndx16x16 = NULL;  m_rgiSubBlkIndx18x18 = NULL;  m_rgiSubBlkIndx20x20 = NULL;  m_rgiPxlIndx12x12 = NULL;  m_rgiPxlIndx8x8  = NULL;	// sprite stuff    	m_uiSprite = 0; // sprite off	m_pchBitsBuffer = NULL;	m_pbitstrmOut = NULL;	m_pentrencSet = NULL;        // shape cache	m_pchShapeBitsBuffer = NULL;	m_pbitstrmShape = NULL;	m_pbitstrmShapeMBOut = NULL;		m_uiVOId = uiVOId;	m_volmd = volmd;	m_vopmd = vopmd;//	decideMVInfo ();	m_vopmd.iRoundingControl = 0;	m_vopmd.iRoundingControlEncSwitch = 0;	Int iMod = iSessionWidth % MB_SIZE;	Int iSessionWidthRound = (iMod > 0) ? iSessionWidth + MB_SIZE - iMod : iSessionWidth;	iMod = iSessionHeight % MB_SIZE;	Int iSessionHeightRound = (iMod > 0) ? iSessionHeight + MB_SIZE - iMod : iSessionHeight;	m_rctRefFrameY = CRct (		-EXPANDY_REF_FRAME, -EXPANDY_REF_FRAME, 		EXPANDY_REF_FRAME + iSessionWidthRound, EXPANDY_REF_FRAME + iSessionHeightRound	);	m_rctRefFrameUV = m_rctRefFrameY.downSampleBy2 ();	m_pvopcOrig = new CVOPU8YUVBA (m_volmd.fAUsage, m_rctRefFrameY, m_volmd.iAuxCompCount);	m_pvopcRefOrig0 = new CVOPU8YUVBA (m_volmd.fAUsage, m_rctRefFrameY, m_volmd.iAuxCompCount);	m_pvopcRefOrig1 = new CVOPU8YUVBA (m_volmd.fAUsage, m_rctRefFrameY, m_volmd.iAuxCompCount);	allocateVOLMembers (iSessionWidth, iSessionHeight);	CRct rctFrameZoom = m_rctRefFrameY.upSampleBy2 ();	m_puciRefQZoom0 = new CU8Image (rctFrameZoom);	m_puciRefQZoom1 = new CU8Image (rctFrameZoom);	// m_pfdct = new CFwdBlockDCT;	// HHI Schueuer: sadct	if (m_volmd.fAUsage != RECTANGLE && (!m_volmd.bSadctDisable)) {		m_pfdct = new CFwdSADCT();		m_pscanSelector = new CScanSelectorForSADCT(m_rgiCurrMBCoeffWidth);	}	else {		m_pfdct = new CFwdBlockDCT();		m_pscanSelector = new CScanSelector;	}	// end HHI	// B-VOP MB buffer	m_puciDirectPredMB = new CU8Image (CRct (0, 0, MB_SIZE, MB_SIZE));	m_puciInterpPredMB = new CU8Image (CRct (0, 0, MB_SIZE, MB_SIZE));	m_ppxlcDirectPredMBY = (PixelC*) m_puciDirectPredMB->pixels (); 	m_ppxlcInterpPredMBY = (PixelC*) m_puciInterpPredMB->pixels (); 	m_piiDirectErrorMB = new CIntImage (CRct (0, 0, MB_SIZE, MB_SIZE)); 	m_piiInterpErrorMB = new CIntImage (CRct (0, 0, MB_SIZE, MB_SIZE)); 	m_ppxliDirectErrorMBY = (PixelI*) m_piiDirectErrorMB->pixels (); 	m_ppxliInterpErrorMBY = (PixelI*) m_piiInterpErrorMB->pixels (); 	// with shape	if (m_volmd.fAUsage != RECTANGLE) {		m_rgiSubBlkIndx16x16 = computeShapeSubBlkIndex (4, 16);		m_rgiSSubBlkIndx16x16 = computeShapeSubBlkIndex (2, 16);		m_rgiSubBlkIndx18x18 = computeShapeSubBlkIndex (4, 18);		m_rgiSubBlkIndx20x20 = computeShapeSubBlkIndex (4, 20);		m_rgiPxlIndx12x12 = new Int [8 * 8];				Int* piPxl = m_rgiPxlIndx12x12;		UInt i, j;		for (i = 2; i < 10; i++)			for (j = 2; j < 10; j++)				*piPxl++ = i * 12 + j;		m_rgiPxlIndx8x8 = new Int [4 * 4];				piPxl = m_rgiPxlIndx8x8;		for (i = 2; i < 6; i++)			for (j = 2; j < 6; j++)				*piPxl++ = i * 8 + j;	}	m_statRC.resetSkipMode ();	m_rgdSNR = (m_volmd.fAUsage == EIGHT_BIT) ? new Double [4] : new Double [3];	// some fixed variables		m_iFrameWidthZoomY = m_iFrameWidthY * 2;	m_iFrameWidthZoomUV = m_iFrameWidthUV * 2;	m_iFrameWidthZoomYx2Minus2MB = m_iFrameWidthY * 2 * 2 - 2 * MB_SIZE;	m_iFrameWidthZoomYx2Minus2Blk = m_iFrameWidthY * 2 * 2 - 2 * BLOCK_SIZE;		if (m_volmd.fAUsage == RECTANGLE) {		m_rctCurrVOPY = CRct (0, 0, iSessionWidthRound, iSessionHeightRound);		m_pvopcOrig->setBoundRct (m_rctCurrVOPY);		m_rctCurrVOPUV = m_rctCurrVOPY.downSampleBy2 ();				m_rctRefVOPY0 = m_rctCurrVOPY;		m_rctRefVOPY0.expand (EXPANDY_REFVOP);		m_rctRefVOPUV0 = m_rctRefVOPY0.downSampleBy2 ();				m_rctRefVOPY1 = m_rctRefVOPY0;		m_rctRefVOPUV1 = m_rctRefVOPUV0;				m_rctRefVOPZoom0 = m_rctRefVOPY0.upSampleBy2 ();		m_pvopcRefOrig0->setBoundRct (m_rctRefVOPY0);		m_pvopcRefOrig1->setBoundRct (m_rctRefVOPY1);		computeVOLConstMembers (); // these VOP members are the same for all frames	}}Bool CVideoObjectEncoder::skipTest(Time t,VOPpredType vopPredType){	if (m_uiRateControl==RC_MPEG4) {		if(vopPredType!=IVOP)			if (m_statRC.skipThisFrame ())				return TRUE;	}	return FALSE;}Void CVideoObjectEncoder::encode (	Bool bVOPVisible, 	Time t,	VOPpredType vopPredType,	const CVOPU8YUVBA* pvopfRefBaseLayer){	m_t = t;	m_vopmd.vopPredType = vopPredType;// RRV insertion    if(m_vopmd.RRVmode.iOnOff == 1)	{		m_vopmd.RRVmode.iQave		= 0;		if(m_statsVOP.nQMB != 0)		{			m_vopmd.RRVmode.iQave	= m_statsVOP.nQp /m_statsVOP.nQMB;		}		m_vopmd.RRVmode.iNumBits	= m_statsVOP.nBitsTotal;	}	m_iRRVScale	= 1;	// default value// ~RRV	    m_statsVOP.reset ();	Bool bTemporalScalability = m_volmd.bTemporalScalability; // added by Sharp (98/2/10)	Bool bPrevRefVopWasCoded = m_bCodedFutureRef;//OBSS_SAIT_991015	if (m_volmd.volType == ENHN_LAYER && m_volmd.fAUsage == ONE_BIT && (m_volmd.bSpatialScalability && m_volmd.iHierarchyType==0) && m_volmd.iuseRefShape ==0 ) { 		if (!m_bCodedBaseRef  || !bPrevRefVopWasCoded ) 			m_vopmd.vopPredType = PVOP;	}//~OBSS_SAIT_991015	//__LOW_LATENCY_SPRITE_	if (m_uiSprite == 1 && m_sptMode != BASIC_SPRITE && m_vopmd.SpriteXmitMode != STOP)	{		setRefStartingPointers (); // need to compute the starting pointers of the refVOP's (corresponding to the current Rct)		computeVOPMembers ();		m_iNumSptMB = 0;		encodeVOP ();	}	else {	    if (m_uiSprite == 1 && m_t>=0)		    m_vopmd.vopPredType = SPRITE;		    m_pbitstrmOut->reset ();#if 0	    cout << "\nVOP " << m_uiVOId << "\n";	    cout << "\tVOL " << m_volmd.volType << "\n"; // added by Sharp (98/2/10)#endif		if(m_vopmd.vopPredType==IVOP || m_vopmd.vopPredType==PVOP || ((m_uiSprite == 2) && (m_vopmd.vopPredType == SPRITE))) // GMC			m_bCodedFutureRef = bVOPVisible; // flag used by bvop prediction//OBSS_SAIT_991015		if (m_volmd.volType == ENHN_LAYER && m_volmd.fAUsage == ONE_BIT && (m_volmd.bSpatialScalability && m_volmd.iHierarchyType==0) && m_volmd.iuseRefShape ==0 )			m_bCodedFutureRef = bVOPVisible; // flag used by OBSS bvop prediction//~OBSS_SAIT_991015	    if(!bVOPVisible)	    {#ifdef __TRACE_AND_STATS_		    m_pbitstrmOut -> trace (m_t, "VOP_Time");#endif // __TRACE_AND_STATS_		    codeNonCodedVOPHead ();#if 0		    cout << "\tTime..." << m_t << " (" << m_t/m_volmd.dFrameHz << " sec)" 				<< "\n\tNot coded.\n\n";		    cout.flush ();#endif		    m_statsVOP.nBitsStuffing += m_pbitstrmOut->flush ();#ifdef __TRACE_AND_STATS_		    m_statsVOP.dSNRY = m_statsVOP.dSNRU = m_statsVOP.dSNRV = 0;		    m_statsVOP.print (TRUE);		    m_statsVOL += m_statsVOP;#endif // __TRACE_AND_STATS_	    }

⌨️ 快捷键说明

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