我使用自定义IVMRSurfaceAllocator9
在DirectX9应用程序中渲染来自DirectShow的视频。我一直在尝试为我的DirectX设备实例处理丢失的设备(用于HDMI [插入]时)。我释放所有DX设备相关资源(纹理,曲面等),重置DX设备,然后重新加载这些资源。我做得很好,一切都开始再次渲染(期待视频);当涉及到自定义IVMRSurfaceAlloctor9我有问题。我尝试了三种不同的东西。DirectShow IVMRSurfaceAllocator9(YUV混合)DirectX丢失的设备
每单的时候,视频也只是黑色(或任何其他颜色我清除了表面(或多个))
其次MSDN文档: Supplying a Custom Allocator-Presenter for VMR-9 我做了页面上的每一步,起初我没有使用IVMRSurfaceAllocatorNotify9::AllocateSurfaceHelper
来创建表面;但我转而使用它,但没有结果。 当我拨打IVMRSurfaceAllocatorNotify9::ChangeD3DDevice
时,它会调用IVMRSurfaceAllocator9::InitializeDevice
。我会重新创建表面,一切都很好。然后,它开始叫IVMRSurfaceAllocator9::GetSurface
,并IVMRSurfaceAllocator9::PresentImage
与就像它在丢失装置之前没有和复位
谷歌发现正确的参数: VMR9 and lost device 我找到了几个帖子说要断开源过滤器和VMR9过滤器引脚,然后重新连接它们。我做了与以前相同的结果。我甚至更进了一步,我彻底移除了VMR9滤波器,并将其丢弃并创建了一个新的滤波器,并将其放置在具有相同结果的位置。
GraphEdit: 经过很多想法之后,我开始认为视频解码器可能会提供空白图像(因为这不仅仅是一个普通的丢失设备,我完全失去了显示器/适配器,必须重新创建DX设备放在新的[主]适配器上)。所以我重新创建了Windows SDK Graph Edit tool中的DirectShow图形并强制丢失设备([un]插入hdmi),VMR9窗口处理它就好了;但在第一次尝试时,我没有像在应用程序中那样设置VMR混音器设置(使用IVMRMixerControl9::SetMixingPrefs
)。我改变图编辑工具中的VMR9滤镜设置来进行YUV混合并再次强制丢失的设备,令我沮丧的是,VMR9窗口变黑并保持黑色;与我的应用程序中的结果相同。
将我的应用程序切换到RGB混合,并重置DX设备后,视频不再是黑色,并继续像任何事情发生过。
所以我的问题是,为什么在YUV混合模式下,我的自定义IVMRSurfaceAllocator9(也就是默认分配器)在丢失DX设备后无法正确重新初始化?
感谢您的提示,没有想到这一点。我不知道我改变了什么,但现在它在我的代码中以YUV混合模式工作;但在GraphEdit中仍然如此。 – DanStory 2012-07-18 03:08:28