📄 videorendereroverlay2.cpp
字号:
/*
///////////////////////////////////////////////////////////////////////////////
// //
// Copyright (C) 2006-2008 Beijing, pengzhen (pengzhenxp@yahoo.com.cn) //
// //
///////////////////////////////////////////////////////////////////////////////
*/
//#ifndef __WINCE__
#ifndef MPEG4D_API
extern void* Get_PhysicalAddress(void* lpLogAddr ) ;
extern void* Get_LogicalAddress(void* PhyAdd , int PhyAddSize ) ;
#endif //MPEG4D_API
//#endif //__WINCE__
#ifdef BT848_API
extern COLORREF Winbt_GetColorkey() ;
#define GetColorkey Winbt_GetColorkey
#define GetOverlayFormats() m_ddpfOverlayFormats[0]
#endif //BT848_API
#ifdef SAA7130_API
extern COLORREF Winbt_GetColorkey() ;
#define GetColorkey Winbt_GetColorkey
#define GetOverlayFormats() m_ddpfOverlayFormats[1]
#endif //SAA7130_API
#ifdef TM1300_API
extern COLORREF WinTm_GetColorkey() ;
#define GetColorkey WinTm_GetColorkey
#define GetOverlayFormats() m_ddpfOverlayFormats[1]
#endif //TM1300_API
#ifdef MPEG4D_API
extern COLORREF Winbt_GetColorkey() ;
#define GetColorkey Winbt_GetColorkey
#define GetOverlayFormats() m_ddpfOverlayFormats[0]
#endif //MPEG4D_API
//#define __YUV420P__
#ifdef __YUV420P__
#undef GetOverlayFormats
#define GetOverlayFormats() m_ddpfOverlayFormats[2] //YUV420 planar
#endif //YUV420
BOOL MediaVideoRendererOverlay::GetRGBFormat()
{
HRESULT ddrval;
DDSURFACEDESC2 lp_ddsd;
SAFE_RELEASE( lpddsOverlay ); // free
ZeroMemory(&lp_ddsd, sizeof(DDSURFACEDESC2));
lp_ddsd.dwSize = sizeof(DDSURFACEDESC2);
lp_ddsd.dwWidth = 352;
lp_ddsd.dwHeight = 288;
lp_ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH ;
lp_ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN ;
ddrval = lpdd->CreateSurface(&lp_ddsd, &lpddsOverlay, NULL);
if( (FAILED(ddrval) ) ) { /*SAFE_RELEASE( lpddsOverlay );*/ return FALSE ; }
ZeroMemory( &lp_ddsd, sizeof(lp_ddsd) );
lp_ddsd.dwSize = sizeof(lp_ddsd);
ddrval = lpddsOverlay->Lock(NULL, &lp_ddsd,
DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT , NULL) ;
if( (FAILED(ddrval) ) ) { SAFE_RELEASE( lpddsOverlay ); return FALSE ; }
lpddsOverlay->Unlock(NULL);
m_iRGBBitCount = lp_ddsd.ddpfPixelFormat.dwRGBBitCount ;
m_iColorFormat = CF_RGB32 ;
switch( lp_ddsd.ddpfPixelFormat.dwRGBBitCount )
{
case 16 : m_iColorFormat = ( lp_ddsd.ddpfPixelFormat.dwRBitMask == 0xF800 ||
lp_ddsd.ddpfPixelFormat.dwGBitMask == 0x07E0 ||
lp_ddsd.ddpfPixelFormat.dwBBitMask == 0x001F ) ?
CF_RGB16 : CF_RGB15 ; break ;
case 24 : m_iColorFormat = CF_RGB24 ; break ;
//case 32 : m_iColorFormat = CF_RGB32 ; break ;
}
#ifdef __YUV__
m_pack_yuv422 = dvp_pack_yuv422( MPV_CSP_RGB32 ) ;
switch( m_iColorFormat )
{
case CF_RGB15 : m_pack_yuv422 = dvp_pack_yuv422( MPV_CSP_RGB555 ) ; break ;
case CF_RGB16 : m_pack_yuv422 = dvp_pack_yuv422( MPV_CSP_RGB565 ) ; break ;
case CF_RGB24 : m_pack_yuv422 = dvp_pack_yuv422( MPV_CSP_RGB24 ) ; break ;
//case CF_RGB32 : m_pack_yuv422 = dvp_pack_yuv422( MPV_CSP_RGB32 ) ; break ;
}
#endif //__YUV__
SAFE_RELEASE( lpddsOverlay );
return TRUE;
}
BOOL MediaVideoRendererOverlay::GetSurfaceAddress( BOOL iSurfacePhyAddress )
{
HRESULT ddrval ;
DDSURFACEDESC2 lp_ddsd;
if( lpddsOverlay==NULL ) return FALSE ;
ZeroMemory( &lp_ddsd, sizeof(lp_ddsd) );
lp_ddsd.dwSize = sizeof(lp_ddsd);
ddrval = lpddsOverlay->Lock(NULL, &lp_ddsd,
DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT , NULL) ;
if( (FAILED(ddrval) ) /*| (lpSurf==NULL)*/ ) return FALSE ;
lpddsOverlay->Unlock(NULL);
if( iSurfacePhyAddress )
{
m_pitch = lp_ddsd.lPitch ;
m_pSurfaceAddress = (void*)(lp_ddsd.lpSurface) ;
//#ifndef __WINCE__
#ifndef MPEG4D_API
m_pSurfacePhyAddress = Get_PhysicalAddress( (void*)(lp_ddsd.lpSurface) ) ;
//m_pSurfaceAddress = Get_LogicalAddress(m_pSurfacePhyAddress ,
// lp_ddsd.dwHeight * m_pitch + 64*1024 );
#endif //MPEG4D_API
//#endif //__WINCE__
memset(m_pSurfaceAddress,0x00, lp_ddsd.lPitch*lp_ddsd.dwHeight );
}
if( m_bIsOverlayRGBFlag )
{
m_vidWidth1 = lp_ddsd.dwWidth * (lp_ddsd.ddpfPixelFormat.dwRGBBitCount>>3) ;
#ifdef __YUV__
m_vidWidth1 = ( lp_ddsd.dwWidth << 1 ) ;
#endif //__YUV__
}
return TRUE ;
}
/*
* Check for Overlay Support
*
*/
BOOL AreOverlaysSupported(LPDIRECTDRAW_PTR lpdd )
{
HRESULT ddrval;
DDCAPS capsDrv;
/* Get driver capabilities to
* determine Overlay support.
*/
ZeroMemory(&capsDrv, sizeof(DDCAPS));
capsDrv.dwSize = sizeof(DDCAPS);
ddrval = lpdd->GetCaps(&capsDrv, NULL);
if (FAILED(ddrval)) return FALSE;
/* Does the driver support overlays in the current mode?
* Overlay related APIs will fail without hardware support.
*/
return (!(capsDrv.dwCaps & DDCAPS_OVERLAY)) ? FALSE : TRUE;
}
/*
* Create Pdd
*/
BOOL MediaVideoRendererOverlay::CreatePdd()
{
HRESULT ddrval;
#ifdef __WINCE__
LPDIRECTDRAW pDD = NULL ;
ddrval = DirectDrawCreate(NULL, &pDD, NULL);
if( FAILED(ddrval)) { return FALSE ; }
ddrval = pDD->QueryInterface(IID_IDirectDraw_IID, (LPVOID*)&lpdd );
if( FAILED(ddrval)) { SAFE_RELEASE(pDD); return FALSE ; }
SAFE_RELEASE(pDD);
#else
ddrval = DirectDrawCreateEx(NULL, (VOID**)&lpdd, IID_IDirectDraw_IID, NULL);
if( FAILED(ddrval)) return FALSE;
#endif //__WINCE__
/*
* Check for Overlay Support
*/
//if( ! AreOverlaysSupported( lpdd ) ) return FALSE;
/*
* Set Normal Cooperative Mode
*/
ddrval = lpdd->SetCooperativeLevel(NULL, DDSCL_NORMAL);
return ( SUCCEEDED(ddrval) ) ? TRUE : FALSE ;
}
/*
* Create Primary
*/
BOOL MediaVideoRendererOverlay::CreatePrimary()
{
HRESULT ddrval;
DDSURFACEDESC2 lp_ddsd;
ZeroMemory(&lp_ddsd, sizeof(DDSURFACEDESC2));
lp_ddsd.dwSize = sizeof(DDSURFACEDESC2);
lp_ddsd.dwFlags = DDSD_CAPS;
lp_ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_VIDEOMEMORY ;
//lp_ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE ;
ddrval = lpdd->CreateSurface(&lp_ddsd, &lpddsPrimary, NULL );
return ( SUCCEEDED(ddrval) ) ? TRUE : FALSE ;
}
/*
* Create Overlay
*/
BOOL MediaVideoRendererOverlay::CreateOverlay(int width, int height)
{
HRESULT ddrval;
DDSURFACEDESC2 lp_ddsd;
SAFE_RELEASE( lpddsOverlay ); // free
ZeroMemory(&lp_ddsd, sizeof(DDSURFACEDESC2));
lp_ddsd.dwSize = sizeof(DDSURFACEDESC2);
lp_ddsd.lPitch = width*2;
lp_ddsd.dwWidth = width;
lp_ddsd.dwHeight = height;
#ifdef __YUV420P__
if( !m_bIsOverlayRGBFlag ) lp_ddsd.lPitch = width; //YUV420 planar
#endif //__YUV420P__
lp_ddsd.dwFlags = DDSD_CAPS | DDSD_PIXELFORMAT | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PITCH ;
lp_ddsd.ddsCaps.dwCaps = DDSCAPS_OVERLAY | DDSCAPS_VIDEOMEMORY ;
if( m_bIsOverlayRGBFlag )
{
#ifdef __YUV__
lp_ddsd.ddsCaps.dwCaps = DDSCAPS_VIDEOMEMORY ;
lp_ddsd.ddpfPixelFormat = GetOverlayFormats() ;
#else
lp_ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH ;
lp_ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN ;
#endif //__YUV__
}
else
{
//lp_ddsd.ddpfPixelFormat = m_ddpfOverlayFormats[0];
lp_ddsd.ddpfPixelFormat = GetOverlayFormats() ;
}
ddrval = lpdd->CreateSurface(&lp_ddsd, &lpddsOverlay, NULL);
//m_pitch = lp_ddsd.dwWidth*2 ;
//m_pitch = lp_ddsd.lPitch ;
GetSurfaceAddress();
return ( SUCCEEDED(ddrval) ) ? TRUE : FALSE ;
}
void MediaVideoRendererOverlay::ConvertGDIColor( COLORREF dwGDIColor )
{
COLORREF rgbT;
HDC hdc;
DWORD dw = CLR_INVALID;
HRESULT hr;
DDSURFACEDESC2 lp_ddsd = { 0 } ;
// Use GDI SetPixel to color match for us
if( dwGDIColor != CLR_INVALID )
if( lpddsPrimary->GetDC(&hdc) == DD_OK)
{
rgbT = GetPixel(hdc, 0, 0); // Save current pixel value
SetPixel(hdc, 0, 0, dwGDIColor); // Set our value
lpddsPrimary->ReleaseDC(hdc);
}
// Now lock the surface so we can read back the converted color
//ZeroMemory( &lp_ddsd, sizeof(lp_ddsd) );
lp_ddsd.dwSize = sizeof(lp_ddsd);
hr = lpddsPrimary->Lock( NULL, &lp_ddsd, DDLOCK_WAIT, NULL );
if( hr == DD_OK)
{
dw = *(DWORD *) lp_ddsd.lpSurface;
if( lp_ddsd.ddpfPixelFormat.dwRGBBitCount < 32 ) // Mask it to bpp
dw &= ( 1 << lp_ddsd.ddpfPixelFormat.dwRGBBitCount ) - 1;
lpddsPrimary->Unlock(NULL);
}
// Now put the color that was there back.
if( dwGDIColor != CLR_INVALID && lpddsPrimary->GetDC(&hdc) == DD_OK )
{
SetPixel( hdc, 0, 0, rgbT );
lpddsPrimary->ReleaseDC(hdc);
}
m_ovfx.dckDestColorkey.dwColorSpaceLowValue = dw;
m_ovfx.dckDestColorkey.dwColorSpaceHighValue = dw;
//m_ovfx.dckSrcColorkey.dwColorSpaceLowValue = dw;
//m_ovfx.dckSrcColorkey.dwColorSpaceHighValue = dw;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -