游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3091|回复: 1

DirectDraw Yuv overlay?????????????

[复制链接]

1

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2011-6-11 10:03:00 | 显示全部楼层 |阅读模式
?????????yuv overlay?MFC??????????????????????MFC???????????????????????????????picture????????????????????????????????????????????????????????????????????picture????????????????????yuv overlay ????????????????????
?????


(1)yuv overlay ?????mfc?picture???????????????yuv overlay????????picture?????????????

(2)???????????MFC??????????yuv overlay???????????????MFC?????????????overlay???????????????

(3)????????????????????????????yuv overlay????????????

??????UpdateOverlay????????
//???????
HRESULT CDirectDrawSurface:irectDrawInit(HWND hWnd, int width, int height)
{

HRESULT hr=S_FALSE;
hr=CoInitialize(0);
DDSURFACEDESC2 ddsd;

//store width, height   
m_width = width;
m_height = height;

hr = CoCreateInstance(CLSID_DirectDraw,
NULL, CLSCTX_ALL, IID_IDirectDraw7, (LPVOID *)&m_lpDD);

if(!FAILED(hr))
hr = IDirectDraw7_Initialize(m_lpDD, NULL);
if (hr!=DD_OK)
{
printf("create directdraw object failed\n");
}

if(m_lpDD->SetCooperativeLevel(m_hWnd,DDSCL_NORMAL)!=DD_OK)
return S_FALSE;

memset( &ddsd, 0, sizeof(DDSURFACEDESC2) );
ddsd.dwSize = sizeof(DDSURFACEDESC2);
ddsd.dwFlags = DDSD_CAPS;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;

// The primary surface is not a page flipping surface this time
hr = m_lpDD->CreateSurface( &ddsd, &m_lpDDSPrimary, NULL );  

if (hr!=DD_OK)
{
printf("create directdraw surface failed\n");
}
else
{
DDCAPS capsDrv;   
memset(&capsDrv,0,sizeof(capsDrv));   
capsDrv.dwSize=sizeof(DDCAPS);   
hr=m_lpDD-> GetCaps(&capsDrv,NULL);   
if(hr==DD_OK && (capsDrv.dwCaps & DDCAPS_OVERLAY))   
{ // determine Overlay support.   
DDPIXELFORMAT PixelFormat[] = {   
//{ sizeof(DDPIXELFORMAT), DDPF_FOURCC, FOURCC_YV12, 0, 0, 0, 0, 0 }, // YV12   
//{ sizeof(DDPIXELFORMAT), DDPF_FOURCC, FOURCC_Y411, 0, 0, 0, 0, 0 }, // Y411   
{ sizeof(DDPIXELFORMAT), DDPF_FOURCC, FOURCC_YUY2, 0, 0, 0, 0, 0 }, // YUY2   
{ sizeof(DDPIXELFORMAT), DDPF_FOURCC, FOURCC_UYVY, 0, 0, 0, 0, 0 } // UYVY   
};   

int i, nPixelFormat=sizeof(PixelFormat)/sizeof(DDPIXELFORMAT);   

//??????   
ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT;   
ddsd.ddsCaps.dwCaps = DDSCAPS_OVERLAY|DDSCAPS_VIDEOMEMORY; // Overlay related APIs will fail without hardware support.   
ddsd.dwWidth=1628;   
ddsd.dwHeight=1236;   
for(i=0;i <nPixelFormat;i++)   
{   
memcpy(&ddsd.ddpfPixelFormat,&ampixelFormat,sizeof(DDPIXELFORMAT));   

hr=m_lpDD-> CreateSurface(&ddsd,&m_lpDDSOverlay,NULL);   
if(hr==DD_OK) {   
char tmpBuf[256];   
sprintf(tmpBuf, "???%d?OVERLAY???? ! ",i);   
::MessageBox(NULL,tmpBuf, "DirectDraw??? ",MB_ICONINFORMATION);   
break;   
}   
}
}

}


if ((hr = m_lpDD->CreateClipper(0, &m_lpClipper, NULL)) != DD_OK ||
(hr = m_lpClipper->SetHWnd(0, hWnd) ) != DD_OK ||
(hr = m_lpDDSPrimary->SetClipper(m_lpClipper) ) != DD_OK)
{
if (m_lpDDSPrimary != NULL)
{
m_lpDDSPrimary->Release();
m_lpDDSPrimary = NULL;
}
m_hWnd = hWnd;
return DD_OK;
}

m_hWnd = hWnd;

return hr;
}

//UpdateOverlay?????????
RECT PicRect,ScreenRect; //???????????;
HRESULT CDirectDrawSurface::DrawYuvToOverlaySurface(RECT ScreenRect,BYTE *YuvBuf,int width,int height)
{
BYTE *pSurf;
DDSURFACEDESC2 ddsd;
memset(&ddsd,0,sizeof(ddsd));
ddsd.dwSize=sizeof(ddsd);
  POINT p = {0, 0};

TRACE("lpitch%d\n",ddsd.lPitch);
GetClientRect(m_hWnd, &ScreenRect);
ClientToScreen(m_hWnd, &p);
OffsetRect(&ScreenRect, p.x, p.y);


if(FAILED(m_lpDDSOverlay->Lock(NULL,&ddsd,DDLOCK_SURFACEMEMORYPTR|DDLOCK_WAIT,NULL)))
return S_FALSE; //??DirectDraw??;

pSurf=(LPBYTE)ddsd.lpSurface; //??Overlay????????????;

if (pSurf)
{
int i;
for (i=0;i<height;i++)
{
memcpy(pSurf,YuvBuf,ddsd.dwWidth*2);
YuvBuf+=ddsd.dwWidth*2;
pSurf+=ddsd.lPitch;
}
}

//????YUV2???
m_lpDDSOverlay->Unlock(NULL); //???DirectDraw?????;

PicRect.bottom=1236;
PicRect.right=1628;
PicRect.left=0;
PicRect.top=0;

/*
GetClientRect(&ScreenRect); //?????????????;
ClientToScreen((LPPOINT)&ScreenRect.left);
ClientToScreen((LPPOINT)&ScreenRect.right); //???????????;
*/

m_lpDDSOverlay->UpdateOverlay(&PicRect,m_lpDDSPrimary,&ScreenRect,DDOVER_SHOW,NULL); //?????? DDOVER_KEYDESTOVERRIDE

return DD_OK;
};

??????????

1

主题

51

帖子

72

积分

注册会员

Rank: 2

积分
72
发表于 2011-6-13 09:49:00 | 显示全部楼层

Re: DirectDraw Yuv overlay?????????????

?????????????.
??,??????Overlay?????????.??????.Overlay???10??????,???GDI/DiectDraw???????????,MS????????????.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-8-7 22:30

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表