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

 原因是:

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; 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值