Win7 WMP12 のビデオDSPプラグインが動作しない件(H.264およびMPEG2)

こんにちは。日本マイクロソフトの我孫子です。

これは日本のお客様からお問い合わせがあり当チームでWindows Media Player 12 (WMP12) の内部動作の解析調査を担当した案件です。

WMP12で Microsoft DTV-DVD Decoder Filter を用いてビデオコンテンツをデコードして再生している場合、つまり H.264 と MPEG-2 Video が該当しますが、このとき、WMP12のビデオDSPプラグインがロードされないため動作しません。

これはWMP12の制限事項となっています。

ビデオDSPプラグインはDMO (DirectX Media Object) という規格に準拠したDLLです。WMP12 は再生に Media Foundation (MF) を使用しますが、MFのみでは再生ができない場合に DirectShow も併用しています。

一般に、DirectShow を用いてWMPがコンテンツを再生する場合のフィルタグラフは、デコーダ→DSPプラグイン→レンダラのようになります。ビデオDSPプラグインは DMO であって DirectShow フィルタではないため、フィルタグラフに挿入するときには DMO を DirectShow フィルタとして動作させるためのWMP用DMOラッパーフィルタがまず実体化され、そのラッパーフィルタ内部で DMO であるビデオDSPプラグインが実体化されます。

H.264 および MPEG-2 Video での問題は、Microsoft DTV-DVD Decoder Filter と DMO ラッパーフィルタの間のピン接続において、Microsoft DTV-DVD Decoder Filter が DMO ラッパーフィルタのメモリアロケータに対して複数のバッファの確保を要求するのに対して、DMOラッパーフィルタが1つのバッファにしか対応していないため、ピン接続を拒否するという動作に起因しています。このため、DSPプラグイン側の実装では回避できません。

当チームとWMP/デコーダ開発チームとの間で修正方法に関する(熱い)議論を交わしましたが、残念ながら現時点では良い方策が見つかっていません。

Microsoft DTV-DVD Decoder Filter はDXVAを前提として(デコード性能に主眼を置いて)開発が進められているため、問題の解決を一層難しくしています。DXVAではGPUでデコードされたピクチャはレンダラが確保したビデオメモリサーフェースに書き込まれたあとディスプレイに出力されてしまい、CPUから直接触れるシステムメモリ(ユーザーモード仮想メモリ空間)には渡ってきません。そのため、もともとそのままではDSPプラグインによるビデオエフェクトを施すことができません。もちろん一旦サーフェースをロックしてシステムメモリにコピーしてくればよいのですが、サーフェースのロックはGPUおよびバスのアーキテクチャ上の制約から一般にとても遅い通信になりますので、このアプローチを採用する予定は今のところありません。DMOラッパーフィルタを複数のバッファに対応するように改修したとしても、結局このDXVAの問題が残るため、DMOラッパーフィルタの改修も今のところ予定されていません。

AMDが推進するFusionのようにGPUとCPUの関係が革命的に親密になればこのような状況も変わるかもしれませんが、今のところは修正の予定なしというのが「公式見解」となっています。

DSPプラグインの開発者様にはご迷惑をお掛けして申し訳ありませんが、ご理解をいただければ幸いです。