« C++ Builder 2007 Update3 | メイン | MPEG1デコーダーについて »

2007年10月16日

吉里吉里 ムービー拡張日誌2:: Vista で拡大補間が効かない対応

    

VMR9 でウィンドウ - フルスクリーン切り替えが安定して動くようなって良かったと思っていたら、Vista で拡大補間が効かない環境があるとか。
なんとまぁ。
StretchRect の最後の引数を D3DTEXF_NONE にしていて、その場合はドキュメントには「D3DTEXF_NONE を指定した場合、ドライバはフィルタリング アルゴリズムを選択します」と書かれている。
そのため、環境によっては拡大補間が効かないのかと思ったけど、ここを変えても直らないよう。
次に、バックバッファのサイズを疑ったが、そこも効果なく、仕方なく板ポリにムービーをテクスチャとして貼ることにした。
で、対応。
この対応で、ビデオカードによって作られるサーフェイスが異なるように。
最近のであれば、テクスチャサーフェイスに直接 VMR9 で描けるようで、VMR9 が描いたテクスチャサーフェイスをそのままテクスチャとして使う。
テクスチャサーフェイス に直接描けない場合は、オフスクリーンサーフェイスになる。
さらに、出力フォーマットが YUV 系ならテンポラリのテクスチャサーフェイスが作られ、描画時に一度そこにコピーされ、それがテクスチャとして使われる。
何が使われたかはコンソールに以下のどれかが出力されるので、それで判別できる。
krmovie : Use texture surface.
krmovie : Use offscreen surface.
krmovie : Use offscreen and YUV surface.

また、テクスチャサイズに二の累乗制限がある時は、コンソールに以下のメッセージが出る。
krmovie : Use power of two surface.

テクスチャサイズの上限に引っかかった場合、VMR は使えない。
たぶん、VMR が分割して描いてくれるとかないだろうから、そこは放置して、使えないとすることに ( でも、VMR9PresentationInfo を見ると転送元矩形や転送先矩形の情報が入っているから、やってくれるかも知れない。調べたほうがいいかも ) 。
その場合、以下のように表示された後、例外が発生してビデオが再生されない。
krmovie warning : Video size too large. May be cannot create texture.

VMR で再生できなくて例外が発生した時は、catch して、モードをオーバーレイモードやレイヤーモードに変更する必要がある。

ビデオメモリ使用量を抑えるため、ムービーを開いた後、サイズ変更不可のウィンドウでプログラム側からウィンドウサイズを変更 ( 大きいサイズに ) した場合に、ムービーのサイズが小さくなってしまいます。
これはサイズ変更不可のウィンドウの時は、バックバッファのサイズをウィンドウサイズと同じにしているためです。
まあ、ゲームではこのような状況はまずないと思うので、問題ないとは思いますが、一応書いておきます。
( これは、なんとか出来なくはないと思いますが、あまり害はないと思うのでそのままにしています )



投稿者 Takenori : 2007年10月16日 02:03




comments powered by Disqus
Total : Today : Yesterday : なかのひと