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

现在在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);

现在的问题是,整个屏幕一直没有变化
解码是确定没有问题的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值