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

📄 videorendereroverlay3.cpp

📁 ZPAV (H265) PC(X86) demo ZPAV (H265) 是 音视频 压缩解压 协议
💻 CPP
字号:


/*
///////////////////////////////////////////////////////////////////////////////
//                                                                           //
//   Copyright (C) 2006-2008  Beijing,  pengzhen (pengzhenxp@yahoo.com.cn)   //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////
*/

BOOL MediaVideoRendererOverlay::SetDrawRect(HWND hwnd , int wHWCardNo ) 
{

	if( hwnd ) m_hWnd = hwnd ;
	
	m_iCurCardOverlayNo_Bak = m_iCurCardOverlayNo = wHWCardNo ;

	//if( !( m_hWnd ) ) return FALSE ;

	GetWindowRect(m_hWnd, &m_rdRect );  
	
	//if( m_bIsOverlayFlag )
	{
		Get_rdRect_op() ;
		
#ifdef __INSERT_FONT__
		SetFontPos( ) ; //InvalidateFont() ; 
#endif //__INSERT_FONT__
	}

	if( m_bIsOverlayFlag || m_bIsOverlayRGBFlag )
	{	
		lpdd->RestoreAllSurfaces();

		if( SUCCEEDED( lpddClipper->SetHWnd(0, m_hWnd) ) ) 
		{
				lpddsPrimary->SetClipper( lpddClipper ); 
		}
		
		if(m_bIsOverlayFlag) ConvertGDIColor( GetColorkey() ) ;
	}
 
	return TRUE ;

}

void MediaVideoRendererOverlay::Draw()
{

	if( m_bIsOverlayFlag ) 
	{
	
		//m_pdd->RestoreAllSurfaces();  

		m_pddsOverlay->UpdateOverlay(NULL, m_pddsPrimary, 
			                         NULL, DDOVER_HIDE, NULL);

		m_pdd->RestoreAllSurfaces();   
	}
	
}
 

void MediaVideoRendererOverlay::GetData( BYTE *dst, BYTE *src ) 

{

	if( m_bIsOverlayRGBFlag ) 
	{
		if( m_vidWidth1 == m_pitch )
		fast_memcpy( dst, (BYTE*)m_pSurfaceAddress, m_pitch * m_vidHeight ) ; 
		else
		fast_memcpy1( dst, m_vidWidth1, (BYTE*)m_pSurfaceAddress, m_pitch, m_vidWidth1, m_vidHeight ) ;
	}
	else
	{ 
		fast_memcpy1( dst, m_vidWidth1, src, m_pitch, m_vidWidth1, m_vidHeight ) ;
	}

}


void MediaVideoRendererOverlay::Draw(BYTE *src, BYTE* lpTextContext, int iTexWidth, int iTexHeight )
{

	if( m_pddsPrimary->Blt( &m_rdRect, m_pddsOverlay, 
		                    &m_rsRect, DDBLT_ASYNC | DDBLT_DONOTWAIT, NULL) == DDERR_SURFACELOST ) 
	{
		m_pdd->RestoreAllSurfaces();  GetSurfaceAddress();
	}
	else 
	{

		fast_mem_or( (BYTE*)src , m_vidWidth1 , lpTextContext, iTexWidth , iTexWidth , iTexHeight );

		if( m_vidWidth1 == m_pitch )
			fast_memcpy( (BYTE*)m_pSurfaceAddress, src , m_pitch * m_vidHeight ) ;
		else
			fast_memcpy1( (BYTE*)m_pSurfaceAddress, m_pitch, src , m_vidWidth1, m_vidWidth1, m_vidHeight ) ;
		
		//if( lpTextContext )
		//fast_mem_or( (BYTE*)m_pSurfaceAddress , m_pitch , lpTextContext, iTexWidth , iTexWidth , iTexHeight );
		
	}
	
}

void MediaVideoRendererOverlay::Draw( BYTE* lpTextContext, int iTexWidth, int iTexHeight )
{
					
	if( m_pddsPrimary->Blt( &m_rdRect, m_pddsOverlay, 
		                    &m_rsRect, DDBLT_ASYNC | DDBLT_DONOTWAIT, NULL) == DDERR_SURFACELOST ) 
	{
		m_pdd->RestoreAllSurfaces();  GetSurfaceAddress();
	}
	else 
	{

		//if( lpTextContext )
		fast_mem_or( (BYTE*)m_pSurfaceAddress , m_pitch , lpTextContext, iTexWidth , iTexWidth , iTexHeight );
		
	}
	
}

void MediaVideoRendererOverlay::Draw( int iCurCardNo, BYTE** lpDPhyAdr )
{
					
	if( m_pddsPrimary->Blt( &m_rdRect, m_pddsOverlay, 
		                    &m_rsRect, DDBLT_ASYNC | DDBLT_DONOTWAIT, NULL) == DDERR_SURFACELOST ) 
	{
		m_pdd->RestoreAllSurfaces();  GetSurfaceAddress(); *lpDPhyAdr = (BYTE*)m_pSurfacePhyAddress;
	}
}

void MediaVideoRendererOverlay::Draw(int iCurCardNo , BYTE *dst, BYTE *src ) 
{
	
	if( m_bIsOverlayRGBFlag )
	{
		
		if( m_pddsPrimary->Blt( &m_rdRect, m_pddsOverlay, 
			                    &m_rsRect, DDBLT_ASYNC | DDBLT_DONOTWAIT, NULL) == DDERR_SURFACELOST ) 
		{
			m_pdd->RestoreAllSurfaces();  GetSurfaceAddress();
		}
		else 
		{
			if( m_vidWidth1 == m_pitch )
	        fast_memcpy( (BYTE*)m_pSurfaceAddress, src , m_pitch * m_vidHeight ) ;
	        else
	        fast_memcpy1( (BYTE*)m_pSurfaceAddress, m_pitch, src , m_vidWidth1, m_vidWidth1, m_vidHeight ) ;
		}
		
	}
	else
	{
		
		fast_memcpy1( dst, m_pitch, src, m_vidWidth1, m_vidWidth1, m_vidHeight ) ; 

		if( iCurCardNo == m_iCurCardOverlayNo )
		{		
			//m_pdd->RestoreAllSurfaces();  
			
			m_pddsOverlay->UpdateOverlay( &m_rsRect_op, m_pddsPrimary, 
				                          &m_rdRect_op, m_dwUpdateFlags, &m_ovfx );
			
		}
		
	}
	
}


void MediaVideoRendererOverlay::Draw( int iCurCardNo ) 

{

	if( m_bIsOverlayRGBFlag )
	{
		
		if( m_pddsPrimary->Blt( &m_rdRect, m_pddsOverlay, 
			                    &m_rsRect, DDBLT_ASYNC | DDBLT_DONOTWAIT, NULL) == DDERR_SURFACELOST ) 
		{
			m_pdd->RestoreAllSurfaces();  GetSurfaceAddress();
		}
		
	}
	else
	{
		
		if( iCurCardNo == m_iCurCardOverlayNo )
		{
			
#ifdef __YUV420P__
			if( ! GetSurfaceAddress( FALSE ) ) //YUV420 planar  
			{ 
				m_pdd->RestoreAllSurfaces();  return ;
			}
#else // !__YUV420P__
			//m_pdd->RestoreAllSurfaces(); 
#endif //__YUV420P__
			
			m_pddsOverlay->UpdateOverlay( &m_rsRect_op, m_pddsPrimary, 
				                          &m_rdRect_op, m_dwUpdateFlags, &m_ovfx );
		}
		
	}

}



#ifdef MPEG4D_API

void MediaVideoRendererOverlay::Draw(int iCurCardNo, dvp_ctx* lpVideoDec , pack_yuv420_function convert_yuv) 

{

	if( m_bIsOverlayRGBFlag )
	{
		
		if( m_pddsPrimary->Blt( &m_rdRect, m_pddsOverlay, 
			                    &m_rsRect, DDBLT_ASYNC | DDBLT_DONOTWAIT, NULL) == DDERR_SURFACELOST ) 
		{
			m_pdd->RestoreAllSurfaces();  GetSurfaceAddress();
		}
		else
		{
			if( convert_yuv ) 
			convert_yuv( (unsigned char*)lpVideoDec->i420_y, lpVideoDec->width, \
		                 (unsigned char*)lpVideoDec->i420_u, \
				         (unsigned char*)lpVideoDec->i420_v, (lpVideoDec->width>>1),\
				         (unsigned char*)m_pSurfaceAddress, lpVideoDec->width,lpVideoDec->height, m_pitch ) ;
		}
		
	}
	else
	{
		
		if( iCurCardNo == m_iCurCardOverlayNo )
		{
			
#ifdef __YUV420P__
			if( ! GetSurfaceAddress( FALSE ) ) //YUV420 planar  
			{ 
				m_pdd->RestoreAllSurfaces();  return ;
			}
#else // !__YUV420P__
			//m_pdd->RestoreAllSurfaces(); 
#endif //__YUV420P__
			
			m_pddsOverlay->UpdateOverlay( &m_rsRect_op, m_pddsPrimary, 
				                          &m_rdRect_op, m_dwUpdateFlags, &m_ovfx );
		}
		
	}

}
#endif //MPEG4D_API



void MediaVideoRendererOverlay::GetDrawRect( ) 
{

	int i , cy , cx  ;

	for ( i=0 ; i < m_iTotalCard ; i++)
	{ 
		cy = i / m_iCardNo_CX ; 
	    cx = i - cy*m_iCardNo_CX ;

		m_rsRect_bak[i].left =  cx*m_vidWidth ;
		m_rsRect_bak[i].top  =   cy*m_vidHeight ;

		m_rsRect_bak[i].right   =  m_rsRect_bak[i].left+ m_vidWidth*m_iScroll_CX  ;
		m_rsRect_bak[i].bottom  =  m_rsRect_bak[i].top + m_vidHeight*m_iScroll_CY ;

	}

}


#define Def_GetCurCardNo() (int)((lpPos.y/m_rdHei)*m_iCardNo_CY + lpPos.x/m_rdWid + m_iScrollPageNo_Bak) 


WORD MediaVideoRendererOverlay::GetCurCardNo( POINT lpPos )  
{

	WORD wHWCardNo = Def_GetCurCardNo() ;  

	return ( wHWCardNo < m_iTotalCard ) ? wHWCardNo : 0 ; 
}

WORD MediaVideoRendererOverlay::SetCurCardFullWin( POINT lpPos ) 
{

	WORD wHWCardNo = Def_GetCurCardNo() ;

	return SetCurCardFullWin1(  wHWCardNo ) ;

}


WORD MediaVideoRendererOverlay::SetCurCardFullWin1( int wHWCardNo )
{

	if( wHWCardNo >= m_iTotalCard ) return 0 ; 

	if( ( m_iScroll_CX == 1 ) & ( m_iScroll_CY == 1 ) ) return wHWCardNo ; // always full windows 

	m_iCurCardFullFlag = ! m_iCurCardFullFlag ;

	if( m_iCurCardFullFlag )
	{

		m_iCurCardOverlayNo_Bak = m_iCurCardOverlayNo;
		m_iCurCardOverlayNo = wHWCardNo - m_iScrollPageNo_Bak ;	
		
		int cy , cx  ;
		
		cy = wHWCardNo / m_iCardNo_CX ; 
		cx = wHWCardNo - cy*m_iCardNo_CX ;
		
		m_rsRect_op.left =  cx*m_vidWidth ;
		m_rsRect_op.top  =   cy*m_vidHeight ;
		
		m_rsRect_op.right   =  m_rsRect_op.left+ m_vidWidth  ;
		m_rsRect_op.bottom  =  m_rsRect_op.top + m_vidHeight ;

#ifdef __INSERT_FONT__
		SetFontPos( ) ; InvalidateFont() ; 
#endif //__INSERT_FONT__
			
	}
	else
	{
		m_iCurCardOverlayNo = m_iCurCardOverlayNo_Bak ;

		m_rsRect_op =  m_rsRect_bak[ m_iCurCardOverlayNo_Bak  ]   ;

#ifdef __INSERT_FONT__
		SetFontPos( ) ; // InvalidateFont() ; 
#endif //__INSERT_FONT__

	}


	return wHWCardNo ;
}


#ifdef __INSERT_FONT__

void MediaVideoRendererOverlay::InvalidateFont()
{

	RECT lpRect={0};

	lpRect.right =  m_rdRect.right -  m_rdRect.left ;
	lpRect.bottom = m_rdRect.bottom -  m_rdRect.top ;
		
	if(m_hWnd) InvalidateRect(m_hWnd, &lpRect, FALSE );

}

void MediaVideoRendererOverlay::SetFontPos( )
{
	
	int wid , hei ;
	
	wid = ( m_rdRect.right -  m_rdRect.left ) / m_iScroll_CX ;
	hei = ( m_rdRect.bottom -  m_rdRect.top ) / m_iScroll_CY;
	
	memset(m_pFontView, 0 , sizeof(BOOL)*m_iTotalCard );
	
	for ( int cy=0 ; cy < m_iScroll_CY ; cy++)
	{
		for ( int cx=0 ; cx < m_iScroll_CX ; cx++)
		{
			int i  = cx + cy*m_iCardNo_CX  + m_iScrollPageNo_Bak ;
			
			if( m_iCurCardFullFlag )
			{
				m_pFontPos[i].x =   0 ;
				m_pFontPos[i].y =   0 ;
			}
			else
			{
				m_pFontPos[i].x =  cx*wid ;
				m_pFontPos[i].y =  cy*hei ;
			}
			
			m_pFontView[i] =  (m_iCurCardFullFlag==FALSE) |
				            ( (m_iCurCardFullFlag==TRUE) & (i ==m_iCurCardOverlayNo+m_iScrollPageNo_Bak) )  ;
		}
	}
	
	
}


void MediaVideoRendererOverlay::DrawText( int iCardNo , 
										  TCHAR* lpText , COLORREF dwTextColor )
{
	
	if( !m_pFontView[iCardNo] ) return ;
	
	HDC hDC ;
	
	hDC = ::GetDC(m_hWnd) ;
	SetBkColor( hDC, GetColorkey() ); 	
	SetTextColor( hDC, dwTextColor ); 
	TextOut( hDC, m_pFontPos[iCardNo].x, m_pFontPos[iCardNo].y, lpText, strlen(lpText) ); 	
	ReleaseDC(m_hWnd, hDC ); 

}

#endif //__INSERT_FONT__


⌨️ 快捷键说明

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