« VMRとフルスクリーン化 | メイン | ダミーウィンドウへ退避 »

2005年11月01日

吉里吉里 ムービー拡張日誌2:: ウィンドウレスモード

    

サンプルプログラムを見るが、ウィンドウモードで再生するものはない。
ウィンドウレスモードかレンダレスモードのものしかない。
ウィンドウモードは使わないほうが良いのだろうか?
現にフルスクリーン周りで問題が発生しているわけだが。
確認のため、ウィンドウレスモードを使っているサンプルでムービー再生中に他のアプリをフルスクリーンにしてみたが、特に問題なく再生が継続していた。
やはり、ウィンドウレスモードにするべきか。

ウィンドウレスモードは、IBasicVideo インターフェイスまたは IVideoWindow インターフェイスはサポートしない。とヘルプにある。
またはとか言っているけど、たぶん両方使えない。
少なくともIBasicVideo が使えないことは確認した。
IVideoWindow は思いっきりウィンドウに関連しているので使えない可能性大。
なので、これらのインターフェイスを使って何らかの操作をしている場所は代替手段を考えなければならない。

ビデオのサイズを取得するためにIBasicVideo::get_SourceWidthとIBasicVideo::get_SourceHeightを使っているが、これはIVMRWindowlessControl9::GetNativeVideoSizeを使えば大丈夫そう。

平均フレーム時間を取得するのにIBasicVideo::get_AvgTimePerFrameを使っている。
IVMRWindowlessControl9インターフェイスを見てもそれに相当するメソッドは見当たらない。
これはレンダリングフィルタの入力ピンが接続に使っているメディアタイプから取得することが可能なので、グラフ構築時にこれを保持しておけばなんとかなりそう。

ウィンドウの付け替えは…… 無理っぽい。
IVMRWindowlessControl9::SetVideoClippingWindowでクリッピングに使うするウィンドウを設定するのだが、再生途中にIVMRWindowlessControl9::SetVideoClippingWindowへNULLを渡してみたら、無効な引数と返ってきた。
すでに設定されているウィンドウが破棄されたらどうなるかわからないが、やばそう。

後、ウィンドウレスモードの用件としてアプリケーションがWM_DISPLAYCHANGE メッセージを受け取った時はIVMRWindowlessControl9::DisplayModeChangedをコールする必要がある。
registerMessageReceiverでWM_DISPLAYCHANGE を見張るか、本体に手を入れるかすれば、これは何とかなりそう。

再描画が必要な時は、IVMRWindowlessControl9::RepaintVideoをコールする必要がある。
吉里吉里本体のUpdateなどで画面が更新された後などでRepaintVideoをコールするようにすれば何とかなりそう。


ウィンドウの付け替えが何とかなればウィンドウレスモードで安定して動作させられそうだな。



投稿者 Takenori : 2005年11月01日 19:35




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