现在在wm下实现实时监控播放,采用ddraw的方式,现在遇到的问题是,我的主页面blt我的离屏页面。希望有经验的兄弟帮忙看一下。
ddra的初始化代码如下
对离屏表面写入rgb数据
显示数据到主表面
现在的问题是,整个屏幕一直没有变化
解码是确定没有问题的
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);
现在的问题是,整个屏幕一直没有变化
解码是确定没有问题的