VMR9无渲染模式设备重置问题

时间:2010-05-06 23:56:46

标签: video directshow direct3d

我正在努力解决这个问题一个星期..我希望我能说出来 问题很清楚:

所以,我设置了我的自定义分配器/演示器,并在InitializeDevice()中 为VMR9创建纹理

然后,VMR9每次有新的时调用我的PresentImage()函数 帧。

我显示将此纹理渲染到四边形并呈现()它。如果 Present()返回D3DERR_DEVICELOST然后我将PostMessage()返回给我 WndProc()表示设备复位。

然后我的WndProc()在我的自定义对象上调用ResetDevice()。 ResetDevice()释放所有DEFAULT_POOL资源并调用Reset() 装置。现在让我们暂停一下


此时Direct3d给我一个错误,告诉我我仍然坚持 引用一些DEFAULT_POOL表面......我很确定我这样做 不是因为我释放了我分配的唯一纹理。这个问题是 据我所知,这是一个谜......有许多未经答复的论坛 关于这个问题的帖子可以追溯到2003年..


让我们改变车道。在这个论坛帖子

http://www.eggheadcafe.com/software/aspnet/29909616/i-did-some-more-e ...

据说你应该停止图表,断开所有引脚 VMR9,重置设备然后重新连接并再次运行图形。

当我这样做时,我得到另一个Direct3d投诉: Direct3D9 :(错误):尝试创建纹理失败 Direct3D9 :(错误):纹理宽度大于设备 支持。 CreateTexture失败。

我将问题追溯到某些功能,我在某些功能中看到了这个问题 VMR9深度计算之前宽度为2的下一个幂 创建一些纹理(除了我成功创建的纹理之外) 我的A / P)。在追踪时我意识到了这一点:

我的视频宽度为640. 640的2的下一个功率是1024.我明白了 这个值不知何故变成10240.虽然我甚至没有设置 分配宽度为1024.我只是通过640,因为我的视频卡没有 需要pow2纹理尺寸。

这是我卡住的地方..

有没有人知道有关重置/刷新的事情 VMR9设备??请帮忙。

提前致谢。

法提赫

1 个答案:

答案 0 :(得分:0)

由于您有自定义分配器/演示者,我假设您正在使用IVMRSurfaceAllocatorNotify9 :: AllocateSurfaceHelper();并且这种方法可以潜在地分配多个表面,你确定在重置设备之前它们都被释放了吗?