目的は、ビデオ処理と外部アプリケーションへの同期のためのカスタム MFT を実装することです。の詳細は重要ではありません。最初のステップとして達成したいことは、DXVA ビデオ処理または DXVA-HD を使用して MFT を稼働させることです。私はそうすることができませんでした。
ソース入力ノード (Web カメラ)、MFT (MFT_Grayscale の例)、および EVR を使用してトポロジの構築を開始しました。これを小さなアプリケーションに含めました。トポロジーは機能し、カメラからモノクロ ストリームを確認できました。ここで、MF_Grayscale の例のコードを変更して、DXVA ビデオ処理をサポートし、VideoProcessBlt メソッドによって提供されるハードウェア アクセラレーションを使用できるようにします。Microsoft のドキュメントには細かな情報が記載されていますが、MFT を実行することはできませんでした。
私がこれまでにやったこと:
- メソッド
GetAttributes
で、この MFT が であることを示しますMF_SA_D3D_AWARE
。 - メソッド
ProcessMessage
では、メッセージMFT_MESSAGE_SET_D3D_MANAGER
を処理してデバイス ハンドル aIDirect3DDeviceManager9
およびを取得しますIDirectXVideoProcessorService
。 - この方法では、https://msdn.microsoft.com/en-us/library/windows/desktop/ms694235(v=vs.85).aspx
SetInputType
で説明されている方法を使用し て DXVA2_VideoDesc 構造を取得し、次のコード https : //msdn.microsoft.com/en-us/library/windows/desktop/cc307964(v=vs.85).aspx を使用してビデオ処理デバイスを作成します。さらに、次を使用してサーフェスを作成しますIDirectXVideoProcessorService->CreateSurface
- メソッド
GetOutputStreamInfo
では、dwFlags
変数は次のようになります。
pStreamInfo->dwFlags =
MFT_OUTPUT_STREAM_PROVIDES_SAMPLES |
MFT_OUTPUT_STREAM_WHOLE_SAMPLES |
MFT_OUTPUT_STREAM_SINGLE_SAMPLE_PER_BUFFER |
MFT_OUTPUT_STREAM_FIXED_SAMPLE_SIZE;
ここまでは大丈夫そうです。今、私の質問(これ以上具体的に言えなくて申し訳ありません):
GetOutputAvailableType/SetOutputType
メソッドを適応させる必要がありますか?この
ProcessInput
メソッドでは、 を取得してIMFSample
を抽出しIMFMediaBuffer
ます。IDirect3DSurface9
関数呼び出しによると、バッファが a を管理していません。バッファーのデータを Direct3D サーフェスに memcpy する必要がありますか?開始点を作成する
ProcessOutput
方法では、受信フレームを出力に転送したいと考えています。VideoProcessBlt
入力から出力まで 1:1 のブリットを作成する必要があります。ドキュメントには次のように記載されています。現在使用されていない使用可能なサーフェスを取得します。
サーフェスが使用中かどうかを判断するにはどうすればよいですか?
サーフェスを出力するにはどうすればよいですか? またはを使用する必要があります
MFCreateVideoSampleFromSurface
かMFCreateDXSurfaceBuffer
?残念ながら、私は本当に迷っており、ドキュメントを使用して進歩することができません.
現在の状況では、ビデオ出力が表示されず (ウィンドウにはデフォルトのウィンドウの背景色があります)、Web カメラは最初のフレームの後にフレームのキャプチャを停止します (LED がオフになります)。その上、何も起こりません - アプリケーションは何も表示せずに実行を続けます)。
誰かが私を助けてくれることを願っています。また、誰かが DXVA ビデオ処理または DXVA-HD を使用した MFT のサンプル コードを教えてくれれば幸いです。私は何も見つけることができませんでした...
ありがとう