zl程序教程

您现在的位置是:首页 >  其它

当前栏目

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

显示 视频 出现 丢失 出来 YUV 表面
2023-09-27 14:29:32 时间
原因是: 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; 


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字节)。
本文是自己对VGA图像显示的练习,附上自己在博客链接http://bbs.ednchina.com/BLOG_ARTICLE_3032085.HTM
最简单的视音频播放示例2:GDI播放YUV, RGB 前一篇文章对“Simplest Media Play”工程作了概括性介绍。后续几篇文章打算详细介绍每个子工程中的几种技术。在记录Direct3D,OpenGL这两种相对复杂的技术之前,打算先记录一种和它们属于同一层面的的简单的技术——GDI作为热身。
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
最简单的视音频播放示例3:Direct3D播放YUV,RGB(通过Surface) 上一篇文章记录了GDI播放视频的技术。打算接下来写两篇文章记录Direct3D(简称D3D)播放视频的技术。Direct3D应该Windows下最常用的播放视频的技术。实际上视频播放只是Direct3D的“副业”,它主要用于3D游戏制作。
最简单的视音频播放示例7:SDL2播放RGB/YUV 本文记录SDL播放视频的技术。在这里使用的版本是SDL2。实际上SDL本身并不提供视音频播放的功能,它只是封装了视音频播放的底层API。在Windows平台下,SDL封装了Direct3D这类的API用于播放视频;封装了DirectSound这类的API用于播放音频。