使用directdraw切换表面实现实时视频播放的问题

physics1988 2010-08-24 02:32:48
现在在wm下实现实时监控播放,采用ddraw的方式,现在遇到的问题是,我的主页面blt我的离屏页面。希望有经验的兄弟帮忙看一下。
ddra的初始化代码如下

if (DirectDrawCreate(NULL,&(fb->dd_ptr),NULL) != DD_OK)
{
return false;
}

//设置协作层
if ((fb->dd_ptr)->SetCooperativeLevel(wnd_handle,DDSCL_NORMAL) != DD_OK)
{
return false;
}

//创建主表面
memset(&(fb->dds_desc), 0, sizeof(fb->dds_desc)) ;
(fb->dds_desc).dwSize = sizeof(fb->dds_desc) ;
(fb->dds_desc).dwFlags = DDSD_CAPS ;
(fb->dds_desc).ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
(fb->dds_desc).dwBackBufferCount = 1;
if( (fb->dd_ptr)->CreateSurface(&(fb->dds_desc), &(fb->dds_ptr), NULL) != DD_OK)
{
return false;
}
if ((fb->dd_ptr)->CreateClipper( 0, &(fb->pcClipper), NULL ) != DD_OK )
{
return false;
}

if( fb->pcClipper->SetHWnd( 0, wnd_handle ) != DD_OK )
{
fb->pcClipper->Release();
fb->pcClipper = NULL;
return FALSE;
}

if( fb->dds_ptr->SetClipper( fb->pcClipper ) != DD_OK )
{
fb->pcClipper->Release();
return FALSE;
}

// Done with clipper
fb->pcClipper->Release();

//创建离屏表面对象
DDSURFACEDESC ddsd;
HRESULT hRet;
memset(&ddsd, 0, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags =DDSD_WIDTH | DDSD_HEIGHT;
ddsd.ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY;
ddsd.ddpfPixelFormat.dwFlags = DDPF_RGB;
ddsd.ddpfPixelFormat.dwSize = sizeof(ddsd.ddpfPixelFormat);
ddsd.ddpfPixelFormat.dwRGBBitCount = 24;
ddsd.ddpfPixelFormat.dwRBitMask = 0xff0000;
ddsd.ddpfPixelFormat.dwGBitMask = 0xff00;
ddsd.ddpfPixelFormat.dwBBitMask = 0xff;
ddsd.dwHeight = src_height;
ddsd.dwWidth = src_width;
if( fb->dd_ptr->CreateSurface(&ddsd, &(fb->offScreensurface), NULL) != DD_OK)
return false;

对离屏表面写入rgb数据


DDInstance->offScreensurface->Lock(0, &(DDInstance->dds_desc), DDLOCK_WAITNOTBUSY, 0);
// DisplayYUV((unsigned int*)(DDInstance->), picture->data[0], picture->data[1], picture->data[2], c->width, c->height, picture->linesize[0], picture->linesize[1], 240);
// DDInstance->dds_back_ptr->
// DDInstance->dds_back_ptr->Blt(NULL, DDInstance->offScreensurface, NULL, DDBLT_ROP, &ddbltfx);
HDC hDC;
DDInstance->offScreensurface->GetDC(&hDC);
SetDIBitsToDevice(
hDC,
0,
0,
g_pBmpinfo->bmiHeader.biWidth, // source rectangle width
g_pBmpinfo->bmiHeader.biHeight, // source rectangle height
0, // x-coord of source lower-left corner
0, // y-coord of source lower-left corner
0, // first scan line in array
g_pBmpinfo->bmiHeader.biHeight, // number of scan lines
g_bufRGB, // array of DIB bits
(const struct tagBITMAPINFO*)g_pBmpinfo, // bitmap information
DIB_RGB_COLORS // RGB or palette indexes
);
DDInstance->offScreensurface->ReleaseDC(hDC);
DDInstance->offScreensurface->Unlock(0);

显示数据到主表面

EZFB_LOCK(DDInstance);
DDInstance->dds_ptr->Blt(&dstRect,DDInstance->offScreensurface,&src_rect,NULL,NULL);
EZFB_UNLOCK(DDInstance);

现在的问题是,整个屏幕一直没有变化
解码是确定没有问题的
...全文
150 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
smilestone322 2011-06-10
  • 打赏
  • 举报
回复
SetDIBitsToDevice 你既然使用了它,就直接采用GDI显示得了

7,655

社区成员

发帖
与我相关
我的任务
社区描述
Windows Phone是微软发布的一款手机操作系统,它将微软旗下的Xbox LIVE游戏、Zune音乐与独特的视频体验整合至手机中。
社区管理员
  • Windows客户端开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧