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; 

目录
相关文章
|
4月前
|
编解码 Linux 计算机视觉
python 调用ffmpeg使用usb摄像头录制视频,输出h264格式,自动获取摄像头的最佳帧率和最大画面尺寸
使用 Python 调用 FFmpeg 进行 USB 摄像头视频录制,需先确保安装 FFmpeg 和 Python 的 `subprocess` 模块。代码示例展示了如何自动获取摄像头的最佳帧率和最大分辨率,然后录制视频。首先通过 FFmpeg 列出摄像头格式获取信息,解析出帧率和分辨率,选择最优值。之后调用 FFmpeg 命令录制视频,设置帧率、分辨率等参数。注意 `/dev/video0` 是 Linux 的摄像头设备路径,Windows 系统需相应调整。代码中未直接实现自动获取最佳参数,通常需要借助其他库如 OpenCV。
|
API 计算机视觉
V4L2抓取USB摄像头YUV视频数据代码
V4L2抓取USB摄像头YUV视频数据代码
267 0
|
程序员 C++ Windows
GDI+与GDI屏幕抓图比较
GDI+与GDI屏幕抓图比较
189 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字节)。
1961 0
VGA练习之图像的动态显示(后续)
本文是自己对VGA图像显示的练习,附上自己在博客链接http://bbs.ednchina.com/BLOG_ARTICLE_3032085.HTM
1774 0
|
块存储
DirectX--yuv420p上实现的字符叠加
<p><img src="http://img.blog.csdn.net/20141217111324616?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWFvMDUxNA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt=""><br>
2001 0
|
存储 vr&ar C++
最简单的视音频播放示例2:GDI播放YUV, RGB
前一篇文章对“Simplest Media Play”工程作了概括性介绍。后续几篇文章打算详细介绍每个子工程中的几种技术。在记录Direct3D,OpenGL这两种相对复杂的技术之前,打算先记录一种和它们属于同一层面的的简单的技术——GDI作为热身。
1484 0
|
存储 API 开发工具
最简单的视音频播放示例3:Direct3D播放YUV,RGB(通过Surface)
上一篇文章记录了GDI播放视频的技术。打算接下来写两篇文章记录Direct3D(简称D3D)播放视频的技术。Direct3D应该Windows下最常用的播放视频的技术。实际上视频播放只是Direct3D的“副业”,它主要用于3D游戏制作。
2156 0
directdraw的多画面显示rgb
// showpicDlg.cpp : 实现文件 // #include "stdafx.h" #include "showpic.h" #include "showpicDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #endif   // ...
970 0