DirectDraw播放中BLT failed与Lock失败问题

编者:李国帅

qq:9611153 微信lgs9611153

时间:2009-10-13 03:07下午

背景原因:

这是一个曾经遇到的播放问题,并不会造成严重问题。发生在win32的年代,一个曾经的记忆。

所需资源:

VC,DirectDraw

问题描述:

在其它的机器上出现了以下错误,奇怪的现象

(1)频繁出现BLT failed

BLT failed ddrval=-2147467259. dstRect(745,763;1005,983) //FFFFFFFF 0x80004005l //FFFFFFFF80004005

2009/09/01 07:16:51       BLT failed ddrval=-2147467259. dstRect(761,97;1013,322)

blt 出现E_FAIL错误,很经常。已经进行了锁定。

没有图像可能与pullid(播放流标记)得到的数据有关系?播放过程中出现间接中断并继续,说明不是因为pullid发生了改变。

blt贴图失败,能不能不进行提示,使用try把错误扔掉。

贴图失败不会导致程序出错,出错的原因是其他的问题。

看是不是越界  一般blt失败就是越界Blt到不该Blt的地方了,曾经有过copymemory错误,但是只要锁定成功就不会了。

(2)出现lock失败

Lock又出现失败的情况了,在一台新机器上,没有安装显卡。

播放器后备缓冲在锁定缓冲区的时候出现了无数的lock失败,不是显卡问题。

CUtil::Instance()->DbgFilePrintf(L"TSPlayer",_T("LockBuffer Backsurface Lock Failed. ddrval=%d."),ddrval);

2009/10/14 14:53:44       TSPlayer: LockBuffer Backsurface Lock Failed. ddrval=-2005532222.//FFFFFFFF887601C2

这个问题不会导致程序出现异常错误。

unsigned char* CDisplayHandle::LockBuffer(LPDIRECTDRAWSURFACE7 lpddsBack)

{

ATLASSERT (lpddsBack != NULL);

if(lpddsBack == NULL) return NULL;

//DDLOCK_SURFACEMEMORYPTR

HRESULT ddrval;

DDSURFACEDESC2 ddsd;

ZeroMemory(&ddsd, sizeof(DDSURFACEDESC2));

ddsd.dwSize = sizeof(DDSURFACEDESC2);

//ddsd.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);

//ddsd.dwFlags = DDSD_HEIGHT | DDSD_WIDTH | DDSD_CAPS;

//ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY;

//ddsd.dwHeight = Height;

//ddsd.dwWidth = Width;

//ddsd.dwFlags |= DDSD_PIXELFORMAT;

//ddsd.ddpfPixelFormat.dwFlags = DDPF_FOURCC;

//ddsd.ddpfPixelFormat.dwFourCC = SubType.Data1;

ddrval = lpddsBack->Lock(NULL, &ddsd, DDLOCK_NOSYSLOCK | DDLOCK_WRITEONLY/* | DDLOCK_WAIT*/, NULL);

if (FAILED(ddrval))//if (ddrval != DD_OK)

{

if (ddrval == DDERR_INVALIDPARAMS)

{

ddrval = lpddsBack->Lock(NULL, &ddsd, /*DDLOCK_WAIT |*/ DDLOCK_WRITEONLY, NULL);

}

if (ddrval == DDERR_SURFACELOST)

{

lpddsBack->Restore(); //已经Restore但还是无法锁定。

ddrval = lpddsBack->Lock(NULL, &ddsd, /*DDLOCK_WAIT |*/ DDLOCK_WRITEONLY, NULL);

}

}

//ATLASSERT(SUCCEEDED(ddrval));

if (FAILED(ddrval))//if (ddrval != DD_OK)

{

CUtil::Instance()->DbgFilePrintf(L"TSClient",_T("TSPlayer: LockBuffer Backsurface Lock Failed. ddrval=0x%X."),ddrval);

return NULL;

}

unsigned char* pBuffer = NULL;

pBuffer = (unsigned char*)ddsd.lpSurface;

ATLASSERT(pBuffer != NULL);

if(pBuffer == NULL)lpddsBack->Unlock(NULL);

return pBuffer;

}

可能的原因:

在后期处理程序的时候也出现,原因是cpu和内存使用量过大,导致计算错误。

程序在运行过程中,突然出现BLT failed,程序开始响应缓慢,出现问题。

2010/01/27 22:39:39       **Player:  BLT failed ddrval=0X80004005. dstRect(218,234;426,371)

2010/01/27 22:39:39       **Player:  BLT failed ddrval=0X80004005. dstRect(428,512;637,649)

2010/01/27 22:39:39       **Player:  BLT failed ddrval=0X80004005. dstRect(218,96;426,232)

2010/01/27 22:39:39       **Player:  BLT failed ddrval=0X80004005. dstRect(428,234;637,371)

2010/01/29 09:16:04       *** fail for (BYTE*)malloc(262144) failed.

参考

/* * Display hardware is capable of bltting to or from system memory */

#define   DDERR_GENERIC       E_FAIL

#define   E_FAIL        _HRESULT_TYPEDEF_(0x80004005L)

#define   DDERR_NOZBUFFERHW   MAKE_DDHRESULT(340)

#define   MAKE_DDHRESULT(code) MAKE_HRESULT(1,_FACDD,code)

#define MAKE_HRESULT(sev,fac,code) \

((HRESULT) (((unsigned long)(sev)<<31) | ((unsigned long)(fac)<<16) | ((unsigned long)(code))) )

#define MAKE_SCODE(sev,fac,code) \

((SCODE) (((unsigned long)(sev)<<31) | ((unsigned long)(fac)<<16) | ((unsigned long)(code))) )

#define _FACDD  0x876

#define MAKE_DDHRESULT( code )  MAKE_HRESULT( 1, _FACDD, code )

/*DDERR_SURFACEBUSY Access to this surface is being refused because the surface is already locked by another thread. */

/*DDERR_SURFACELOST Access to this surface is being refused because the surface is gone.

* The DIRECTDRAWSURFACE object representing this surface should have Restore called on it. */

#define DDERR_SURFACEBUSY   MAKE_DDHRESULT( 430 ) = ((1<<31) | (0x876)<<16 | 430 ) = 0x887601ae

#define DDERR_SURFACELOST   MAKE_DDHRESULT( 450 ) = 0x887601C2

DirectDraw播放中BLT failed与Lock失败问题相关推荐

  1. VMware虚拟机出现Reason: Failed to lock the file

    打开VMware出现Cannot open the disk *.vmdk or one of the snapshot disks it depends on.Reason: Failed to l ...

  2. c++调用mysql存储过程_C++中ADO调用MySQL存储过程失败,诡异的语法异常,求解中,附源码...

    C++中ADO调用mysql存储过程失败,诡异的语法错误,求解中,附源码 不管怎么调整,死活都出现下面的错误 C++ADO代码我实在找不到什么错误了,难道是MySQL有什么问题,或者有其他需要注意的地 ...

  3. go插件 vscode 报错_MacOS中 VSCode 安装 GO 插件失败问题的快速解决方法

    问题重现 Installing golang.org/x/tools/cmd/guru FAILED Installing golang.org/x/tools/cmd/gorename FAILED ...

  4. CentOS7中使用systemctl列出启动失败的服务

    列出启动失败的服务 # systemctl list-units --state failed 可以发现,有个两个服务启动失败了. is-failed选项 可以使用is-failed选项检查指定的服务 ...

  5. boost中的mutex与lock

    最近在多线程编程中多次使用到mutex来互斥,看了下项目的代码,有自己封装的mutex类,也有直接使用boost::mutex的,而boost中关于mutex可谓令人眼花撩换.这里总结一下. 对于mu ...

  6. 虚机打不开报failed to lock the file错误原因及解决方案

    问题出现的原因: 虚拟磁盘(.vmdk)本身有一个磁盘保护机制,为了防止多台虚拟机同时访问同一个虚拟磁盘(.vmdk)带来的数据丢失和性能削减方面的隐患,每次启动虚拟机的时候虚拟机会使用扩展名为.lc ...

  7. Qt程序添加音乐和音效,解决QtCreator中给程序添加音乐失败的问题

    Qt程序添加音乐和音效,解决QtCreator中给程序添加音乐失败的问题 最近写了个Qt小游戏,希望添加个背景音乐,却失败了很多次,下面总结一下经验. 添加音乐或者音效一般需要使用multimedia ...

  8. 虚拟机Failed to lock the file 和Reason: The file is too large错误的解决方法

    转自http://hi.baidu.com/perfectxyz/blog/item/23ac06f871720b04d8f9fd57.html 1.VMware 启动报错 "Failed ...

  9. Ubuntu中Could not get lock /var/lib/dpkg/lock解决方案

    关于Ubuntu中Could not get lock /var/lib/dpkg/lock解决方案 转载于:https://www.cnblogs.com/daemonFlY/p/10916812. ...

最新文章

  1. 解决Neither the JAVA_HOME nor the JRE_HOME environment variable is defined问题
  2. ‘复杂变简单‘的代码例子
  3. 【SpringMVC】SpringMVC 对 Date 类型转换
  4. 如何成为架构师?3条有效的实战经验
  5. (98)FPGA localparam 与parameter区别?
  6. Silvaco TCAD仿真2——Silvaco TCAD 档名
  7. 计算机标准体重计算公式,项目2:就拿胖子说事---(2)计算出标准体重,当超重时,请给出提示...
  8. 33、Python第三方库安装和使用
  9. 3A简介(持续更新)
  10. Android设备root及xposedPrivacy的安装
  11. DHCP工作过程及DHCP中继
  12. DeepNet :Scaling Transformers to 1000 Layer
  13. python轮子下载教程
  14. 系列文章深度解读|SwiftUI 背后那些事儿
  15. kde调整分辨率_7个很酷的KDE调整将改变您的生活
  16. 冷启动问题——协同过滤(推荐系统)
  17. 农作物病虫害AI智能监测预警系统
  18. c语言经典测试,c语言经典写作测试(非常完整).doc
  19. Android 存档
  20. 雅马哈机器人以太网通信_紧凑型机器人控制器 - RCX320 - Yamaha Motor Co.,Ltd./雅马哈 - 以太网通信接口...

热门文章

  1. 区块链USDT承兑商支付系统开发应用技术
  2. mysql chown_请教,mysql编译时出错,chown: “mysql”: 无效的用 户
  3. 数学公式中的侧m 求和符号∑详解
  4. 八代的cpu能装服务器系统吗,8代i5能不能装win7
  5. 01背包问题详解(浅显易懂)
  6. NS版暗黑破坏神3金手指开发教程(17)
  7. 【C/C++】【面经】2022 寒武纪 面经;( 媒体软件方向 )(更新:一面;二面;)
  8. C#学习记录(30)windows应用程序基础之控件
  9. 中国移动政企科创专题:5G网联无人机,逆风飞行,使命必达
  10. 我们正进入另一个黑暗和无知的时代----《三联生活周刊》 (转载)