« WMVの再生が出来るように | メイン | Async Readerでないと無理 »
2005年10月23日
吉里吉里 ムービー拡張日誌2:: DirectX VAネゴシエーション ステップ訳
Tweet @jin1016をフォローWindows Media Format SDKのヘルプのDirecX VAネゴシエーション ステップを訳してみた。
以下の訳は、ほとんど直訳の上に私の英語力のなさが加わって意味不明な文章になってます。
でも、大体何をすればいいかはわかります。(私だけかも)
現状単なるメモなので、コーディングして動くようになって理解したら、文章を修正します。
1. プレーヤーは、ソースフィルタとリーダーオブジェクトをインスタンス化します。リーダーは、ビデオデコーダーDMOの生成と(圧縮された)入力タイプの設定を行います。
これらはプレーヤーがフィルタグラフの構築を行うより前に行わなければなりません。
なぜなら、SDKとデコーダーDMOは、グラフのネゴシエーションプロセスにかかわらなければならないからです。
また、DMOはステップ9の間、入力フォーマットを知っていなければなりません。
2. プレーヤーは、ビデオソースフィルタの出力ピンを引数にしてIGraphBuilder::Renderをコールします。
DirectShowフィルタグラフマネージャはVMRをプレーヤーのビデオソースフィルタのこの出力ピンへ接続しようとします。
3. フィルタグラフマネージャは、プレーヤーのビデオソースフィルタの出力ピンのIPin::Connectをコールします。
ステップ 4 ~ 10は、IPin::Connect内で起こります。
4. ソースフィルタは、リーダーのIWMReaderAccelerator::GetCodecInterfaceでIWMCodecAMVideoAcceleratorを取得します。
CodecがDirectX VAをサポートしない場合、GetCodecInterfaceの呼び出しはたぶん失敗します。
この場合、ネゴシエーションプロセスはいつも通りの(DirectX VAをサポートしない)物になります。
5. ソースフィルタはIWMCodecAMVideoAccelerator::SetAcceleratorInterfaceを通して内部に接続されたピンからデコーダDMOへIAMVideoAcceleratorのポインタを渡します。
6. 次に、ソースフィルタはIPin::Connect オペレーションの残りをCBaseOutputPin::Connectメソッドへ任せます。
SDKとのフォーマットの列挙は今日するように続きます。???
Codecが接続されているコンテンツのためのDirectX VAをサポートしていたら、CodecのDMOはそれらのDirectX VAサブタイプをサポートするYUVやRGBサブタイプの前に最初に提供します。
DirectX VAサポートが利用できるのなら、ステップ7~11はDirectX VAサブタイプのコンテキスト中で試みられます。
以下のソースコードはDirectX VAメディアサブタイプを識別するためのものです。
ヘルプにソースコードがあります。
7. CBaseOutputPin::Connectの実装は、ステップ3の間にIPin::CompleteConnectを呼びます。
もし、DirectX VAサブタイプに確定していたなら、DirectX VAネゴシエーションが試みられます。
出力ピンは、現在の出力メディアタイプを渡してIWMCodecAMVideoAccelerator::NegotiateConnectionをコールします。
8. デコーダDMOはIAMVideoAcceleratorインタフェースを通してVMRとの必要なネゴシエーションを実行して、2が同意したビデオsubtype GUIDを返します。
出力ピンがこのプロセスの間にIAMVideoAcceleratorNotifyインタフェースで受信したすべての呼び出しは、デコーダDMOのIAMVideoAcceleratorNotifyインタフェースが代理します。(また、IWMReaderAccelerator::GetCodecInterface メソッドでそれを得ることができます)
9. IWMCodecAMVideoAccelerator::NegotiateConnectionが成功するなら、出力ピンはIWMPlayerTimestampHookインターフェイスを渡してIWMCodecAMVideoAccelerator::SetPlayerNotifyをコールする。
このHookで、それらがレンダラーに手渡される前にソースフィルタはサンプルの上のタイムスタンプをアップデートします。
10. ソースフィルタはIWMReaderAccelerator::Notifyにネゴシエートされたメディアタイプを渡してコールする。
これでリーダーは内部変数をアップデートし、DirectX VAを受け入れる。
これはCodecかリーダーが失敗できる最後の場所です。
上のステップのどれかが失敗するなら、ソースフィルタは、ステップ3に戻って、リーダーが列挙した次のタイプを試すべきです。
11. 再生は始まります。 リーダーは接続の出力タイプがDirectX VAであるならデコーダDMOからの出力バッファを無視します。
12. IPin::Disconnectが発生したら、ソースフィルタはNULLを引数にしてIWMCodecAMVideoAccelerator::SetAcceleratorInterfaceをコールします。
これはコーデックとレンダラーとのDirectX VA接続を解除します。
投稿者 Takenori : 2005年10月23日 22:44
comments powered by Disqus