使用directdraw切换表面实现实时视频播放的问题
现在在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);现在的问题是,整个屏幕一直没有变化
解码是确定没有问题的
...全文
相关推荐
Qt+DirectDraw实现
Qt+DirectDraw实现 参考链接: http://blog.csdn.net/ajaxhe/article/details/7532273
DirectDraw全屏显示BMP图片:双缓冲翻转机制与实现详解
在图形界面开发中,画面闪烁与绘制效率是长期存在的痛点。GDI通过BitBlt逐像素拷贝到窗口DC,受CPU内存带宽限制;而DirectDraw作为早期DirectX的2D接口,直接将表面置于显存,并通过表面翻转实现高效双缓冲。其核心概念是主表面、后备表面与离屏表面:离屏表面存放BMP素材,后备表面负责合成,Flip一次即可无撕裂切换显示。这套机制不仅适用于老式工控机、广告机的全屏启动画面,也为理解显卡显存管理和帧缓冲提供底层视角。本文基于DirectDraw7,给出一个在VC 6环境下从创建DDraw对象、
DirectDraw绘制YUV数据
源代码为VC6.0工程,用于实验DirectDraw绘制一帧YUV(420)即YV12数据。
如何使用DirectDraw直接显示YUV视频数据
本文介绍了如何使用DirectDraw技术直接显示YUV视频数据,以及一些程序
DriectX7中DIRECTDRAW的32位离屏表面加载24位位图的C++代码
DriectX7中DIRECTDRAW的32位离屏表面加载24位位图的C++代码 注意位图与离屏表面必须有相同的长宽,以像素为单位


