2008-12-01 47 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或其他設置)。