カスタムIVMRSurfaceAllocator9
を使用して、DirectX9 アプリケーションで DirectShow からビデオをレンダリングします。DirectX Device インスタンスの紛失したデバイスを処理しようとしています (HDMI が [un]plugged in の場合)。DX デバイスに依存するすべてのリソース (テクスチャ、サーフェスなど) を解放し、DX デバイスをリセットしてから、それらのリソースをリロードします。すべてが再びレンダリングを開始します (ビデオを期待してください)。カスタム IVMRSurfaceAlloctor9 に関しては、問題があります。私は3つの異なることを試しました。
毎回、ビデオは黒(または表面をクリアした他の色)になります
次のMSDN ドキュメント:
Supplying a Custom Allocator-Presenter for VMR-9
そのページのすべてのステップを実行しました。最初はIVMRSurfaceAllocatorNotify9::AllocateSurfaceHelper
、サーフェスを作成するために を使用していませんでした。しかし、私もそれを使用するように切り替えましたが、結果はありませんでした。を呼び出すIVMRSurfaceAllocatorNotify9::ChangeD3DDevice
と、IVMRSurfaceAllocator9::InitializeDevice
. 私は表面を作り直しました、すべてが良かったです。次に、紛失したデバイスとリセットの前と同じように、正しいパラメーターで呼び出しを開始しましIVMRSurfaceAllocator9::GetSurface
たIVMRSurfaceAllocator9::PresentImage
Google の調査結果: VMR9 と紛失したデバイス ソース フィルターと VMR9 フィルターからピンを外してから再接続するようにという投稿をいくつか見つけました。以前と同じ結果でそれを行いました。さらに一歩進んで、VMR9 フィルターを完全に取り外して破棄し、新しいフィルターを作成してその場所に置き、同じ結果を得ました。
GraphEdit: 多くのアイデアの後、ビデオ デコーダーが空白の画像を提供している可能性があると考えるようになりました (これは通常の失われたデバイスではなく、ディスプレイ/アダプターを完全に失い、新しいデバイスで DX デバイスを再作成する必要があるためです)。 [プライマリ] アダプター)。そこで、 Windows SDK Graph Edit ツールで DirectShow グラフを再作成し、失われたデバイスを強制的に ([un]plug hdmi)、VMR9 ウィンドウは問題なく処理します。しかし、最初の試行では、アプリケーションで行うように VMR ミキサー設定をセットアップしませんでした (を使用IVMRMixerControl9::SetMixingPrefs
)。グラフ編集ツールで VMR9 フィルター設定を変更して YUV ミキシングを行い、失われたデバイスを再度強制すると、残念なことに VMR9 ウィンドウが黒くなり、黒のままになります。私のアプリケーションと同じ結果です。
アプリケーションを RGB ミキシングに切り替え、DX デバイスをリセットすると、ビデオが黒くならず、何も起こらなかったように続きます。
私の質問は、YUV ミキシング モードで、なぜ私のカスタム IVMRSurfaceAllocator9 (またはデフォルトのアロケーター) が失われた DX デバイスの後に適切に再初期化できないのですか?