2008-12-01 43 views
0

很难把它放到标题中,所以让我解释一下。在整个过程中使用指针传递纹理

我有一个使用Direct3D以显示一些目和DirectShow(VMR9 +分配器)来播放某些视频,然后发送视频帧作为纹理Direct3D的一部分被施加到网的应用程序。应用程序需要全天候运行。至少它可以每24小时重新启动一次,但不会比这更频繁。

现在的问题是,由于编解码器,视频驱动程序或视频文件本身,directshow在播放几个小时后似乎出现问题。此时应用程序只是拒绝播放视频。但Direct3D部分仍然运行良好,网格仍然显示。应用程序重新启动后,一切恢复正常。

因此,我正在考虑将2部分拆分为2个不同的过程。因此,当视频过程无法播放视频时,至少我可以立即重新启动它,而不会丢失Direct3D部分。

所以问题来了,是否可以通过传递指针将视频播放器中的纹理传递给direct3d进程,也就是从指针中检索另一个进程的纹理?由于受保护的内存寻址,我最初的猜测是不可能的。

我在这两个进程上都有TCP通信设置,我们不用担心在这一点上传递指针。

这可能是一个疯狂的想法,但它的工作不知道你是否分离出来作为一个单独的过程然后我怀疑这是不可能的这是有史以来可能

回答

2

是的,你可以用Direct3D 9Ex来做到这一点。这只适用于Vista,你必须使用Direct3DDevice9Ex。你可以阅读关于分享resources here.

0

,但如果它是一个孩子线程然后他们会共享内存寻址我相信。

+0

这就是分开它们的目的。目前,该播放器正在与direct3d分开的线程上运行。如果纹理存储在视频内存上,该怎么办? – faulty 2008-12-01 17:17:39

+0

不确定视频内存如何映射到进程/线程内存空间。只是不是我曾经处理过的事情。 – EBGreen 2008-12-01 18:49:26

1

现在的问题是,directshow似乎在播放几个小时后出现问题,无论是由于编解码器,视频驱动程序还是视频文件本身。此时应用程序只是拒绝播放视频。

为什么不直接修复这个bug呢?

+0

不可能,视频驱动程序和视频编解码器不在我们的控制范围之内。问题也是随机的。很难缩小范围。我们尝试通过反复试验找出最稳定的驱动程序版本和编解码器,但即使使用相同的硬件,它仍可以在PC和PC之间执行不同的操作。 :( – faulty 2008-12-01 17:34:04

0

传递纹理不起作用。

我会使用以下方法做:

  • 与自定义渲染+分配器是放置图片到内存
  • 您的图片从共享存储池中分配内存更换VMR
  • 一旦你收到另一张照片你信号的事件
  • Direct3D的进程等待该事件,并与新的纹理
012更新目

请注意,您需要将图像数据传送到显卡。最大的区别是,这种转换现在发生在Direct3D应用程序中,而不是在DirectShow应用程序中。

你也可以尝试使用VMR这一点。我不确定自定义分配器/渲染器部件是否允许您渲染共享内存。

+0

这正是我所做的,并一直在做所有这些(vmr9 +分配器)。它不会将DirectShow从Direct3D分成2个进程。每当DirectShow失败时,我仍然需要重新启动整个应用程序 – faulty 2008-12-01 18:11:25

0

也许你可以在你的DirectShow主机进程中使用Sample Grabber来获取图像作为系统内存缓冲区。然后,您可以使用WriteProcessMemory将数据写入您的Direct3D应用程序中的预先约定的地址(通过TCP或其他设置)。