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

📄 sptenc.cpp

📁 此源码是在VC平台下,实现MPEG4编解码的源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	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_rctRefVOPZoom1 = m_rctRefVOPY1.upSampleBy2 ();
		m_pvopcRefOrig0->setBoundRct (m_rctRefVOPY0);
		m_pvopcRefOrig1->setBoundRct (m_rctRefVOPY1);
		computeVOLConstMembers (); // these VOP members are the same for all frames
	}

	m_tPiece = -1;
	encode (TRUE, -1, IVOP);

	m_pvopcSptQ = new CVOPU8YUVBA (m_volmd.fAUsage, m_rctSptQ);  
	VOPOverlay(*m_pvopcRefQ1, *m_pvopcSptQ, 1);
 	delete m_pvopcSptP;	  m_pvopcSptP = NULL;  
	delete m_pvopcOrig;	  m_pvopcOrig  = NULL;
	delete m_pvopcRefQ0;	m_pvopcRefQ0 = NULL;
	delete m_pvopcRefQ1;

	m_pvopcRefQ1 = 	m_pvopcSptQ ; // to support	"rgpvoenc [BASE_LAYER] -> swapRefQ1toSpt (); "

	m_iNumMBX = m_rctSptExp.width / MB_SIZE; 
	m_iNumMBY = m_rctSptExp.height () / MB_SIZE;

	CMBMode* pmbmd = m_rgmbmdRef;
	IntraPredDirection* Spreddir;
	IntraPredDirection* preddir;
	// initialize  MB hole status array	
	Int iMB_left = (rctRefFrameY.left - m_rctSptExp.left) / MB_SIZE;	
	Int iMB_right = (rctRefFrameY.right - m_rctSptExp.left) / MB_SIZE;  	
	Int iMB_top = (rctRefFrameY.top - m_rctSptExp.top) / MB_SIZE;	
	Int iMB_bottom = (rctRefFrameY.bottom - m_rctSptExp.top) / MB_SIZE;
	for (iMBY = 0; iMBY < m_iNumMBY; iMBY++) 
		for (iMBX = 0; iMBX < m_iNumMBX; iMBX++) {
			if ((iMBX >= iMB_left && iMBX < iMB_right) && (iMBY >= iMB_top && iMBY < iMB_bottom)) 
			{
				m_ppPieceMBstatus[iMBY][iMBX] = PIECE_DONE;
				m_rgmbmdSpt[iMBY][iMBX] = CMBMode (*pmbmd);
				Spreddir = m_rgmbmdSpt[iMBY][iMBX].m_preddir;
				preddir = (*pmbmd).m_preddir;
				memcpy (Spreddir, preddir, 10  * sizeof (IntraPredDirection));
				pmbmd++;
			}
			else
				m_ppPieceMBstatus[iMBY][iMBX] = NOT_DONE;
			m_ppUpdateMBstatus[iMBY][iMBX] = NOT_DONE;
		}
	Int Curr = (m_pbitstrmOut -> getCounter ()) - OldCount;
	Int Num_MB = (iMB_right-iMB_left) * (iMB_bottom-iMB_top);
	m_pSptmbBits[AVGPIECEMB] = Curr / Num_MB; // average macroblock bits used by a sprite piece
	
	InitPieceRect = rctRefFrameY; 
	InitPartialRect = InitPieceRect; 
	m_rctPieceQ = InitPieceRect;
*/
#ifdef __TRACE_AND_STATS_
	m_pbitstrmOut -> trace (-1, "VOP_Time");
#endif // __TRACE_AND_STATS_
	m_rctPieceQ = CRct ( m_rctSptPieceY.left, m_rctSptPieceY.top, m_rctSptPieceY.left, m_rctSptPieceY.top);
	m_pvopcSptQ = new CVOPU8YUVBA (m_volmd.fAUsage, m_rctSptQ);  
	m_pvopcRefQ1 = 	m_pvopcSptQ ; // to support	"rgpvoenc [BASE_LAYER] -> swapRefQ1toSpt (); "
	m_pbitstrmOut->reset ();	// inserted as a result of half day debug
// end:  modified by Hughes	  4/9/98

	m_tPiece = m_nFirstFrame;
	m_tUpdate = m_nFirstFrame;
	m_vopmd.SpriteXmitMode = PIECE;
	if ( m_sptMode == BASIC_SPRITE)
		m_vopmd.SpriteXmitMode  = NEXT;
}

Void CVideoObjectEncoder::initialSpritePiece (Int iSessionWidth, Int iSessionHeight)
{
	// identify initial sprite piece
	CRct rctRefFrameY, rct ;
	Bool SpriteObject =  (m_sptMode == PIECE_UPDATE) || ( m_sptMode == BASIC_SPRITE);

// Begin: modified by Hughes	  4/9/98
	m_rctSptExp = CRct (0, 0, iSessionWidth, iSessionHeight);  // m_rctSptExp is specified in relative coordinate
// end:  modified by Hughes	  4/9/98

	if (!SpriteObject) 
	{
		if (m_iNumOfPnts == 0) 
			rct =  CRct (0, 0, iSessionWidth, iSessionHeight);
		else
			rct = InitialPieceRect (0);
		rctRefFrameY = CRct (rct.left, rct.top, rct.right, (rct.bottom + 16 - rct.height()/2));	   //dshu: 12/22/97
//		rctRefFrameY = CRct (rct.left, rct.top, rct.right, (rct.bottom - rct.width/2));	 
	}
	else
		rctRefFrameY = CRct (0, 0, iSessionWidth, iSessionHeight);
	if (!SpriteObject)
		rctRefFrameY = 	PieceExpand (rctRefFrameY);
	m_rctSptPieceY =  rctRefFrameY;
}

CRct CVideoObjectEncoder::InitialPieceRect (Time ts)
{
	CRct rctSpt, rctSptQ;
	CSiteD rgstSrcQ [4];
	rgstSrcQ [0] = CSiteD (m_rctOrg.left, m_rctOrg.top);
	rgstSrcQ [1] = CSiteD (m_rctOrg.right, m_rctOrg.top);
	rgstSrcQ [2] = CSiteD (m_rctOrg.left, m_rctOrg.bottom);
	rgstSrcQ [3] = CSiteD (m_rctOrg.right, m_rctOrg.bottom);

	for (Int i = 0; i < m_iNumOfPnts; i++) {
		// quantization	rgstSrc
		CoordD x = rgstSrcQ [i].x, y = rgstSrcQ [i].y;
		Int rnd = (x > 0) ? (Int) (2.0 * x + .5) : (Int) (2.0 * x - .5);
		m_rgstSrcQ [i].x = (CoordD) rnd / (CoordD) 2.;
		rnd = (y > 0) ? (Int) (2.0 * y + .5) : (Int) (2.0 * y - .5);
		m_rgstSrcQ [i].y = (CoordD) rnd / (CoordD) 2.;
	}
									   
	rctSptQ = CornerWarp (m_pprgstDest[ts], m_rgstSrcQ); 
	rctSpt = CRct (rctSptQ.left, 0, rctSptQ.right, m_rctSpt.height());	 
	return rctSpt;		
}

CRct CVideoObjectEncoder::CornerWarp (const CSiteD* rgstDst, 
									  const CSiteD* rgstSrcQ)
{
	CSiteD stdLeftTopWarp, stdRightTopWarp, stdLeftBottomWarp, stdRightBottomWarp;
	CPerspective2D persp (m_iNumOfPnts, rgstSrcQ, rgstDst, m_uiWarpingAccuracy);
	stdLeftTopWarp = (persp * CSiteD (0, 0)).s;
	stdRightTopWarp = (persp * CSiteD (m_rctOrg.width, 0)).s;
	stdLeftBottomWarp = (persp * CSiteD (0, m_rctOrg.height())).s;
	stdRightBottomWarp = (persp * CSiteD (m_rctOrg.width, m_rctOrg.height())).s;

	CRct rctWarp (stdLeftTopWarp, stdRightTopWarp, stdLeftBottomWarp, stdRightBottomWarp);
	UInt accuracy1 = 1 << (m_uiWarpingAccuracy + 1);
	rctWarp =  rctWarp	/ accuracy1 ; 
	rctWarp.shift(-m_rctSpt.left, -m_rctSpt.top);  // rectangle is w.r.t. UL corner of sprite object

	return rctWarp;
}

Void CVideoObjectEncoder::encodeSpritePiece (Time t)
// code sprite pieces 
{
	if (m_vopmd.SpriteXmitMode  == STOP)
		return ;
	if ((m_vopmd.SpriteXmitMode  == PIECE) || (m_vopmd.SpriteXmitMode  == UPDATE)){
		m_pvopcSptQ -> shift(-m_rctSpt.left, -m_rctSpt.top);	// prepare m_pvopcSptQ to merge new piece
		UInt uiF = t + m_volmd.iTemporalRate;
		uiF = (	uiF >  m_nLastFrame) ?  m_nLastFrame :  uiF;
		UInt uiSptPieceSize = m_iBufferSize/(300/m_volmd.iTemporalRate);
		CRct rct = m_rctPieceQ;
		if (( m_sptMode != PIECE_UPDATE) && (m_tPiece == (Time) m_nFirstFrame))
		{	
// Begin: modified by Hughes	  4/9/98
			InitPieceRect = encPiece (m_rctSptPieceY);
			rct = InitPieceRect;
// End: modified by Hughes	  4/9/98
			rct = CRct (rct.left, (rct.top - 3*MB_SIZE + m_rctSpt.height()/2), rct.right, m_rctSpt.height()); // dshu: 1/4/98	 
			InitPartialRect = encPiece (rct);

			m_vopmd.SpriteXmitMode = UPDATE;
			m_rctUpdateQ = CRct ( rct.left, rct.top, rct.left, rct.bottom);
			CRct rct1 = encPiece (rct);
			rct1 = encPiece (CRct ( rct.left, m_rctPieceQ.top, rct.right, rct.top));
			m_vopmd.SpriteXmitMode = PIECE;
			m_tPiece = 	uiF;

			if (m_iNumOfPnts == 0)
				m_vopmd.SpriteXmitMode  = NEXT; 
		}
		else  {
			if (( InitPartialRect.right >= InitPieceRect.right) &&
				( InitPartialRect.left <= InitPieceRect.left))  {
				CRct rctSptQ = ZoomOrPan ();
				encSptPiece (rctSptQ, uiSptPieceSize);
				while ((m_tPiece < (Time) uiF) &&
					(m_vopmd.SpriteXmitMode  == PIECE) )
					encSptPiece (ZoomOrPan (), uiSptPieceSize);
			}
			else {
				m_bSptRightPiece = TRUE;
				encSptPiece (m_rctUpdateQ, uiSptPieceSize);
				InitPartialRect = m_rctUpdateQ;
			}
			Bool StartUpdate = (m_tPiece >= (Time) m_nLastFrame) 
				&& (m_tUpdate == (Time) m_nFirstFrame);
			if ( StartUpdate )	{
				m_vopmd.SpriteXmitMode  = UPDATE;
				if(( t < (Time) m_nLastFrame) && (m_sptMode != PIECE_OBJECT)) {
					// identify initial update piece
					rct = InitialPieceRect (t-m_nFirstFrame);
					Int left = (rct.left < m_rctSptExp.left) ? 	m_rctSptExp.left : rct.left;
					Int right = (rct.right > m_rctSptExp.right) ? 	m_rctSptExp.right : rct.right;
					InitPieceRect = CRct (left, rct.top, right, rct.bottom);
					rct = InitPieceRect ;
					if (m_sptMode == PIECE_UPDATE) {					
						cout << "\t" << "\n start sending updates for sprite..."  << "\n";
						cout.flush ();
						m_tUpdate = -1;
						m_rctUpdateQ = CRct ( left, rct.top, left, rct.bottom);
						m_pSptmbBits[AVGUPDATEMB] = m_pSptmbBits[AVGUPDATEMB] ;
						rct = PieceSize (TRUE, uiSptPieceSize);
					}
					rct = encPiece (rct);
					InitPartialRect = m_rctUpdateQ;				
					m_tUpdate = t;
				}
				else 
					m_vopmd.SpriteXmitMode = NEXT;
			}
		}
		m_pvopcSptQ -> shift(m_rctSpt.left, m_rctSpt.top);	 // prepare m_pvopcSptQ for warping	
		m_vopmd.vopPredType = SPRITE;
		// --- begin of bug fix (David Shu)
		if (m_volmd.fAUsage != RECTANGLE)
		{
			CRct r1 =  m_rctSptQ;
			m_rctSptQ = m_rctSptExp;
			m_rctCurrVOPY  = CRct(0,0, m_rctSptQ.width, m_rctSptQ.height());
			m_rctCurrVOPUV = m_rctCurrVOPY.downSampleBy2 ();
			m_rctRefFrameY = CRct (-EXPANDY_REF_FRAME, -EXPANDY_REF_FRAME,
				EXPANDY_REF_FRAME + m_rctSptQ.width, EXPANDY_REF_FRAME + m_rctSptQ.height());
			m_rctRefFrameUV = m_rctRefFrameY.downSampleBy2 ();
			setRefStartingPointers ();
			m_iFrameWidthY = m_rctRefFrameY.width;
			m_iFrameWidthUV = m_rctRefFrameUV.width;
			m_iFrameWidthYxMBSize = MB_SIZE * m_iFrameWidthY;
			m_iFrameWidthYxBlkSize = BLOCK_SIZE * m_iFrameWidthY;
			m_iFrameWidthUVxBlkSize = BLOCK_SIZE * m_iFrameWidthUV;
			m_iOffsetForPadY = m_rctRefFrameY.offset (m_rctCurrVOPY.left, m_rctCurrVOPY.top);
			m_iOffsetForPadUV = m_rctRefFrameUV.offset (m_rctCurrVOPUV.left,m_rctCurrVOPUV.top);
			padSprite() ;  //    final padding just before warping

			m_rctSptQ = r1;
		}
		// --- end of bug fix
	}
	
	if (m_vopmd.SpriteXmitMode  != STOP){
		SptXmitMode  PieceXmitMode = m_vopmd.SpriteXmitMode;
		if (m_vopmd.SpriteXmitMode  == NEXT )
		{
			PieceXmitMode = STOP ;
			m_vopmd.SpriteXmitMode  = STOP;
			m_iNumMBX = m_rctSptExp.width / MB_SIZE; 
			m_iNumMBY = m_rctSptExp.height () / MB_SIZE;
			Int nBlk = (m_volmd.fAUsage == EIGHT_BIT) ? 10 : 6;
			for (Int iMBY = 0; iMBY < m_iNumMBY; iMBY++){
				for (Int iMB = 0; iMB < m_iNumMBX; iMB++)	{
					for (Int iBlk = 0; iBlk < nBlk; iBlk++)	
						delete [] (m_rgpmbmCurr_Spt[iMBY][iMB]->rgblkm) [iBlk];

					delete [] m_rgpmbmCurr_Spt [iMBY][iMB]->rgblkm;
					delete [] m_rgpmbmCurr_Spt [iMBY][iMB];
				}
				delete [] m_ppPieceMBstatus[iMBY] ; 
				delete [] m_ppUpdateMBstatus[iMBY] ;  
				delete [] m_rgmbmdSpt[iMBY] ;
				delete [] m_rgpmbmCurr_Spt[iMBY];
			}
			delete [] m_ppPieceMBstatus ; 
			delete [] m_ppUpdateMBstatus ;  
			delete [] m_rgmbmdSpt ;
			delete [] m_rgpmbmCurr_Spt;
// Begin: modified by Hughes	  4/9/98
			delete [] m_rgmbmdSprite ;	   
// end:  modified by Hughes	  4/9/98
		}
		else
			m_vopmd.SpriteXmitMode  = PAUSE;
		codeVOSHead ();
		if (m_vopmd.SpriteXmitMode  != STOP)
			m_vopmd.SpriteXmitMode  = PieceXmitMode;

	}
}

Void CVideoObjectEncoder::encSptPiece (CRct rctSptQ, UInt uiSptPieceSize)
{
	UInt uiTR = m_volmd.iTemporalRate;
	CRct rctSpt = (m_vopmd.SpriteXmitMode == PIECE ) ? m_rctPieceQ : m_rctUpdateQ ; 
	CRct rctSptQNew = rctSpt;
	CRct rctPiece = PieceSize (m_bSptRightPiece, uiSptPieceSize);
	rctSpt.include(rctPiece);

	UInt uiF = (m_vopmd.SpriteXmitMode == PIECE ) ? m_tPiece : m_tUpdate;
	UInt boundary = m_nLastFrame ;	
	if ( rctSptQ.valid() && (rctSptQNew != m_rctSptExp)) {
		rctSptQ = rctSpt;
		uiF += uiTR ;  
		while ((rctSptQNew.right <= rctSptQ.right) && (rctSptQNew.left >= rctSptQ.left) 
			&& (uiF <= boundary)) {
			CRct rctWarpNew = CornerWarp (m_pprgstDest[uiF- m_nFirstFrame], m_rgstSrcQ);
			if (rctWarpNew.left < m_rctSptExp.left) rctWarpNew.left = m_rctSptExp.left;
			if (rctWarpNew.right > m_rctSptExp.right) rctWarpNew.right = m_rctSptExp.right;

⌨️ 快捷键说明

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