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

physics1988 physics1988 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
现在在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);

现在的问题是,整个屏幕一直没有变化
解码是确定没有问题的
...全文

相关推荐

评论 2
收藏 已收藏
分享
返回顶部