2012-07-13 47 views
2

我使用自定义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设备后无法正确重新初始化?

回答

0

根据我对VMR7和VMR9的经验,YUV混合纯粹可用于reduce the required memory bandwidth。我可以想象,很多处理是由GPU在当前机器上直接执行的,很可能GPU驱动程序管道的YUV部分不能像他们经过良好测试和广泛使用的RGB对应部分那样正常工作。

您是否尝试过使用YUV与参考光栅器或其他设备意味着正确性,而不是速度(作为测试)?我认为它会正常工作。

+0

感谢您的提示,没有想到这一点。我不知道我改变了什么,但现在它在我的代码中以YUV混合模式工作;但在GraphEdit中仍然如此。 – DanStory 2012-07-18 03:08:28