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

📄 sptenc.cpp

📁 《Visual C++小波变换技术与工程实践》靳济芳编著的光盘程序。
💻 CPP
📖 第 1 页 / 共 3 页
字号:
			if (rctWarpNew.right > m_rctSptExp.right) rctWarpNew.right = m_rctSptExp.right;
			rctSptQNew.include (rctWarpNew);
			uiF = ((rctSptQNew.right <= rctSptQ.right) && (rctSptQNew.left >= rctSptQ.left))
				? (uiF + uiTR) : (uiF - uiTR);
		}
		Int left = (rctPiece.left < rctSptQNew.left) ? 	rctSptQNew.left :  rctPiece.left;
		Int right = (rctPiece.right > rctSptQNew.right) ? 	rctSptQNew.right :  rctPiece.right;
		if ((right-MB_SIZE) > left)
			rctSpt = encPiece (CRct (left, m_rctSptExp.top, right, m_rctSptExp.bottom));
	}
	else {
		uiF = boundary;
	}
	if (uiF  > boundary)		
		uiF = boundary;

	if (m_vopmd.SpriteXmitMode == PIECE )
		m_tPiece = uiF;
	if (m_vopmd.SpriteXmitMode == UPDATE ) 			
		m_tUpdate = uiF;

	if (uiF  >= boundary) {
		if (( m_sptMode == PIECE_OBJECT) || m_vopmd.SpriteXmitMode == UPDATE )
			m_vopmd.SpriteXmitMode = NEXT;
	}
}

CRct CVideoObjectEncoder::PieceSize (Bool rightpiece, UInt uiSptPieceSize)
{	

	Int right, left;

	CRct rctSptQ = (m_vopmd.SpriteXmitMode == PIECE ) ? m_rctPieceQ : m_rctUpdateQ ; 
	Int AvgBitsMb = (m_vopmd.SpriteXmitMode == PIECE ) ? m_pSptmbBits [AVGUPDATEMB] : m_pSptmbBits[AVGUPDATEMB];
	assert (AvgBitsMb != 0);	

	m_iPieceHeight = (MB_SIZE-1 + m_rctPieceQ.height ()) / MB_SIZE;
	m_iPieceWidth= (Int) (0.5 + uiSptPieceSize/(AvgBitsMb * m_iPieceHeight));

	m_iPieceWidth= (m_iPieceWidth<2)? 2 : m_iPieceWidth;

	if (rightpiece) {
		right = rctSptQ.right + MB_SIZE * m_iPieceWidth;
		if (right > m_rctSptExp.right) {
			right = m_rctSptExp.right;
		}
		if ((m_vopmd.SpriteXmitMode == UPDATE ) && (right > m_rctPieceQ.right)) {
			right = m_rctPieceQ.right;
		}
		left = rctSptQ.right;
	}
	else  {
		left = rctSptQ.left - MB_SIZE* m_iPieceWidth;
		if (left < m_rctSptExp.left) {
			left = m_rctSptExp.left ;
		}
		if ((m_vopmd.SpriteXmitMode == UPDATE ) && (left < m_rctPieceQ.left)) {
			left = m_rctPieceQ.left ;
		}
		right = rctSptQ.left;
	}
	CRct rctSptPieceY = CRct (left, m_rctSptExp.top, right, m_rctSptExp.bottom);
	if ((m_tUpdate > (Time) m_nFirstFrame) || (m_vopmd.SpriteXmitMode == PIECE )) 
		if (rightpiece) {
			if (left > (m_rctSptExp.left+MB_SIZE))
			{
				left -=  MB_SIZE;
				rctSptPieceY = CRct (left, rctSptPieceY.top, rctSptPieceY.right, rctSptPieceY.bottom);
			}
		}
		else{
			if (right < (m_rctSptExp.right - MB_SIZE))
			{
				right +=  MB_SIZE;
				rctSptPieceY = CRct (rctSptPieceY.left, rctSptPieceY.top, right, rctSptPieceY.bottom);
			}
		}
	return	rctSptPieceY;
}

CRct CVideoObjectEncoder::encPiece (CRct rctpiece)
{	
	Time ts;
	Int right = rctpiece.right; 
	Int left = rctpiece.left;
	CRct rctSpt = (m_vopmd.SpriteXmitMode == PIECE ) ? m_rctPieceQ : m_rctUpdateQ ; 

	CRct rctSptPieceY = PieceExpand (rctpiece);
//	m_rctSptPieceY = rctSptPieceY;
//	m_rctSptPieceY.shift(m_rctSpt.left, m_rctSpt.top);

	if (m_volmd.fAUsage == RECTANGLE) {
		m_rctCurrVOPY = rctSptPieceY;		
		m_rctCurrVOPUV = m_rctCurrVOPY.downSampleBy2 ();
	}

	m_iPieceWidth= rctSptPieceY.width / MB_SIZE;
	m_iPieceHeight= rctSptPieceY.height () / MB_SIZE;
		
	m_iPieceXoffset= (rctSptPieceY.left - m_rctSptExp.left) / MB_SIZE;
	m_iPieceYoffset= (rctSptPieceY.top - m_rctSptExp.top) / MB_SIZE;
	rctSpt.include(rctSptPieceY);
	codeVOSHead ();

	Int OldCount = m_pbitstrmOut -> getCounter ();

 	// encode sprite piece	
	m_pvopcSptP = new CVOPU8YUVBA (*m_pvopcSpt, m_volmd.fAUsage, rctSptPieceY);
	m_pvopcSptP -> shift (-rctSptPieceY.left, -rctSptPieceY.top);	
	CRct rctRefFrameY = m_pvopcSptP -> whereY() ;
	m_rctCurrVOPY = CRct (0, 0, rctRefFrameY.width, rctRefFrameY.height());		
	m_rctCurrVOPUV = m_rctCurrVOPY.downSampleBy2 ();

	m_rctRefFrameY = CRct (
		-EXPANDY_REF_FRAME, -EXPANDY_REF_FRAME, 
		EXPANDY_REF_FRAME + rctRefFrameY.width, EXPANDY_REF_FRAME + rctRefFrameY.height()
	);
	m_rctRefFrameUV = m_rctRefFrameY.downSampleBy2 ();
	m_pvopcOrig = new CVOPU8YUVBA (m_volmd.fAUsage, m_rctRefFrameY, m_volmd.iAuxCompCount); 
	VOPOverlay (*m_pvopcSptP, *m_pvopcOrig);

	m_pvopcOrig->setBoundRct (m_rctCurrVOPY);

	m_pvopcRefQ1 = new CVOPU8YUVBA (m_volmd.fAUsage, m_rctRefFrameY, m_volmd.iAuxCompCount);
	delete m_pvopcSptP;
	m_pvopcSptP = new CVOPU8YUVBA (*m_pvopcSptQ, m_volmd.fAUsage, rctSptPieceY);	 // extract reference
	m_pvopcSptP -> shift (-rctSptPieceY.left, -rctSptPieceY.top);
	VOPOverlay (*m_pvopcSptP, *m_pvopcRefQ1);

	if (m_vopmd.SpriteXmitMode == PIECE ) {		
		m_rctPieceQ = rctSpt;
		ts = m_tPiece;
		m_vopmd.vopPredType = IVOP;
	}
	else {
		m_rctUpdateQ = rctSpt;
		ts = m_tUpdate;
		m_vopmd.vopPredType = PVOP;
	}
		
 	m_pvopcRefQ0 = new CVOPU8YUVBA (m_volmd.fAUsage, m_rctRefFrameY, m_volmd.iAuxCompCount);
	m_iFrameWidthY = m_pvopcRefQ0->whereY ().width;
	m_iFrameWidthUV = m_pvopcRefQ0->whereUV ().width;
	m_iFrameWidthYxMBSize = MB_SIZE * m_pvopcRefQ0->whereY ().width; 
	m_iFrameWidthYxBlkSize = BLOCK_SIZE * m_pvopcRefQ0->whereY ().width; 
	m_iFrameWidthUVxBlkSize = BLOCK_SIZE * m_pvopcRefQ0->whereUV ().width;

	encode (TRUE, ts, m_vopmd.vopPredType);
//	encode (TRUE, ts, m_vopmd.SpriteXmitMode);
	
	m_pvopcRefQ1 -> shift (rctSptPieceY.left, rctSptPieceY.top);  
	VOPOverlay (*m_pvopcRefQ1, *m_pvopcSptQ, 1);
	delete m_pvopcSptP;	
	delete m_pvopcOrig;	 m_pvopcOrig = NULL ;
	delete m_pvopcRefQ0; m_pvopcRefQ0 = NULL ;	
	delete m_pvopcRefQ1; m_pvopcRefQ1 = NULL ;
 	if (m_iNumOfPnts == 0) {
		m_pvopcRefQ1 = m_pvopcSptQ;	  // to avoid	"rgpvoenc [BASE_LAYER] -> swapRefQ1toSpt (); "
	}

	Int Curr = (m_pbitstrmOut -> getCounter ()) - OldCount;	
	if (m_iNumSptMB > 0) {
		if (m_vopmd.SpriteXmitMode == PIECE ) 
			m_pSptmbBits[AVGPIECEMB] = Curr / m_iNumSptMB; // average macroblock bits used by a sprite piece	
		if (m_vopmd.SpriteXmitMode == UPDATE ) 
			m_pSptmbBits[AVGUPDATEMB] = Curr / m_iNumSptMB; // average macroblock bits used by a sprite piece 
	}
	return rctSpt;
}
CRct CVideoObjectEncoder::ZoomOrPan ()
{
	CRct rctWarpNew ;
	CRct rctWarpOld ;
	UInt uiTR = m_volmd.iTemporalRate;
	UInt uiF = (m_vopmd.SpriteXmitMode == PIECE ) ? m_tPiece : m_tUpdate;
	UInt boundary = m_nLastFrame ;

	if (uiF >= boundary)
		return rctWarpNew;		

	rctWarpNew = CornerWarp (m_pprgstDest[uiF- m_nFirstFrame], m_rgstSrcQ);
	rctWarpOld = rctWarpNew;
	// determine if sprite is zooming or panning?
	while (rctWarpNew == rctWarpOld) {
		uiF += uiTR ;
		rctWarpNew = CornerWarp (m_pprgstDest[uiF- m_nFirstFrame], m_rgstSrcQ);
	}
	if ((rctWarpNew.right > rctWarpOld.right) && (rctWarpNew.left < rctWarpOld.left))
		m_bSptZoom = TRUE;  // sprite is zooming
	else {
		m_bSptZoom = FALSE ;  // sprite is panning		 
		if (rctWarpNew.left < rctWarpOld.left)
			m_bSptRightPiece = FALSE;  // sprite is panning to the left
		else
			m_bSptRightPiece = TRUE;  // sprite is panning to the right
	}
	rctWarpNew.include (rctWarpOld);
	return rctWarpNew;		
}

Void CVideoObjectEncoder::codeVOSHead ()   
{
	m_pbitstrmOut -> putBits (m_vopmd.SpriteXmitMode, NUMBITS_SPRITE_XMIT_MODE, "Sprite_TRANSMIT_MODE");
	if (( m_vopmd.SpriteXmitMode != STOP) &&( m_vopmd.SpriteXmitMode != PAUSE)) {
		// Sprite piece overhead code
		static UInt uiNumBitsStart = 4* NUMBITS_SPRITE_MB_OFFSET + NUMBITS_SPRITE_XMIT_MODE + NUMBITS_VOP_QUANTIZER;
		Int stepToBeCoded = (m_vopmd.SpriteXmitMode == UPDATE) ? m_vopmd.intStep : m_vopmd.intStepI;
		m_pbitstrmOut -> putBits (stepToBeCoded, NUMBITS_VOP_QUANTIZER, "sprite_Piece_Quantier");
		m_pbitstrmOut -> putBits (m_iPieceWidth, (UInt) NUMBITS_SPRITE_MB_OFFSET, "sprite_Piece_width");		//plus 9 bits
		m_pbitstrmOut -> putBits (m_iPieceHeight, (UInt) NUMBITS_SPRITE_MB_OFFSET, "sprite_Piece_height");		//plus 9 bits
// Begin: modified by Hughes	  4/9/98
		m_pbitstrmOut -> putBits (MARKER_BIT, MARKER_BIT, "Marker_Bit");
// End: modified by Hughes	  4/9/98
		m_pbitstrmOut -> putBits (m_iPieceXoffset, (UInt) NUMBITS_SPRITE_MB_OFFSET, "sprite_Piece_Xoffset");		//plus 9 bits
		m_pbitstrmOut -> putBits (m_iPieceYoffset, (UInt) NUMBITS_SPRITE_MB_OFFSET, "sprite_Piece_Yoffset");		//plus 9 bits
	}
}

CRct CVideoObjectEncoder::findTightBoundingBox (CVOPU8YUVBA* vopuc)
{
	const CRct& rctOrig =  vopuc -> whereY ();
	CoordI left = rctOrig.right - 1;
	CoordI top = rctOrig.bottom - 1;
	CoordI right = rctOrig.left;
	CoordI bottom = rctOrig.top;
	const PixelC* ppxlcBY = vopuc->pixelsBY ();
	for (CoordI y = rctOrig.top; y < rctOrig.bottom; y++) {
		for (CoordI x = rctOrig.left; x < rctOrig.right; x++) {
			if (*ppxlcBY != transpValue) {
				left = min (left, x);
				top = min (top, y);
				right = max (right, x);
				bottom = max (bottom, y);
			}								
			ppxlcBY++;
		}
	}
	right++;
	bottom++;
	if (left % 2 != 0)
		left--;
	if (top % 2 != 0)
		top--;

	return PieceExpand (CRct (left, top, right, bottom));
}

//  extend the rctOrg size to multiples of MBSize w.r.t. m_rctSptExp 
CRct CVideoObjectEncoder::PieceExpand (const CRct& rctOrg)
{
// Begin: modified by Hughes	  4/9/98
//	Int left = rctOrg.left ;	
//	Int right = rctOrg.right ;	
//	Int top = rctOrg.top ;	
//	Int bottom = rctOrg.bottom ;

	Int left = (rctOrg.left < m_rctSptExp.left) ? m_rctSptExp.left : rctOrg.left;	
	Int right = (rctOrg.right > m_rctSptExp.right) ? m_rctSptExp.right : rctOrg.right;
	Int top = (rctOrg.top < m_rctSptExp.top) ? m_rctSptExp.top : rctOrg.top;	
	Int bottom = (rctOrg.bottom > m_rctSptExp.bottom) ? m_rctSptExp.bottom : rctOrg.bottom;
// End: modified by Hughes	  4/9/98

	Int iMod = (left - m_rctSptExp.left) % MB_SIZE;
	if (iMod > 0)
		left -= iMod;
	iMod = (right - left) % MB_SIZE;
	if (iMod > 0)
		right += MB_SIZE - iMod;
	iMod = (top - m_rctSptExp.top) % MB_SIZE;
	if (iMod > 0)
		top -= iMod;
	iMod = (bottom - top) % MB_SIZE;
	if (iMod > 0)
		bottom += MB_SIZE - iMod;
	// for update pieces, skip the entire row of MBs if the cooresponding object piece if missing
	if (m_vopmd.SpriteXmitMode == UPDATE) {
		Int iMBX, iMBX_left, iMBX_right ;
		Int iMBY, iMBY_top, iMBY_bottom ;
		iMBX_left =  (left - m_rctSptExp.left) / MB_SIZE;
		iMBX_right =  (right - m_rctSptExp.left) / MB_SIZE;	
		iMBY_top =  (top - m_rctSptExp.top) / MB_SIZE;
		iMBY_bottom =  (bottom - m_rctSptExp.top) / MB_SIZE;
		for (iMBY = iMBY_top; iMBY < iMBY_bottom; iMBY++)	{
			for (iMBX = iMBX_left; iMBX < iMBX_right; iMBX++)	{
				if ( m_ppPieceMBstatus[iMBY][iMBX] != PIECE_DONE) {
					top = top  +  MB_SIZE;
					break;				
				}
			}
		}
		for (iMBY = iMBY_bottom-1; iMBY > iMBY_top; iMBY--)	{
			for (iMBX = iMBX_left; iMBX < iMBX_right; iMBX++)	{
				if ( m_ppPieceMBstatus[iMBY][iMBX] != PIECE_DONE) {
					bottom = bottom  -  MB_SIZE;
					break;				
				}
			}
		}
	}

	return CRct(left, top, right, bottom);
}

⌨️ 快捷键说明

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