directdraw显示yuv视频,出现屏保时,yuv显示不出来,表面丢失

简介: 原因是: DDrawSurface 丢失, DDraw表面在很多情况下都会丢失(如:启动其他全屏独占程序,屏保,或锁屏时), 表面丢失其实就是表面所使用的内存或显存被DirectDraw系统释放, 分配给其他程序. 如果表面丢失, 对此表面的操作都会返回 DDERR_SURFACELOST , 此时应该调用 IDirectDrawSurface 接口方法 Restore 来恢复表面(重新申请内存或显存)。

原因是:

DDrawSurface 丢失, DDraw表面在很多情况下都会丢失(如:启动其他全屏独占程序,屏保,或锁屏时), 表面丢失其实就是表面所使用的内存或显存被DirectDraw系统释放, 分配给其他程序. 如果表面丢失, 对此表面的操作都会返回 DDERR_SURFACELOST , 此时应该调用 IDirectDrawSurface 接口方法 Restore 来恢复表面(重新申请内存或显存)。

 

伪代码如下:

hr = m_lpDDSOffscreen->Lock(rcDest,&ddsd,DDLOCK_SURFACEMEMORYPTR|DDLOCK_WAIT,NULL);


if (hr==DDERR_SURFACELOST) 

hr = m_lpDDSOffscreen->Restore(); 
hr = m_lpDDSOffscreen->Lock(rcDest,&ddsd,DDLOCK_WAIT,NULL); 


 if (FAILED(hr))
 {
  return DD_FALSE;
 }

 

//将数据拷贝到离屏表面,然后使用blt块传输到主表面

 

 HRESULT ddrval;
 ddrval=lpDDSPrimary->Blt(NULL, lpDDSOffscreen, NULL, DDBLT_WAIT, NULL);

 if (ddrval==DDERR_SURFACELOST)
 {

  lpDDSPrimary->Restore();
 }

 

这样当屏保,锁屏,修改屏幕分辨率,表面都可以恢复,视频显示正常

 

这里也可以使用 ddraw对象,恢复所有表面,方法如下:

 lpDD->RestoreAllSurfaces();

 

其中

 LPDIRECTDRAW7           lpDD; 

目录
相关文章
ENVI Classic: 如何进行波段合成、矢量栅格叠加显示、窗口链接、图像格式转换、头文件编辑、重采样等(详细)2
ENVI Classic: 如何进行波段合成、矢量栅格叠加显示、窗口链接、图像格式转换、头文件编辑、重采样等(详细)
474 0
win11断电之后屏幕变暗设置
win11断电之后屏幕变暗设置
|
存储 内存技术
屏幕为黑色yuv值怎么设置
屏幕为黑色yuv值怎么设置
316 0
|
程序员 C++ Windows
GDI+与GDI屏幕抓图比较
GDI+与GDI屏幕抓图比较
203 0
Gprinter热敏打印机光栅位图点阵数据解析工具
最近参与的项目有一个需求,解析佳博热敏打印机的光栅位图点阵数据并保存为图片文件。数据是通过Bus Hound抓取的,如下图所示。   其中1b 40为初始化打印机的指令,对应的ASCII码为ESC @,1b 4a 18为打印并走纸的指令,对应的ASCII码为ESC J,1d 76 30为打印光栅位图的指令,对应的ASCII码为GS v 0,其后紧跟光栅位图模式(0x00)、水平方向位图字节数(0x0036)和垂直方向位图点数(0x0018),后面则为本帧的位图数据(0x36*0x18=1296字节)。
1987 0
VGA练习之图像的动态显示(后续)
本文是自己对VGA图像显示的练习,附上自己在博客链接http://bbs.ednchina.com/BLOG_ARTICLE_3032085.HTM
1790 0
|
存储 vr&ar C++
最简单的视音频播放示例2:GDI播放YUV, RGB
前一篇文章对“Simplest Media Play”工程作了概括性介绍。后续几篇文章打算详细介绍每个子工程中的几种技术。在记录Direct3D,OpenGL这两种相对复杂的技术之前,打算先记录一种和它们属于同一层面的的简单的技术——GDI作为热身。
1503 0
|
存储 缓存 API
最简单的视音频播放示例5:OpenGL播放RGB/YUV
本文记录OpenGL播放视频的技术。OpenGL是一个和Direct3D同一层面的技术。相比于Direct3D,OpenGL具有跨平台的优势。尽管在游戏领域,DirectX的影响力已渐渐超越OpenGL并被大多数PC游戏开发商所采用,但在专业高端绘图领域,OpenGL因为色彩准确,仍然是不能被取代的主角。
1548 0
VC GDI双缓冲机制绘图防屏幕闪烁实现步骤
在OnDraw(CDC* pDC) 中添加如下代码      CDC MemDC; //首先定义一个显示设备对象  CBitmap MemBitmap;//定义一个位图对象  //随后建立与屏幕显示兼容的内存显示设备  MemDC.
1000 0